嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
' x4 l1 H; b" _( E  A8 i/ m8 Y
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
" n3 k4 S' \& ]. Y- C
1 L$ I0 o3 n& P7 l, ], \+ G; {  x#include "TL138.h"                 // 创龙 TL138 开发板相关声明
2 d* f) d* F3 [) m5 J6 Q, K+ q; Y) Q- n
#include "hw_types.h"               // 宏命令' f' W/ T7 V$ g; M+ _
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
% I5 |* S% n* {1 H#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
4 Q* Z2 B0 ?- T" Q  H9 t4 t! _% D/ q
2 j3 r0 G' G; N4 {/ u#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
- F1 V+ }2 d0 U1 k( t#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明0 y( C& C- O3 l0 Y$ b
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明9 b, X( U* M/ H4 }! Z$ l
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
) @1 Q! _, P* g
% M# h/ c7 X& C+ H4 U3 J' J/****************************************************************************/
) T% N" }; X& u1 I( }) u/*                                                                          */( ?! }& S. O! \4 r; c! n
/*              宏定义                                                      */& {' r0 T0 L; D2 i+ B+ y3 d
/*                                                                          */
$ s0 p) X  p6 p/****************************************************************************/  n2 m' I) H- a, [; S* I" }
// 时钟
' h3 g4 n* Q; F' L$ K  r#define SYSCLK_1_FREQ     (456000000)% N! e/ Y/ s+ v. X
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
4 k; `; O% G: |  ], C  |7 [#define UART_2_FREQ       (SYSCLK_2_FREQ)9 ]% Q/ t( O! X0 E6 ?3 t8 R7 x
$ L( ]' a- w% P: c* D' z! C8 M+ u
/****************************************************************************/* D+ l+ a% p* l
/*                                                                          */; o; }* ^6 }0 @7 i/ D
/*              全局变量                                                    */% m8 K! S8 F5 M. ~0 d$ U
/*                                                                          */4 ?6 I# q$ m  m: X. b( ^1 O; R
/****************************************************************************/. j2 i! M, Y5 L' H+ }0 q; B* ]
char txArray[] = "Tronlong UART2 Application......\n\r";0 [3 Y+ g; {& @  s+ U, R: L4 p

- t5 ]1 |( I8 ^* R, s" f8 @/****************************************************************************/9 E9 m' j$ [9 v0 j( a' z9 g  j
/*                                                                          */) ~. ^7 M0 f# z
/*              函数声明                                                    */% G  ?4 x$ Y6 }, T% E
/*                                                                          */
/ @# r  j- U: q0 K/****************************************************************************/+ Y  m% _9 ]3 ?" a* A7 |
// 外设使能配置
8 D2 z+ ?$ m' {9 j5 |4 F, cvoid PSCInit(void);+ x9 Z6 Z. n& m

/ {* C' F$ c4 a* d, v+ J  H// GPIO 管脚复用配置
3 I& v! C) w% H6 _- Q  M) k' ^  wvoid GPIOBankPinMuxSet();2 A7 N0 R( J8 d/ X# B; u  i% O

( T: X# j. h( q// UART 初始化
5 l8 I+ \+ t% a: T3 E, Mvoid UARTInit(void);
& F7 d7 r& {: z// ARM 中断初始化
1 F% u& k2 N  j$ x( f0 b: |void InterruptInit(void);
3 F; C6 g; i: r+ F9 F  p; i// UART 中断初始化
: K. h9 U; _9 ~  b! }* Pvoid UARTInterruptInit();
0 c# b$ l5 {* o: Y# K% @// UART 中断服务函数
1 M% M" A6 ?/ xvoid UARTIsr(void);# \5 t# H8 z( @5 D4 R4 d' ^& R  [

( r, a6 {- x' E/****************************************************************************/. r. }$ b4 v; \8 \9 s
/*                                                                          */2 `5 h7 ~: p7 ]4 c5 f5 E
/*              主函数                                                      */- ]/ b! Y7 O9 {& g
/*                                                                          */
( j5 P- U, ~$ }0 S/****************************************************************************/5 w  Q# w: b: B9 D% X
int main(void)
, G& W# \  N7 W. F{
# U# K6 R/ N5 r+ M! ^; C        // 外设使能配置
3 B3 A. M- h1 R) T6 E        PSCInit();% O' `$ ?' f5 A
       
% Q: y5 n0 Z# e  ?        // GPIO 管脚复用配置( n3 ]9 r1 b$ V! f- ?
        GPIOBankPinMuxSet();
  I$ T3 {% Z' O9 r" Q# w2 ~
8 q3 h: u6 l' p' u& S        // ARM 中断初始化6 H  D$ ~% Z" C) X/ S  U, v
        InterruptInit();
5 ?# g6 c- x3 E) l* C: N' D0 n% W" e2 Q  J6 }& {& ^
        // UART 初始化
! d8 P7 h! Q' F2 T8 ^        UARTInit();+ G8 \* r: g8 M2 X. G

" K) L4 ~& T0 U1 E1 I        // UART 中断初始化4 q3 w6 K$ i6 W" _8 b
        UARTInterruptInit();$ Y; g  W4 Q! p; |% s

$ n2 }( A! M2 v4 B# j8 p        // 主循环0 o1 I* p2 O2 z: t' r
        for(;;)% p9 `9 i0 b) g! ^, H! g
        {" n; V+ j+ e+ t5 B) U
4 Z- _8 @5 M; t% y( H
        }4 S: I3 d4 ~+ h8 S- v# @
}/ F& V9 X0 a/ X# _- b/ {8 ~1 |

6 q! T7 u7 L! l3 x. y1 A, e/****************************************************************************/
$ C! s2 s7 ^+ g/ S* }/*                                                                          */6 A) k/ R! y" d% b
/*              PSC 初始化                                                  *// X- `: i' |6 O2 o9 b
/*                                                                          */
$ u9 x1 A( Q7 }/****************************************************************************/
1 T4 J1 q3 [9 B" u) S7 tvoid PSCInit(void)
5 O9 E. e& l6 J{/ F% n  f6 a$ N2 n+ S
        // 对相应外设模块的使能也可以在 BootLoader 中完成1 e4 i- @  u/ E$ T" V6 d/ ~' O
    // 使能 UART2 模块  Q& C0 H: z* G( z+ m
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, c) [4 J+ k* b/ `& n/ S" h}
3 e; U/ C; K7 B) K6 |# Z# _. y1 O2 A7 M, P
/****************************************************************************/' m' l% V: K+ k
/*                                                                          */
1 |7 E/ J( T( F# ^/*              GPIO 管脚复用配置                                           */; F: e* _1 Y& u  P5 P$ ]; F0 I4 d
/*                                                                          */: t# j' a- l) A4 `3 h2 u
/****************************************************************************/! F3 Z8 h% d4 G& ^5 S  Z
void GPIOBankPinMuxSet(void)
/ U' T- _0 W+ F2 t. C{
6 E, m0 H+ m5 l' }        // UART2 禁用流控$ {0 }" {+ _9 }- _+ m; r! N
        UARTPinMuxSetup(2, FALSE);
0 ?! H% a/ Z$ L  C}2 k+ Y- z8 e( y
  }8 ^& D5 q' S: I! q
/****************************************************************************/+ K5 o8 V/ V  e8 K1 v' H; \  i
/*                                                                          */& q7 }  a9 E, [4 p- ]+ N3 E* t
/*              ARM 中断初始化                                              */
- B9 D& d. A/ S2 O, z* A1 d0 Q  E. X+ `/*                                                                          */$ I) A- k2 m& ?
/****************************************************************************/# ]2 @5 s4 s. e3 d
void InterruptInit(void)
2 f3 ?0 p$ }6 g0 d{
( F5 W+ |, T0 D! U8 Q    // 初始化 ARM 中断控制器
7 b% p& e+ z, q% ^# p1 F4 K4 S5 A    IntAINTCInit();
2 l, j1 {* {5 @( _
2 s) O" G8 v# w  r) x2 F/ {: }) B    // 使能 IRQ(CPSR)
4 i+ x* i  n6 h% W- L" F! v0 b0 R    IntMasterIRQEnable();' A$ V/ W: m3 x% J" a' K/ e
0 V( l. R0 r9 e$ q- h0 J0 F: D# H
    // 使能中断(AINTC GER)
, w+ q6 s! V6 m5 G) w    IntGlobalEnable();
0 l4 M- J0 e8 x+ Y' X
( s7 r2 E: p: E: _6 g    // 使能中断(AINTC HIER)& t; Y; Q( u9 D( s0 q
    IntIRQEnable();  ]$ k+ ^) r. ^1 d, Z& |9 F# c( E
}
) q, A  j" S0 M0 `4 _5 N
1 r3 A9 a& C1 n$ H) r/ x: ]$ O/****************************************************************************/
" w# O+ j. e; Q0 T" L% }# a' n/*                                                                          */
7 X8 M& I2 v3 v' @, H* d/*              UART 初始化                                                 */
& I$ a# W( T6 I1 p/*                                                                          */9 H2 n# ]7 H+ r6 v, C$ L
/****************************************************************************/1 ?9 o* j1 r: ?- ~5 i$ J6 A- G# S
void UARTInit(void)% C7 V. v* z4 \% t3 X
{+ |6 `- `" v( o3 ?, t
        // 配置 UART2 参数
5 i9 I' I1 M, g& a$ [        // 波特率 115200 数据位 8 停止位 1 无校验位
' q3 X- L0 z# k, |    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
# u: L: u# I3 V$ s                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
, x2 t) p4 x) E1 s% J. g        // 使能 UART25 s; S! W! v9 Z% U
        UARTEnable(SOC_UART_2_REGS);; q- z3 y$ e0 ~3 L9 l% ^
, q- z1 t) H' G( q; p, z; y$ I
    // 使能接收 / 发送 FIFO
) v; t5 Y8 ]- [4 L9 R/ J. b7 z: u    UARTFIFOEnable(SOC_UART_2_REGS);
( \* ?) U/ Z- \+ ^9 G( B. F" w! o% w: c7 ]
    // 设置 FIFO 级别
- [8 O+ Q3 I2 z    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);$ k# I, n8 P6 y& U$ J' N
}3 F3 E( V$ a" M- ?* e

) i  S$ P. a: d% `/****************************************************************************/& c/ d$ p& z8 n1 T0 F6 C  U
/*                                                                          */& H% A6 F: A& v- h7 o+ X3 N3 E
/*              UART 中断初始化                                             */9 l& u& u: Y( k) [1 Q2 [" G
/*                                                                          */0 f2 N1 c8 P# {7 n/ P  h* z
/****************************************************************************/; g, ], k; y! q, v4 N1 u4 {
void UARTInterruptInit(void)4 A  H! r6 V& V* i' _/ U' u
{
3 O! G2 K# L! s        IntRegister(SYS_INT_UARTINT2, UARTIsr);2 u6 @1 m' S) f: n5 Z# r6 s
        IntChannelSet(SYS_INT_UARTINT2, 2);
% ~& [: X" O9 Y+ l* [: m- R/ g        IntSystemEnable(SYS_INT_UARTINT2);+ r# m5 m$ g' B, W  Q: c

+ W' K# ^2 F9 H3 O0 }* I5 v! j* h        // 使能中断
. B& g$ ~# K+ |! G# ]        unsigned int intFlags = 0;) l- D$ v" y. }4 A( K
    intFlags |= (UART_INT_LINE_STAT  |  \
3 E; ]/ C# ?. }                 UART_INT_TX_EMPTY |    \
1 d- z" v$ e$ K! u7 f& M* N; b9 [                 UART_INT_RXDATA_CTI);8 ?" F' L0 P! B5 W7 v
    UARTIntEnable(SOC_UART_2_REGS, intFlags);5 u8 L7 ~) s2 }
}* O$ U  O) e/ U2 {: @3 `4 T

0 V& p1 d2 U6 Z% ]- N" B' u/****************************************************************************/% {4 z3 h: X1 S1 j% ^$ u
/*                                                                          */7 S+ x- D% N3 Z& l4 u1 p
/*              UART 中断服务函数                                           */# x$ q. a8 t# h- M0 x
/*                                                                          */5 C" m7 s. X7 o7 J- v# p; f
/****************************************************************************/. L+ v7 _* B7 n1 y) s% M
void UARTIsr()
; U9 q* A$ E2 T! z4 g/ b{
, Z) u2 s, j% Q2 g    static unsigned int length = sizeof(txArray);
( a2 |- _  W8 h0 [! ]4 c) I8 U    static unsigned int count = 0;8 m) x. c8 d/ H+ P, \/ Q' b# _
    unsigned char rxData = 0;
+ T% c! v; O* _/ ^    unsigned int int_id = 0;
, Q% Q9 }8 Y/ a+ s5 F  b2 \' U* @4 U, X$ F+ R7 `
    // 确定中断源
0 b6 w, `6 Y. L6 P    int_id = UARTIntStatus(SOC_UART_2_REGS);
/ F# H" M% }% g# Z, I" ]/ u. p, g' n5 o- a: t
    // 清除 UART2 系统中断7 [5 z( q% f" x& `3 d1 |; n1 i
    IntSystemStatusClear(SYS_INT_UARTINT2);8 P: `8 G9 d; o/ P# @( T

; B; Z# v- z  X! y" A/ B$ k    // 发送中断
5 U* k- a: h5 _    if(UART_INTID_TX_EMPTY == int_id)
+ Y$ I$ C# a; ~3 E6 @    {& {3 T( @& x5 y5 L- ]5 X) y4 }
        if(0 < length)
! n- z6 m/ h, T6 C0 F; M        {
7 F/ J' r' a. S* {            // 写一个字节到 THR- A5 {7 Y  V) \, o" ^8 |5 E& H4 e4 g
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( ?/ b% N8 H9 i; v' E% W( Y7 E4 X8 K. B            length--;
4 Y0 T; M: J" a+ v% X# R            count++;- n7 ]4 d6 x! e" C. l4 n
        }
7 z0 p7 [# a8 h7 s; f        if(0 == length)# c" |& U1 d$ I5 U6 [9 |* C
        {/ u1 p' v) n, p3 V
            // 禁用发送中断) i" N; P5 i0 y9 t9 t
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);6 D7 D- Y6 K7 P) c
        }
, L) Q. w& a2 h* v1 `3 x     }
* c! N; v  p& J9 X, r' }6 X/ V
2 C9 I& t# h$ K  n% \3 V; l- q    // 接收中断
; |) d; e8 z# d    if(UART_INTID_RX_DATA == int_id)
$ C& _1 e7 p; u( R  z    {
6 v% A1 C5 U- ?1 Y        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 G; Y' g5 _$ v! B# Q4 }- D% y7 J& ^! M6 E" z
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
' c- c/ Y8 y7 Z! ~- ^1 V# @    }- `) }4 R' b8 z) l) F& W  V

8 e% p" Y3 ?7 P( e* [: V    // 接收错误% H4 |$ g  E: l3 X; K! o* |) O
    if(UART_INTID_RX_LINE_STAT == int_id)/ _0 C# T; u5 j
    {# g( c* C& b' r- |: i
        while(UARTRxErrorGet(SOC_UART_2_REGS))( G* x+ E2 M2 J+ }: v% X) w# t: M
        {9 u9 X9 S. N) x# s
            // 从 RBR 读一个字节
0 x. S0 }& G- k8 R3 e            UARTCharGetNonBlocking(SOC_UART_2_REGS);
* q6 O( H7 |5 t4 R        }
" _' A6 H4 h% H3 o  A    }
/ {) y  R# `/ z- X    6 P# r* {' l' X# j
    return;
: V1 u6 ]0 D# P, M}
5 u) ?, \* o% S- P6 }- P. Q
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25- R+ ~" D" S6 y0 L2 @, J
如果其它设备快速给你发送串口数据,你这边能正常通讯?
" j5 d6 ^, r  ~9 F. X' _3 h
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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