嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
" X9 M7 _2 t2 j& I
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
; H5 W- |6 I1 b8 P3 S, p+ c" e% B6 j% ?$ d" [
#include "TL138.h"                 // 创龙 TL138 开发板相关声明: h+ a3 E. N2 O! {' r. G

& u* |) v5 U1 W6 I* ]3 r4 d#include "hw_types.h"               // 宏命令
- P1 w" ]  s- E0 h5 s$ Q  h#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器0 V: Q# q6 c$ a! I! W, }+ v. K4 d' ^
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器0 }" M* K2 I+ p1 o3 b: n5 Q; K# F  c
, j5 W2 c6 V  Q8 _- V7 Z
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
6 n5 `6 X0 ]1 q#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明+ T1 @/ y4 O, f; B9 G/ }$ |
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明# v2 p0 s& g) q3 d
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
! w7 w" N& G+ Y2 W
- U5 T% L% X2 }  @7 ^/****************************************************************************/
7 B" X# T2 Y2 ~( C8 Q, Q! C5 J/*                                                                          */& @" ~7 L  k- w8 K/ m( }7 A) d
/*              宏定义                                                      */
) L. Y, O  j3 y9 K- ]9 z! L/*                                                                          */
2 n9 b: ?4 s) x$ e6 K/****************************************************************************/+ g  O/ u( P7 p6 q
// 时钟
. L* s5 E6 j0 Y" @9 ^, E#define SYSCLK_1_FREQ     (456000000)
/ q# ^: B4 t% B6 R2 v#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)! V2 g5 e: u, j& c0 m9 Y& }  \
#define UART_2_FREQ       (SYSCLK_2_FREQ)
  b6 S2 t# P) t; N( i- S; p( {9 c2 v- @, k1 s  C
/****************************************************************************/
% _( I0 {* G$ u, l% k* U+ r/*                                                                          */, H' F/ D5 q# v' T2 i0 f3 H4 G
/*              全局变量                                                    */
! T6 |5 P% k; @3 `/*                                                                          *// T' t( f5 o" V* {3 k: W
/****************************************************************************/
) B! C* ~- \. ^char txArray[] = "Tronlong UART2 Application......\n\r";+ q( z' _4 g: f% F# w7 \
6 L; o/ q$ Z$ n6 D" i% u* ~
/****************************************************************************/# e7 H8 {% W2 k3 e
/*                                                                          */( x# m% p5 N" Z5 i" n: D7 `$ B: M
/*              函数声明                                                    *// Q$ Y, s+ X2 y# F9 `! C! C
/*                                                                          */5 C. m# w( G- ^# z5 O5 w. X
/****************************************************************************/% ^1 e0 L5 Q8 L6 Z7 |: `( z& C
// 外设使能配置
* i. b7 K' \% [" O! bvoid PSCInit(void);* r/ a; e- U* l# [- N

: }% e, k* _, R" _' c, n3 C// GPIO 管脚复用配置; H; |% r" C9 P& O$ j% l* F- k/ i
void GPIOBankPinMuxSet();! k5 W# t( Y. [' ]
% n% q7 Y, F8 ^+ ]6 N- F5 J- S$ l  c
// UART 初始化+ c) Q- [/ s( z* ?! S  r
void UARTInit(void);0 x# c. l) W$ y' p
// ARM 中断初始化2 b+ I9 D4 _4 m7 t% G5 t
void InterruptInit(void);* E- K) z2 n7 R2 c: c' w
// UART 中断初始化
( y! _3 r1 K5 h9 n: V9 lvoid UARTInterruptInit();- N/ Q0 [) ?' L8 p) \+ i$ s
// UART 中断服务函数
, k! k- |$ X. \( {9 W& I4 F8 Qvoid UARTIsr(void);
: w2 u- O( z6 s+ w( |/ _/ O& e7 ]- \+ `4 d9 h
/****************************************************************************/4 e( E" H2 `- G( E
/*                                                                          */
3 _1 {9 t. P9 F7 I- X% ~9 Z2 j: _/*              主函数                                                      */& w# A6 h" M6 l1 h! y
/*                                                                          */- ]& z; X, _3 ?* X6 K2 n
/****************************************************************************/3 T% c  s% ~- A5 Q# Q: T" v
int main(void)
5 |7 Q6 d+ x8 F+ n& D: m+ i{
" o2 W9 c& [" @* `3 a        // 外设使能配置
% D" a: g8 k3 e8 y7 l        PSCInit();
) `3 z& l' [0 G/ d; Y        6 r/ _1 @9 }9 X5 @/ T% K
        // GPIO 管脚复用配置; T4 {; w% T) w1 a2 Z1 o2 t
        GPIOBankPinMuxSet();; Y2 x, ^1 c8 ^3 ?3 I& L

* i; ^, E5 X. ~. X/ n5 b' _        // ARM 中断初始化: B3 j; S& W3 c7 O. y& J  H7 `
        InterruptInit();3 X; `  T1 n4 R) T
5 _' b! e) ^# F
        // UART 初始化
5 j/ x: `; p, U  h' O# K7 A! s        UARTInit();, u* O' X6 w( @

6 [3 O3 A, x7 x) u4 `& ?# p        // UART 中断初始化7 a1 }* ?0 v* @( u9 Q" o# M
        UARTInterruptInit();
/ Y' w: I0 B1 e2 z: C" Y" l& O
8 _5 S  P/ ^0 O        // 主循环- a7 E8 i: [0 ?# X
        for(;;)) \9 N4 l/ o" I! P2 r# ^7 t& J5 p
        {
5 @2 |8 c" y1 A# v0 h% \+ E- Q
3 R- J3 k) X( Y# B) h6 e        }
8 W# ?& @* T6 C) i& j}4 L8 K3 z& u5 d0 P
2 I# q5 [1 L# ~  D
/****************************************************************************/; R: X0 U* M2 p8 U. X( b; k5 p
/*                                                                          */9 P4 o$ h' h. k& R% l1 X- p
/*              PSC 初始化                                                  */3 @- N7 z' b' j$ c  E/ H  G1 s8 l
/*                                                                          */
! U9 k: ~9 Z/ X3 D, |' [/****************************************************************************/
3 D/ P1 L% d" r8 a/ Kvoid PSCInit(void)
1 P+ ?: t- e- q{
8 E* H. P5 m3 e  G/ M# C        // 对相应外设模块的使能也可以在 BootLoader 中完成/ J8 h5 x! {1 E- U, O6 h- k
    // 使能 UART2 模块
- \7 p9 m# U' s. x5 g7 Y    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);4 _( O" C8 G2 A& d0 F
}
7 S% q# B) ~: Y9 o0 U' Z2 M: l
0 t6 l& T  O9 N0 d/****************************************************************************/$ n# y0 Y7 e  T, A5 c
/*                                                                          */
9 m& l2 {/ x0 V' N5 o% s/*              GPIO 管脚复用配置                                           *// [1 S5 t; t9 t5 |/ B% L
/*                                                                          */
; G1 E/ g# z" e% f; @6 b, j/****************************************************************************/
% @5 l: s6 `8 Q4 w' Fvoid GPIOBankPinMuxSet(void)) q. Z( l( I+ E
{
, G3 _  P- S1 z5 ^, R        // UART2 禁用流控
& z9 R4 E4 n" }- t1 S3 D% s- ?: }        UARTPinMuxSetup(2, FALSE);
+ b) B7 t+ {* g4 B9 A}
" L2 W3 H5 [. t# V
. w6 a6 ]1 Z1 A' ]0 z; F- N/****************************************************************************/
' S7 O# N6 O" ^6 Z3 [0 B3 f9 Z7 w/*                                                                          */
4 X! g  e4 L# I4 b/*              ARM 中断初始化                                              */3 X8 ^; E2 o; t
/*                                                                          */
3 i/ ^) \- R- }3 w; z# ^/****************************************************************************/
! a0 ?: B2 n  K& i! Evoid InterruptInit(void)
  o& A4 p& J0 f$ ^{4 v. _; v$ }7 \/ E
    // 初始化 ARM 中断控制器8 j! z; S8 i: U6 }* x: ]' a9 Q9 H
    IntAINTCInit();) C8 @. h# G) W6 R$ B4 @# }

* k6 ~7 n1 N& _8 o1 }+ V    // 使能 IRQ(CPSR)
" k- k3 e7 W7 a3 I/ p' y    IntMasterIRQEnable();
+ H& ]. o  _4 Q5 m& E; j/ x, o
( o9 u1 k+ Q+ E" y# x) h; b    // 使能中断(AINTC GER)2 i( l, l+ b  N  g4 M& S
    IntGlobalEnable();6 c( X8 }# j9 j7 h) q; e/ [0 h' x
3 x3 d) O' Q1 q3 m# `. W% D
    // 使能中断(AINTC HIER)1 t' S9 K& y2 R6 U( i
    IntIRQEnable();: p! n# h9 j3 |& B
}
/ `1 R/ c- L: @
3 e3 P1 C  i; M" }/****************************************************************************/
5 \! V: N4 m: x( f; _/*                                                                          *// w( n! K: N7 B" [
/*              UART 初始化                                                 */2 X4 b4 L- L5 K0 o/ \* T
/*                                                                          */, v4 d( o4 v  x. j% M' T( U
/****************************************************************************/
6 L0 k. V0 F$ `3 w) @4 t' Q, D7 U5 lvoid UARTInit(void)
5 v) T; s2 N9 l4 e& R, j6 \  r2 I$ L* h{
2 c# \& e* p  d: H        // 配置 UART2 参数) B3 o  |' L8 ]: A7 P
        // 波特率 115200 数据位 8 停止位 1 无校验位
" r& G0 ^0 j9 V7 O9 E    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 e7 P+ q1 \: q7 k% i" q                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);; ]! C( f' v, b8 D+ g( A) y
        // 使能 UART2
# Q1 A8 ^+ c& }- K$ Q8 M0 y& k8 z        UARTEnable(SOC_UART_2_REGS);
" {1 V+ j. \4 F( N9 W; T5 b/ Z+ c# W& l
    // 使能接收 / 发送 FIFO+ X3 j6 X" e8 S. r0 u0 l
    UARTFIFOEnable(SOC_UART_2_REGS);
8 |/ O1 t, b' [" H! I+ A" C4 s$ c  B4 p" m/ v" s
    // 设置 FIFO 级别5 s+ Y) I1 ]- t2 j  V
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
3 `" A9 @, Y5 }}2 @3 C  k1 q. R  y4 x% G) E
$ I& d8 I; p3 F" K# h
/****************************************************************************/
. v2 ~4 b1 f6 P. u/*                                                                          */+ a3 b, E2 |3 p( r. X( q+ _# q
/*              UART 中断初始化                                             */6 P9 i/ `, U! S) I9 ]& u
/*                                                                          */
( `7 z! ~6 L8 N  z$ n, \1 o/****************************************************************************/
3 v; }+ j7 c6 p- y: [- N# nvoid UARTInterruptInit(void)
( I# z& M! N& S* \( {0 }{
7 H/ v$ z% B- j2 S3 g        IntRegister(SYS_INT_UARTINT2, UARTIsr);
# U% t' ~9 @" o) c        IntChannelSet(SYS_INT_UARTINT2, 2);) `+ ^" r' e) H, P6 x1 Y' k6 R
        IntSystemEnable(SYS_INT_UARTINT2);. e; E! w; i; `

" s) F' p9 \( F; v        // 使能中断
. A( X9 h6 b! [  I* s        unsigned int intFlags = 0;
" e. ?7 f' j& {$ U  K    intFlags |= (UART_INT_LINE_STAT  |  \+ K' x: @: h4 }8 T; C. Y. t. v/ R, c
                 UART_INT_TX_EMPTY |    \3 J5 U& Z8 d, ]2 W
                 UART_INT_RXDATA_CTI);! W/ T: n+ o3 Y% @
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 j* d, e! t+ Y/ C( d3 e}1 `) x# ?) X  E( i2 b8 p0 [
0 T! H0 a4 }( F& w8 T9 n
/****************************************************************************/3 V- M( u! m# E' U% k
/*                                                                          */; D5 t! }: j9 `; n
/*              UART 中断服务函数                                           */
; t9 d  x; q6 G$ z; t1 V/*                                                                          */
( p6 g" [9 \; d. L0 ?, E5 ^( z/****************************************************************************/
0 |; ?  _& X8 {  fvoid UARTIsr()% O% x( n) N& b; F3 Y, J8 f
{
/ \( e: b7 f/ t4 [; Q: x) b+ |    static unsigned int length = sizeof(txArray);- v  a, U) ~& l6 c1 k
    static unsigned int count = 0;
7 c0 l2 U1 `' k9 `% ]; A* S    unsigned char rxData = 0;, \; o/ {+ O$ b
    unsigned int int_id = 0;
- b7 V% f4 o4 ~; Z. E- t3 A0 ~8 q% h  P4 Y
    // 确定中断源
2 ^5 ~1 Q) n- Q' m3 M    int_id = UARTIntStatus(SOC_UART_2_REGS);7 t4 F+ j( M4 A. ~- k! D
# l5 _" I( E2 L1 _
    // 清除 UART2 系统中断
% N, u" ?# j9 \* p7 @3 S    IntSystemStatusClear(SYS_INT_UARTINT2);
: ?3 f" W; F& t' F3 o( h
# ]6 Y( k9 S+ |; S    // 发送中断
( ~  y3 Q* z7 T; W/ i    if(UART_INTID_TX_EMPTY == int_id)& e0 i/ `2 H5 H) ^6 M' C, Q
    {
0 P7 K# {& d9 `5 f% h7 d        if(0 < length)9 O+ ?  r& t) |/ E2 x
        {- F* o* q" {# Q
            // 写一个字节到 THR
( k& ^6 D9 R, }- _8 j; V$ [            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 M; \5 q2 b# V$ H9 C" [# \. ~" b
            length--;3 [  q1 y/ _5 o& [: P" `
            count++;
' _% v' B9 @+ ]' Y' Q0 `0 Y        }
# L7 v0 A; B' S        if(0 == length)
- [! P, L/ @# z& w$ W/ y        {
% d7 A. F4 W5 i            // 禁用发送中断3 z- Y: R, @. j! C7 V% I% X: ?; Y) x
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
4 Y0 @$ S0 v6 K, s- m        }! C- s& z9 G8 D; U2 O
     }
' |" K  @7 D1 x8 a! ^
1 ~( f+ n. g5 U* a9 O    // 接收中断, @9 }& }; F5 }* E
    if(UART_INTID_RX_DATA == int_id)- u- r5 v' y5 h- K9 Y# _
    {
$ y0 K, O, q7 c5 A& K, E        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);/ L# B* P; R- e2 x/ T
) z/ _$ o" v" ^0 d* _
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);+ E- M5 \. Q6 L3 j2 K; j5 T
    }
$ w; n' U" u. e4 c) p" ]" a7 j3 X9 J! _! b% Q7 N$ F4 T7 k
    // 接收错误
$ y, p) G0 b: P* v: k  B; ?, I* P    if(UART_INTID_RX_LINE_STAT == int_id)
+ V% K$ U: R7 R3 L. `6 i  [- m    {: m2 ^" O6 q- F: e& K) W
        while(UARTRxErrorGet(SOC_UART_2_REGS))& @# Z- O1 h; G7 Z$ F: A7 s9 t* [) s
        {1 C& n" n! S+ f) I5 @' j" G
            // 从 RBR 读一个字节
* Z& a2 y: d- j  _            UARTCharGetNonBlocking(SOC_UART_2_REGS);8 T9 z- v/ T! R
        }
# x3 z# `4 c+ Y" S. L! a    }
. m; S' B* ^& |+ \, g/ B    0 {$ i. C& Y) e% W" P4 }  U8 ?. J
    return;: i- W0 T( r/ W: L" H9 u( C
}. H+ u3 \: g1 X

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:252 C9 l, S9 M: H4 ^+ R9 q2 U+ ~5 }
如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 c$ X  x& j% c2 L) K
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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