嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。7 Y! i7 R1 y0 H' Z

/ G& K  [- E1 r  z: S7 G5 ]#include "TL138.h"                 // 创龙 TL138 开发板相关声明
& @4 x" n0 Z- A1 k- }5 b
) e. r' |- p, N#include "hw_types.h"               // 宏命令- M; q, Z" n' }0 J3 Z& Z
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
9 R$ ~0 z$ b" R9 A' n; ]#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
4 O; [, b# o/ `; Z$ G' J. c- \. B) l9 O( g
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
' }) P% O0 |- n  _+ J  Z1 F#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明% [4 A# s- q% b" S6 ]
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明8 S2 v+ `2 ~* ?
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
. E* F, ~' o8 C/ O  m
* V/ _  @) s4 C" p/ T( N. y/****************************************************************************/
  |3 x- s) A0 E/*                                                                          */4 x9 j8 l5 r2 f9 q* J
/*              宏定义                                                      */
+ z4 P" W( F3 G/*                                                                          */+ `' ^& U, d) y0 `
/****************************************************************************/
& y2 V4 s5 W/ C6 |// 时钟# d/ u7 }) A4 R$ k$ S' M+ q" ~5 K
#define SYSCLK_1_FREQ     (456000000), @+ p5 Q5 i/ z
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)  m2 A, s5 P1 l& V
#define UART_2_FREQ       (SYSCLK_2_FREQ)
; ~( m! c; d4 x
5 T% i, \4 {" s. Q1 [, l# o; t/****************************************************************************/
9 R* K7 l4 {4 l. s$ p1 I4 S/*                                                                          */
) T3 E/ A6 l( s$ W2 x% A/*              全局变量                                                    */
8 y  S5 n- r' d$ R. `/*                                                                          */
, e. u% O2 U4 G% d/****************************************************************************/. U* h# }( ]+ {0 Q% k4 B; Z! S
char txArray[] = "Tronlong UART2 Application......\n\r";0 ^3 K0 l$ Q; F+ A' U8 v
5 N2 O/ Z( I1 j  v* J
/****************************************************************************/
$ \; \% }6 t! d+ {6 w/*                                                                          */2 o) `! Y* L7 l, g# V. {
/*              函数声明                                                    */5 J- e, t( }2 m8 e
/*                                                                          */
5 [, I/ h1 J1 T0 w0 @6 r% G/****************************************************************************/" @+ c2 t0 O- b( y9 S# k) i& K
// 外设使能配置
: v# _" F  g' @1 w: U1 Dvoid PSCInit(void);
3 u* h, K* L5 W# A
0 g' ^! W* I! t' l+ P/ B6 E// GPIO 管脚复用配置
4 P' d' \+ ~# [" J! cvoid GPIOBankPinMuxSet();
: P8 R$ f$ M; D, K1 U
# Y( v  v$ Q' X# C- Z( P% L* I// UART 初始化
0 @+ h( {* w% L) r6 _! G0 [- Z) z; Rvoid UARTInit(void);  _1 T. s: l9 F6 l) ]1 y/ j
// ARM 中断初始化5 \* ]; G. |3 `' r' j7 {( B. [
void InterruptInit(void);/ E4 Y5 T8 ?1 }0 b& Z( y4 s
// UART 中断初始化; t& a. U* i: \* K' M$ [) f/ }
void UARTInterruptInit();) {. }& I5 p% E$ e+ G( v0 l) d7 x
// UART 中断服务函数3 M# i2 d4 K5 ^1 X/ o' Y
void UARTIsr(void);
4 Z0 l6 l/ @9 k5 m: @2 @; Y3 A+ n
% L0 I* ]* M$ \- ^7 X: }# u/****************************************************************************/
$ N! b9 P& U. N2 y: w: O. P/*                                                                          */
6 Z4 O" S$ Q! E' Q& o7 b/*              主函数                                                      */
9 K- F8 W3 y( G/*                                                                          */5 Q! S- X6 p4 N0 O6 ^
/****************************************************************************/
0 l. N8 Z$ t' E% m$ Pint main(void)
2 o1 @' s1 l) |4 M+ q{. ]0 A3 G% h4 K1 Y1 V$ g) c
        // 外设使能配置0 N+ u: S4 t" J5 ^4 p
        PSCInit();
7 Q% C0 f' G/ p% d3 O9 ]; D& J        9 U9 ~4 z' `! ^
        // GPIO 管脚复用配置% O3 C2 G/ e- ]
        GPIOBankPinMuxSet();- O" N, b3 p: j/ F9 [' ]

" y" P( _( _$ ?4 Y) D5 ?+ A1 R        // ARM 中断初始化
* q- t$ O6 M+ }  d* I        InterruptInit();7 y" m' R) L0 N- A9 f5 W$ o

$ I' J6 j. I' ], j8 e2 t8 b        // UART 初始化
0 _% v8 h: H- A& o  ~6 N        UARTInit();! E1 X8 Z0 g* L1 a) C( i: c
- c8 V9 S& y1 V
        // UART 中断初始化
6 _" H7 A7 k$ N' E" S2 P        UARTInterruptInit();! C8 U' ]4 L! A# x3 t% o* @

, c7 I1 ~% |/ E/ Y+ \0 |( V, q        // 主循环
# Q) Y7 a* m; [        for(;;)& y/ q' F- j; o# f# k
        {
2 T: Y4 I* x/ |& m! X; L- o
' r' q, k* f  ^# G# l3 T3 k        }; e' t' D0 F1 U) S: @, I7 Y
}
2 M# l* u9 J1 J& k# X- F" V$ v+ m" _7 p# {) D+ \
/****************************************************************************/
5 ]9 j3 p: _$ U: t, s) n% p7 I. [/*                                                                          */9 O, R) q% f6 U3 }7 u
/*              PSC 初始化                                                  */
/ U+ Y. f8 @. ]9 U! O9 F  x/*                                                                          */
, G9 `: \- j/ k6 k- D/****************************************************************************/# z) ?% O4 U9 k- q
void PSCInit(void)+ {  {' M8 x$ A7 b" r
{( L4 R! E9 |( q- j; s. d
        // 对相应外设模块的使能也可以在 BootLoader 中完成
* I' s8 j8 c: [0 q    // 使能 UART2 模块
. t! Y" n1 l1 D2 e8 `    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 N% w7 v. m6 ~5 P}
6 a8 c; }! D, r2 J  B2 {& c( b. J! F' L3 t  @4 s
/****************************************************************************/
+ r2 {% T2 z6 n0 I/*                                                                          */
0 X3 P$ W8 H; r8 M$ z+ k6 d% c# w/*              GPIO 管脚复用配置                                           */
% N3 |+ B( z' M% U9 s8 n4 A& P/*                                                                          */
/ Q# ^/ W3 Y0 O, B/****************************************************************************/; I" p% h& F$ w! K
void GPIOBankPinMuxSet(void)
" \; H2 }( I- Q- ]) L{
6 ~* |' M. B- L  d) N; s! i        // UART2 禁用流控
. U: ?7 {' O$ b7 R; W7 Z1 o" l        UARTPinMuxSetup(2, FALSE);9 c6 h0 W* M8 t
}
1 M+ U: R- ~9 ?& w, m; w. Z
- f  y- A% Z# K' R0 m8 q8 t; ]/****************************************************************************/
: w+ w6 k# r9 ^  U) p* e% v/*                                                                          */
8 k9 i4 g( O5 y6 m: G- O. F/*              ARM 中断初始化                                              */# i2 g8 b4 N3 F2 |% x' T
/*                                                                          */! ]  i1 |4 q/ E% E' R
/****************************************************************************/
4 c$ H# a$ z- g6 q0 Rvoid InterruptInit(void)
" _& s" ]( r# u0 n0 O$ G  y{
# }8 i) q+ O+ h. r    // 初始化 ARM 中断控制器5 s) X+ J/ e. N, y
    IntAINTCInit();4 S5 _& h5 j' h5 }/ _
0 [+ D+ f( g, s, o" o$ x5 p/ R  n
    // 使能 IRQ(CPSR)
4 E* |, C& n3 ?. m& v# m  S    IntMasterIRQEnable();
5 l) M3 R5 p! r1 E
. i' P/ z) q/ Q    // 使能中断(AINTC GER)8 [9 G( U6 x* X0 f; E+ R3 A
    IntGlobalEnable();
4 M) H2 G- d+ D4 K/ L0 l* @3 E; d: @6 U7 R( N: F0 i  H: W
    // 使能中断(AINTC HIER); Y6 Q( G& i& o; U% d. I! Q
    IntIRQEnable();6 F" I2 L- ?0 C* V1 `  Q, G3 l
}
) |" \- H; M7 Z' L4 r
; e8 S, M3 m$ @% v) J0 o/****************************************************************************/. v% x( C" H5 _8 [, d+ Y0 F; t
/*                                                                          */) p% s" t) b# I( n7 g
/*              UART 初始化                                                 */
4 n. G6 Y; d8 ~. U9 A, z) Q/*                                                                          */
& _. p: n) E+ w% {5 [) f/****************************************************************************/
0 G. t% r% u$ }7 ~6 Avoid UARTInit(void)
( z1 j, N3 M, ~. R( M. G4 v{0 h) S  l4 w9 u
        // 配置 UART2 参数
5 J9 T$ E, P5 K* c  v7 d        // 波特率 115200 数据位 8 停止位 1 无校验位
$ v! @) D4 A/ V! x1 K' a    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 i! p- ]" U! C7 T* W                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% @5 H/ t# p6 \2 |        // 使能 UART2
' j/ _& W3 D9 T% D/ B        UARTEnable(SOC_UART_2_REGS);
+ ~* `! v" }) D7 B
% a# A  k1 [1 ~5 e* T; B. C7 N# Y' J    // 使能接收 / 发送 FIFO: N5 C% r7 k( A7 @) t! M. D
    UARTFIFOEnable(SOC_UART_2_REGS);2 ^  @+ F5 b5 f2 S' t. x$ s- [

, R/ T0 a6 Y: q8 {" }2 G1 M$ {    // 设置 FIFO 级别2 |, Y/ P& }+ D4 Z( D
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
! w4 D  f# V, N1 c% O6 ~}0 E- v# J' k- ~5 c) u3 R* [" [& h
1 l! p" ]# ^, X4 v% r
/****************************************************************************/
2 O# M$ J5 p1 w/ F/*                                                                          */
8 R. ^/ ]8 x1 g. ?/*              UART 中断初始化                                             */
* x1 i+ K( t. L0 r/*                                                                          */. F- k. n% D+ p: d$ \) ?5 Z
/****************************************************************************/
2 o/ n& I) Z# m+ d( Bvoid UARTInterruptInit(void)- U! A0 {, I2 |  R1 y5 x
{
' B3 i6 ?% \; [* x( |. G        IntRegister(SYS_INT_UARTINT2, UARTIsr);6 m7 U+ W9 x( f# L
        IntChannelSet(SYS_INT_UARTINT2, 2);* d* [' j% g; ^6 n5 `! L
        IntSystemEnable(SYS_INT_UARTINT2);0 I3 N( B7 W/ W" `1 S
- C; d9 H& O2 q" u, n# q; L$ o: l
        // 使能中断( _1 E+ `# _5 V9 D; |; z  n* z' j; a4 S* w
        unsigned int intFlags = 0;) e# P8 {, i  N
    intFlags |= (UART_INT_LINE_STAT  |  \- X+ x- y) z! w
                 UART_INT_TX_EMPTY |    \, `6 V) g' n3 Q  e% L: O
                 UART_INT_RXDATA_CTI);
1 F& o5 ~2 l4 ?, [1 Q% T: k1 W, |    UARTIntEnable(SOC_UART_2_REGS, intFlags);, p: ?* D+ w3 U" n* E5 J
}
- j! c7 m+ v/ S' C0 {! M* X+ `% x3 H; }; S7 X! B
/****************************************************************************/6 R* [( ]1 A# g1 c& Z
/*                                                                          */2 y: C& S, w% A4 W- ?2 L
/*              UART 中断服务函数                                           */
8 X- }( y0 r( o, o0 D/*                                                                          */
% S) t4 e( c" C& ?- |# y5 j; u8 _/****************************************************************************/: Q7 j( ~  S0 R) }) e. c5 ?
void UARTIsr()' T0 t1 u& ~9 ?
{
  s9 x' Y$ d( x" L& s" m) Z- c) q+ Y    static unsigned int length = sizeof(txArray);9 v/ y- a9 I% V5 G; W+ s( e
    static unsigned int count = 0;
1 g9 y6 f. [) Z3 {6 F    unsigned char rxData = 0;
- o* p/ o2 K6 h+ }7 [6 C. l    unsigned int int_id = 0;
) D, C% t' K0 N3 k, |1 T% l# F9 z4 E3 q
    // 确定中断源
) [8 q8 C! b8 G6 l- P4 d    int_id = UARTIntStatus(SOC_UART_2_REGS);$ K6 t% ?: o1 m+ w6 ]/ D8 B3 {

4 C7 \. s1 m! L9 N( g    // 清除 UART2 系统中断
  e1 T; ^! ?( A$ H1 U3 ^    IntSystemStatusClear(SYS_INT_UARTINT2);: G# F2 v- H$ B- M3 q4 G4 G! }$ q

6 W& \; }: J& C    // 发送中断$ e2 J% M7 I2 N
    if(UART_INTID_TX_EMPTY == int_id)) ~. W( [5 E) Y! i# P9 |
    {
) O/ J+ M" k" g' ?9 l- l0 u* }        if(0 < length)
3 ~; e: F3 K  t. u/ i1 }& i* T* @        {# i  K& G8 v- |. q9 Z5 |0 X2 X2 c
            // 写一个字节到 THR0 w- J9 c5 h" C7 N- V& P$ V- v
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);3 b9 Z2 f$ r# q& Z4 k: _
            length--;
" w: D- s3 k! P4 ]# l            count++;
8 L; f% d! s  e7 A" m8 J2 t" x        }
, p3 ]. Q7 d, [5 z        if(0 == length)
5 R) v( M3 N1 @1 E1 {; D        {9 ]& ^% K% d# [% o' |+ m& w6 a) t
            // 禁用发送中断% e$ K) P4 g; h
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);7 w  N# G& v+ T$ l/ K; _; o- A3 O& D
        }
' p' D7 D- T- M  b  f     }
/ Q8 v$ `2 ~) i3 m
9 Q" w2 `" O2 N2 M. t    // 接收中断
& K; C  t( ~( O2 Z! d    if(UART_INTID_RX_DATA == int_id)
- r! d- [1 J, T/ J; z    {
, Q7 d+ ~$ }; H) L$ M( j* Y  J        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" \3 c8 V4 y% l2 d& y: D
" u, `% M- C  m2 |4 D7 q' d        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 x( V- o+ N0 R    }/ }1 I; b& t# p8 O, {( H
) `3 w8 V% j- `" G4 [! C
    // 接收错误% e$ M, @% N" q; r6 k( Y
    if(UART_INTID_RX_LINE_STAT == int_id)' R5 w+ h& `) ^0 R
    {& o' H/ X% L/ D2 ]. A! A
        while(UARTRxErrorGet(SOC_UART_2_REGS))
7 o4 ?% x* E+ Y) p0 a/ f        {% u! Q" l9 _% z( G
            // 从 RBR 读一个字节2 f: C; u; v& Y3 y
            UARTCharGetNonBlocking(SOC_UART_2_REGS);% Q- ?% G) g) g5 V2 k
        }
; q$ W+ M9 W4 o6 B    }7 _; X; E. ~9 ?/ W' p: O
    ; u3 h7 C6 u6 v; q; j( Q
    return;
  A2 ~$ W& ^: r}/ d- u+ @; w* x" B: U

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
9 [0 T4 r% s, f. e# f3 }( \如果其它设备快速给你发送串口数据,你这边能正常通讯?
- x8 l4 z) O4 U# x
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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