嵌入式开发者社区

标题: 串口发送中断触发条件 [打印本页]

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]/ N- Q) V  |/ S% i

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 |" S& O4 `8 I9 D/ E( F8 C4 B+ A, X" s" l% `  @. |
#include "TL138.h"                 // 创龙 TL138 开发板相关声明+ f" n# ]1 ~: g4 s9 ]; ?

( `: u* d) W+ r# a# p3 ?#include "hw_types.h"               // 宏命令
. e; U+ V2 J- r% g4 v: G#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器. a! ^$ m8 @, e; a
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器% z) q/ N  `1 r! y3 }! {
& C8 r1 @+ H% I1 E* I
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明0 L) b: w0 f" w; Z
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明, D/ a8 Y! S' W. w* a$ l7 Y
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明, D! z1 Y2 v) s! p+ L2 C3 c
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义1 Q: v) l6 H: U
9 M+ [& g9 y0 \# A6 J* D! L4 E
/****************************************************************************/
, s* `, r) Z7 d/*                                                                          */
: ]0 l. k( F8 C. S/*              宏定义                                                      */
9 ^% K. x% N, Z2 |  Y: e/*                                                                          */
& u) c9 g3 C/ r& O3 v; [! o/****************************************************************************/5 q; V' d7 `1 G2 O5 J' @
// 时钟3 M6 T1 P4 }; F  I. w8 I
#define SYSCLK_1_FREQ     (456000000)
* b- n$ C; \) q+ a6 j% G1 s#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
1 L5 ?" K, ^4 k: _' `$ E4 \#define UART_2_FREQ       (SYSCLK_2_FREQ)) _' D) m: @/ T- e$ ~4 o/ n  v
- z3 A8 i/ P3 A' \
/****************************************************************************/; V& z9 w9 T% h6 m( g6 J
/*                                                                          */
! e6 m* d! ^' r: Y: o9 U/*              全局变量                                                    */
5 S  N  n/ U- l0 I; U2 a/ n" p# w/*                                                                          */
+ K% ?" {1 r+ d# p- S/****************************************************************************/
) l$ I% g; J6 h. |9 r+ ~' D& t! n* ]( g6 jchar txArray[] = "Tronlong UART2 Application......\n\r";
% e' c* h5 u2 P! k& ~
( T: P7 r- e6 G/ a7 U3 c2 U/****************************************************************************/
! ?6 `0 {5 p0 H, k+ A/*                                                                          */
% ?! ?& _6 ?' [1 `; ]/*              函数声明                                                    */
0 A& V+ ?2 }5 ^; a. V9 \8 s! d/*                                                                          */# T# P. z" d5 ?* i% D
/****************************************************************************/6 v/ d( Y, A4 |  D- Q1 t# V
// 外设使能配置2 i9 g: y% X3 h* b# c% \7 |7 {0 _
void PSCInit(void);
! ?  s- t( G2 \7 o4 C
8 X. `1 z9 O' `* V: C5 p  T// GPIO 管脚复用配置
# q4 T- b% H$ H) u3 i# yvoid GPIOBankPinMuxSet();
2 y/ j. C. p% W2 U9 O4 A4 v% t+ R7 ~! Q
// UART 初始化
. X* f) E2 ?9 c$ lvoid UARTInit(void);1 p+ C) k" a$ w9 {
// ARM 中断初始化* i3 b; x7 w2 V; L9 A
void InterruptInit(void);) [: s; X3 e4 j
// UART 中断初始化5 c, l9 U+ M! Q- a  m6 z( P$ b
void UARTInterruptInit();" w( |5 G; \1 r2 V
// UART 中断服务函数. o6 Y, |# n2 G7 v) S" C
void UARTIsr(void);
% ^' s3 B- g& O
7 Q7 R( D! h3 \- }3 E6 a) [8 [/****************************************************************************/, o/ O2 d2 C2 L9 b6 X8 o& k
/*                                                                          */
/ j, s( v0 K0 m6 }& e/*              主函数                                                      */
* R9 I3 c' ]4 c3 A/*                                                                          */
% @: T; D- s/ I9 F9 v, G/****************************************************************************/( H; j0 `7 J- g( f
int main(void)# e" g6 g  {/ d9 M: [! f. f
{
+ e; r2 g$ C4 T# R        // 外设使能配置0 v4 k( ?# [# B& W  N9 j
        PSCInit();
' q( G+ o' u, D+ q        . V0 I* S+ Q$ _" g
        // GPIO 管脚复用配置
9 K9 @# [4 g8 Q) p        GPIOBankPinMuxSet();
( A& r; k& K8 X. R! E0 ^/ q9 k  V1 D/ B: H( l9 ?
        // ARM 中断初始化
5 m9 I6 }& A0 Q) y' p        InterruptInit();0 ^) ~' Y+ l: Q" t
- Y/ g3 C& \, B; E5 o$ i
        // UART 初始化( O& s1 g3 o4 O8 g. T
        UARTInit();
- m6 }! A9 t/ H) R' Q! y5 p
4 D4 E( p* x/ i; }. Z        // UART 中断初始化
$ r( h/ C1 N7 ~1 }        UARTInterruptInit();1 S( V% \8 P# P2 t7 W% ?7 q

0 E0 D1 {) [* R! X        // 主循环
+ ?7 E2 o5 \6 @/ q/ ~1 m9 g        for(;;)
' h6 R9 r% {( s, `; A3 q0 J: P, u        {- ?6 D' [+ l2 q$ h" N2 }

& f! J1 ^! Y8 F3 W        }
" U& O/ P5 S9 `' F& H}3 q- ~$ Y# c% I& |* m
. A) O$ ]* b# f3 d# ^' i
/****************************************************************************/
" i2 J1 s! V) o2 Y& J/ A, c9 @/*                                                                          */
  o0 P5 H& H( A7 V/*              PSC 初始化                                                  */
7 @# b4 [7 I: V$ k! o/*                                                                          *// K5 S4 t2 C% c- M8 V
/****************************************************************************/
  Z) s1 L: s* Xvoid PSCInit(void)# y8 w  g: T. |+ \$ G5 k/ f, y: c# c: A& h
{8 v* y0 ~# ?3 c" P
        // 对相应外设模块的使能也可以在 BootLoader 中完成
5 M* r0 `7 v7 E    // 使能 UART2 模块, q" v7 F5 _" z5 p0 i/ B
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
( B9 i" c3 o  G! I9 ?3 i# f}
1 D( g5 I5 G# A% ], n. ^9 ^8 O8 j" \6 c& M. _
/****************************************************************************/
, D% Y" S5 L. S4 E% F! m/*                                                                          */9 @# ?3 L  W; \, w. s5 U3 [
/*              GPIO 管脚复用配置                                           */; _1 B( d3 l8 P1 T/ N5 q
/*                                                                          */
/ @, }. n* e4 G* ?2 q) a/****************************************************************************/
/ E* ^" m. j3 ?4 ]: X' ~void GPIOBankPinMuxSet(void)
1 w; M# K4 i# ?$ y$ ?# K{
4 o9 I9 a& ~4 j4 K0 r6 C: v9 @: @        // UART2 禁用流控
6 Q9 x" t, o. p5 M4 L  ]        UARTPinMuxSetup(2, FALSE);! x& n- m2 V2 U7 B8 y1 _9 o
}
! c! o( {& w* L! M# ?6 O; _
- K: H+ z" F* }% z; z9 S4 t% n/****************************************************************************/
. ^, \3 C; ?% j% R, y! @* p/*                                                                          */
: b( a& W- u, X; D0 Q/*              ARM 中断初始化                                              */1 Z' O- w! _" N) Z8 [/ |6 n, X
/*                                                                          */9 B; ?" O" v& C8 Z! e$ W7 ^; |
/****************************************************************************/
( J! V' B2 h: Y$ L' @void InterruptInit(void)
. O5 m( s1 t' w{5 }' t4 ]' z* v5 M; V! g) d
    // 初始化 ARM 中断控制器5 T4 v. S2 J2 ^, k( T  I4 [. y
    IntAINTCInit();
- x) d; s; i7 o4 z' ?, A) j5 P  p7 }+ H0 o& s) \; \* |
    // 使能 IRQ(CPSR)
" N' ]* |3 Z8 |$ D    IntMasterIRQEnable();
6 v7 j9 T# O" ~8 a; |4 r5 z, J2 Z
9 G5 g4 [2 P6 J8 x+ L    // 使能中断(AINTC GER)
) L9 Q0 b4 i  h0 ~( W- n    IntGlobalEnable();, n- m1 N2 K2 Y* k% J

3 _7 d! W' T& Z4 y* m" {# g( Y    // 使能中断(AINTC HIER)
7 g9 a% A4 g3 }  Z    IntIRQEnable();- N& }( y! [) s, t" S/ O& y# y6 p
}; k7 E. y! F  l
* }& g0 L% J0 P
/****************************************************************************/
" ^' s' v( L2 o0 L4 L/*                                                                          */* n! b+ f8 @: E1 I/ C6 D0 N
/*              UART 初始化                                                 */' c" }9 z% n1 g0 z6 B
/*                                                                          */
8 j/ ]- N1 t2 w# L5 C/****************************************************************************/
; @. i) b9 N( b2 T( tvoid UARTInit(void)( I+ F% e8 m9 S& e5 ?) v
{9 q+ R) h" x, f1 u
        // 配置 UART2 参数7 N: e6 Y5 [/ u5 ~5 O0 x
        // 波特率 115200 数据位 8 停止位 1 无校验位
$ _& Q# ?0 O( f1 h( Y" p0 a" q    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( C; y2 [4 ?  E  e. L7 I                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);( W! U0 k( h6 r! K3 V$ ?0 ^) S3 u: A
        // 使能 UART2
2 q, K7 N$ g. ~+ r! W* V/ N8 b  g        UARTEnable(SOC_UART_2_REGS);. h) T$ o5 C* v0 ~% b

8 Z8 B$ k$ x% F/ a/ ]3 A    // 使能接收 / 发送 FIFO. S/ ^% _; O4 o* Q8 _- t
    UARTFIFOEnable(SOC_UART_2_REGS);
6 D+ M3 T  a+ ]8 N2 N4 N
& ^0 K" b4 E6 [4 ?3 J% g    // 设置 FIFO 级别
9 T/ T' E  I2 ~. y* j    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
5 M* ^( m0 ?) o8 m, [* F}
: N8 A) O( h& ?" ~# ^+ E# Q/ N
/****************************************************************************/
  N$ ~! i  l7 c8 J/*                                                                          */
: W! Q* |2 n3 _* I' w3 k  L7 ]8 `& [/*              UART 中断初始化                                             */
* Z0 Q+ k1 P* j5 y/ ]% R( Y/*                                                                          */4 f$ z* w, p: L1 e1 l' g0 Q
/****************************************************************************/
7 B6 m: {7 q, D# w1 M: l; K/ |void UARTInterruptInit(void)
+ f5 U$ D- E, |6 {{
& b; _4 z4 a# [        IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ M8 ~8 Y+ ?, \/ B5 c$ Y        IntChannelSet(SYS_INT_UARTINT2, 2);8 u3 R, b+ n7 ^
        IntSystemEnable(SYS_INT_UARTINT2);6 E' ]# W2 ]9 e" P
0 y+ f6 |* G9 B2 ?- P# x/ Q
        // 使能中断
4 D- M4 j- d+ c  t        unsigned int intFlags = 0;
) O* {0 E5 d$ i    intFlags |= (UART_INT_LINE_STAT  |  \5 B3 k6 `6 U2 O# b* w4 c3 ^0 H2 D/ R2 E
                 UART_INT_TX_EMPTY |    \
4 {- q+ _: w7 K8 Q# B; ]) \* ~                 UART_INT_RXDATA_CTI);; l/ Q( U& K7 [, K# {
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 @% Q3 Z. P. y9 G; R$ ]; W% x# \}; v" q. F2 }  r& d
& L0 X9 C8 Q# _* h! b& |: G
/****************************************************************************/
( {9 j, @; l4 R& G/*                                                                          */$ X: [( @" p- ^& D4 J1 d. k0 z. P
/*              UART 中断服务函数                                           */
3 E$ ]: D+ O1 ?/*                                                                          */
1 f3 e! A7 ?1 p) `/****************************************************************************/1 {2 Z- S& v6 E. g& \* }" h& [1 p! p
void UARTIsr()
, f( I9 j. k  z8 H8 B7 U* F{
- z  L! p3 g& C0 W% ~/ l  Z    static unsigned int length = sizeof(txArray);* Z# Y& s" \) T, ^
    static unsigned int count = 0;. p6 K. O9 ?8 Y! V
    unsigned char rxData = 0;
8 F2 y$ c" ^/ D2 K& ^    unsigned int int_id = 0;
8 Q: e1 Y' z0 u( \' f# y: A5 ^! U; R" J2 K; o) I8 m
    // 确定中断源
& w0 L, K, c( O- Q$ H; W. W    int_id = UARTIntStatus(SOC_UART_2_REGS);+ G$ ]' b6 f% b: `' @% f
% ]! j9 j! \: s6 q; z6 ]* |
    // 清除 UART2 系统中断6 H* O( n; s0 a. w7 Z" b3 S% e* T8 ], j
    IntSystemStatusClear(SYS_INT_UARTINT2);" e4 M0 {% S9 Z+ p% R9 f& K
1 w% l+ g5 @  K2 o5 f3 I
    // 发送中断  ^( B2 ]5 {# y2 d  g& f
    if(UART_INTID_TX_EMPTY == int_id)1 ^. K; |" F* u" u8 T$ K
    {) ^+ I# z* ?, w1 e' V+ m
        if(0 < length)  w$ Q. p. v+ c7 W
        {2 B& X: _( T. o. f
            // 写一个字节到 THR9 N4 Q9 p  k. I7 b4 m- d
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 z2 ?9 P6 g3 W' E            length--;! o8 u" b) b: E7 c: h
            count++;
' T- f3 t8 m) o; z& u1 O, B; s        }% \4 u4 G. G2 ~' k
        if(0 == length)
$ A6 i2 ^" K* D. D3 e! V) e  C( L        {
3 f1 T: H7 d3 H  i& l2 M            // 禁用发送中断
7 F& M9 o% {) n( W/ {6 s            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);1 w' T. K; \% \
        }' q1 [( Q( d8 `. F4 c* _) W
     }, p- F! _! w3 g3 [  [
; W! w9 ]( e3 d- S2 |( H* y7 |
    // 接收中断
8 `/ r' [+ O+ C+ d2 {3 l: `. L    if(UART_INTID_RX_DATA == int_id); D3 u2 e- c7 y( ~2 \
    {) i2 f- M6 G; V% P
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ o; ]+ d+ a6 a( L3 Z" W# x" Z& X8 F
' r# I- W7 m  m6 {) Z
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ D7 U7 C: _1 e: N8 Q* P* x
    }1 N' M4 P$ K- O4 E( Z" V0 X$ }6 ^
2 P  J* ^7 Y* t3 N
    // 接收错误. v  ^; w2 T# k& P  U
    if(UART_INTID_RX_LINE_STAT == int_id)2 L6 T1 d5 F( Z- K( C' T
    {
% Y6 Y; b% n! b: t        while(UARTRxErrorGet(SOC_UART_2_REGS))) d; i8 Y# t7 j  d9 j" v- Y
        {! E1 u+ S. p% ~* Z
            // 从 RBR 读一个字节
5 O( h! `8 z2 x& ?, [" Q            UARTCharGetNonBlocking(SOC_UART_2_REGS);- N) ?" D) b, i3 ^
        }
8 e2 ~- Z$ N/ ]& b3 M6 c    }
3 g" x$ \6 }, m! i4 P' u8 r+ I+ A    ; ~/ F& T$ M: `2 y7 N
    return;
# G4 \* B7 c9 c4 C1 k}, O$ T* ?8 _2 @+ A( l

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
$ c% c& s6 j0 A9 C  s, }如果其它设备快速给你发送串口数据,你这边能正常通讯?
  l+ X7 @5 C4 L0 r
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4