嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
2 b" f* y: G  y! I& t
, V) S. q) b0 l( i#include "TL138.h"                 // 创龙 TL138 开发板相关声明3 A% s8 H3 g0 f- r$ m' ]

7 w/ w5 X& b% Z/ H1 E#include "hw_types.h"               // 宏命令0 e: B" b6 Q. H* \# A# q5 t8 C/ C
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器+ m- p6 e# y1 d3 |3 ^
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器+ B+ @" k# r# y  Y/ s
( z8 z3 o. B( Y/ R
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
4 h1 `1 c/ L4 k( y#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明! m- e( ^( q% P2 G% Z2 P' o" Z; l
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明" \' H2 z" R  w5 N  G1 @8 A
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义% E/ W6 ?$ @5 y% v
: K5 R6 [' w9 M' C0 y
/****************************************************************************/- D/ F9 p- E' o. E/ S5 \
/*                                                                          */
6 U3 G7 d- b1 S7 _4 Z& j! G4 W/*              宏定义                                                      */
# O. s" I) d1 k7 n6 Z8 e2 x& P/*                                                                          */
! e1 t) z$ x  D2 M5 {+ Z$ N/****************************************************************************/
. e! s+ E% p) E: v// 时钟
6 S( ^% z/ B/ v% ?# ~, }3 ]% R#define SYSCLK_1_FREQ     (456000000)1 s* D9 P. _4 \( p4 j; d
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
! t: ?7 O0 s& [+ R  Z#define UART_2_FREQ       (SYSCLK_2_FREQ)( z" A# [9 _0 X

, b/ E* w* m5 z0 Z% F$ f/****************************************************************************/
4 W% l# u2 B* D4 g. Q/*                                                                          */
( p1 t5 L. r" J. V( Q( Z5 ~/*              全局变量                                                    */
) o  V. M. S# s0 f+ n+ [/*                                                                          *// E1 \( C8 @3 t0 N
/****************************************************************************/
  R7 t' c8 ^/ N" T+ b; B& |0 G" s6 fchar txArray[] = "Tronlong UART2 Application......\n\r";
# Z9 p, m/ v" k% D: q# V! u! W$ ?4 t# B2 q
/****************************************************************************/7 @2 ~1 {1 d1 K! E5 r4 z; p" m
/*                                                                          */
+ o9 {; Z: I; q2 [2 ^/*              函数声明                                                    */
9 D  O2 Y, N4 o/ k) V. b1 t+ y7 y/*                                                                          */
2 q* g  F  m- ]7 }5 L" H3 l+ W/****************************************************************************/2 ]0 k9 D# o9 R$ y' X( k
// 外设使能配置' Q0 }. c& n) {1 Q: w( M) O4 i9 ~
void PSCInit(void);  J& `# X6 b5 m* \1 h! R' u( O& ~
5 `0 W) w0 G) p0 e0 T
// GPIO 管脚复用配置
$ l$ |7 ?- d3 y) T/ c$ D3 u0 p! Hvoid GPIOBankPinMuxSet();
5 m7 b6 Y$ _7 R% y# t) R7 P5 L9 D' c
// UART 初始化0 _2 S' O" l3 Q0 D; P
void UARTInit(void);
. ]- h% o3 \" O* [' ^" ?// ARM 中断初始化+ f" y7 j% S. d. C: i
void InterruptInit(void);
( m( ~: `& M/ `2 U" o0 h// UART 中断初始化8 f8 t0 s- ^- p0 t/ n# @
void UARTInterruptInit();
- A6 u3 c. M" ]* \' l// UART 中断服务函数0 p* r* l5 c0 |! k, d- s/ {
void UARTIsr(void);3 F7 n9 B7 g& j. I  @! m( W, y) Y' q

3 c6 K/ X4 N. i/****************************************************************************/
0 l6 m9 n4 D- ]% f3 E6 L7 O/*                                                                          */3 F, a) Q) o  a9 M# J
/*              主函数                                                      */( R, m/ b; j- C, u) V' F/ B; g
/*                                                                          */
& A8 o' A; e7 k9 P/****************************************************************************/
0 F# T/ N# A0 W( U, x. mint main(void)* Z- e5 t9 d2 x/ u  S
{0 S: Y& S! v9 t  |! ~$ p
        // 外设使能配置1 l- P4 R+ X2 z/ G! T: \0 Y& c; e% @
        PSCInit();  C7 ~% F8 X% g, z* Y2 p
        9 J: L" O: k7 s& g
        // GPIO 管脚复用配置& i( p$ Q# y% w3 S+ C4 @; H
        GPIOBankPinMuxSet();
$ {: b" E( G! O# h* A# B$ s( i( e+ g) \! J
        // ARM 中断初始化- ]; ]2 d; _5 x( B
        InterruptInit();
2 V. }& j1 N; p9 q; c% }1 j# B6 e
        // UART 初始化
8 e" _2 C. N0 z2 _) W1 S        UARTInit();. ^& y! B7 x, ?0 ^
/ Y1 S) ^+ T% W8 U. I5 K
        // UART 中断初始化* W- e0 s% R) n2 W3 f
        UARTInterruptInit();
  Y6 X$ F) c  U4 n2 |) z
7 [' f5 v0 A7 Y! B( J        // 主循环
, k/ {& H; f. I" N+ j        for(;;)3 m0 h8 P; W6 F. W
        {+ h0 D0 g; e3 z1 F
% |' N! N+ M0 |4 x2 n2 P' W: y
        }
. p6 h/ B+ Q( Q9 M  N4 @& y3 P}* ?. n! V* d( F! |. k

% v5 a# y$ k. s  N5 h, O3 n/ @/****************************************************************************/1 r" C/ W- Y6 o. i/ P7 P; v- l
/*                                                                          */- ]; |! ?* M6 c
/*              PSC 初始化                                                  */3 m( B: B( k5 B8 h6 }/ m
/*                                                                          */7 x, T& I; r! U% X4 X
/****************************************************************************/: {; R' @  [# {8 z
void PSCInit(void)
3 o9 }8 A1 j2 J- v1 U{4 _$ E# N3 z! q2 P( Q" |' _: M" e
        // 对相应外设模块的使能也可以在 BootLoader 中完成
$ X7 m; ]3 y, w1 W. f0 o    // 使能 UART2 模块
) C+ j/ e0 n" e1 T: b+ r    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; j8 U; L: V: c2 \6 Y. L}
. [$ ]& m% b- }) I
1 {  }7 |, n0 n9 ^% \* |% i/ M1 X/****************************************************************************/1 U! t6 P8 ^# D+ A/ Z; \
/*                                                                          */
2 z! d+ I2 l5 z* [: {% q& [/*              GPIO 管脚复用配置                                           */- v! _& W* |1 |3 T+ n* D
/*                                                                          */
: T( c/ N: ]# }6 ]$ i1 @' ~  k/****************************************************************************/
2 `5 B/ Q' m- @0 jvoid GPIOBankPinMuxSet(void)
% S" O7 ]  n+ K* ^9 q{. L: K7 V8 {0 k! F
        // UART2 禁用流控  H  _; R6 U" c( a+ U$ a
        UARTPinMuxSetup(2, FALSE);9 K' K- W7 I0 I0 t# G. [4 g/ r
}
( v1 N  d9 D# @* y# r
# j! N- K! L& ?5 T. l! q2 x8 Z7 D/****************************************************************************/
2 c5 A6 }0 c, A+ H0 o1 U3 A' a/*                                                                          */
% N" I/ ]- f5 b) B; d/*              ARM 中断初始化                                              */
! t: L7 Z. p7 R$ K/*                                                                          */& V& x" Y' r; p  o7 Y7 B5 z- Q
/****************************************************************************/$ A9 B; G: ^+ I8 I/ P3 i
void InterruptInit(void)
& x. ~; a+ E" F4 ]7 ~( ~{# s4 p1 B' M4 T/ g6 \8 I: @
    // 初始化 ARM 中断控制器
% }' ?1 i) T  l3 I9 Z: T7 C    IntAINTCInit();; P$ ]. n& `9 A3 j1 ]4 m
" C/ H& @5 A/ P$ _5 {
    // 使能 IRQ(CPSR); S+ L1 @8 k* n
    IntMasterIRQEnable();% J& f  X" Y- ^4 J( |8 P$ b
2 f3 U8 i' M# C
    // 使能中断(AINTC GER)
) w9 z& Z  W; r: b7 e- A# ?# T2 M    IntGlobalEnable();4 G1 ~% |& U4 X1 ~- E. {

8 \9 [; i1 o# C; L- M    // 使能中断(AINTC HIER)# F7 i, `# y, I2 H6 \
    IntIRQEnable();/ n( f# ~4 E  X1 b: ^! o+ _/ g
}
) A' K, y0 R& {, Z. ^8 v4 v
0 J5 r5 q8 k! s. r/****************************************************************************/
- Z) b' B( n! y3 M1 S/*                                                                          */) Q6 I8 z" v" }  u
/*              UART 初始化                                                 */
, o, e: _0 Y2 W/*                                                                          */* A5 Q! a, \6 b9 H7 E  z
/****************************************************************************/& X* z/ g$ Z, q/ [( @9 G
void UARTInit(void)4 B* O) Y, y7 i
{
  e' _4 f" w3 h8 @* E- q        // 配置 UART2 参数
! v, D# S, j) \$ X' ~" p, F/ l        // 波特率 115200 数据位 8 停止位 1 无校验位3 i# G! q# \6 y# ]# z- B' g
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
5 Y0 X4 v; L# f( i; H5 B& A                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
! K, c1 u( Q, ^( ?        // 使能 UART2
5 N$ M/ l1 m9 N* ~" p0 v        UARTEnable(SOC_UART_2_REGS);
' d8 E5 c* ~5 G2 R, z! X/ ~( n# K5 s$ L0 ~# K
    // 使能接收 / 发送 FIFO$ h2 J4 ]: G1 S, v7 s
    UARTFIFOEnable(SOC_UART_2_REGS);
& \9 @& l/ D& T+ l5 D& Z3 D6 O( Q8 H9 W/ o6 X" U$ m5 f
    // 设置 FIFO 级别
, i' z6 y& O* q' t    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
+ Q& k# c% `8 v  O9 n$ M' v}
1 l- U3 T% @9 b( _% t
/ n; A4 R  T/ _- s+ N* ]* v/****************************************************************************/
" ?6 R* a4 @$ [% z/ N, f/*                                                                          *// \6 i: W" {: g. `1 n  R
/*              UART 中断初始化                                             */
. b. Q% L- L' Y2 V4 ?) A% ]5 s2 O/*                                                                          */4 k$ K% v) A  v
/****************************************************************************/" R/ C8 D* {7 d& ~
void UARTInterruptInit(void)
# N* M& Z2 u9 s$ A) T: j5 O0 ?{! b- q' Q3 V& G7 T9 _7 a5 H  f
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
8 i5 P& a) d. _2 D6 d% W* f        IntChannelSet(SYS_INT_UARTINT2, 2);
( Y- z* s) R; `7 }" n. i        IntSystemEnable(SYS_INT_UARTINT2);
8 {+ `1 d. s& Z* i& `; x! T9 ]
% y7 i. n1 K9 g4 `3 w; K" i" h        // 使能中断
' p' B; Z9 h7 Q        unsigned int intFlags = 0;) V  F" I, C9 Y: j& t
    intFlags |= (UART_INT_LINE_STAT  |  \
; s) q6 z1 Q( N8 a7 d7 k1 |' D                 UART_INT_TX_EMPTY |    \
' `" X' M1 q1 i1 t$ Q. v                 UART_INT_RXDATA_CTI);. x! h) X6 ~  L
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 F4 V3 x' j& j/ u7 l: w' O; C}# \) o4 U8 F; I( ?: P2 d
- c# _7 K* `* u) L
/****************************************************************************/
0 H" I" J+ [- ~4 [/*                                                                          */  t1 g( C6 o3 Y6 [7 a2 M4 x
/*              UART 中断服务函数                                           */
" f3 S4 ?$ ]# b4 K/*                                                                          */7 h) V: E6 n, x% W; R' t1 m1 F
/****************************************************************************/. W0 W1 p! d: z) X9 F! D: X
void UARTIsr()
# w6 L3 u, x$ h# S3 |{
" m! {( A* n7 D- j; U# d: i$ A" z    static unsigned int length = sizeof(txArray);) J3 R! V% G8 I
    static unsigned int count = 0;4 U9 p( s; g! a% I9 R
    unsigned char rxData = 0;2 ^7 J, u) i5 y7 C1 `5 Z
    unsigned int int_id = 0;
& b, T2 s+ q& T9 |, z9 z, k  @0 Y# n6 c* H& f$ `
    // 确定中断源0 M, _+ n. T2 U) b: ?
    int_id = UARTIntStatus(SOC_UART_2_REGS);
  n& `2 ]9 x- {9 V9 ^1 I0 L' ^% ]9 A$ F. Z; ~
    // 清除 UART2 系统中断6 ^: u4 l: R/ |
    IntSystemStatusClear(SYS_INT_UARTINT2);
3 u2 s; v  ?( p4 d# j' Z
/ g! P* u3 m$ O    // 发送中断; K. f  _* ?5 @/ a1 d. L1 {
    if(UART_INTID_TX_EMPTY == int_id)& ]$ C- G/ q' Q
    {* k3 }; i% u$ O
        if(0 < length)4 [5 {8 w4 R0 M& z( m' b/ _3 L# c) {
        {# k: N, W$ T5 ]# X2 C
            // 写一个字节到 THR
' g1 @* w# F6 C' T! O1 T. R            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! b% P4 f: f6 p% [# i            length--;
8 g5 i2 \) Z" H. _3 {1 v4 K2 i            count++;0 A6 V9 ~- v9 O0 s2 B
        }
2 J/ m% b/ a: K7 |        if(0 == length)4 n+ |) E0 m  S8 }, ^! y. q
        {1 k* S& \- y" M, @' E$ Z
            // 禁用发送中断
! a1 I, ~4 O/ _. e            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
# l3 {2 T2 c; f: y0 ^: ?& g        }
0 D! Y# X% Z" S  @     }
3 s) \1 y3 F+ Y2 T, r+ K6 s
- H) s- B. [+ t9 r! k4 _) ^    // 接收中断. w: K7 V/ d; u9 \
    if(UART_INTID_RX_DATA == int_id)# w( e9 u6 f- \& _
    {6 w& ^5 y8 A, I0 _
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
  v. V$ y& z% N/ ~8 ~0 B1 u$ ]+ M5 z0 d8 b2 Z) }4 z# B2 A
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ L9 W. Y0 d- e6 q8 o1 {$ L3 C% m$ y
    }
! O- S8 t' Q! D/ L3 l0 @
) R% |6 p2 J1 Y, c    // 接收错误9 j& u% n& |0 l' b
    if(UART_INTID_RX_LINE_STAT == int_id)
5 e8 J$ G* k  t9 a+ t* z: ^) [    {
9 X6 ^: k) h; f" _' Y% r  f# W) u        while(UARTRxErrorGet(SOC_UART_2_REGS))3 ~5 i0 I) ]* N' m% s% J0 Y. Z" E& D
        {
4 F/ `4 X+ c& L' H            // 从 RBR 读一个字节  g/ h+ A3 V4 r8 p' p) p- f3 m. i# `
            UARTCharGetNonBlocking(SOC_UART_2_REGS);4 h; x- h( Y8 x; s0 J8 k$ E) u
        }. ^5 [* x+ C- B5 F' a$ `$ y9 x
    }$ G- |/ u! e0 b1 c+ w( i% A) D% i5 d
    . m. b% b& j- Y
    return;  Q. s1 m" r8 C) c
}
& l  @3 h/ `! S: u  W( j' Y
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25; Y& t: W$ }& }2 |
如果其它设备快速给你发送串口数据,你这边能正常通讯?

" H. |+ O& b/ q/ o# ?8 n谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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