嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
) R* q9 T- w  t& Z
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。! m- ?$ D+ `5 r0 c, P! |4 S  m

- \7 W% _! N: M$ B4 o* q( I7 c#include "TL138.h"                 // 创龙 TL138 开发板相关声明) ~* ?9 m4 h8 l
( e6 }) j* t0 x- [( j
#include "hw_types.h"               // 宏命令
4 {; |- `# z7 U  h( a$ I#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器9 M& x/ [$ G% \$ Z
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器) {: c# d2 E5 @" N+ P

1 Q' t+ I; H2 n' F#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
- y* `. Z0 ~# ^6 V# H# y/ ~#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
: K) r& ?3 o8 \#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明9 F2 k9 @( _; a. M, h" l- V/ d, E
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
0 \: V& A1 Z: X3 A; Y" r) t7 s# J! T# \# ?+ B6 d7 t
/****************************************************************************/
2 K4 u4 W& f; M: ?9 C! B! |& @/*                                                                          */
  Z5 y. f  G; J2 c6 u; s) G/*              宏定义                                                      */4 ]4 M/ m% a9 {3 Q8 O# r, g8 ~7 u
/*                                                                          */. u) G- V5 s! \! N
/****************************************************************************/
; C9 H, V. [4 O4 f# G, L5 E// 时钟
( _& o  k$ h( b. D; ~; f' u#define SYSCLK_1_FREQ     (456000000)2 ]" L! I+ h/ S5 a6 w
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)0 v! C6 @0 Q/ n* \
#define UART_2_FREQ       (SYSCLK_2_FREQ). |- r5 `7 j7 B& D) ]. C* {
7 S5 T8 [) P5 J1 v, }! x8 F* v
/****************************************************************************/1 h5 Y2 z  w# }7 z: V
/*                                                                          */
4 y2 _: _5 o1 b# q8 |/*              全局变量                                                    */
" B+ p% H  C) L$ u1 i/*                                                                          */
! q  o0 V" Y0 A) \3 D, i0 ^# n/****************************************************************************/  L; {( H* D8 w* k# y
char txArray[] = "Tronlong UART2 Application......\n\r";4 Z7 y1 P7 ?8 R  S' @8 `2 y% ^
% N  a! o3 A) |: g3 h. v
/****************************************************************************/
; k$ i) D8 j" G7 Z. H. o/*                                                                          */: [3 _' G/ a/ c! J2 ]5 T  s
/*              函数声明                                                    */
' |9 ^) D$ y( R$ h* B/*                                                                          */
! Q- ?& }: V/ L# X' p2 p/****************************************************************************/8 w* y0 `) k! M; `. w
// 外设使能配置! }% l9 u) g( A
void PSCInit(void);( k# C- ^$ z4 K3 q
; ?3 @+ ]% ~0 [- f
// GPIO 管脚复用配置9 L" m8 }8 R& M1 b' W
void GPIOBankPinMuxSet();
6 s) X+ x6 c7 k) w1 K1 a0 O. C* |# ^
1 T. L# {: c+ V  ^, ?5 T- A8 S// UART 初始化3 Z3 v5 ?* r) [0 o: P
void UARTInit(void);
6 Q3 |# R) q, |+ `8 L// ARM 中断初始化" V4 y. L' G6 A/ ^! m
void InterruptInit(void);: E6 c( W: y$ B. u
// UART 中断初始化
$ x6 r$ h" L+ B0 |void UARTInterruptInit();. T, H9 y# u5 v) d
// UART 中断服务函数) t* `# _& U" ?8 l5 F, k: ~
void UARTIsr(void);9 \- Y1 H6 i: a

! D+ t. G9 U+ W/****************************************************************************/
' e3 O! u( J9 S9 [- p/*                                                                          */
: ^& E0 R0 W; O' b* v/ t9 C/*              主函数                                                      */4 X7 ?% n! ?; M2 @3 B, c  ~
/*                                                                          */: {% \9 R( Y, G
/****************************************************************************/
7 Z0 a2 [& I6 J" k& R# xint main(void)! f4 I: b5 F+ C+ D- ?
{* S9 K+ B) w+ [, Q
        // 外设使能配置9 D+ M0 p+ Z8 d6 s7 ^2 V
        PSCInit();
" Z# Q( G9 p0 f9 l) a8 l        ) P; d, n7 q# T+ F
        // GPIO 管脚复用配置% p6 h5 N3 y/ V9 w
        GPIOBankPinMuxSet();2 }* {( ~  z! y5 k2 U
, Y, `  a2 D# H& s! {
        // ARM 中断初始化  T3 Z8 k& P& D, z- r( w0 g' ?
        InterruptInit();
1 \8 ?/ d) n! q
9 O$ E1 s) R  i        // UART 初始化" V, ~" ]9 L- d  F; M: C$ O
        UARTInit();
$ a+ U- l4 q9 W0 [2 w9 t
2 d2 Z3 T, U% X/ P' z0 U9 U. y: `        // UART 中断初始化
! j/ a- L: B6 a        UARTInterruptInit();
  d1 ~: q* W5 O% q" k+ A- U8 _4 a2 N5 ^$ \9 j% f0 i. B
        // 主循环
* k0 |1 P- p! K        for(;;)& k% o/ I& X1 v  ^& Z) s% I
        {& q5 e1 s; ~2 x: Q- p

& r+ {% V" W6 }        }% a$ M1 @* Z! q! \5 ~* `6 |6 v
}
: a) D/ \# Y  ]2 f4 x- D$ T; j
  C( y9 K  v/ b6 U; A: {- o/****************************************************************************/
  N8 }& h. b, x" g; c/*                                                                          */
: [* D# A; g1 v1 K1 d/*              PSC 初始化                                                  */( W% y- R, a4 Y, s
/*                                                                          */; g: }& l" U7 w# ~. \7 D! A* W6 {
/****************************************************************************/
1 G  Y1 n  ~9 P) X" U) {; ~" ]void PSCInit(void)5 j# g( Y' t* g
{+ z  k/ F# g7 K1 v( X8 s
        // 对相应外设模块的使能也可以在 BootLoader 中完成7 p2 Y8 c1 R6 {: [/ |  ~
    // 使能 UART2 模块
* |# J' p+ m, ~' f# ]1 [9 H  I+ ~    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
) @) G; L4 e: q' S! k' }- Z}
+ Q4 H1 C! D3 Q7 y3 ^" n5 |7 u8 l$ X. G, P
/****************************************************************************/: e& f/ [' w! T' L4 j; p% u0 b0 j
/*                                                                          */6 N& P  [+ y9 f" k
/*              GPIO 管脚复用配置                                           */$ Q3 a( X; W  o3 ~% h# Q" N! `
/*                                                                          */, ]% D9 S3 z* [- p# N2 J8 y/ y
/****************************************************************************/
: O" Z0 r. ~( ?' H' {9 pvoid GPIOBankPinMuxSet(void)* Y9 i* A% k5 S( Q. k* ?8 Z* C
{: |5 w: w2 [6 r4 y$ I. M. }
        // UART2 禁用流控
- R, z, a! |  {% `! Z7 l3 \' U        UARTPinMuxSetup(2, FALSE);$ o, k( }6 @. A& g. l
}) a4 Q9 B$ T# W7 {$ M! g

8 v7 R" P- E! z) w3 b6 n2 S/****************************************************************************/
$ `! W1 Y2 ]3 M! f4 C0 y/*                                                                          */# U4 k: X9 X% l& b
/*              ARM 中断初始化                                              */
0 {  J: n$ F( f, g( p/ c. @& n/*                                                                          */1 b* F) K: a/ [, l. x
/****************************************************************************/3 q" A$ X/ ^, q* [) C
void InterruptInit(void)' h" T# L* z1 p
{
6 B! f* p( W2 u7 {3 S4 p* x: A    // 初始化 ARM 中断控制器7 C* h! I+ c" v( D7 A: w
    IntAINTCInit();4 j1 M* V7 G* [# r
8 ?3 \/ g) }4 y, o0 z
    // 使能 IRQ(CPSR), b0 M9 b9 ]4 S7 m
    IntMasterIRQEnable();
) `2 C; x, f+ G2 x5 T+ e! r. R" c. W. k4 M; P% D2 A
    // 使能中断(AINTC GER)3 j1 v2 _0 k4 O# i. j# ~
    IntGlobalEnable();
+ _4 ^4 D$ D. J0 I! J: A4 Q
. Y6 B7 O: @. [4 t+ q4 Y) i$ U    // 使能中断(AINTC HIER)& ~* O4 U* A2 ?" p
    IntIRQEnable();( u" L* l. B7 z4 I& d# t  R
}2 y, V+ I- x* E- u" V
4 [8 |* x  M! J" `7 d' Q
/****************************************************************************/
; b0 A$ u- \' i/*                                                                          */
3 |7 A, Y, E% h' X) P/*              UART 初始化                                                 *// p  i5 p* e! y2 c3 D. }5 Y0 `% D
/*                                                                          */9 a. f( h, v& \2 f3 n
/****************************************************************************/6 X% S5 S, N/ J2 C5 g
void UARTInit(void)  i5 v- }$ G! ~" [; f
{
2 f! P0 {( q" r        // 配置 UART2 参数( b; G; c  U! g/ C
        // 波特率 115200 数据位 8 停止位 1 无校验位
' X6 ?% y) k3 _) C" D* _- H    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,. ?- R, }6 ^; }' C) j# [  M! e
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) [: I) Q4 z& z# H0 r
        // 使能 UART2* N# r1 W; \# J/ v
        UARTEnable(SOC_UART_2_REGS);! q( h, i7 Y8 I8 a7 J9 ^- H

. N9 l9 d8 z' N# i& Z    // 使能接收 / 发送 FIFO# _9 d2 c2 G- R; }& s
    UARTFIFOEnable(SOC_UART_2_REGS);- m/ a/ t: C7 d% s) T

" s& ?9 [$ I, b5 B: ]    // 设置 FIFO 级别6 J' ]" t2 O: g
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
: c) J/ l1 q! U& H& O1 T}  X8 g: J& }  a2 z3 j( h# C* [
; j3 X9 P/ L* [& p
/****************************************************************************/) c0 \  ?8 z% X/ e/ p% B% q
/*                                                                          */  `& c2 e- F3 R
/*              UART 中断初始化                                             */
2 G6 L# G4 }  c$ O6 n/ i6 j/*                                                                          */
7 D. C0 j; v4 s. T& t- q/****************************************************************************/( U$ S6 k: @  ~+ U1 P% ]2 ^" K3 y
void UARTInterruptInit(void). F' o& g4 V7 Z+ A# v" U9 F% {
{
# s9 q8 h5 Y" S' ^; i, f        IntRegister(SYS_INT_UARTINT2, UARTIsr);
& H1 R. m4 L* _  a; O- ^        IntChannelSet(SYS_INT_UARTINT2, 2);
1 @. k( n/ ?3 F+ K: U        IntSystemEnable(SYS_INT_UARTINT2);2 R) R( F: `; }4 r' d" u, N

! {$ x" u0 x, e7 i) d        // 使能中断+ G" f  c; V$ p
        unsigned int intFlags = 0;
5 U. u8 g+ i6 ]5 |    intFlags |= (UART_INT_LINE_STAT  |  \
! O, S: N2 k  a6 J# C0 J, s                 UART_INT_TX_EMPTY |    \! h: U* X$ Q( J" B4 v
                 UART_INT_RXDATA_CTI);- F6 C) M( B* }
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
  k7 S& g2 ^! k* R}2 {5 U1 {" ?) P, M7 g/ b' y% C
. x0 r2 z( t3 ?# t: W
/****************************************************************************/$ Z7 g/ y  g5 u$ s; W& M4 z  {& g
/*                                                                          */( q& L7 ^  p: e9 P3 T! v
/*              UART 中断服务函数                                           */3 H) t" f9 ~5 ~
/*                                                                          */, t) i" F) {7 w9 @- d9 l0 x- H
/****************************************************************************/+ B2 b& ?9 h$ w
void UARTIsr()4 w4 H: h! H/ j2 l' d0 v) Y
{/ ~, Q4 I/ _1 g: o" h' q& c
    static unsigned int length = sizeof(txArray);
1 z5 Y* h  D" k0 T! u9 X, I) O    static unsigned int count = 0;
+ C/ q% n1 @# u    unsigned char rxData = 0;
1 P/ J7 j- u: F( m    unsigned int int_id = 0;
( w5 ]5 F; k+ A1 X# Y6 Y+ g2 k1 r- Z( p
    // 确定中断源7 M8 Y: @# ?% n7 x
    int_id = UARTIntStatus(SOC_UART_2_REGS);
: |! Y; i1 x) S7 K( U+ k; b( e' P/ U9 g7 @. F
    // 清除 UART2 系统中断5 {9 U' _+ Q1 v$ Z
    IntSystemStatusClear(SYS_INT_UARTINT2);3 M0 E3 e) Z5 @: U" c
7 ]+ u2 b6 i: f2 l' Z
    // 发送中断1 Q% w+ u4 e1 R& ?( `  G1 l1 H! c
    if(UART_INTID_TX_EMPTY == int_id)- \5 m' k; b0 x
    {+ X0 o8 N$ {. f4 L9 j$ u$ X
        if(0 < length)9 |; F( o0 j- L2 j1 {$ C$ }
        {3 u/ u6 s) J# @) e! s& r+ p% j
            // 写一个字节到 THR* S$ |% K, g1 P# d, I' ^
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 i1 f  h1 `/ S! s" r5 q
            length--;
/ }; w9 o3 R8 d) w% i7 t& V            count++;- `/ A3 ~' J* _
        }
# s: G3 v5 X- p" G$ z        if(0 == length)( z  I* o! r& S# y5 L
        {1 g9 T, G2 r9 j: d. d* c- ]
            // 禁用发送中断
0 a' }3 x) n, t0 h1 l0 B. c            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
/ L# v: p( f( ]% Q- l  l        }
' f) B5 I, W- O# R) I     }6 Y3 u4 r* b/ K- A; U: H
. S6 |! ^" j# D3 j* M
    // 接收中断
7 B. u9 G9 v$ w- E9 P  q    if(UART_INTID_RX_DATA == int_id)4 a0 e0 Z- T2 R. _2 P: X5 x
    {
: M8 J0 U: J# u, T+ ~        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
% P, ~) f0 W. A  B( G
% \" X, T4 u( ~) s* p) M        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);7 b1 h( [2 Y. k! ~' X
    }- M5 o: L% d  o; ~

& q2 t0 r6 S. w9 T! D6 V    // 接收错误9 b& ^/ }- r; m% v
    if(UART_INTID_RX_LINE_STAT == int_id)
+ [. S7 m9 A5 m1 i2 Y    {
0 a7 O% t1 R9 f        while(UARTRxErrorGet(SOC_UART_2_REGS))# N1 d% K0 K# F) ]
        {! g: |9 e) [( m
            // 从 RBR 读一个字节
8 |/ J( E: o( h+ B* c            UARTCharGetNonBlocking(SOC_UART_2_REGS);
" f9 C  a% `0 k        }* Z$ S1 t- O: D
    }8 P/ b* o; X3 k7 l1 T5 D
    . k6 a* Q8 G3 P) k5 h
    return;
( A% B  ~  D: `( r. C& R}) x: h6 v' X5 m

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:255 q( L8 U3 ]# m6 B1 O  W
如果其它设备快速给你发送串口数据,你这边能正常通讯?
( G+ a( V' w: ^8 ], I+ z% V
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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