嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。" P+ i' f/ n1 o1 w5 F
/ S( ^- g0 `6 [# ]$ m1 l
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
) k; p; ?5 ]; w, h* A$ x' t0 a- {' j$ H3 w+ `+ _
#include "hw_types.h"               // 宏命令
% v  g5 S5 E) x" M( v* E) Q6 t#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器3 O) l4 S2 f7 C" C% G
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器/ \) n" k! K8 S/ i% o/ q6 Y1 Q

: y8 e$ r# ], Z' p7 u#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
# q% V5 I! L, P, H8 X6 c1 G* b#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明* \5 s7 M  b, R# `- Y( R
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
. m* o& I& v1 V0 D#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义( v, a+ G. ]" U  U+ N" P6 l
$ x8 F6 w4 ~9 ?' q+ o3 c
/****************************************************************************/
0 N* |3 @4 T9 }$ c/*                                                                          */
' A/ L+ B+ D' K% z) d/*              宏定义                                                      */5 Y0 P0 A8 t9 ]3 w3 C0 H
/*                                                                          *// k. I4 W" \, K. v
/****************************************************************************/
9 Z3 y- J/ K8 X' D// 时钟; r+ `# a, y# Z
#define SYSCLK_1_FREQ     (456000000)
' `3 |7 M- N9 ?' Z# k6 _#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)0 Q4 K, G. |( J
#define UART_2_FREQ       (SYSCLK_2_FREQ)+ x& \1 f% I3 J- R) C9 i
% ~) W9 I) B, U
/****************************************************************************/
% ]0 _# w$ T1 t; ]$ V/ I7 s& A% w/*                                                                          */& W% o% R! A: {* e
/*              全局变量                                                    */! ]; _: Q" @0 G# E' J- g% v6 e
/*                                                                          */
# W" v' b# P; ?: ?8 O( a3 }/****************************************************************************/
1 @) Z* |( |) W: s- w  h/ s4 rchar txArray[] = "Tronlong UART2 Application......\n\r";
! w8 }6 e; ?" t4 E# ?, S6 n; F/ k% k, W% O3 R
/****************************************************************************/* I, P% q+ a2 M
/*                                                                          */  p% y/ C! e* x7 z0 E6 i
/*              函数声明                                                    */! z& W: D- c; U3 j
/*                                                                          */
# }5 }7 d/ K  ]* s7 r/****************************************************************************/4 S, X5 Z: s9 }6 v+ C
// 外设使能配置! v* h% i; v$ n' C" _. o
void PSCInit(void);, O7 f$ S% E  Z, g5 k9 g6 ]' o
- H/ p+ J( B1 ^( n# ^4 ]! u8 k
// GPIO 管脚复用配置
" S: X" h! ~$ K1 L0 ~void GPIOBankPinMuxSet();2 N! y. I. X2 G# G2 i8 r& u* D

1 `2 t0 d7 g8 l; p0 m; Z# y// UART 初始化
3 o* S# q# c3 S% @2 R* g" Fvoid UARTInit(void);
! h4 @# E1 m" f// ARM 中断初始化
  @7 E. r7 G# E- o* Y6 y! bvoid InterruptInit(void);% Y8 Q) |! X1 I9 [8 L: Q7 J
// UART 中断初始化
# b4 M0 G3 Z. P$ l( `) N9 v- I/ X2 W) pvoid UARTInterruptInit();
6 w7 G# X9 j7 s/ _! n& o// UART 中断服务函数
0 }& K2 b1 U, t2 }) Kvoid UARTIsr(void);
% H; C, Q/ m7 u  y# u# I7 T
% N  G$ Y' J+ v, ?/****************************************************************************/
8 }$ ?- Z0 `1 ~% x& c/*                                                                          */
" J& K9 ~. i$ J+ b2 x/*              主函数                                                      */1 e0 R' ^% _  v9 l7 k
/*                                                                          */# q% _( [# u* h* j
/****************************************************************************/: B  {& O: c$ d
int main(void)
0 H) `6 Q6 f" p3 u$ {; A* K! A, d4 D{0 `1 Q% x* Y  y" w0 A
        // 外设使能配置% l, A, \( i3 @3 }) U( L
        PSCInit();
6 t. Y: Z$ W  w2 L       
- H7 r' d4 m  ]- H! E- g        // GPIO 管脚复用配置
7 s7 _8 G+ U6 w; _, e        GPIOBankPinMuxSet();
0 c) N' R+ w. U! f
) K% k; J- e" T: }        // ARM 中断初始化
; r( x$ u+ Q% k& b" L! C) J        InterruptInit();% y' J( s) y& \3 _9 d7 q
: ]  B& g# E% p6 e+ ?9 c# }
        // UART 初始化  G, V. C; y+ _' B) _. c' p) _
        UARTInit();8 D' M9 \5 R6 k! m( p
4 M" G2 T, b9 A! ]7 ]
        // UART 中断初始化" W, e# H. R- p& G
        UARTInterruptInit();
1 k8 @& {7 U$ \
1 g0 R( L0 L. ~5 ^+ f2 G- C        // 主循环
1 Z' N$ a3 W% }) y% `. `        for(;;)5 B0 k: u# w1 n6 m" Q- F* C+ i
        {/ V- F' |& ~& t, L" b) Q7 ~, j" r
3 Z9 |3 C- e) Y
        }
$ C  }6 |1 X( [! |8 ^4 q}' t9 K9 J8 K5 x- J" U7 D- H
' n5 g# b/ s  p8 \1 i
/****************************************************************************/
; a3 _2 w$ j7 Y7 k" Y! t/*                                                                          */) [! Q$ u' k1 Q+ P$ c. m+ }
/*              PSC 初始化                                                  */6 T* n1 c; v: Q( z
/*                                                                          */
& |6 d- H7 ^; _. y. a) T8 W" w/****************************************************************************/
, a- Z9 [) J. }- b! uvoid PSCInit(void)0 x* F1 W1 e5 X+ ^) I% G9 o
{) T5 c; G2 }& U; @
        // 对相应外设模块的使能也可以在 BootLoader 中完成
/ Y8 S, {3 s! P0 e    // 使能 UART2 模块
: Q. f& m5 R7 x6 }, V* b    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);& N: K. @. c: x8 e
}% R- {8 I( {! M1 z9 ?: t
0 o1 ~3 |+ i  e( {
/****************************************************************************/
8 ~  p; k9 a0 E! [' E& N+ c- h/*                                                                          */% E  x4 @0 @' c; J1 _8 v% q
/*              GPIO 管脚复用配置                                           */) ~  c; h" V3 {' L, _
/*                                                                          */
. w1 y+ |8 p/ H8 d/****************************************************************************/# }7 m, ]4 t& U9 I) N" N$ R6 A2 ]# z
void GPIOBankPinMuxSet(void)5 V9 c# m5 l( p% A; J. R5 w4 R
{
- R; B9 a6 W2 R        // UART2 禁用流控
( ^5 ~7 ]# t3 G2 n! K        UARTPinMuxSetup(2, FALSE);
' w  ^% U9 I' O; Q}
6 T  c$ w! c+ W' N  Y# j: g5 e: r% E7 h% C- G* K' q3 \9 v
/****************************************************************************/
" N0 {9 F! u' v/ F) L/*                                                                          */, q) R6 a$ M- a- l9 t3 y
/*              ARM 中断初始化                                              */, g+ I# }9 S# l; }6 U* \
/*                                                                          */
; n. ]( b: _; ^7 ]. o5 |- U; R/****************************************************************************/3 V% E  W3 g! S* b0 h5 F* w
void InterruptInit(void)$ W+ \+ B: C! D% E5 D# a' [
{) b+ {7 v( |1 z8 F
    // 初始化 ARM 中断控制器6 C. U, p( u' r* {1 Q5 E/ b# z+ _% q
    IntAINTCInit();
% H  t# J0 Q: @+ a- y! N2 O7 S% G3 u. z# e) s1 o, ^
    // 使能 IRQ(CPSR)
- u; ^! _0 v* p: k    IntMasterIRQEnable();% w+ e) w- g1 x. n8 @# @7 i3 M

7 c& m+ e' l. d' \, R+ u, I    // 使能中断(AINTC GER)4 i) U8 a! t: @
    IntGlobalEnable();
1 F  b' N- a2 Q3 f& x  [( D' p
7 U- N' q6 K7 k5 F4 S5 v, f    // 使能中断(AINTC HIER)& o; A- N* N' ~9 f: E% v
    IntIRQEnable();
" f! H1 P. W9 A9 ?}
. q: O- F- m: B
0 o5 ?- O' J0 k/****************************************************************************/
! q3 f/ |6 t3 T( X- b/*                                                                          */' V2 D8 w* a: B- t* m* _8 C6 y
/*              UART 初始化                                                 */
: k  u0 a0 L( Z/ s% h/*                                                                          */6 T: t) m$ B! _  w5 t( N
/****************************************************************************/
+ i7 J7 r1 r7 G' |$ F0 pvoid UARTInit(void)
! m4 z1 I5 u# y: w* Q8 L! a{
5 z2 F. ^' j" j" P! C  {        // 配置 UART2 参数$ A) j8 E5 n$ l7 E: f/ M
        // 波特率 115200 数据位 8 停止位 1 无校验位. `. m) U, @2 l7 J* K9 i
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 y6 ^$ X- |& J, N/ U                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ b) [1 b& O! h+ I% b
        // 使能 UART2  p8 S% H4 e; ?1 _3 m$ R9 \
        UARTEnable(SOC_UART_2_REGS);! m- R, \% o* s8 s
1 f9 t) Y, C4 A/ }- K8 W# @
    // 使能接收 / 发送 FIFO) Q7 T& k' ?# D3 G; ~5 t
    UARTFIFOEnable(SOC_UART_2_REGS);
( w& T/ V+ F! O5 L. C; `
/ g- ~8 O. ]3 D) k+ f. c- g: N    // 设置 FIFO 级别
; _# x8 k7 V, @& Z7 `+ b) G    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 R, U1 V* _3 Q}2 }9 r* o# b0 z8 T
3 |" e3 d3 Z: _. j- I+ @
/****************************************************************************/6 Z" f1 P# k, j8 x' T, x
/*                                                                          */8 Z/ K6 g7 ?5 {1 [
/*              UART 中断初始化                                             */
7 X8 G: m5 _0 U- q1 n6 L: F/*                                                                          */: i: I! M6 C0 t0 ~
/****************************************************************************/
' U4 S3 h3 }$ `. ]void UARTInterruptInit(void)
+ u" B7 ~" \! I! k. j; l{
: q7 S( d; r# k        IntRegister(SYS_INT_UARTINT2, UARTIsr);7 u5 I0 `7 I6 R8 }. e+ i# |* h
        IntChannelSet(SYS_INT_UARTINT2, 2);
  K& j2 `. ?* [0 D        IntSystemEnable(SYS_INT_UARTINT2);9 Z" Z" p7 S9 B% B

7 o' n; c0 ~* D3 N        // 使能中断+ S' i  Z3 x6 h2 i5 i% ~# x
        unsigned int intFlags = 0;( y5 s( S/ }; Q
    intFlags |= (UART_INT_LINE_STAT  |  \
  s! v! S& {9 r! `9 J                 UART_INT_TX_EMPTY |    \1 j" G% s$ [4 E- w+ w, S
                 UART_INT_RXDATA_CTI);
! Z; O6 M' L5 O! d' w& o    UARTIntEnable(SOC_UART_2_REGS, intFlags);6 I- V2 }5 S1 P  t6 d; |! ]4 N1 t
}* E+ ^4 A3 m/ r. b

3 f9 ~) L! h8 ^$ P5 y/****************************************************************************/
/ }; B* b$ c1 W9 x0 W/*                                                                          */
- H4 U  ?. d1 b/*              UART 中断服务函数                                           */3 D5 _1 }" ?0 A4 o9 M8 z
/*                                                                          */
! t( q: I) K3 P9 s/****************************************************************************/3 s/ D5 |+ v# z/ q1 Y2 _' |
void UARTIsr()4 R+ n( t) \- f
{+ n$ ?  K6 y: k9 @' v! r3 Y* A
    static unsigned int length = sizeof(txArray);- j1 S6 b4 I: D& |# v  E; I) @; v
    static unsigned int count = 0;
9 Z: J" K0 ]! s) \# k+ l    unsigned char rxData = 0;
! J- D& L9 r$ L! P$ i$ A) l- T    unsigned int int_id = 0;
, F" k$ o; U6 z, F! M# z6 p
" T6 b9 {0 t$ a) p$ Q    // 确定中断源8 c# F  K' O4 F/ m8 p+ L# }; j, u
    int_id = UARTIntStatus(SOC_UART_2_REGS);! p( ]/ m- }4 a' t
' t+ ]+ @4 k8 c2 h" Z$ V! d; v
    // 清除 UART2 系统中断
0 p# m$ Q' ^, D3 R. f" i4 \    IntSystemStatusClear(SYS_INT_UARTINT2);
$ d2 G4 A7 V  x! m: `& ^& l. Z3 r7 t3 X( k( f( o. ], l+ \
    // 发送中断
) V4 K4 O: Y& `( W    if(UART_INTID_TX_EMPTY == int_id)1 X2 E8 ]5 C: z2 H
    {
% V$ o" g, s2 ^% c* w* d        if(0 < length). F" h; m3 S7 M2 d6 z3 f' H
        {3 `) G; j# M  @  S4 l, @; N
            // 写一个字节到 THR
# Y8 d) l3 P; F2 U1 G3 V# J            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
, W$ p: L4 M4 W0 r  ^! N, Q# e            length--;
7 V8 V( |* F2 {+ U9 n            count++;- S/ ]) q7 Q- {& h
        }2 l9 @- N5 e2 Q# A$ n/ t
        if(0 == length)
8 |4 W6 O% D6 F0 G% V        {# [/ [9 F7 F$ Q# }9 n
            // 禁用发送中断
) l4 z9 e* }' S% ?+ j4 M( n            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);; T' I0 V+ {. n3 `( W& t6 l
        }' F! g5 ~) n. }9 V5 I- H7 }$ w
     }& G" z* N# x1 Z8 \. E

5 [2 L1 I- d9 o$ N) @$ R. C  h2 g    // 接收中断% L, |/ F7 Z, Y+ V& C* f
    if(UART_INTID_RX_DATA == int_id)* D# g! R/ P4 P$ G9 g% |
    {8 P/ @! \) n1 M! \( Q* _& S4 ^; {$ x
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
; v$ v" o# I2 g" N8 x; B% d8 K  R  ?9 _3 [8 n; E( v" Q7 ]
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);$ p* J5 @3 W3 b9 F( Q9 s0 }
    }
* ]3 N' W7 O+ A  @& d5 o0 f3 e7 |' |$ X9 G* i) e
    // 接收错误% C/ I0 u& r' T
    if(UART_INTID_RX_LINE_STAT == int_id)
, y2 v- |/ P7 r; r0 H' f' H    {
2 M( n* J; @  y# z        while(UARTRxErrorGet(SOC_UART_2_REGS))
% x- B2 i& Z( g9 Z1 `        {
) ?/ K) P+ c) t* b' X1 K6 L3 `( u- t            // 从 RBR 读一个字节
- h, c0 }! R% @) ^            UARTCharGetNonBlocking(SOC_UART_2_REGS);0 n* S8 O- ?* ?
        }
' `/ z- W1 v( j9 p3 v3 m    }# S2 o% ^7 x/ t0 N; E1 g' G
    * |2 b1 g1 P) p) t* I
    return;
7 U4 Z7 z: X8 P6 ]8 E}: F* s! l# K) v; O

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
$ G* V2 D0 c; H- V6 a如果其它设备快速给你发送串口数据,你这边能正常通讯?
6 W# I0 O' d6 _+ L' _) U
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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