嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
6 A+ v1 E) m, U9 x  h( h* D: k
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。  z' \% {$ s4 e& }7 Z1 \
2 q/ x4 T0 N$ p( x, ?: @$ w
#include "TL138.h"                 // 创龙 TL138 开发板相关声明% n3 n/ W. t3 l! f

/ p+ I# C8 g- Q+ {+ ~# B8 I#include "hw_types.h"               // 宏命令
  m# J# l% ?  a" `0 V( T  ^#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
! b# v3 C0 P6 C6 e! H2 N# }/ R5 j#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器6 y  P' s3 W4 P: U1 ^
  ~8 P3 Z# r, y: t2 a8 m5 L! @4 W
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明1 O; J% E* |1 C  `; j5 ~$ ~
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明3 o; z! T1 y2 u# P, `0 L7 x0 Z
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明4 m# F* x! C- _% U$ a
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( m8 ~6 \% A9 u. h  @) f
: R3 a; S3 @( S7 y6 n/****************************************************************************/; \# s7 t( n/ o/ @3 M
/*                                                                          */3 r8 [+ j: }7 o: K% u* R+ R2 b
/*              宏定义                                                      */
+ A$ x$ d+ W1 c+ a- C; J1 x/*                                                                          */7 {" M' O5 p' b+ |5 V8 F
/****************************************************************************/
4 U" }" g4 P& s6 J' F// 时钟
! ^0 }8 A, y! D5 t- }) R$ h#define SYSCLK_1_FREQ     (456000000)& G0 v3 ?' y. y
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
) ?$ \4 ]0 W) _( C* `" @3 |' f* c#define UART_2_FREQ       (SYSCLK_2_FREQ)
9 u. R) e3 I* n" ]; q7 J
* w; M! c/ ^' s4 D; E/****************************************************************************/! c: ]2 {0 S4 P
/*                                                                          */# w- {" s3 h8 v! r3 X
/*              全局变量                                                    */0 k/ S# A4 I$ W! B# [  s' V
/*                                                                          */
; K3 H7 q- O" H# Y# _6 {8 E/****************************************************************************/( K9 c; d" s& P2 o
char txArray[] = "Tronlong UART2 Application......\n\r";
# @0 D" k6 l, e3 G+ c& x: {
% F. e* b# W6 P- u7 f/****************************************************************************/
- R" A1 }9 I! w6 r$ e* K& x/ h2 X/*                                                                          */+ \  t6 Z  W: p0 c0 {; M& E. O
/*              函数声明                                                    */. B7 L, d0 C1 B( s& \. v
/*                                                                          */; n& M% l- N4 ]! W* L
/****************************************************************************/( F" j  n* @2 @2 J* X! h7 N
// 外设使能配置
0 Q8 r$ Y$ g' B2 d1 T0 uvoid PSCInit(void);- P  q4 ?* L% s& x& c
% j. t1 \$ ?2 `$ C
// GPIO 管脚复用配置6 x; E7 h. a" z% W5 z. i8 l
void GPIOBankPinMuxSet();! B" [. d- v; }" r& W, g, T* E
3 T3 i5 r/ f4 e/ [1 o1 s) _
// UART 初始化; g1 N- r) @7 W+ H3 d
void UARTInit(void);# Y" T& }% n6 L. M
// ARM 中断初始化
+ y" ?  A' @- P0 ivoid InterruptInit(void);6 _+ P- w/ o3 K( {6 n3 y9 z. E
// UART 中断初始化
" ]) x0 @# P7 |8 d5 v/ s8 U  Yvoid UARTInterruptInit();
2 K( L* z1 I* J& ~// UART 中断服务函数
7 n. I5 F: R; j* Z6 F6 ]void UARTIsr(void);) W  Z6 i- f3 Q) C3 r

& M# w  S- K# k, i/****************************************************************************/4 B+ T9 y! ?) w; p  ], }
/*                                                                          */* Y/ M- x7 h' L- q' ?$ N  s& O
/*              主函数                                                      */
9 d; `3 Q* h3 o, B' y3 L/*                                                                          */
' |( g3 s' \; [/****************************************************************************// B/ t- ?9 |) T* K5 Q2 M2 V
int main(void), i: Q  K$ n6 j. I2 ^$ }. y8 W4 Z
{
# n) v0 C" U5 `2 p; |6 z        // 外设使能配置
3 @3 K  U& J7 ~; x& H) [        PSCInit();" o) Z* k0 @: L9 C0 K
        ( x8 F& T. ]8 Y$ ]$ b) t" ~# f
        // GPIO 管脚复用配置
: }9 q! m9 y, t  @2 F; k        GPIOBankPinMuxSet();
2 B1 I6 `- L# D/ d% U8 \6 O* E) T5 F- e8 J; L
        // ARM 中断初始化
3 H: E3 m: G! }        InterruptInit();
* a" }3 N7 B, m1 l7 l; e2 X3 V( {6 u9 g  Q
        // UART 初始化
* k6 |& W* W- c2 w4 w) |' J" ?        UARTInit();
1 l2 r( @, ]% w+ h5 k: x2 F0 k1 l% p# U9 ?6 m( @4 H9 I0 ?1 t
        // UART 中断初始化
. P  Z# v2 N! G3 J# y! ~* S        UARTInterruptInit();- W% }* o8 c8 r3 ], s' S9 H& D% {" N) E

6 h- h1 ^8 l6 j. K6 @& ^) |        // 主循环7 J! }2 f, f, D# B! u' R9 }
        for(;;)
5 U4 u9 y+ `2 R  n        {1 f# f7 S- `, `$ k
: x3 G8 j: ^0 `, W" V0 m, g
        }. G3 o  {2 O7 i# l  `- ^( w% L% y
}
& `; Z1 T" ^$ D/ e( U  j
6 w6 X# q: T% e" E3 Z% P* G/****************************************************************************/# M0 @1 H) c9 F+ J9 l
/*                                                                          */
3 ~) `) h" n- B7 {1 n/*              PSC 初始化                                                  */+ f5 {4 \9 D" D% v( \" M/ T
/*                                                                          */1 I' \$ h4 u7 m2 b! x) A
/****************************************************************************/
  x# e1 Y7 u: L8 U1 f& |( ^void PSCInit(void)2 T) G# f# E+ I7 N* t* h/ q  Y; _
{* E( l6 B) F. P7 r* N; M2 Q
        // 对相应外设模块的使能也可以在 BootLoader 中完成
0 k* `# f$ O! U    // 使能 UART2 模块: O5 c* \% I% P/ P! j- k4 K
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" [6 b8 u+ E+ ]. u}
* ^* }5 `- f; c4 J4 \) E
3 Z$ [! q1 ?  Y0 P7 Y) J. u/****************************************************************************/
) b( K+ T# }+ i/*                                                                          */
: ]4 y+ p9 L; K- V2 ]" E/*              GPIO 管脚复用配置                                           */
' r& I: M5 ?- K, R! t9 U/*                                                                          */4 v$ f  [, I$ o$ F) Z" ^
/****************************************************************************/
1 G. b- D2 D0 nvoid GPIOBankPinMuxSet(void)
9 k! ^) ]( h( R# ~{" d4 B% g, w6 m- }% R8 _- O' B9 x4 ^
        // UART2 禁用流控
* n8 H) g( w( V7 \; d: v4 G        UARTPinMuxSetup(2, FALSE);
* Y& s% D. `7 Y$ f! q" i}4 }/ [6 y0 y/ k) J* K2 G# t
8 ?# a. w# @. L. [8 t, C
/****************************************************************************/+ q# Q2 Y9 e9 U2 \* T  o# O
/*                                                                          */
) m3 w0 U4 V5 q& A/*              ARM 中断初始化                                              */# z3 J& z' a( e+ C1 C( v
/*                                                                          */
& }- [( o" Y  [8 ~. r% E4 R- E/****************************************************************************/+ h; J; r2 Z4 m6 J; @
void InterruptInit(void)
; B# @9 ]% g! U3 o; q  }  {7 A$ v6 h{
2 m" E: r4 t$ P1 q" z" Y* O3 r' P. t0 K6 F    // 初始化 ARM 中断控制器. X. ~0 _+ F, g9 L: _5 N( ~0 Y
    IntAINTCInit();: u! {/ W8 M( N% T( M% M* \+ z

$ A7 f* r7 Z& a    // 使能 IRQ(CPSR)) P. o  a8 S+ d
    IntMasterIRQEnable();
# S& G1 i, w1 S, h$ _/ s, u1 ~0 K, ]* H/ f3 c, j3 Z2 C! p
    // 使能中断(AINTC GER)9 K( K0 w* V; S$ P
    IntGlobalEnable();
- C4 m. n/ A% P! w* ~  Z, h- C) Y/ |1 Q3 B+ D8 k7 E. c
    // 使能中断(AINTC HIER)% L1 c6 y) [) _1 P% K* o1 z
    IntIRQEnable();" B4 z8 j6 e2 K& t  u3 l2 N4 E
}
7 Q4 M9 V9 c+ R4 s. R) T$ h  N% b/ ^: y7 G+ ~$ l
/****************************************************************************/6 |5 N1 m# A- e. \) O
/*                                                                          */4 J7 s0 {1 X) Y+ u! O' C& [
/*              UART 初始化                                                 */
, Z2 N1 A5 ~+ a) G9 t/*                                                                          */
5 `( f9 A  x, a$ ?, J* b4 c/****************************************************************************/
+ Q$ i* ^5 ]3 ?" J2 X1 Zvoid UARTInit(void)3 ^" y8 }8 }  {! K
{+ D2 s1 _/ _% A0 j8 {0 w# s
        // 配置 UART2 参数
* H- p* e& h; w5 p) q        // 波特率 115200 数据位 8 停止位 1 无校验位- B  x" N4 @1 B6 [2 n* f$ A) Z( j' t
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,) Q: q- ?! a  u
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);2 u% R. P  d% J. ~/ b! ]( m
        // 使能 UART2( Q6 U1 u5 ~! @& }
        UARTEnable(SOC_UART_2_REGS);
9 V2 s3 m8 N2 z, G" ~$ A
2 f( U& R8 x' |$ v6 C3 d  ?    // 使能接收 / 发送 FIFO& o0 R4 V# @" H, c9 o$ y7 y8 X$ e& X
    UARTFIFOEnable(SOC_UART_2_REGS);* z. ]% n! E1 f7 M# V& P! y% {
3 w. B7 o1 @6 ]4 \
    // 设置 FIFO 级别9 Q; d* P: I/ c6 x' |3 N" |
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
- b! }. w6 R6 O# @& o}
2 Q6 a) p3 U& J- p
; U/ G4 n+ D( N& \$ |" V8 K) w8 _/****************************************************************************/
  r( O8 f3 O) h& X) _: F/*                                                                          */9 w  F) H2 C1 i/ }
/*              UART 中断初始化                                             */5 a$ H2 O. A, j2 C* x
/*                                                                          */& g* j5 b8 l4 P7 f- P. R# E# f9 H
/****************************************************************************/4 f9 K) i. s/ q! f6 O
void UARTInterruptInit(void)1 _2 t" Y) d3 G
{% f, a! p* C7 `4 ^4 [5 _
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
9 B  G! p* U) C& r. K        IntChannelSet(SYS_INT_UARTINT2, 2);
. x' ?5 Y% |5 P9 k        IntSystemEnable(SYS_INT_UARTINT2);
8 e! M; n" \9 Z, ]" Y& A9 l: n  [1 S
        // 使能中断
$ g% O# R; F; F& {        unsigned int intFlags = 0;
# I# C& s* t* C2 g    intFlags |= (UART_INT_LINE_STAT  |  \
% g1 \2 K4 X- ~                 UART_INT_TX_EMPTY |    \
1 Y8 \8 |) T/ I1 n0 [                 UART_INT_RXDATA_CTI);& D9 ^/ F) `- \4 S9 o
    UARTIntEnable(SOC_UART_2_REGS, intFlags);( o( v( h0 N; }9 f
}
2 T* |' K0 a$ v6 L$ m( E
$ `# k3 h  g2 c. F$ ~: K/****************************************************************************/# k& A1 l& x( N0 v0 j. A; y5 n
/*                                                                          */9 n& ?2 o4 @3 E- B
/*              UART 中断服务函数                                           */
) I& i6 v( Z7 S/*                                                                          */
% |- W0 n  N1 L4 E% L/****************************************************************************/$ k' {2 p9 ]" L3 ^/ k
void UARTIsr()0 h" s6 }2 [8 h# h2 o
{  O* R4 g7 w- r
    static unsigned int length = sizeof(txArray);9 k4 K; z# ^- Y+ \+ B/ a/ W# H
    static unsigned int count = 0;
! g2 S( V% G: B6 Q* T' [    unsigned char rxData = 0;$ U* v2 r! a+ g: G$ l- }0 x8 @
    unsigned int int_id = 0;
: z6 a) c# O& Y0 M  G+ y* F/ B' S2 Z/ u  }  ?
    // 确定中断源
( @- K  W# n" t: t    int_id = UARTIntStatus(SOC_UART_2_REGS);
0 \1 A9 U* V+ [& \2 O* `
; ~# I' i! ~- L/ f    // 清除 UART2 系统中断
- ~0 ]; \) E% x$ E0 Y) I    IntSystemStatusClear(SYS_INT_UARTINT2);, u  T6 V1 U4 z+ X0 X& b% u2 K
1 H! G; l8 F( r7 `' c
    // 发送中断% d* D6 O& [) ~( Z/ t
    if(UART_INTID_TX_EMPTY == int_id)
- D; c3 Y- ~6 v: W# m- l  B3 j    {
+ T7 e( K) N' a! l+ D9 e        if(0 < length)
7 ~5 C( m% N  d) q: {/ l' Z$ e& z        {
8 U" G( V* f0 _4 `            // 写一个字节到 THR: Y6 X, X  D% k
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" @# ~6 u/ S! j  R4 W) I
            length--;3 f5 F7 R" X" |) V3 \- G
            count++;
* t' A7 [( w" G& {0 o        }
/ h4 z' h9 {/ V, k* Q        if(0 == length)4 E! T6 S2 Q# O9 ?; z: a: F
        {! U0 |/ |+ {  k
            // 禁用发送中断$ N6 n" c9 u7 {9 u  t9 |* g
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
" X) e' `0 d% N9 T7 j        }
( H  x: N: d) y6 s6 P( h- ?# W( H     }$ n9 a5 ]- |. a3 V

6 k# |5 h( j: N( l4 `2 k# z. j& N" f+ `    // 接收中断& O$ r$ p8 Y# D4 E
    if(UART_INTID_RX_DATA == int_id)
, w7 q& v/ R0 G) v    {
; X; Z8 {6 _0 ]4 e        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);. o. E$ f7 j8 f4 h! C/ p
: I$ A9 q( I' B( U
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# H7 P7 S6 k4 `" \    }
6 x( E2 J1 i- c# E0 c
. d9 |9 M+ n0 S* K% _    // 接收错误9 U) L. H. l4 \/ l
    if(UART_INTID_RX_LINE_STAT == int_id)8 i$ @- f/ v+ z/ N; {4 C0 H" f
    {. \/ Y' ~9 X+ s: y9 `+ W4 w
        while(UARTRxErrorGet(SOC_UART_2_REGS))) A2 B& [- Z6 G' P( x6 T
        {
8 D9 m2 H# ~: C7 D0 z  R/ d- G            // 从 RBR 读一个字节& [7 S( d" _( k3 D2 H* b- d
            UARTCharGetNonBlocking(SOC_UART_2_REGS);4 J. c7 Z! \; a! n4 z
        }. U7 s% g/ f3 Q9 |
    }- R+ C. N) A6 o( v4 i
    ; O) C+ X, q3 o2 V) G# P$ N
    return;- ]* l5 N- N! A" N7 ~0 M9 Q
}: L8 y" ?) t* K1 o1 ^* Q0 q* t& `

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25' l% e8 J$ i" \: U+ v9 J9 F
如果其它设备快速给你发送串口数据,你这边能正常通讯?

& x+ k# [, R& q9 f" F% q谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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