嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
8 l" t! F2 @) Q9 _% Y
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。, T$ M, U5 F. ?* v& w3 p3 @9 ?( S/ ~6 [
, H1 ^2 H) ^  a& ~' I; M1 T# U
#include "TL138.h"                 // 创龙 TL138 开发板相关声明5 O9 X5 ]1 ^6 ~; w9 Z0 e: Y) R
& n  K7 u8 N# e% D; |/ e0 g
#include "hw_types.h"               // 宏命令. \$ Y. c- ~$ }. v  A6 J( k3 E* Q
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器$ U0 E8 D. k/ J( \" A2 |& n* Q
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
8 |2 y1 r* `! f: T, X& v
4 p! S/ {; \. D' g4 h#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
1 B5 }& X. Q" ?6 Y' G" d1 V1 r4 D#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明3 j# b# X' c( m/ J. ~
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明0 f* X  t' P) C: `& K0 h8 Y; R2 H; z# Z
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
7 P- h3 v& G, R7 Z, C9 E# x8 L/ a
$ \7 Z! j) C: W8 O/****************************************************************************/
( s4 Z2 h% Q9 e/*                                                                          */
6 S; ]1 m! P% C! _0 K/*              宏定义                                                      */
2 n- j$ _) D" j3 I* G! h/*                                                                          */
( u. w: O: S/ d/****************************************************************************/
5 ^2 |5 z4 F) k- a2 y// 时钟
5 o& C5 i4 W+ g#define SYSCLK_1_FREQ     (456000000)
, H. x2 c6 N/ Y# Q- Q! j( l#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
  H5 h3 c0 f2 |1 u) ]: V#define UART_2_FREQ       (SYSCLK_2_FREQ)
, {8 }6 Z! Q& `/ c
0 O# Y1 T7 j4 J/ i' h6 e/****************************************************************************/' a& ~3 }/ X7 X+ r
/*                                                                          */
. Q% E% ^% ]" Z" M/ ?9 G/*              全局变量                                                    */" W7 r& A3 C, \4 D# a' @8 W+ E* B2 Q  O
/*                                                                          */
9 o2 x9 c* O9 n$ K  ^) Y/****************************************************************************/- d% M( `; |; L' J. u7 p
char txArray[] = "Tronlong UART2 Application......\n\r";5 s6 s2 ?9 H+ o! \( N# z

" W* W" z8 r1 ~/ Q/****************************************************************************/4 q/ a* V3 q% x  g5 o
/*                                                                          */
: d4 x. W% G1 ?% M0 q* _' ~9 ~. T/*              函数声明                                                    */4 F$ t5 d9 h- m) r+ D( H& L
/*                                                                          */9 O' |% a1 z. ^5 P2 K3 {
/****************************************************************************/
4 A  @- Z4 i# R) r& q6 |// 外设使能配置
% i/ j# p7 T. A: svoid PSCInit(void);
, s) [/ [4 R% ~" ^
9 o. L! \( H+ A" h% f. h) Y/ j// GPIO 管脚复用配置  r! L. s, J+ d; [3 Q/ B
void GPIOBankPinMuxSet();
4 b, a4 M+ |0 J& e" e6 M+ a7 }/ x) V# W; J% ]9 k' M
// UART 初始化# f! E7 \% n7 S" N4 G
void UARTInit(void);+ }3 z, y; `: a7 w2 c3 }, s% N& Y
// ARM 中断初始化
0 T' e# B+ ?) e" nvoid InterruptInit(void);( J* J! f( H1 h6 j
// UART 中断初始化
( }+ J6 Q/ {) ~; v) Hvoid UARTInterruptInit();
6 X1 x: s9 X3 o# u// UART 中断服务函数
' o) G, a) L+ s9 ~void UARTIsr(void);
7 K8 \" ^# l& W$ A
6 j, N5 K7 [' G% ], Q. h8 l1 W. l/****************************************************************************/
2 }! Q9 U; H$ Q) I1 t4 ~; _& T2 l/*                                                                          */
, E: F# n2 I7 e# T5 U/*              主函数                                                      */, R4 `0 F7 Z. E/ L
/*                                                                          */" J" E$ Q: A. n& H0 ]/ M
/****************************************************************************/
4 R  a) @$ u! t4 C* @  [( tint main(void)- n( ?& a! R* T& X* k4 m! P, _2 ~
{
9 @4 m2 t) x) e  Y9 D        // 外设使能配置
# M& @) [- A  V* z4 J        PSCInit();! ^1 C" A: }3 b, M/ q% b! {" s
        $ |3 p* Y. H! C8 @
        // GPIO 管脚复用配置$ _( s3 b5 _& H- E6 Z1 q
        GPIOBankPinMuxSet();) u- |9 c3 J# R: V

+ W% Z% _) b- Q        // ARM 中断初始化7 a/ I' W  S0 p+ K) H0 t
        InterruptInit();
* v1 G4 F( J) P5 B" j# Q0 G$ N; A1 T  e" |  b4 m: }
        // UART 初始化
9 R+ Q7 n$ c8 _9 m* [/ Y5 a        UARTInit();0 @4 ]) z0 F* s9 x; }' Y  q, g

: k- A. b7 O6 ?7 h) l% [$ N        // UART 中断初始化, J* P3 ?$ b4 r' |3 u6 C8 Z. G
        UARTInterruptInit();' ]7 {' I9 ]4 g

) h7 U1 S, \7 f( G/ a' |% L0 k, @6 c        // 主循环
- Q  ~+ Q( s7 _7 g# I2 ^        for(;;)
* |. [6 D. m9 P  {9 q" a        {
# A8 Q) {! ]( `( C( s* Z8 l+ Q. e& B$ i
        }
- X. K' H1 @+ {4 |: l8 n2 i! {}
/ O! Y/ F; B$ V* c1 E+ _) P4 G6 o' S( r+ G# q# v) b+ d
/****************************************************************************/! |, p/ _- k+ _' ~/ |* W
/*                                                                          */
7 a9 O+ q9 W7 W' L* ?( g# _/*              PSC 初始化                                                  */' U. D- x9 ?; f' q' n+ [) K8 r9 S
/*                                                                          */4 U7 G) g! m+ d0 E4 z: ?- h; b- C
/****************************************************************************/: S4 P% f( x/ A5 C9 G! {
void PSCInit(void)
, y5 y: g  Y  ]5 I% `, t{7 l" G; N  l8 G5 z4 Y) C; [
        // 对相应外设模块的使能也可以在 BootLoader 中完成" C2 x) H' S; n4 ]
    // 使能 UART2 模块
6 t9 N. r- S& |( R- Y4 C: E; Y) U    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; C1 [8 m) U$ \% n/ H' Z0 G8 |4 A: ]- a}
, K# B: C: n0 f* D" K) l8 |
' _- B7 d; t8 R/****************************************************************************/! J/ x0 n3 G; \  [+ x  w
/*                                                                          */1 \6 ?8 ?6 K) a% f, C, ^$ e
/*              GPIO 管脚复用配置                                           */
: U. x  W7 W" o& T) ]$ ~1 D/*                                                                          */
' r* |6 ]7 U7 x* p# Z( r4 c/****************************************************************************/
, ?( n0 e9 C$ |8 [, s) S$ `$ ^void GPIOBankPinMuxSet(void)8 v2 Z: `' p9 A" G
{+ P: @# A3 s- g7 h+ ?
        // UART2 禁用流控6 g4 V2 g9 O7 t+ M  J
        UARTPinMuxSetup(2, FALSE);' j' a& u5 B  z5 F8 s( q( h
}( |/ W( L. ~8 V$ q  N. ~+ {
( t% u+ X. b: W& ~- h
/****************************************************************************/
6 t9 Y% V  Y; w9 G! W/*                                                                          */6 k! R. u/ e& ^3 D# c9 L* c8 `& K- L
/*              ARM 中断初始化                                              */
0 f9 n9 S+ G) Z2 K1 p/*                                                                          *// \9 H' H! z; X* p+ Q
/****************************************************************************/
- a8 j/ E8 F/ h4 n5 w$ vvoid InterruptInit(void)8 p6 a" Z( b! w* k4 n
{6 T4 ^/ d6 u! J
    // 初始化 ARM 中断控制器
) Y  a: P% j. ~, o( z    IntAINTCInit();, t/ X7 N( r9 u* T' Q( p+ a! g
6 }0 y) e3 e9 H( a! Q# A
    // 使能 IRQ(CPSR)
2 [1 w: Q7 W) q) ?" G    IntMasterIRQEnable();2 I/ t0 t2 T& \4 o/ F. ?  a

* H/ z* y2 e/ R7 R  `    // 使能中断(AINTC GER)6 M" i6 ?5 m; U1 @/ H) \# ]
    IntGlobalEnable();
; x4 c# L2 d/ R( t; h, J3 H' S! T' ^, I1 n
    // 使能中断(AINTC HIER)
; i1 a) q* q% P1 Z8 |    IntIRQEnable();4 ]" o0 v& i% ?7 ^% D5 f2 v  l
}0 l; c# f6 |6 D  {' e
. E6 f6 w1 m! ?1 }/ |. G7 I
/****************************************************************************/
5 H8 d4 ?, X$ o8 a# f! ?) c; i$ G/ n/*                                                                          */
; h, R- M7 Z2 S) J1 ~* U+ e  o/*              UART 初始化                                                 */- i7 M3 `. H" A$ I0 V7 H: j, l0 y
/*                                                                          */8 J1 v1 U3 A( I5 H4 D- t; g
/****************************************************************************/8 y" ?- |5 B; j5 P# `; t& P
void UARTInit(void)' o9 b' p7 V7 l; s; |; m7 l
{, v. [$ o4 o1 v- z
        // 配置 UART2 参数
* |7 w: b# u' {. ~6 f, I5 `        // 波特率 115200 数据位 8 停止位 1 无校验位# N7 t/ J$ u- P- m- V3 H
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,1 N7 @( T) y2 P+ T4 a
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);# R$ d! i% n& u' C0 G; O' p+ s
        // 使能 UART2
# z( U6 z  d! E6 K& U: n. S        UARTEnable(SOC_UART_2_REGS);/ Q) G2 ?# K4 Q

, D6 ^6 D- y5 y3 Y1 u' a" R    // 使能接收 / 发送 FIFO
) n% r: W+ Y6 g" \$ G: ~7 n    UARTFIFOEnable(SOC_UART_2_REGS);, n- ?4 S. C9 l9 t: |

  {, R# p- h) D% t# r* B    // 设置 FIFO 级别
, E; I5 t* {" ~    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 m2 K* K$ X" d: `* A}
" H# W. L8 U6 g5 A8 W- ^9 R! e
% m4 u$ e5 z* i- g0 O: z. R. e/****************************************************************************/1 ^. Y7 C7 I$ j6 r
/*                                                                          */! n3 ]+ w3 {8 F0 }. t  N4 y
/*              UART 中断初始化                                             */. \  \  u4 @: W' a  j
/*                                                                          */
2 j: m# L" ?4 t: I! _/****************************************************************************/5 N' H9 g* C; z* y  O
void UARTInterruptInit(void)/ O6 e9 w. f% F9 K5 `) s/ h
{" V; n7 e$ [: _" f/ e+ B
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
( n# I: z- w* L% Q4 f. C        IntChannelSet(SYS_INT_UARTINT2, 2);3 ~, \& X( F( B
        IntSystemEnable(SYS_INT_UARTINT2);  v; P& Y. i& ?  ~

/ @1 P# r7 u: J+ {/ o- D        // 使能中断
/ \& P8 M% _* X, _) G3 L1 Z: r        unsigned int intFlags = 0;
# f9 L: ?* T- ^    intFlags |= (UART_INT_LINE_STAT  |  \7 q' H' T; g; O4 U1 a2 a0 }
                 UART_INT_TX_EMPTY |    \
, x3 `& w7 [0 ?7 S7 `                 UART_INT_RXDATA_CTI);5 P+ `" |6 ]$ m# @7 C# Z
    UARTIntEnable(SOC_UART_2_REGS, intFlags);9 n: {* T" F3 F: _3 i# U  ^' t
}
2 C- z1 x8 M& P- o! d9 Z: ~. E- ]  H' M3 N' F# \& t! G: M$ h8 [$ N$ f: d" e
/****************************************************************************/0 U7 j" I+ C- G% p: Z( ^
/*                                                                          */# D8 [, g1 q2 ^' @+ H9 L6 a1 G
/*              UART 中断服务函数                                           */1 a9 ^, a* l  I
/*                                                                          */( B5 |: ?5 Y* l, K3 u  l
/****************************************************************************/: d" m: @8 z1 B3 D. v
void UARTIsr()8 E4 j# `+ e5 p" R
{, c2 R5 k4 k/ g+ }# ]8 X
    static unsigned int length = sizeof(txArray);
& f3 i" x  t2 E3 O    static unsigned int count = 0;+ U. I* G4 J1 N
    unsigned char rxData = 0;2 I3 t, Y4 _, U: K2 h: U- d
    unsigned int int_id = 0;# c8 F' n5 _* y4 P6 t
9 F* L, u% j9 D" g
    // 确定中断源  y& h$ C( A5 n3 l' R7 ]
    int_id = UARTIntStatus(SOC_UART_2_REGS);
- ?; n9 n5 P2 E! U6 \, x' ~$ o/ v* B9 {1 Z# \
    // 清除 UART2 系统中断/ k* m, X& f+ k6 S/ j
    IntSystemStatusClear(SYS_INT_UARTINT2);" U  A1 x/ N4 a$ v0 R- x* b/ g5 S
( P- R0 \9 A% ~
    // 发送中断3 g6 g1 }6 o1 K
    if(UART_INTID_TX_EMPTY == int_id)  t: d; K8 S. v# F
    {
+ {; }( ]6 J  z* U        if(0 < length)
. A7 u( i1 N: @6 }2 @7 g        {
2 {# h0 g" m8 B$ H6 ~            // 写一个字节到 THR
- G/ l, k: [, F2 @! }0 w            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( m2 \  i1 l, i. y1 T: r2 a" \            length--;! q6 y  K$ {- I7 p( X; Z
            count++;
: i+ Q4 F' R. l5 k- e. K* Z/ v        }
8 l& ~* P# d6 x" ]3 @        if(0 == length)
5 z/ l; H! g7 o) J- g0 ?- Q# T  o        {
/ J: l# x% R, B& A2 r$ ]: {            // 禁用发送中断
3 r$ r2 B" W' `" a/ k: ~            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);; k# {" a2 O  y6 Q# m
        }  ]& u7 a7 V. {3 k& x
     }0 P2 F+ p- X+ t$ A2 U* h0 H# o. _

; @( h& b: x1 \' w5 I2 I    // 接收中断$ }& s" a" \# s0 ?
    if(UART_INTID_RX_DATA == int_id)/ a! k# c* @" T* W/ s
    {
2 g6 W! o' W3 P8 D        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
# L$ q& h$ x, }& k+ d' \0 C7 l! A1 F# A" t1 j& T# P
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
4 H, f! z( Z" F& k2 J, ^- K! J    }
3 m$ ]: I' E/ G, f) g' Z
  K! ^; i5 @, A0 B% ]2 ^- i    // 接收错误7 F- g" L. g6 [7 K) Q! g
    if(UART_INTID_RX_LINE_STAT == int_id)! Z9 Q1 N& I0 E
    {8 L3 B  x; t3 ^* J7 [, z( T  d- g
        while(UARTRxErrorGet(SOC_UART_2_REGS))- s' D5 i3 t4 ]; c6 T
        {
! x7 R' ]4 a* h& `  s. h            // 从 RBR 读一个字节! L7 |4 Y6 R- H; L* |4 w
            UARTCharGetNonBlocking(SOC_UART_2_REGS);- C' |5 E/ t% l& q
        }
2 V" E6 O$ ~/ r# ]3 N/ k* R7 _    }
  ^5 w9 X7 h1 t/ p9 w3 z: O: E    ; ]9 L3 W' ^8 |; e' E, I* [3 Q2 D  k
    return;5 T: @  J) P# O4 ~4 a0 p4 c
}
2 n# L9 |9 {! \
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
/ [( E' F# B  Q! K8 L如果其它设备快速给你发送串口数据,你这边能正常通讯?
# {1 \7 s' @) L; k* S, g/ K! [
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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