嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
5 z' D9 i% E- v  n0 @
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。$ c8 D. n2 w! R' E" @! Y, t4 O

5 a0 q1 X5 \& e; b#include "TL138.h"                 // 创龙 TL138 开发板相关声明
8 h4 C! y, t# [  H0 j6 v  Q
& _( }( t4 N7 c& R) n#include "hw_types.h"               // 宏命令; a3 H7 g0 _4 S+ j" k
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
" X1 L- k* l. p$ H% O* u5 E#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
# z8 O, C" h! k# i7 ~2 s1 L6 @$ N: J9 x* }& s' B
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明. {; G* G$ u1 d0 |2 v0 x* K& Z
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
' E' N9 H7 ^8 B7 I#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
0 z/ M2 n/ }. B3 g( |5 O#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义, O* c+ @1 e) ]: d' l  ]" ]

3 y8 h& `: U0 r1 ?+ M/ L/****************************************************************************/
" g" g" O' Z3 }/*                                                                          */
" A1 U2 Y; D5 f* {/*              宏定义                                                      */( `3 o& o7 h% w/ H. c9 d
/*                                                                          */
1 C+ c) t/ D4 N" m5 I/****************************************************************************/
& Z, M; r" z4 L/ ]" p& s// 时钟
! ~( p! Q1 R0 G( w#define SYSCLK_1_FREQ     (456000000)& x2 @  }7 u) z2 W
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)2 c. V' X$ {8 R
#define UART_2_FREQ       (SYSCLK_2_FREQ)3 W5 @  H3 @* l- g
5 ~' k& `# y8 B  i4 e3 M) U: t6 Q) A" v( u
/****************************************************************************/+ W0 y& N$ v/ k$ S$ O- E8 ^6 k
/*                                                                          */
# s  s! B3 L: @/*              全局变量                                                    */
3 H2 j' ]* e, M, [$ y/ e0 W/*                                                                          */- ]% `; i0 I8 j
/****************************************************************************/
6 e" f1 j, n- s! J0 d; ~9 f" c+ qchar txArray[] = "Tronlong UART2 Application......\n\r";
# G4 F2 H0 T5 Q+ m$ c: z& G- \- }2 H! i8 v* T8 n
/****************************************************************************/* n( q9 g0 \& H1 Z
/*                                                                          */0 I+ x! w4 |, Z. w3 R
/*              函数声明                                                    */0 x8 z: k0 U% ~" B, i
/*                                                                          */2 m) Q3 T! \& I% }* H
/****************************************************************************/# [2 E! y- q* |# d
// 外设使能配置
6 Q2 k" c; ]/ ^! wvoid PSCInit(void);% w4 A) v# u+ b4 X* |

* o! ]$ `$ l$ T& E0 T; V  C7 Z// GPIO 管脚复用配置
( \. F4 H. t% p4 e' @; {1 [void GPIOBankPinMuxSet();  N7 s5 R/ u3 w- t' P
/ @# y; J' `$ U. u7 r* Y1 ]3 I
// UART 初始化; h; X6 n: M8 b$ f9 C& R1 K" X4 k
void UARTInit(void);( a! S, t1 e4 n
// ARM 中断初始化* S- \  X, `  c
void InterruptInit(void);
% M* c; N( c) l6 J; j$ H// UART 中断初始化
* I- L1 W4 @7 cvoid UARTInterruptInit();
' ~3 c0 V+ K# q9 E// UART 中断服务函数
* D: b  [4 X8 j. t9 I' L" Evoid UARTIsr(void);( q. d$ B0 ~8 Y- ]0 _6 T( ^# O

5 n2 g' R5 j0 o9 I& I2 I. V0 m) `/****************************************************************************/( V* [% B; V6 C7 t/ X4 J3 S' c
/*                                                                          */
2 t+ H2 I/ G/ ~/ P7 c/*              主函数                                                      */' @9 d: V8 _0 F5 C! Y( F3 k6 g  Z& |
/*                                                                          */7 q+ U# f  C3 j" D. G8 k
/****************************************************************************/% G& h5 c' x" Q( ]6 O# `
int main(void)+ t' j: ^$ l( U6 E
{* X/ N$ {, X) Y) p# r
        // 外设使能配置
; Z. z- ?9 D3 n+ Z# G' T        PSCInit();
7 V' k/ Q. i! Q' W/ h4 i* B       
2 l6 a8 A, x) _. p* {6 B" T        // GPIO 管脚复用配置
# s9 E+ ]# v" N, Q8 W        GPIOBankPinMuxSet();/ P+ z% G  ?! y4 g

6 R2 E+ c3 E1 t$ U1 M        // ARM 中断初始化( b' \) s7 a5 D% [8 V" T# M7 J3 h
        InterruptInit();$ n" o. D' T3 ]. i( G" \- X

. k2 q5 k: y3 o- s        // UART 初始化
" s9 R: n9 ~+ A: ~$ L: F. a, z        UARTInit();
/ A" l* S: g; H+ A" ~8 v% p" C; [5 M* `* X( A% Z" \
        // UART 中断初始化" E+ M0 f: e( n' ?( ^" I7 b' O
        UARTInterruptInit();* U% \) Z2 T# q# n$ A
# ?' H  J  z! U
        // 主循环
( N' K6 j2 d: e9 q        for(;;)
( y1 i6 o. J: q5 s        {
- ?. h0 k) L$ F+ c1 J2 S$ @' `' c* \+ |2 l
        }
( j0 ~# o! L) v4 e2 H% R}
( E! N; p% V. A6 V* S- [0 h1 A( `' S  B) v7 m; x
/****************************************************************************/: n' q: ^3 j! u
/*                                                                          */
( V4 p( E, l& m( J+ U" Q0 {9 g/*              PSC 初始化                                                  */0 d& o3 |! x* s. k- b
/*                                                                          */
0 h% c# a9 R1 l! ]+ W/****************************************************************************/
" {) ]2 X& k3 b0 f  S8 Bvoid PSCInit(void); z# [+ e; f8 B4 j# z
{8 N, U7 Q/ K  {+ P7 M" t- d
        // 对相应外设模块的使能也可以在 BootLoader 中完成3 b  E4 m2 U: r8 h+ C
    // 使能 UART2 模块
% E$ z. g/ f& j) _% v    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);4 g" h& [! o% R5 f
}. h$ ^' a4 e+ s8 m" c* V' ?
5 q" M2 h3 P( R$ x' J
/****************************************************************************/1 b- B. B' T- T# h
/*                                                                          */; x: M4 s. J, G: t  ~
/*              GPIO 管脚复用配置                                           */& V2 z; y+ C$ ?) f) j
/*                                                                          */
7 s" e3 a, }% b2 ]' b7 H/****************************************************************************/
+ J/ `% O' ~8 U+ Y# ivoid GPIOBankPinMuxSet(void)) a! `1 W  Z% E1 O' {- V1 |) O& p/ E
{! W/ M* O" G2 Y8 ^, }7 A
        // UART2 禁用流控
9 H. e7 m5 A% P: F) ~5 ]2 ~2 p# |        UARTPinMuxSetup(2, FALSE);8 C' w( N" u: M  z% a
}
5 Q! Y+ R8 t5 Y: ?8 }3 _( Q4 h9 d( }1 P
/****************************************************************************/
; H; d0 n" r  l( r% s, e: j/*                                                                          */
2 I. s9 }+ v0 O9 z) @& [/*              ARM 中断初始化                                              */
& }" U: n; j( Z$ a( ]/ n9 R/*                                                                          */
! N7 b: s5 z$ o+ g7 f/ d$ Z$ e- K; c/****************************************************************************/
6 y* V+ Z- z  L5 L) g  O2 pvoid InterruptInit(void). J/ J, P0 e/ R5 C8 c. b* A
{- W& q* k) D0 W" f/ x5 \
    // 初始化 ARM 中断控制器
2 R* ]+ \+ A7 C0 a5 E# x    IntAINTCInit();) o( K8 P- r! H0 m: x$ C$ h
6 H6 A! t8 C  Q  d
    // 使能 IRQ(CPSR); c3 P  r0 e5 Z9 H% g9 t
    IntMasterIRQEnable();
; D" A3 Q# \. D& F1 Z
% h9 D6 g: W- O* q$ a2 x- d2 ~( r9 y    // 使能中断(AINTC GER)
( F$ T% J% t' {1 r+ ^2 i    IntGlobalEnable();* J. ]- ?# w2 h4 v8 {$ ?
/ Y9 @: k9 e1 _1 B
    // 使能中断(AINTC HIER)
& h6 b2 V3 ]: b, a% ?    IntIRQEnable();
4 v+ v6 z8 C. w) `# Y! w}% z" `) H) p7 `0 s& y7 G
' P: R* a0 O9 E' C
/****************************************************************************/
. E) P8 w/ M0 Q. N- q' L/*                                                                          */0 ?- \$ A  I$ R- {
/*              UART 初始化                                                 */
5 ?5 {2 `! O4 i( S5 J- Z% f/*                                                                          */
" d# P8 Z3 F# I  L; l: y) b1 n1 j3 h/****************************************************************************/
, W* m7 m8 K: S$ N$ E4 Dvoid UARTInit(void)
, g, l, w- B$ Y5 G; r, b* H% O! s7 V" y{4 x; x- V8 h5 v$ W1 J/ M5 _
        // 配置 UART2 参数
3 C+ a. o" k( @1 W/ }        // 波特率 115200 数据位 8 停止位 1 无校验位* |. t% _6 Z) O" Q& z# l* Q* U
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 @3 x, h0 r  |' o& h5 D- j. \                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);; B+ A: d( R6 v+ y& f' g/ E! B
        // 使能 UART2
8 y' g  x+ T7 S' r  }9 _* b        UARTEnable(SOC_UART_2_REGS);' i* v5 \# h2 u1 @

$ k$ E8 h4 n/ ^; v8 K$ Y    // 使能接收 / 发送 FIFO% v4 w! X9 w% E2 O2 M
    UARTFIFOEnable(SOC_UART_2_REGS);
' v$ Q9 Y- s" v; h) t6 T0 ], T, ~# p. ?- V# e2 }' t; C9 o( d8 Y
    // 设置 FIFO 级别
( _7 S* V$ R) V    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
. i: n+ Y# N# O4 a; }; j}
5 M( z0 K" I4 V' I% n9 h% J- d! V$ l9 C
/****************************************************************************/
; N9 w6 R+ e1 p7 K/*                                                                          */) x3 c4 K6 @' j% b6 f( H
/*              UART 中断初始化                                             */
4 z6 ?6 ]. h# Y- ^( k/*                                                                          */& N+ P  e7 T, f  ?! O$ t
/****************************************************************************/# s2 I9 j+ z8 q9 r9 E
void UARTInterruptInit(void)
( t$ _9 u, G. S  A6 A+ n$ c{
' |6 V1 r9 I* C5 ]- l# ]) ~        IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 I6 y- c' M3 H1 n5 c6 F        IntChannelSet(SYS_INT_UARTINT2, 2);
* g; L( M5 L' v( m- q$ N3 ~        IntSystemEnable(SYS_INT_UARTINT2);  j6 e, t& R* s: \

  B3 `4 x! H1 z, A        // 使能中断  z0 R: Z# a( n) ^& Y: s
        unsigned int intFlags = 0;  k3 R: v3 u- A5 N9 a1 S8 i: J$ _
    intFlags |= (UART_INT_LINE_STAT  |  \" D2 ]: ?4 c7 q( D/ b+ H2 n  L$ k" b! Q
                 UART_INT_TX_EMPTY |    \# d1 \# H/ h1 T+ |, S9 u. j  @
                 UART_INT_RXDATA_CTI);
& Q% G3 R3 }# e( C    UARTIntEnable(SOC_UART_2_REGS, intFlags);
% \" t, e( J- [}
; V1 j$ U5 y1 H& d
* }; K+ N( S1 ^/****************************************************************************/
) y6 t" ?2 s: B& F8 I* g; s/*                                                                          */
" Q- g. u& Y, h/*              UART 中断服务函数                                           */+ M, @2 ~# e& F/ F- [( m! X1 H8 v
/*                                                                          */
% k0 L: y/ S* o; M9 }! D. q/****************************************************************************/
: e' u: s9 w( x0 r  B% Zvoid UARTIsr()2 D* n  J8 c1 y3 V8 y7 G" y
{
% Z9 n, F& g- q6 R    static unsigned int length = sizeof(txArray);, z6 {  g4 A' _, i- M$ V4 N
    static unsigned int count = 0;  a- o% Z. l9 S2 y3 i! c1 O  s5 c
    unsigned char rxData = 0;
. v. N( I- ?  v, s    unsigned int int_id = 0;
8 }, Y) Q9 d4 \$ z) s" l9 ^; O3 i
, |) H) R4 M$ t4 T2 t    // 确定中断源+ d7 S9 P3 B0 X/ C" F8 @. [9 n
    int_id = UARTIntStatus(SOC_UART_2_REGS);
0 }+ B( L; Q! u' M0 Y
0 n0 \3 c3 m+ Y& j4 q4 L0 `4 U1 ]    // 清除 UART2 系统中断& q% D4 z3 Y8 K( J+ b% U
    IntSystemStatusClear(SYS_INT_UARTINT2);
3 D2 }; d# x8 }# X* u1 Z7 F  b# {4 p6 c
    // 发送中断
- @' g% d! ^8 A' K( `2 b    if(UART_INTID_TX_EMPTY == int_id)
7 J9 l! E8 T1 C    {6 W* S5 E0 d5 s6 _" A/ ^9 d
        if(0 < length)7 I! s! ]/ h) E# d
        {
" s' u7 D* [. j; g( r  P$ X            // 写一个字节到 THR
1 K! }! H. i; f! b+ O            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" y+ D) z2 P- \" J( i* f3 W! p            length--;
- g2 D  [9 ]- l$ r- G8 w            count++;
6 c2 H8 a6 n' u6 s        }2 T* {# e  i4 G" Z! Q  m) P9 ^
        if(0 == length)) e' w* Q- V  \+ K
        {
8 h" s. r# M9 o  k; F/ H7 B& y            // 禁用发送中断
$ c9 q9 M; k4 W% k% D% x  ^            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);, R0 o) L* @8 v, Z  i
        }3 `3 ~! m7 E. W1 {1 b! F- \
     }
: k5 I8 z6 B1 t3 ^" m0 ]' V! p4 @7 X  x0 A0 h& T
    // 接收中断! h+ [/ F; J+ q/ n1 e" n2 ]
    if(UART_INTID_RX_DATA == int_id)
: c- V1 @) a( F. v, y/ |    {
" F: \" U. m% Z0 `3 `/ j        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 v9 W  I0 c" M3 |  [6 U7 e
1 Z  e" ~  C+ n* h        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ p; w7 ~; H+ l1 E) m
    }
$ p- T, u+ \6 V- I; I) L4 C3 X% }5 d( m7 D6 z
    // 接收错误
/ f( L% c8 K7 e# W    if(UART_INTID_RX_LINE_STAT == int_id)9 R6 [7 ?( U1 R' i+ W* H# Y) n6 o
    {
* j' W" l6 x$ n' N! k        while(UARTRxErrorGet(SOC_UART_2_REGS))
7 }1 a; A, S7 L        {& G8 g5 S0 p9 a# G2 c+ b- h
            // 从 RBR 读一个字节+ T" t5 ~' q# E
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 B" ]3 T2 V) j! Z        }
$ B" R( ^5 v0 L( b% E7 \    }
8 M: o2 U2 K: Z( L1 k5 O   
# Z/ C, V9 z  O    return;' M2 f0 g0 ~0 N
}
1 _+ L, b! ^: f5 k' n% ~9 ]) g
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
5 D0 e$ E: z- G" r4 f; n如果其它设备快速给你发送串口数据,你这边能正常通讯?

; m& I8 g8 E# v谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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