嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
+ v( \1 X& s+ }
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 k8 F2 @; L8 O: u7 p: [' G
  x* y; A7 f# G#include "TL138.h"                 // 创龙 TL138 开发板相关声明! Y' {( C; {+ ]

9 W3 h( [" }; @7 M. ?+ y' P# H0 y#include "hw_types.h"               // 宏命令& \" t; `* R4 r0 x4 L4 L
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
0 ?1 U1 i/ ~; r  C#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
7 _4 C/ p+ r6 H5 h! T( }0 D5 l0 J6 ?
$ c. o+ a4 V2 Z$ Z+ {" q# F: Y#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明  i$ |0 z2 V8 t3 `
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明# B. I4 Z5 h3 I5 Z# }8 n2 V
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明" @' `3 u- T8 q/ Y
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- U7 T8 p$ D5 |+ n
5 e' o' R- B9 A; i% o1 y8 L/****************************************************************************/
" k" @' q: D9 l( K! ]. Z0 U/*                                                                          */
7 i4 V0 ~* w. B- J7 l/*              宏定义                                                      */
% h" r) e# G/ g) {+ |, ^" W% x$ p/*                                                                          */: r/ A& G; V% C
/****************************************************************************/$ y! C# `/ ^, h& A, ?' X( N
// 时钟
/ j; [& V' B5 w4 F! L% l#define SYSCLK_1_FREQ     (456000000), p2 y2 c  O/ p6 o: O/ k
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
0 Z/ V, k0 M; n$ G( Y#define UART_2_FREQ       (SYSCLK_2_FREQ)2 E1 R' ]9 ?# E8 m1 L# q5 `# l$ S$ X
8 I' [; u7 `- O2 }+ R# y
/****************************************************************************/
: \9 `: d+ W" }; t. P! ?$ I+ U& v( C/*                                                                          */, q8 h1 T  t  w7 Z- _( I/ Z: ^6 j
/*              全局变量                                                    */
) A2 Q8 B0 g. U7 i, i" Y/*                                                                          */" y$ N4 k; \: `7 }* p( V
/****************************************************************************/
1 W3 f  E' J2 B* r$ @char txArray[] = "Tronlong UART2 Application......\n\r";$ d4 j; p+ z  E. W

' c8 }1 [4 o" c$ q/****************************************************************************/( e- q. K- Q8 Y  `
/*                                                                          *// O, }4 ^, [& H' n( X$ F/ h* {
/*              函数声明                                                    */
6 ]9 Y- e8 n6 i$ e/*                                                                          */
3 C1 e+ F( r, a; l& M/****************************************************************************/- c8 }' T- G: S
// 外设使能配置6 x! j, N8 o: o/ r. l3 n
void PSCInit(void);: L7 Z; E- n' u  M1 S$ a" I

+ ^5 o1 r& K7 v9 O/ Y4 C! q' Y: A// GPIO 管脚复用配置5 w" L& ~4 \6 O8 m: i  U
void GPIOBankPinMuxSet();
. f% `) @( H8 D, e& l  C0 N( p
" _( y; n& f* s9 {" ^// UART 初始化2 a( F) D! r" e4 d7 b
void UARTInit(void);
+ V7 h0 s9 V+ Y, s// ARM 中断初始化$ J* w$ a  l5 \& B8 ^, Q7 ~+ W
void InterruptInit(void);3 q* Y4 ], O* l5 z
// UART 中断初始化3 @$ Y+ n9 s/ b" h" s. N
void UARTInterruptInit();, ^" y; U1 M8 i5 Q5 K6 P
// UART 中断服务函数! O+ @' B2 j0 s% p
void UARTIsr(void);; v& M5 o: y' x6 T% B% P& G& W

9 n  r  X! E+ v5 V& Z/****************************************************************************/. l  Y, i( A9 C1 s4 R
/*                                                                          */
6 W: x* R$ f5 B/*              主函数                                                      */- F1 E% x1 B5 y) o/ m
/*                                                                          */
/ {5 L" D: w  F5 L/****************************************************************************/; D5 }( t6 j1 z( S7 ^0 l
int main(void)
# O# f0 y( k7 `) M3 `/ ^{* Y" |& x* n5 m6 }% U
        // 外设使能配置
% Z4 y0 m+ V. k: S+ k- k- [* x4 y        PSCInit();
: P4 M. ]- k+ u4 P1 M       
$ d5 T6 f* m$ S% j$ o. _2 w( d2 ?8 x        // GPIO 管脚复用配置. r+ i% N; v$ E. S4 i9 n' T2 h
        GPIOBankPinMuxSet();" g# x; }2 p8 e
) d: i+ j( v& N5 K
        // ARM 中断初始化
/ ^0 {3 m, u: ?& X        InterruptInit();
  u0 b/ A) l3 G1 f7 z+ E4 [2 p' q; x4 u
        // UART 初始化5 ^, I4 l+ e/ [: k+ u3 K+ w2 J
        UARTInit();
7 T% }1 W, y( Y1 w* N/ U$ t: X3 Z: b  P4 q" M
        // UART 中断初始化
# z' E4 w+ s* T+ f0 G' X$ w! s        UARTInterruptInit();* a: F3 \  G3 R( u; ]% [
: f1 g/ f% i0 S4 u2 Y; \. ~2 b
        // 主循环5 D- k& I6 n* G* P; W
        for(;;)9 C* u2 K6 o" z! H
        {$ Y4 a$ G8 I# q
% T( e4 B* h( [6 }: b
        }
! F: P- I$ A" _& K* Y; ~, A' _- c}
6 F! ~6 ?6 ~; J1 ^. X* H7 t0 K2 P' u& H( U, v7 d
/****************************************************************************/
) i: I5 z  }/ S8 |. E/*                                                                          */
3 w2 \3 ~" Y6 B6 I/*              PSC 初始化                                                  */
' s  O, C: C: F% w/*                                                                          */
$ @, I3 A2 }+ E) h% Q% j& X' }0 F( }/****************************************************************************/
# n# l2 j' Z+ g3 q" b1 E! v) F0 @. ^void PSCInit(void)- k4 g2 o, i6 V3 ^
{3 }6 o8 p+ w# o* y; Z% {) {" j# n
        // 对相应外设模块的使能也可以在 BootLoader 中完成
! v9 w9 S( ^# k    // 使能 UART2 模块( N* k/ a0 U) E4 w0 Z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);% E! D0 s, \5 G8 J  M
}: N3 M* M# e1 s6 ]2 e
) \8 G$ ?9 |6 g  J' i
/****************************************************************************/
( Q5 Z) f- T+ B0 z6 }6 t3 \8 b/*                                                                          *// ^; x8 @( N7 p' f$ }
/*              GPIO 管脚复用配置                                           */
! v1 i' m, t7 V% e- K  ~& K6 Y3 J  W/*                                                                          */% D1 Y) b* D' E9 k- k' Q
/****************************************************************************/2 I8 C* f" I/ w- @, G, _8 T6 t
void GPIOBankPinMuxSet(void)
8 Y$ n( D+ A3 |9 W{( w3 Q: P! \" O4 t; o, f
        // UART2 禁用流控
( S8 |& M& e, h) ~" y0 t; Z        UARTPinMuxSetup(2, FALSE);6 @1 Y% W8 {) Q/ f
}
. \) d1 l. j" j4 X  w( Z- ^: A( m, Z4 j
/****************************************************************************/7 r7 P5 M$ ~! b) Q9 D! W
/*                                                                          */
( R' x2 S" j  t: F/*              ARM 中断初始化                                              */
* o' a6 T" W- v* w$ I' U* N3 m( Z/*                                                                          */' z$ {7 q* @% N8 V" v
/****************************************************************************/( g3 S1 l' h9 W; A' @1 K( W
void InterruptInit(void)
5 o0 N3 T* ^  D  y$ E{
' G9 U0 o: X  @! K4 V# [: X) G    // 初始化 ARM 中断控制器1 W2 J( s* o# g4 r/ u  x
    IntAINTCInit();
) m( x5 A. W# e- M' `) ]* z& A$ a7 u7 |* A5 j9 J/ ~. t7 @! K' w8 w
    // 使能 IRQ(CPSR)  I5 g& A3 a/ W# U
    IntMasterIRQEnable();9 a  m: U( y8 o) [
  T3 w( {- n; J" M; b2 Y
    // 使能中断(AINTC GER)
' z4 g9 ^3 p9 Y4 v    IntGlobalEnable();
! P) X' H: P8 Z! B
. q& l, e  Y) i$ y" H; x    // 使能中断(AINTC HIER)
3 c$ ], `  s4 d9 l0 Y' s: X    IntIRQEnable();8 A8 U/ Z0 h/ @0 X" g' d8 Y
}
% W, s- U7 m9 u( ~! F3 |9 m* o: v
1 W: o$ ^9 U' g* {/****************************************************************************/
8 b3 {. }* X/ a3 h- i/*                                                                          */
: R8 j1 d: y5 |* n( e/*              UART 初始化                                                 */
( m. N6 P2 ~; [6 Q/*                                                                          */
# i9 v, `& |$ t9 f# A8 t+ g3 m$ n/****************************************************************************// h$ i  B: b  S8 j
void UARTInit(void)1 |3 r: Q& `+ B* ~* W9 S! r( V
{
/ F; I9 `2 X$ K) ^        // 配置 UART2 参数( n+ ]7 M, ^& j7 V8 W
        // 波特率 115200 数据位 8 停止位 1 无校验位" A8 d; u5 {9 L+ A# z
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 W7 ]6 B! x" H* n# j$ Q                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 M4 k! D" `( ^* h) @
        // 使能 UART2
1 B  U+ \& s9 x7 ?/ E        UARTEnable(SOC_UART_2_REGS);. n4 f1 _4 s3 `# t. [

8 r: n) n- Y  J- `* U/ f: X    // 使能接收 / 发送 FIFO, }3 a% v8 H7 c9 X/ t
    UARTFIFOEnable(SOC_UART_2_REGS);
; C! H7 j1 ]3 n. a, ^: ~
# V4 N3 m* Y' ?% g( q6 W" E( m    // 设置 FIFO 级别1 j4 C. R0 f+ E$ Z/ d
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);5 ?6 s1 J" t- ^- E0 V& S/ N
}  \. P0 e2 H) F# k0 q6 C* b3 M

3 Z$ f3 ]- ~- |$ Q0 Y2 S/****************************************************************************/
: q- ^2 m& B) \: C' `6 d4 j/*                                                                          */$ l  o1 F$ e% Z  U5 w
/*              UART 中断初始化                                             */
1 W& o' B9 {1 c. m$ }% x0 s0 o/*                                                                          */
" R" s) _/ ^( e# _  h/****************************************************************************/) m. M5 T( w) n
void UARTInterruptInit(void)
; s$ L  k  a% M5 A{
9 S2 k8 L1 y+ m1 ^; `8 U        IntRegister(SYS_INT_UARTINT2, UARTIsr);) ?/ S* t& D. M( S
        IntChannelSet(SYS_INT_UARTINT2, 2);0 m! i7 X1 ^& w5 n1 w
        IntSystemEnable(SYS_INT_UARTINT2);
& @2 |) n* B, T9 ^* o* q0 Z
& r# C' Z' X$ j        // 使能中断8 z7 l# D/ O3 x4 q4 J6 R
        unsigned int intFlags = 0;
; l$ y  u7 t/ S7 W' o( }    intFlags |= (UART_INT_LINE_STAT  |  \0 S) k% }# O$ Q4 C, V9 S5 ?
                 UART_INT_TX_EMPTY |    \. n2 x# E+ V  V6 t& H" a
                 UART_INT_RXDATA_CTI);1 ]$ v0 F/ Z3 B9 I
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
' q/ P9 {4 r4 `* p8 p}& ~/ V  P% C. ]4 G, M  C; O2 H: Z
- d7 J. A# X, V  X. o0 j
/****************************************************************************/
$ o# k2 t# v, @/*                                                                          */8 [, K2 B/ d6 D
/*              UART 中断服务函数                                           *// l7 b+ U, h3 I% m! m4 n8 K
/*                                                                          */% L. A% q/ P' I* k+ d; _8 n
/****************************************************************************/
* Q. h: S7 y7 w: @void UARTIsr()
1 X! _9 Q4 }" Z{
) Q$ m% U- g/ }+ g1 K    static unsigned int length = sizeof(txArray);% a+ j, }! ]5 b0 a; F2 [
    static unsigned int count = 0;) ~9 ?  z4 A3 |" K/ q/ t1 i3 Z6 e# z, r
    unsigned char rxData = 0;7 \$ Z0 b: I6 c) j1 _+ U$ U- @: E$ D
    unsigned int int_id = 0;
: g! q5 i1 y7 ]1 e% N8 a) B$ x# V) o! K8 d' i% X- ^$ M7 X
    // 确定中断源
7 p6 b. ^8 e- M5 q    int_id = UARTIntStatus(SOC_UART_2_REGS);6 y9 L! R: C! _* E0 |0 b( c8 n

- l. i0 Z, V" Y    // 清除 UART2 系统中断" }2 E! }, [9 l' S5 e; h
    IntSystemStatusClear(SYS_INT_UARTINT2);
9 F  b7 G, {. E( q5 |" c  \
  |+ U2 _  k, g$ k    // 发送中断; D  g7 F( n8 B+ G4 @6 [5 M
    if(UART_INTID_TX_EMPTY == int_id). n+ `0 }: G' R! @
    {0 {/ C. ?) z1 e2 L- }# H; K
        if(0 < length)* P% t" g. ]+ [" E4 ?- t
        {( O8 ]" ^' E$ U: t
            // 写一个字节到 THR
' W2 k' Z- `3 X- o9 h+ Z' X6 R            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);7 S. ?% r1 {9 m
            length--;
$ b  ]' u; c( r" |            count++;
8 n  |) T, L. y; v0 L1 I& A& j0 }9 s        }
' p1 U- X5 ?% Z5 r        if(0 == length)
  Q2 V5 \5 d+ B  S4 y        {* R% m4 A- T6 x. e/ {
            // 禁用发送中断
5 r) C9 b2 V3 C. m% v/ ^6 U' L            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
2 u" p7 }8 ^9 u- A* ~        }
$ f7 v( `' L: Z% ^     }6 x* b+ d1 Z$ N  ~; L; W* J
5 \8 T8 y, |9 T5 z
    // 接收中断
7 _6 T2 h$ [$ d5 Q! T; ?    if(UART_INTID_RX_DATA == int_id)$ a. [/ {3 L/ D$ o  Y/ A
    {* s( O) C  U# V2 E& R
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);9 @# n) [9 v9 o+ K9 n3 |

! T7 [/ [+ {# h* _4 X        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
, L# R; i0 ^- |    }4 g* k/ D. |( ?

5 K: }- K! U. s0 N% X    // 接收错误, }  z. r0 {$ `( `; Y1 L9 C' l
    if(UART_INTID_RX_LINE_STAT == int_id)
& x% R6 P5 n$ a    {3 _' F* P. N2 ^# ]" [/ k. j5 h# k
        while(UARTRxErrorGet(SOC_UART_2_REGS))( _6 O& a) A- [$ ?2 W) u0 N+ J! Q( }" m' C
        {
1 ]* n8 c! I# L" @. z2 E            // 从 RBR 读一个字节. m" e4 Y) p. o) G8 ~
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
% Q/ \+ J" a0 C/ k        }
% n1 t- U/ p) t* v    }
( P/ z4 E( X  `" p' ], Q   
+ p3 x  l- N5 @1 F2 ?) `    return;! r$ R, q  T+ r% Z
}
$ u3 \; r  t4 ]+ G; z! v5 z
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
6 X4 a  J; w5 K如果其它设备快速给你发送串口数据,你这边能正常通讯?

! U" J2 i% }% q9 ?) O1 m  Z6 o; w谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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