嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- L+ ~# Y- ^# Q; r7 Y( t
. F; n/ T. t+ a8 q6 s+ @#include "TL138.h"                 // 创龙 TL138 开发板相关声明1 s# N2 ]* ?$ n9 H

2 X# V9 j9 [: w3 t#include "hw_types.h"               // 宏命令
6 {8 n9 m+ e+ I. p; n) D' m#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器9 o0 ^3 U" d/ Z! ?' ]# D, w3 h
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器& J" d9 ?$ s6 @2 A- N

; c0 w$ H2 P+ ~( f#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明- \4 c- F$ l+ |! f
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
1 c& f' g" o+ V' c8 H) h#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
1 I/ c& N+ `7 ?) J3 K2 O#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义3 E8 p, _& }/ D% f9 o: ?
0 p& @3 ]7 ]* `5 K5 [0 `) A2 z, B
/****************************************************************************/) N! W. t; M# _) ?
/*                                                                          */4 T) ?1 B  W, O/ T/ I8 q
/*              宏定义                                                      */' G- ?" W- u* t- T
/*                                                                          */% |, r, ]4 I: U
/****************************************************************************/" l# `9 u+ ?7 q/ Y( O; i
// 时钟
+ V1 N4 K6 z  P#define SYSCLK_1_FREQ     (456000000)
* d; k% f- @. l3 V3 q#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
6 u, i4 d* {5 g$ ^* M+ k0 S2 P/ V- h#define UART_2_FREQ       (SYSCLK_2_FREQ)7 p4 w# u- e. ?7 r; z# W1 W
9 q) ]5 [/ y+ ~+ w$ A% i
/****************************************************************************/
! y* `/ h' D4 K+ E$ I/*                                                                          */7 X& m+ S; e% S6 A8 F
/*              全局变量                                                    */% Y9 A2 w/ f. S7 H* b
/*                                                                          */
, q4 ?; \4 b; h* z2 M( y; k/****************************************************************************/
- B2 W# k: u, B( y4 y% vchar txArray[] = "Tronlong UART2 Application......\n\r";& x8 p1 C& b+ V
  g3 a% q2 S& S
/****************************************************************************/
. \! N; K. |4 n! p. h" c/*                                                                          */
2 }/ l( C% j" ^/ ]7 @. [/*              函数声明                                                    */7 s8 V  [& i4 N8 p# T9 K. G, T
/*                                                                          */
1 a" l, W" a7 z6 x9 U$ w3 ]/****************************************************************************/7 ~5 \2 E- @6 ^) Y& X. o
// 外设使能配置; Z4 o* x3 a6 G" [9 {& n4 n  P
void PSCInit(void);# I6 Y  [4 t- B; O. S# \, j- ~! T& R
% W3 \4 ]3 w% w; r
// GPIO 管脚复用配置
; Y: l- ~" H" R" ^( \void GPIOBankPinMuxSet();
  W- o) C- G  ^! N- J2 ]! M: L( A7 f9 ]$ R5 D- g& X+ ^
// UART 初始化
' ]0 G4 B& j! B  f% J, @8 fvoid UARTInit(void);
4 i6 x: t0 ^! ~6 G, v7 x1 P4 h3 j. ?// ARM 中断初始化2 m1 C* ~4 r/ o( x( b. F
void InterruptInit(void);
) b% X( V' t! |; C% B: t6 w// UART 中断初始化; H: a& v0 ?  j, m  n/ L' U
void UARTInterruptInit();3 ~2 E" F1 U) d. D: U
// UART 中断服务函数
  q' W% a& L# P8 W& I; i! \void UARTIsr(void);7 a$ j. A; v( ~

! p: [8 q' F, k' \" q/****************************************************************************/2 U/ K0 s. `0 x' D3 s4 f
/*                                                                          */; \+ l  ^) B) H& H; Q0 b! M
/*              主函数                                                      */9 X7 g$ o& y8 k4 J8 n) c
/*                                                                          */
+ ]' |+ R7 U  G* b$ r2 j8 V/****************************************************************************/6 J# R. W3 B8 ?  i- t; L8 e
int main(void)8 [" d  d! f# E7 y
{8 }4 z' w2 K* L3 C
        // 外设使能配置
+ `$ y$ k; @$ f( c1 S( m        PSCInit();# U) I- D) N5 ^( r6 M
       
% [# f! e+ r  b/ [5 L3 J        // GPIO 管脚复用配置
+ N4 I' {' j9 A! D        GPIOBankPinMuxSet();
  a- K# S9 `$ b! Y+ s  p4 Q6 f5 L
        // ARM 中断初始化* {' ^1 s* f1 z2 [
        InterruptInit();
, Y: y% K& b7 E* |6 A  Q) z; t" A! B" }- y0 n5 j. m
        // UART 初始化
5 ^9 ]/ E6 a7 F7 V) f: @6 \        UARTInit();0 j: N) J# o* a. a' H. h  D$ e! Q. d" \

5 L9 h8 T/ U$ K% t) D( d5 H1 }        // UART 中断初始化- b. }% }( w/ X7 k9 E+ F; T
        UARTInterruptInit();! j( c% o  l6 a3 c* c. v0 k; {

( Z, k+ c1 R- l' U# ?* v! |0 X        // 主循环
+ w# m- m5 `) |1 p. a. s3 W        for(;;)
. w5 \1 W; n/ i% `, B: A) I        {# o0 c/ {4 i9 v7 Z0 e

+ H( q2 y& u. F, B5 c        }, _% q' ?' b# v7 x/ L  F
}
' u& i$ \% ^* O, V1 |. O! T& ]/ L/ B% }6 F4 }6 q0 C6 u
/****************************************************************************/8 \$ P- E  i9 }" `
/*                                                                          */
7 ]+ Z7 z9 Q/ g7 G3 f: C; a6 i8 N9 s/*              PSC 初始化                                                  */
! h5 V* n; U3 ?0 v: a/*                                                                          */' ^1 G7 R7 x! N" \
/****************************************************************************/
; _' t6 s; F! d! S8 ~: Xvoid PSCInit(void)
; I3 h! Y- S% }8 f; f# R{& X+ o  Z5 r# A$ T4 ]) ?
        // 对相应外设模块的使能也可以在 BootLoader 中完成5 T/ h, D! i+ b0 P( N& R
    // 使能 UART2 模块6 |3 p" N# F) q* D' I. g
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);1 m& I1 K4 v" S  J, c3 W0 h( T
}
; @/ K/ F# g% \* i& I0 b2 W$ r! [8 D3 {; E& h
/****************************************************************************/
' b, x* H" K/ {$ }) j( [/*                                                                          */; E& S' s* W7 k2 S2 j( P
/*              GPIO 管脚复用配置                                           */" x$ u4 k, U5 u% o  o( n) }" l* C. x
/*                                                                          */' B; F) w8 u" Q0 x# }
/****************************************************************************/+ ]7 b$ {* O0 P7 H$ O( p- q
void GPIOBankPinMuxSet(void); V: o3 S* ]) k/ @7 |& j9 \
{
4 v+ F2 o: q1 I6 V, A        // UART2 禁用流控
) J  C- p1 L3 e* ]5 b        UARTPinMuxSetup(2, FALSE);
6 [) z9 g8 {3 ]' W: J}
  D7 H' o+ O. \  U2 t: T' B% S% @$ H+ t
/****************************************************************************/
( _$ R  v# B# S! K/*                                                                          */* F0 d3 t  X" o, g; J$ {
/*              ARM 中断初始化                                              */1 R% o# u0 Z4 T  a& d8 i) i% C
/*                                                                          */
; m7 f+ Z  p. c( G/****************************************************************************/" F1 w) Q/ q, w: }% O* P& ^4 h; z' j6 I
void InterruptInit(void); O* t- c0 C* {0 n3 d- f4 c1 g' o* V! X; o
{2 e8 I( V4 |5 f2 l
    // 初始化 ARM 中断控制器
: X  \9 o4 r: [$ W; c5 K2 G    IntAINTCInit();
) K* X: R$ p4 P* A8 z& p+ N4 ~* K4 y0 S3 t5 v% A. E
    // 使能 IRQ(CPSR)
5 H$ {4 d$ n- S$ [) j$ w    IntMasterIRQEnable();
. s/ _3 \' z( F8 W6 i+ b1 G5 i4 Z# r% D
    // 使能中断(AINTC GER)* C& M& G7 U3 P6 N& F! c5 R% t
    IntGlobalEnable();
" v* V, B; _+ Y7 a
- r4 \2 G% S) y# F" `5 U    // 使能中断(AINTC HIER)- k, f( U8 _: l5 h, j, v) `3 l
    IntIRQEnable();3 Z3 Y8 {6 @3 @) Y- k+ l3 h/ K
}
; m- R2 U# \1 u* X+ C" n+ P
% G0 F0 ]  z0 j7 A- ^& n/ o) o+ S/****************************************************************************/; K) A2 D. z/ d" Z/ F" R
/*                                                                          */
, h7 |' l( V( _; f/*              UART 初始化                                                 */. I+ y4 C8 g+ X8 `
/*                                                                          */. h0 f2 @" w7 r, u  w
/****************************************************************************/
9 r$ ~: `6 w$ I' L  {void UARTInit(void)8 \" A3 T/ W  l4 ]
{
# g: ?9 r0 f' z        // 配置 UART2 参数6 K/ G- ~" I0 G9 _& Q
        // 波特率 115200 数据位 8 停止位 1 无校验位6 D7 H0 f: z: A
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,1 P8 h& G1 ~/ X7 ]
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. ~. C2 t" R" Q5 C# d
        // 使能 UART28 F7 i' Y: \8 {2 s" K. z. B
        UARTEnable(SOC_UART_2_REGS);
& k- D  J6 c) J) w
1 S7 U! Y: N' d9 _7 }! |; ~    // 使能接收 / 发送 FIFO
: ^" h' s" f- z( }2 G# d    UARTFIFOEnable(SOC_UART_2_REGS);
& M  L; H$ W/ b! m* Z& S# x( {
- Q7 c3 M' e$ {+ W# j" @  c' ~    // 设置 FIFO 级别, P7 Q3 ?5 a1 [, w8 K' \
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
# k# L# V% H  f}
& B6 i# l0 Q3 c! P' A. V) f8 m5 A5 `" \4 [7 B4 Q
/****************************************************************************/
/ f5 ^% n" _6 ]8 t) m/*                                                                          */" r/ T# s- D/ F* m. D
/*              UART 中断初始化                                             */, K+ y, ^  m" t
/*                                                                          */
. @# {" @" ~$ B5 Y! l/****************************************************************************/
3 C- G6 Y5 o4 x% w& Mvoid UARTInterruptInit(void)/ y* l* A/ A9 U* F
{
/ U8 W# m; m2 a6 \: T! j        IntRegister(SYS_INT_UARTINT2, UARTIsr);
. M* p/ r0 Y( U+ ^7 ^, C        IntChannelSet(SYS_INT_UARTINT2, 2);
* u% ~3 ]% L$ I! ]  _& T; f        IntSystemEnable(SYS_INT_UARTINT2);
6 L6 T/ g! e) ?( ]1 i0 Q
2 w' |- x" g! m! d1 A        // 使能中断
/ v" U0 b& q; N7 \8 m+ v+ G" Z  j; e        unsigned int intFlags = 0;  Q% C) {* K) @
    intFlags |= (UART_INT_LINE_STAT  |  \
- m& J* w- i8 p) B/ C4 s                 UART_INT_TX_EMPTY |    \$ {+ w7 F$ Z5 `) M/ J
                 UART_INT_RXDATA_CTI);: a2 s+ ]; U* f5 A8 I0 z% S& f
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ S% P8 Q$ s7 ?( R; {, u4 @5 g}
' r, W7 G, O& y( J
) Y; A* S/ l# g0 O/****************************************************************************/$ Y$ b3 t. k  O$ \! U: X( Y
/*                                                                          */0 d" C6 ~2 `  c* i
/*              UART 中断服务函数                                           */( m9 }9 i' L4 H3 a& g, R3 W
/*                                                                          */
7 H6 \4 _+ |1 z% B/****************************************************************************/
1 q& \6 P& r+ O$ avoid UARTIsr()
- ~4 G5 T3 J6 ~7 T4 H+ F{
& d% |( f& S1 b. t( c1 e    static unsigned int length = sizeof(txArray);  b- |% D3 p2 R( f; t3 r
    static unsigned int count = 0;! {9 H9 d' i8 q8 ?' p9 d& X
    unsigned char rxData = 0;
. }: t- B( D; [1 i6 F    unsigned int int_id = 0;
# x7 E1 S& b  K0 Z9 C
/ j2 }* ~0 Q8 D9 T) V& Q- `    // 确定中断源
" B: P0 n7 k! ]6 W) w% \    int_id = UARTIntStatus(SOC_UART_2_REGS);5 v* @5 v& E" D: ]
( n( B1 Y8 o; S1 D
    // 清除 UART2 系统中断& F* W, W: A- h8 t* s
    IntSystemStatusClear(SYS_INT_UARTINT2);
2 ^9 O, F& Z$ G& `7 G- i8 L' h+ I4 u" a2 {# n
    // 发送中断
1 t, O% N! b, D! C0 E8 i5 F3 v9 ]    if(UART_INTID_TX_EMPTY == int_id)) _9 L1 d# ]- A& R- f" S8 ?
    {
& t& D. u$ j# F: {& |) x        if(0 < length)
+ N0 D  p" W6 L9 d        {
, r: T' n5 C  \. C# j+ H, i, p            // 写一个字节到 THR
2 i6 N; k% r8 S6 \, v4 U6 k            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ r7 J3 E* d7 J" h) X
            length--;
7 r6 \* ^7 }; H$ H2 d! e            count++;) g0 c  H6 E! p% ~- M5 h/ Z
        }6 S- I& S! f4 H/ ?: t+ w$ |: a: x
        if(0 == length)% u3 _; ]" u1 L
        {. \# M' Z: W8 L6 R# h! x- B
            // 禁用发送中断
( ^# a5 W4 i/ d2 o            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);% A1 l* ]4 i0 {0 b2 }% A: r
        }) ~  ?" J+ X8 B+ Q  \3 E- f
     }
! I: Z( E5 X6 c2 p
7 f" S% @' J# q6 U6 K  T  p    // 接收中断& f1 [0 l+ N4 S+ m4 E
    if(UART_INTID_RX_DATA == int_id)
( w' d& v" g# ?6 a8 N0 }! m    {" J0 A  d2 M) P0 g" X
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 c$ D3 @9 x7 R0 s) M# P5 y" e7 H
$ F# v3 c  i9 z, ~: T/ m        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ h& s7 t0 K" u* u( X    }) x5 {5 h) e5 `8 C
2 w/ ~* c, U: V6 A1 [+ ]* K
    // 接收错误
( p! A* T# d) a* C" p0 ]    if(UART_INTID_RX_LINE_STAT == int_id)& ]4 u: N( F+ m0 K! M
    {
9 o4 x8 o- Z3 ?5 c+ I0 C# X        while(UARTRxErrorGet(SOC_UART_2_REGS))
- R8 c/ p" h/ O5 U        {2 G) a/ o% m) U5 q
            // 从 RBR 读一个字节
1 Q9 w+ @. O* D/ c/ g6 N            UARTCharGetNonBlocking(SOC_UART_2_REGS);! @9 ^, j& O) f# z( ]) P1 v
        }, C5 u9 l2 W( Z# f! N% N4 r; E
    }
3 g6 j: Y( V7 h+ s* W0 R, `) \% n* h    ( C- T. I' v4 f. s
    return;
+ d; d9 J/ Y3 Y3 ~* f}, L! q3 \7 o$ B2 w

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
# ^5 U& X; c$ r3 ~如果其它设备快速给你发送串口数据,你这边能正常通讯?

% e( i* a% W* o: y$ ?8 m, [8 A0 w- E谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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