嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]# J* J" ^9 U7 x1 F9 Y3 K; B% m

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- w4 ^  W+ j- c. c: o1 }- f, Z# u; j! A) T$ X! n" ~- a
#include "TL138.h"                 // 创龙 TL138 开发板相关声明8 T0 E: b8 ?5 u4 k1 T# ]
3 b" L* X; T: e6 h5 ?  u2 _: ?
#include "hw_types.h"               // 宏命令# E& j! }* [  ?7 p
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器7 y/ c$ w; o, j1 F
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器* I7 }: b) [! ?/ G% G

% }. g. @# ^7 [6 E6 Y; ]  C+ k7 q3 L#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明5 p% k$ R3 @+ v; `* }% D! D
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
0 j8 |- Y, i! b7 }; h$ V#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
6 D$ T! D* R+ W* h' w' E7 m7 q- B2 v#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义! x0 M1 @8 N8 I$ X' ?, H

8 |8 S# n2 H5 O. k; @6 u- }/****************************************************************************/
  R5 n. Y1 S( X- r/*                                                                          */2 t; L$ n. t) s9 K% L3 m
/*              宏定义                                                      */
+ B+ [$ \9 r3 R& o  z- N/*                                                                          */& x) Z9 `: ~% W2 T+ C  ?3 Z3 d
/****************************************************************************/( w* P! W5 v  Y. e% q# T: u
// 时钟
& F  c0 n4 \& k7 }#define SYSCLK_1_FREQ     (456000000)
/ u$ J7 ?% ?, n+ ^* \) F#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
! @1 @: f8 {) _" W: D#define UART_2_FREQ       (SYSCLK_2_FREQ)
# K0 i1 H( d1 ], N5 C5 U, _' a3 v
& y! v4 l% L) p, v9 p' Z( @+ d+ e- `" c/****************************************************************************/1 V. S& }; \$ Z( F+ m
/*                                                                          */
# F0 }' v/ o# ^( E9 {+ L/*              全局变量                                                    */
( [" a- V: Z9 y/*                                                                          */. a- l* U; K1 b' k& k" v8 `
/****************************************************************************/* ?' r- _" a' ~1 T- A
char txArray[] = "Tronlong UART2 Application......\n\r";
8 f/ b) s2 D# y- f& q& m
( r/ j" ]& Q) m0 {/****************************************************************************/. ]: r! z# Z$ M3 H
/*                                                                          */
/ N: W. Q) }7 i/*              函数声明                                                    */& z7 O/ u. S( o: v
/*                                                                          */" a) H' x4 B# g1 `$ N  K
/****************************************************************************/1 X1 D5 t$ B4 q4 b" K( s, L+ {
// 外设使能配置
- T: ^% g; h$ k, cvoid PSCInit(void);
0 G, d$ g' H7 x0 T/ x% E: ?7 t1 _- ~3 {3 f: i9 O
// GPIO 管脚复用配置. H6 K4 J6 Q5 a: A. C$ f+ y) D: V' |
void GPIOBankPinMuxSet();
# b6 }; h0 r1 l" W
3 A9 C4 {, ^. B3 F) j2 a! Q/ H. U// UART 初始化- u# x" m# x( c- N
void UARTInit(void);' p- g6 v$ L/ o* s
// ARM 中断初始化* w; k5 a+ w' ^' k8 H5 Q( H* E
void InterruptInit(void);; s& `  e  |& i* \# j# V
// UART 中断初始化: s0 S1 m5 Z+ p
void UARTInterruptInit();* c- n" b; V3 \
// UART 中断服务函数( t) e, B( A3 M! F2 _2 f* V/ W5 U# S
void UARTIsr(void);7 }! ?, ~. h5 d$ i* r

% u  A% i& j8 b' {" d  E* m, r4 F6 B. y/****************************************************************************/
" Q7 p! {# _& i/ {) T0 F1 t/*                                                                          */
, h. i* F5 d) h: }2 y6 m/*              主函数                                                      */
' q: c7 r5 k- |$ p/*                                                                          */
' y$ ~% a3 z. R8 {6 w( A9 A$ l* V/****************************************************************************/& B( [' F  [8 k# f0 V1 ]. h
int main(void)
9 w' J7 J) ~: A{
8 K* p$ H" ]+ r) }0 x+ @        // 外设使能配置
3 Y* C  \4 t! X6 y7 f        PSCInit();
3 ~( Z* m, ^3 Q6 G% y       
' p1 n1 z" L6 j        // GPIO 管脚复用配置, z+ y4 M9 w* k( F; |6 R/ b
        GPIOBankPinMuxSet();
' p& |( x- D' j* A; P0 N% [' E' I
% _  z4 {% M9 i: _% p$ k        // ARM 中断初始化
  ?( j0 X/ t5 l; y        InterruptInit();  X4 Q9 d  V! w  x0 w
4 B5 D# s7 M/ {! }
        // UART 初始化0 n/ Q1 _! G" v) S8 R
        UARTInit();
+ G3 P' u- m4 f0 }
& X2 W' m$ M2 w        // UART 中断初始化9 T  Q+ |. s1 u% b/ I) v# q6 O2 ?
        UARTInterruptInit();
' L2 K$ L5 ?. ~2 t, ], q4 C4 `/ w1 o0 H" D( l$ r/ A
        // 主循环1 O2 q' z' ], Z' \4 B
        for(;;)) L& N% O2 L, ]* c7 \2 @/ S" P2 X
        {
7 e. U) c, g; r; w- G4 C2 O7 b% \
        }
7 B" ?6 B# j; ]+ j# [5 p" ~}
9 \. h7 S" I6 d0 {# I6 B( r2 S8 F2 S; [+ D. S9 W6 c. b
/****************************************************************************/0 B% J) R/ m8 \% ~' a1 M7 E5 L, c
/*                                                                          */+ V. O+ u4 d: ~% ?$ v4 v6 z
/*              PSC 初始化                                                  */
0 ^$ ]' V' [% R- s# m* I+ m/*                                                                          */6 W# T- [* v& M3 B# ]9 _7 ]
/****************************************************************************/6 k$ D( Y1 B7 N  s8 T
void PSCInit(void)! ^4 H9 |9 A, ^& H& ~/ Z
{; n+ ~9 T8 b$ u6 _3 R  A
        // 对相应外设模块的使能也可以在 BootLoader 中完成
$ O+ l  P5 l* G! U4 E4 \    // 使能 UART2 模块. _" P) U! ~; o$ s% k$ q4 l
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
5 w( P3 I! U/ v3 T7 o" K}
7 B4 R* T9 W" |+ t- [6 Q
# K! E+ L. ?0 c8 }# J, |: `/****************************************************************************/3 S6 ?  d  ?9 M
/*                                                                          */
. `; \( j/ K* O6 d/*              GPIO 管脚复用配置                                           */# Q# H, F0 x5 e
/*                                                                          */
3 l0 D- k$ ]/ m4 \/****************************************************************************/6 q- ]. J' H2 s2 X, L5 e2 Y" L
void GPIOBankPinMuxSet(void)* W3 Q9 n! X$ E4 S" _, @
{
$ q, J- Q) E5 n0 D8 E7 Y        // UART2 禁用流控
: p8 T  A" r/ `; x5 a        UARTPinMuxSetup(2, FALSE);7 \. N( d0 T# e' y
}3 g/ K" D& {  z& I
; z( C1 ?/ g. j' \" T
/****************************************************************************/
8 O2 S- p; I4 R  [: i4 k, h* }/*                                                                          */
0 t5 H) N1 r5 w1 ~  |& E" ~/*              ARM 中断初始化                                              */' r) l+ |" W5 P" v* r, Q8 y( N4 W: y
/*                                                                          */, c  Q( @6 w0 t
/****************************************************************************/5 W+ [/ c' ]2 R; E3 Z& `
void InterruptInit(void): O9 I" T/ F# G: K  H2 g6 h
{- A" W% J9 u- _; r. R
    // 初始化 ARM 中断控制器0 s, \+ {0 [) N, L1 g5 |! x+ _
    IntAINTCInit();
! ^. d" B$ D0 |- }% {0 [) j) o7 a. y$ W' K; b1 h1 t# N2 s; Q
    // 使能 IRQ(CPSR)7 Y& R" K3 `, [' I( l& q' z4 Y) P
    IntMasterIRQEnable();
" M3 Z* v; s3 l7 N& E/ B7 D6 W! e! X  s5 G/ b# p6 ^
    // 使能中断(AINTC GER)) T; q- B6 o% x' S  A" \
    IntGlobalEnable();8 z7 G, {' ]6 ~' {& ?

3 a2 P1 |! k; D7 J    // 使能中断(AINTC HIER)1 i4 i8 l* L3 a- U% N
    IntIRQEnable();- o/ x/ l- G4 p2 }" U8 {
}6 L7 H7 g" q" S* F8 z; {, T% j8 b/ _
9 T: M8 ?0 J; E
/****************************************************************************/8 _4 K) n# n4 X0 q
/*                                                                          */# q; C5 D7 @& y( I7 X# X
/*              UART 初始化                                                 */0 A; y2 `& O8 W8 o/ U- c; e* k
/*                                                                          */
$ ~$ ~& u2 Y0 J% l* N& |/ g/****************************************************************************/
; v" ]( @# I' B  ~, L5 rvoid UARTInit(void)' A3 f5 L) w% K' e
{
2 Z) a' N/ D7 w7 j        // 配置 UART2 参数7 B* X5 Q& I3 D/ k0 P1 C, ]3 Q8 r
        // 波特率 115200 数据位 8 停止位 1 无校验位( G% W! G- {" _' Q2 S2 P$ E, b( K
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,; K2 o3 [5 Z* l! A0 c
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
! g0 b8 j6 ~: e2 [; }0 n        // 使能 UART2) P1 s! ]( L! K: j: Z0 _
        UARTEnable(SOC_UART_2_REGS);
! H# S$ Z+ b; E2 P0 L
" Y* h$ I% \; S' K    // 使能接收 / 发送 FIFO) f' ^# I' Q# J' B8 H; j
    UARTFIFOEnable(SOC_UART_2_REGS);
" S) n) }' `7 e3 S# F$ o5 ?( k! s- \- R  q4 c. {. g
    // 设置 FIFO 级别! l2 [6 k* D) q, {
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
8 r! ^% W  J" v9 l. f9 M9 \}
/ i% U9 U/ D! l, \  b: u' o; W) H. B
/****************************************************************************/' }0 J: F8 X2 `" T  p+ V8 r
/*                                                                          */+ }7 T) H3 |& r& W
/*              UART 中断初始化                                             */4 K) @1 ^* C3 j, s* U+ l8 p0 ?
/*                                                                          */
; c2 @1 i, A% l/ P9 i! s; b/****************************************************************************/
8 n% s! v2 s$ G9 ~void UARTInterruptInit(void)
/ b4 Q  y5 t1 \* q% G( _5 P{5 e' @+ z: J3 Z' Y( ^! M2 d
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
4 F) ~6 g- k# J9 K- C- [        IntChannelSet(SYS_INT_UARTINT2, 2);
3 M1 K" U) T6 U8 N/ ?        IntSystemEnable(SYS_INT_UARTINT2);
" Y! x+ C: z! @# O. y4 S7 _
1 i. L' z0 z3 h5 J1 m        // 使能中断
0 e. i$ i% X, s2 W: h& J- X        unsigned int intFlags = 0;& {/ Q: z) G( T; o' W
    intFlags |= (UART_INT_LINE_STAT  |  \
# B9 L3 {$ Y8 R" D0 ~% p0 ?                 UART_INT_TX_EMPTY |    \
6 q7 A8 ^" h9 W# e6 y                 UART_INT_RXDATA_CTI);  w2 H4 o. y. ^
    UARTIntEnable(SOC_UART_2_REGS, intFlags);& [: B3 c, k8 \. v5 }2 |( e( e
}% M8 Y; Y5 W9 `

1 s' j" Y. f! V' j/****************************************************************************/1 n+ g- a$ g! U' b4 d
/*                                                                          */& j. `; t* b% {1 [  l
/*              UART 中断服务函数                                           *// H: a4 h" R3 h% v+ d
/*                                                                          */4 K! r5 I; d; M- c( a7 E8 z- I
/****************************************************************************/
6 {0 ?/ u, \" z8 s7 Uvoid UARTIsr()
$ A; l( v" w: }2 r4 l) V{
" m- D3 r, _% T% K; s) r    static unsigned int length = sizeof(txArray);
1 k/ Y9 O8 X, g1 b    static unsigned int count = 0;
5 z# W+ ^, r1 J, h    unsigned char rxData = 0;! t; c5 T& @2 y+ C% ]! a
    unsigned int int_id = 0;+ }( W, W( k4 T# u9 Z. j

: r* l( C& {# L* ?. L    // 确定中断源
8 d: i5 a" S- W! i    int_id = UARTIntStatus(SOC_UART_2_REGS);3 o" w0 T1 G5 k: j

/ @0 C, n3 }- m0 U* D5 X8 `    // 清除 UART2 系统中断& _2 ?! L1 N6 ]/ W2 m6 ~  v* x
    IntSystemStatusClear(SYS_INT_UARTINT2);; F# z0 R4 _+ z- `% N  u0 p4 D
( E" X/ E! u6 q$ n6 l% T0 B
    // 发送中断
! e7 u" c( v1 P" k, |4 Z4 N: ?    if(UART_INTID_TX_EMPTY == int_id)" k6 z# z! T( i9 H" o
    {
" @3 \* ?- t; L& F( B# D( y        if(0 < length)
5 q' D3 C0 |7 z: ~/ {        {
& O$ a3 Z$ Z! p% p            // 写一个字节到 THR& H0 c) N  B0 ]+ e, S
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);0 H+ q4 w0 a6 z! f( x
            length--;% g$ U: s& p. h2 s% Q
            count++;2 [3 w, g; L( u5 g# \6 D& D& ]- e
        }
8 V6 p1 t* ]- `0 \: {- s        if(0 == length): k/ ~2 j0 V3 B, z* f
        {
& k; k; k% g/ \2 l4 r7 b& `4 N+ n1 ^            // 禁用发送中断% q# ^0 t' V1 E
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);' e3 U: }: z$ d- i& x7 H/ O
        }
& m3 ?5 @9 a# I0 p     }
% w) k# F* Y5 F5 s" W
; A  {6 S% c* `6 Z  O    // 接收中断) c. {1 W3 p( ^5 N& ]4 b
    if(UART_INTID_RX_DATA == int_id)
1 i1 }8 e& Y8 ]    {/ c4 m* x6 S$ F/ U
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);1 q, k! {9 |( R% n
7 j# N: V- z$ M  i' x3 M
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 |8 a9 T$ V/ Y
    }
/ o5 A3 {5 W6 t  h3 `7 O' ^
" l4 I: u/ r2 ~- i/ y. j  S$ C    // 接收错误! C; w1 W) b$ F) J/ M
    if(UART_INTID_RX_LINE_STAT == int_id)1 t8 h/ m1 D% Z% F
    {' H, @6 ^; F5 r* f
        while(UARTRxErrorGet(SOC_UART_2_REGS))
+ U6 I; }: }1 \7 X        {0 X, n( B: ^8 J7 y$ A$ Y
            // 从 RBR 读一个字节, o. @6 K) k% g- j4 Z9 u4 E
            UARTCharGetNonBlocking(SOC_UART_2_REGS);+ T7 N6 W$ o# q: i) q8 _. B/ Z
        }
& d) x, c6 q4 |% T  R/ n4 O    }
1 j' T+ ~( M. S4 ?' C2 Y4 ?    * D% b+ U1 _5 }* k$ o
    return;! v" u8 n- j1 Z
}1 I4 i2 f3 t+ r% n9 I" l

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:257 \2 M9 q: ?+ Z5 \- W5 a# F9 R, N
如果其它设备快速给你发送串口数据,你这边能正常通讯?
" F& W8 A- F# i/ Y
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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