嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
( @+ ^1 N$ Z% m9 Q7 }: B
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
: O3 F8 H" w7 B7 V! e# Z+ Q1 u8 A+ i+ p3 x
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
2 w8 N; z! V6 l! q; t! Q5 {& g/ }( r8 }" g$ _  J
#include "hw_types.h"               // 宏命令
* ^  N. m: _  C4 Y" O#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器! r( j0 W, @4 {8 D7 {) Q
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
* L6 `- u" o0 \6 q9 t
4 r- J" h6 l3 }' Q+ [9 l6 C6 R#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
0 Z# P% l  A. C! Z- f7 X#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明3 U" n; `; A! e# Q: T2 u
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明3 I4 ~+ S* _, J8 d
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 M7 Z4 k8 b: T7 {. {  g( J

, K) L# _, ^6 l) L0 P% s# G/****************************************************************************/1 `, Z0 B6 {8 @: r- p* I
/*                                                                          */1 g' M8 N! w* \# [  i% Y; b% G9 I5 w
/*              宏定义                                                      */3 W1 I: Q$ \$ o" U# |9 C5 m
/*                                                                          */
7 D  D8 L6 D4 w$ S; M/ H" M! ]/****************************************************************************/
  i+ f4 `8 |* D2 P) m3 e// 时钟
% X* N" [5 E! |6 ?7 I#define SYSCLK_1_FREQ     (456000000)  w( w# S! W8 L; e3 e8 G
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
& D1 c  B  D: ]2 G! ]" N#define UART_2_FREQ       (SYSCLK_2_FREQ)$ ]2 f9 j* u8 ]- o: s6 ^1 @
% N7 n+ a, a+ P2 N+ W
/****************************************************************************/
' S0 x0 Z# H8 `( s4 T/*                                                                          */
4 \7 b- v9 ]6 d) u: V/ J. S/*              全局变量                                                    */
: H5 d7 R$ ~  Q, i- l# r) h5 Q: {/*                                                                          */
6 J: v8 }) v' D- f/****************************************************************************/
" G7 q* y9 G/ I$ J( Y" Schar txArray[] = "Tronlong UART2 Application......\n\r";, J8 I! n) {; s  j& \
* j. K  }2 J1 T% x
/****************************************************************************/: p3 S' T. V1 _
/*                                                                          */' @( H( e1 p$ t6 u; n/ p
/*              函数声明                                                    */5 [( b8 X# b. K  ~0 \* [7 o' h2 ]
/*                                                                          */
) u5 w7 N3 Q: J2 S. U/****************************************************************************/- `; i( p0 K/ f6 F
// 外设使能配置
- p0 _8 u9 e/ J8 D3 a4 Uvoid PSCInit(void);
9 B, N/ v  h- u  @7 X
& s# V4 @, z% B6 u// GPIO 管脚复用配置' \+ }  s; n1 K, T9 Q
void GPIOBankPinMuxSet();) f/ U, K+ O2 w1 g  g$ y+ s. k

( |; V8 @: X/ A1 M// UART 初始化
+ c2 o) [4 I  R; y6 rvoid UARTInit(void);
: s; |) o- r/ W& p// ARM 中断初始化
* I0 C& T4 s$ \3 U3 Cvoid InterruptInit(void);
( h5 t9 T; L* W& L// UART 中断初始化  B( X. M9 Y- e( p
void UARTInterruptInit();" o  a& J% Y9 c$ l( X
// UART 中断服务函数+ t1 d  o9 K* |# U3 Z6 z
void UARTIsr(void);1 [5 b* E6 T, g

( g; w7 F! @  Y& B( r5 L: o- S1 G/****************************************************************************/
- K* e3 t  V5 |7 G  Y  f6 C/*                                                                          */
& y/ q. v' p6 A/*              主函数                                                      */
! v6 k% h* u& E+ @/*                                                                          */
$ E: E6 m$ D! I/****************************************************************************/
( F2 k/ h9 ^6 \$ Vint main(void)) I# P' j) E) p4 r9 L
{6 u) n7 A; Y( Q) l
        // 外设使能配置
* \% Z" S1 S4 i        PSCInit();
; N+ x/ ~! B1 r$ I       
+ |( b1 U. n3 z/ G, L        // GPIO 管脚复用配置
2 O" ?: n1 s3 N% M8 u% z  |: c        GPIOBankPinMuxSet();
3 }! Y% Z) P7 a3 O  P
& {* \- v+ E8 m. C        // ARM 中断初始化2 U) r- i5 ?" {, J, d
        InterruptInit();3 \9 q+ Y) r# o
* ^7 u. }( B+ e
        // UART 初始化
2 P- h  i" [" u9 E) o        UARTInit();* w8 E6 J: W, Q- u2 u% F! y
# M. t: P7 @" {5 X6 C/ b& f; b& f6 O
        // UART 中断初始化1 _) d; r* G5 {4 v  z) |
        UARTInterruptInit();5 g: r& B. W" U, T3 m9 Z8 z

4 {4 ^/ L7 i/ j$ G9 P9 s        // 主循环1 r- G+ X; K8 J- F  a% R
        for(;;)
2 O7 c8 P7 s' o& K/ S# A        {
+ c2 ^* k( [" `) X7 S
0 A) z; v5 [& q2 c        }7 `9 _, `/ d* g! K. F
}% w! N/ ?4 ]- C3 l/ b1 I

  T3 N* K3 g  [; q* A6 E/ |/****************************************************************************/
/ @3 Z" G( h5 a0 C1 \/*                                                                          */
1 I3 ^  O9 _6 Y9 I% Z/*              PSC 初始化                                                  */! J6 ]1 r5 u: O% p9 Q
/*                                                                          */. p5 w/ b, P( {
/****************************************************************************/
4 X8 E- s9 E7 [+ m" ivoid PSCInit(void)
( Z. n% T: N/ a7 F1 P+ ^{
. P! H/ |# k. }$ K& E        // 对相应外设模块的使能也可以在 BootLoader 中完成0 r5 _0 }1 c+ a: {1 p
    // 使能 UART2 模块! w9 W0 i0 S" {& g+ M9 Z2 c
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);7 |4 o8 l9 ~& }! R0 x
}
7 ~# T8 ^' n# U- v$ D3 k+ ^
% o: _( `" I" N/****************************************************************************/$ t0 L4 `+ c& i. Z6 X! {
/*                                                                          */
" A# {4 N6 k* J, N- Z9 ?/*              GPIO 管脚复用配置                                           */
5 t3 o5 I5 w+ P7 B$ l7 N+ [/*                                                                          */  J1 M% T' j& o( C
/****************************************************************************/. e, j. J6 v+ I5 M: Z- h) G8 }- _
void GPIOBankPinMuxSet(void)
6 W% J6 m* _7 I8 J4 O  H{; T  R7 U8 ], |2 r2 Y7 ^4 f2 V  r
        // UART2 禁用流控
8 B/ [; Y( m6 p/ t0 f# N        UARTPinMuxSetup(2, FALSE);
# s; @' Y* l: r3 k5 U}
, ]2 ]8 K7 b8 B3 U% t: u9 F3 D+ E% I$ Z: Y, _
/****************************************************************************/. b* S0 D: f7 ?& N
/*                                                                          */" ^5 W4 ^! y- X! z7 @4 z' O
/*              ARM 中断初始化                                              */1 S7 O" G1 Q. m
/*                                                                          */) a. Y; t" w2 V- X8 ~( v, J
/****************************************************************************/
( d6 }/ u$ I" N# v0 q) x0 Kvoid InterruptInit(void)1 S1 @8 X8 L9 r
{
+ H9 s2 Y* r' @7 W    // 初始化 ARM 中断控制器
+ [" h( n2 k6 U7 N9 g  j    IntAINTCInit();+ u: t, P7 |: }5 B' C4 T$ r/ K0 }
) ~; o( f4 U1 g1 G; ?
    // 使能 IRQ(CPSR)* B4 X, P0 k8 L4 o# O
    IntMasterIRQEnable();
7 z7 G: ?/ C& ?! k" M3 p
7 i  t; y" }" z    // 使能中断(AINTC GER)
% o6 m, z" l* b% [9 V9 J. Z    IntGlobalEnable();5 O  [* g; D5 v8 a

4 J9 n2 w9 z) t, k; g, J5 Y    // 使能中断(AINTC HIER)
& g8 c' ^/ }9 K    IntIRQEnable();* w3 y6 w6 K6 t6 T
}
: h0 e! _. m/ s& f: E+ \9 R
- M+ m' h* u$ Q! f' V, ^/****************************************************************************/5 Y  S1 m. ~7 k5 w9 H# q
/*                                                                          */  Y3 G! t$ j+ ^# \5 d4 Y
/*              UART 初始化                                                 */2 J' H  U' F$ b* H: z. j
/*                                                                          */4 D$ [! n! h% D/ w/ A
/****************************************************************************/
) t1 g" Q( G% n9 J0 Q- ovoid UARTInit(void)
* C& C# }9 |4 T# V# z! a* F( E{
4 a8 M' l$ j; U        // 配置 UART2 参数& `+ ]/ B; T  _, d! `9 d) x! ?' T
        // 波特率 115200 数据位 8 停止位 1 无校验位
- K% J% ^. y3 w3 L9 X8 [% {: H; B% d    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 y9 W+ [6 M# _( W* q* B                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! ^" X! A4 ]$ o- `' u+ L. ~# {
        // 使能 UART2
$ M8 n2 I2 r1 o: |& ^& b" Y        UARTEnable(SOC_UART_2_REGS);
+ l# v/ z3 m2 h& Y7 u/ g' y0 f
/ S, c9 L# T' ^  @    // 使能接收 / 发送 FIFO& p* y6 U* y! E: c3 r
    UARTFIFOEnable(SOC_UART_2_REGS);- Y4 g% Z5 [$ P* F8 \

' _0 t3 k3 `5 j- b    // 设置 FIFO 级别
/ W4 I* f$ U' y) w6 B    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" D: v1 I9 ]! ]- K3 f7 o
}
! x& }% l' c% R' k
4 e) J! ^2 U1 k( k! G/****************************************************************************/
2 U; ~4 u( W5 g. H/*                                                                          */: j. S4 V$ _# A) [; |/ K" [
/*              UART 中断初始化                                             */
, U: \5 {: X- }: \2 S0 c/*                                                                          */
5 p' F5 {. D& \/****************************************************************************/
$ \, q; \) A4 cvoid UARTInterruptInit(void)
; Z) E0 N, W* J5 {{$ {* H8 b8 E: X- _- Z3 T6 P
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
; ?3 v" C& S2 \, @6 r  C        IntChannelSet(SYS_INT_UARTINT2, 2);
; d7 B! r, M, f+ b. [. W        IntSystemEnable(SYS_INT_UARTINT2);0 N$ V& ?$ q6 K% c( d% K! M& U

8 R7 N1 e- @, J        // 使能中断2 X3 j  v  m5 I
        unsigned int intFlags = 0;5 q, x; B$ Y, Q) X  e
    intFlags |= (UART_INT_LINE_STAT  |  \8 u  A2 W8 t' X& @
                 UART_INT_TX_EMPTY |    \
1 Y/ H' d2 U/ Y! b8 M                 UART_INT_RXDATA_CTI);7 }9 _" C2 P' X) O
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
& K! M. |& D; O9 D( Z4 ?}' B1 x& ^0 _2 l

8 }; Y5 P3 Y  K4 w( B6 b/****************************************************************************/% K$ h1 o! `6 X! P% C5 d
/*                                                                          *// k6 M+ j" J2 l" R- P
/*              UART 中断服务函数                                           */
! q/ h  L+ c7 M- ?9 n7 ^/*                                                                          */: n0 h( F) `2 Y. w, ~' ~
/****************************************************************************/
1 R+ A: K6 O, }" h9 qvoid UARTIsr()
; [# q' x: N' D9 Q, V; M) L0 Q4 e{
' T* O- b& k' F4 C* |    static unsigned int length = sizeof(txArray);; g$ H- V1 n/ F- o/ Z
    static unsigned int count = 0;& C7 |) ~, K* C5 d1 W& r
    unsigned char rxData = 0;
3 ]8 T" a; O! r: d4 j    unsigned int int_id = 0;
9 }3 v- X2 U! ]; _) B- o% L+ ?8 W; ^  w8 U1 H1 n& ?
    // 确定中断源( P3 o6 g. a/ e1 E2 ~( M2 N
    int_id = UARTIntStatus(SOC_UART_2_REGS);
6 }4 j8 k/ Q# q$ R( O! `$ ?5 i$ g' ]5 Q' o
    // 清除 UART2 系统中断
; ]; ^/ h( x& n/ \. Y0 l    IntSystemStatusClear(SYS_INT_UARTINT2);0 c, ~9 u  [6 u( A+ R7 Y

3 B  v6 a" C7 _" t; U5 A5 m0 V    // 发送中断4 K  h' R: q8 n' U2 K
    if(UART_INTID_TX_EMPTY == int_id)5 R& u! w3 M; t' y& w4 W
    {  R" [0 C7 T( l1 N$ ^
        if(0 < length)
6 U& o  x0 S7 Q4 m7 Y; L( b# d        {
; j: B9 i! e( r1 M* M+ v* T6 `  C            // 写一个字节到 THR& I& d% z# d. ]' y9 r. T
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
1 L$ ^" d& X8 m, c2 G            length--;
1 l9 m$ S2 t  J2 Z4 T            count++;- s7 \9 z; E3 z. Q# D( \
        }
4 n5 a3 }3 z+ S% c) S* v        if(0 == length)* K! t  [( [8 ]- V# Z/ W" v
        {
! v* q9 I8 C* @+ q% \9 {            // 禁用发送中断. C- R* P: O- K  f! W
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
! U! H& ?8 v0 N$ d        }+ F: W6 B5 Z( _( E
     }9 E' O# `* |+ y! y

- J8 C& }3 G& E7 j' s, M! Q6 b8 w2 v    // 接收中断, ?6 \2 T' z7 I6 m
    if(UART_INTID_RX_DATA == int_id)7 e5 J* @1 p) d" O6 Q: L
    {
! K3 M0 K2 i  G) p3 q2 x. k6 e        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);, K0 J# M5 t" ~& N; ^0 d

4 o! I0 o9 ?* {8 v) H        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
  v+ S: S6 k* A6 E# b4 Q  C    }: e2 U  o! U' ^: ~- o0 b8 b
/ e$ G' t1 d# d' K2 B
    // 接收错误
. i( s& I+ r$ Z6 u    if(UART_INTID_RX_LINE_STAT == int_id)
. f* ~* a  x2 q! e+ S' E2 H1 M/ S    {/ p- _! c$ O( q5 C) `
        while(UARTRxErrorGet(SOC_UART_2_REGS))
7 V3 |3 n! [' A# M0 d        {
" [" |8 D9 t. a9 t            // 从 RBR 读一个字节
6 P# q2 f  ]( Q            UARTCharGetNonBlocking(SOC_UART_2_REGS);
, O/ r6 a+ d$ Z9 Y/ r        }( |+ z: d& @, ]  o, `2 R3 X
    }
! ?0 @0 N4 l  G   
$ _3 i( S" H% y9 _    return;5 A) p8 ^' E& C8 j# S1 T1 w: y
}# O1 Z, x% j3 @

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:256 C2 d' `# }/ N4 K1 F% k0 v
如果其它设备快速给你发送串口数据,你这边能正常通讯?
. S( H( `6 z" Q( o- D& ~8 q
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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