嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
( \$ d% |+ W1 m! _4 ~5 Z! B! r6 N8 b" }9 [) w
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
: d1 Q4 g6 G( K0 ?+ d5 X
2 V8 w* i- i" v/ h- v+ @+ c#include "hw_types.h"               // 宏命令/ c' o9 g. U! c
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
/ ?0 f! ^7 p9 h- P( X+ t, A5 x; o#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
% Q8 _: t% p+ N  F: n; P: I3 ?
5 N& o9 g/ b+ ^2 k# W: r% Z#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
6 a3 ?! m$ w6 V/ F: F" W& a. q+ y4 N#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明8 g& R  H( A* I3 x, N( g
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
& L% W9 v0 R7 Q#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 I  G5 \( ]  y. H$ s
) B- N% R1 s6 ^/****************************************************************************/0 B* b( O/ B9 k+ `
/*                                                                          */( \  y* t+ ^5 a# r  V
/*              宏定义                                                      */
$ ^/ T0 r9 r! l* X0 i/*                                                                          */8 X6 l- P" [4 k
/****************************************************************************/
) B  j7 O/ y" w& A; h( C// 时钟) C6 \5 F7 i/ s3 a  i
#define SYSCLK_1_FREQ     (456000000)8 x, @/ E# O$ a8 `8 P/ g5 d
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
+ z. s. c/ X9 V#define UART_2_FREQ       (SYSCLK_2_FREQ)2 Y# I1 S$ y0 v6 y

$ m9 A% _2 D' P+ u3 M, G/****************************************************************************/
7 ~( _+ I: o$ W$ h6 v5 ^1 b/*                                                                          */
! K/ \1 g: R) l! I/ R2 c" k/*              全局变量                                                    */
  L3 U3 Z5 g6 L5 h; |' q, J! @7 {/*                                                                          */
+ u, @  w3 t3 Y5 U4 b2 p# i/****************************************************************************/
' t6 r! ?( G! K/ D8 ^! M3 Rchar txArray[] = "Tronlong UART2 Application......\n\r";
- N, }* a3 j1 k
' ?7 s2 D" w- s0 \( @+ p/****************************************************************************/6 N* |% n2 e1 N: m" |4 z
/*                                                                          */
! I2 ]3 Y& j- c+ b! q0 _/*              函数声明                                                    */
. y8 [" h7 }* N4 _. I* v/*                                                                          */0 F; d* O2 D4 W' S
/****************************************************************************/
0 f0 b% T- O$ O5 r// 外设使能配置7 ?% e( H# f* ^% {. N/ o
void PSCInit(void);7 c5 |/ T9 G: r0 T% M/ z. j+ Z
% {! ~: [. t& P7 S
// GPIO 管脚复用配置, f8 G" O0 E% C( H/ D6 r1 [; `
void GPIOBankPinMuxSet();
3 J- v4 C% {8 R$ z5 I
, c& |3 V! S# Z// UART 初始化
- D4 O  S- K* M( Z$ k" |( nvoid UARTInit(void);
! E5 P3 d* d7 D! ~, C  z( j$ L// ARM 中断初始化
- W9 a( _; [( O# \void InterruptInit(void);( j7 V2 D9 A  F) {! s
// UART 中断初始化
) N, O" [- o3 Z, V. @void UARTInterruptInit();
9 q2 m0 e# r6 {; I* B- ^- J// UART 中断服务函数7 l/ T$ n9 I; I3 P& Y
void UARTIsr(void);  C( H' |, b8 l
3 o& S4 W6 p( G3 q
/****************************************************************************/' v% \4 w3 |0 `; }: `1 A1 C
/*                                                                          */
. d/ f, C7 t- a. m7 M6 v/*              主函数                                                      */0 ~- E; s! Z% r
/*                                                                          */
5 C' n; p1 T/ o& ]; g+ Z  Y/****************************************************************************/
. d- L" [! T+ [/ Qint main(void)  c& J8 _2 G+ X' E0 M
{
' Z! n# H$ j: i; }2 B, H- U        // 外设使能配置8 R0 H" @! O# \% i# Z! S+ ?
        PSCInit();
0 a! q. s( D4 |) [3 E; u: s        5 y5 q9 ~) ]; @* i( p( _$ [
        // GPIO 管脚复用配置1 p) p2 m/ C0 i( [- ]$ {  P
        GPIOBankPinMuxSet();
4 _2 ?) K% H# p. |3 N3 ?" n& v! M8 k& ]' f4 x
        // ARM 中断初始化
. c! I. w" J& [2 E0 i: ?0 Y9 }        InterruptInit();
" ~; g: U+ H! B2 N  N! C) @
6 s' O! T/ F" C$ n+ h" p3 O3 x        // UART 初始化1 q2 w! N5 u0 Y& o" Z7 B7 D
        UARTInit();: L; [* O7 B. j, t5 x- ?7 ^1 S4 n

- ^7 ^/ [4 h) Q        // UART 中断初始化# B; Z+ R  ?+ ?
        UARTInterruptInit();8 j. `1 h% ~) i$ E9 N% g$ J
( z& x% ?& L" l& Q5 J3 I9 n: b
        // 主循环
7 i6 ?, ^/ ^) _5 H4 r        for(;;)/ ~" A* J( B, N- K( v) U& n
        {
/ W) L/ Q, _# R* J) g+ f8 a1 A) \) I* g5 x' z. ^! n0 T4 c
        }2 K: F" O+ e$ C& e# [8 v
}1 }. }9 l9 @0 [# M% g; P
0 B1 U6 V0 q9 u4 `  v
/****************************************************************************/
: F5 g) G; z8 `5 L' ?/*                                                                          */
8 r9 l5 o# n1 f; f5 z# ^* M/*              PSC 初始化                                                  */
( {. t9 L4 b) c8 K8 i2 W* i/*                                                                          */- W: j/ p$ g. a# z1 e
/****************************************************************************/
2 v9 Q* S- z% ]6 ~( b2 m7 }; nvoid PSCInit(void): D) `8 v7 l& S- Q9 {* P
{: [! w# a; L. [" N  L" U
        // 对相应外设模块的使能也可以在 BootLoader 中完成
- C2 y) D: ^4 r7 _6 s    // 使能 UART2 模块2 }  [; }; n; {4 K+ Q7 ?
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; f) g% o: {: H- E6 t
}
( B" y' k( Y( g4 O1 {
+ Q! d- b" o/ u  W+ }) H1 t- @/****************************************************************************/
5 j: F, V9 F% h# ?8 R  p* D$ [" D/*                                                                          */: c0 m- g+ {0 D3 I- M& F
/*              GPIO 管脚复用配置                                           */
# R) i. V: p9 ]1 D6 }/*                                                                          */) X/ f7 ?/ r+ W9 \5 K
/****************************************************************************/+ O: X; U9 q4 Y4 t
void GPIOBankPinMuxSet(void)4 k, Y2 ^( Z9 u8 O) F( u, k9 Z
{
) R  U& s- J8 X& P9 d        // UART2 禁用流控
2 b% V3 L+ e6 _8 w        UARTPinMuxSetup(2, FALSE);' x2 O8 g# A/ l: A: W$ }5 C- |0 a
}
  ]. D5 B0 g2 |7 _5 u. z$ _; K% K+ A, L* @
/****************************************************************************/; o1 \6 c1 v. I6 M" ^2 }
/*                                                                          */. C6 j5 j- t! x: q
/*              ARM 中断初始化                                              */
4 F: b# y+ {* Z1 b/*                                                                          */  M* ^/ s; |; D% J$ x2 Y
/****************************************************************************/
1 d& I" W! x2 q' P, \2 ^void InterruptInit(void)+ M( `$ G3 V- o9 I) K+ U
{" a8 r. f+ K( a" J# Z+ l! L
    // 初始化 ARM 中断控制器
$ l5 P6 A) r: \+ Y" [0 c    IntAINTCInit();) R+ m; J$ r9 l0 y6 O; a
3 v. ~/ l- S: b5 ]
    // 使能 IRQ(CPSR)
, T) }. O! V" t: G    IntMasterIRQEnable();
- h+ x1 P& M  h2 a2 e
9 x$ W9 L% X1 o: f; {  m. G0 `  l    // 使能中断(AINTC GER)
5 M# Q# Y2 \' _" u! I% z6 B    IntGlobalEnable();
8 \; K; {, W9 }3 y# T
0 O5 t! \2 l( ], D8 d. n    // 使能中断(AINTC HIER)
/ u- _, n2 y4 e. F6 M    IntIRQEnable();& a: c* l7 X) F4 l" ^: {
}/ r0 w) G6 P/ E6 p/ n: E* z  Z

8 {( g8 O1 A6 V! f/****************************************************************************/+ N3 D$ y9 r$ q* t+ K
/*                                                                          */
- j, U, D3 U2 D7 B; e6 X/*              UART 初始化                                                 */
6 t, b, X( c* y) G/*                                                                          */) E2 G9 S/ K3 L; C
/****************************************************************************/! _3 m( Z+ |1 `0 v
void UARTInit(void)& W7 n. x  }) H/ @
{
( ?  S8 P9 |- ]) |        // 配置 UART2 参数0 \# V9 W# s, D4 ~" {* n- }
        // 波特率 115200 数据位 8 停止位 1 无校验位
) i4 Z) i- `2 `5 W" `- y/ c9 w    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,$ v, Z, U& l. r$ y1 t
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 W, X6 V. Z/ S' h: e4 D
        // 使能 UART27 x7 Z3 [* k  B7 [7 G" W
        UARTEnable(SOC_UART_2_REGS);
  L' Z4 d, t& H% S; h' h, r- r, c1 x7 S( k+ }
    // 使能接收 / 发送 FIFO
" G0 E6 D2 [. g+ l6 b% t    UARTFIFOEnable(SOC_UART_2_REGS);) E) Z% N% ^  i7 p6 _: i
( f( V- N' _6 R/ E
    // 设置 FIFO 级别' c- r5 _# I+ D4 Y4 H; Z
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);. b9 ?* F- y  |1 J. X% l+ ~+ x
}
9 J3 g( y7 `) @. F8 X; D
2 W7 q$ C# z  U/****************************************************************************/3 Q' Q  z- D8 x! d% ]7 i' ~' a
/*                                                                          */
# w7 P2 p, j" O# C/ v" J( m/*              UART 中断初始化                                             */
% F+ r( i3 ?! z- \; |2 B4 e/*                                                                          */2 ]- C* U. f8 m1 U$ [6 A0 K
/****************************************************************************/  X6 j- C+ U1 B$ K
void UARTInterruptInit(void)+ S4 J+ f% |) l) d2 ~
{! V6 H# |' e' k' a' U2 T5 n
        IntRegister(SYS_INT_UARTINT2, UARTIsr);3 V7 J5 F- p3 a. C: N% D% `- E$ Y
        IntChannelSet(SYS_INT_UARTINT2, 2);
. p7 R! W: `- j0 {        IntSystemEnable(SYS_INT_UARTINT2);- U  B3 e% ^) N- ^* ?2 m

9 Z& n8 @6 Q0 }; T$ y        // 使能中断
  o9 s+ f% V' r) ?; c: ?, i        unsigned int intFlags = 0;8 p5 w9 P2 k3 Z3 J) J, `
    intFlags |= (UART_INT_LINE_STAT  |  \3 S8 l  i  R; o' c! v0 v6 O, G
                 UART_INT_TX_EMPTY |    \
/ r5 h% \% ], @) T: i# F9 F                 UART_INT_RXDATA_CTI);
, _+ P. S9 _: y: X    UARTIntEnable(SOC_UART_2_REGS, intFlags);5 ]( F8 S# C3 b* S
}% {: k6 ]! S+ `1 \0 D

) `( \8 x' f- [6 E+ y0 N! y/****************************************************************************/
8 X: ]' d( {6 r7 p, t8 u- T6 `/*                                                                          */
3 D, H) m7 f! j4 b, H* _/*              UART 中断服务函数                                           */; B7 T6 W8 }/ f: U$ a: ?
/*                                                                          */
9 c' y, G7 E( M9 Y/****************************************************************************/& X1 S) a6 g0 {/ @) \) ^3 m
void UARTIsr()  U, }8 R; p/ E  D/ l/ a4 K+ _: ^3 n
{; C+ A% y( m' f  G+ Y  I9 _; j+ I
    static unsigned int length = sizeof(txArray);1 n: C4 q# R; V/ A/ p
    static unsigned int count = 0;
, p8 {3 }% w; P" p    unsigned char rxData = 0;; B$ c6 Y/ e8 `
    unsigned int int_id = 0;
0 t7 u, e1 z2 E% ^8 v- S0 w' Q( d1 ]' Y7 \. O( }! Q# J
    // 确定中断源
7 S. j& i" B1 D  y3 _4 k7 v* V" u6 l    int_id = UARTIntStatus(SOC_UART_2_REGS);
) ^0 Y1 E1 y6 N% W, _9 k$ H2 D" J. g. E5 l
    // 清除 UART2 系统中断
0 u5 {6 m" f9 P, a' p    IntSystemStatusClear(SYS_INT_UARTINT2);& n/ K9 V6 {  \) \# ?0 Y
/ N3 B1 C) h- W9 b$ A( D7 b
    // 发送中断
) U8 `3 b& J4 _, ^4 j    if(UART_INTID_TX_EMPTY == int_id)5 Q2 Z1 ^* M- Y  p
    {1 }, F) ?8 F- M/ Q3 @
        if(0 < length)
. {" ]3 l  x8 K/ ?, j        {3 `! ^( b6 Y5 L5 h. a) E
            // 写一个字节到 THR+ j' f  c  H2 r7 n/ x
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
6 h& [1 B2 y8 ?1 k: F( _6 `            length--;( Z' V7 X& ]6 ^" W1 f
            count++;
9 g: d2 d' P/ ?! ^  C        }
- D* B" D" H; I        if(0 == length)" @$ U1 \: C" B4 h$ i  B
        {
/ f4 }- ^' T7 q5 ?            // 禁用发送中断
/ S1 P# e3 C9 T3 ]            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);9 t, {, r/ c$ k% `; b8 T- a* H
        }
7 W! Q, i7 d5 M# w8 J     }6 ^* B, s3 p, R( n/ j* R
4 ]* Z* L. k; }6 t( t) ~4 I$ G
    // 接收中断3 u4 W2 ^! v7 D/ c0 b
    if(UART_INTID_RX_DATA == int_id)
' F) [, w3 y5 e7 b+ O' P    {: p5 o7 x* ^8 g; X4 u
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" ?. n: O4 B/ C6 p" C/ c8 c+ g4 p1 j" B( l# c/ `
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
0 N6 {; f+ K2 b0 l: t' [% w: Q    }2 w. B8 S+ [& z) e# v5 V$ Y. [. i6 n
/ u" [/ z# F( J
    // 接收错误5 X5 W4 Z: _" }' s
    if(UART_INTID_RX_LINE_STAT == int_id)5 z7 N" K1 S1 t2 z2 \
    {7 N1 u7 k# l, ?% C
        while(UARTRxErrorGet(SOC_UART_2_REGS))" S/ U3 T% V% d' l
        {! O, i' f1 S7 Z8 J$ ^: ?$ M$ L
            // 从 RBR 读一个字节( z+ {" E% U" T! M
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
' d4 Y- m6 O3 l# [* P, X" s        }
5 X  S9 q6 `4 N( E    }
% b; L; t  i+ ?# c% w6 `   
' j/ f. b0 L  ]& S5 b7 F    return;
3 _) X) t  K8 `}
6 B( B# c' I- M& }9 d4 s) p/ s
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
- u8 c3 j0 S4 _" a) E如果其它设备快速给你发送串口数据,你这边能正常通讯?

# c2 U% Z( M( T' B谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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