嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
, A6 R- a. H' Q5 z! x2 H* R
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
( \$ d% |+ W1 m! _4 ~5 Z! B
! r6 N8 b" }9 [) w
#include "TL138.h" // 创龙 TL138 开发板相关声明
: d1 Q4 g6 G( K0 ?+ d5 X
2 V8 w* i- i" v/ h- v+ @+ c
#include "hw_types.h" // 宏命令
/ c' o9 g. U! c
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
/ ?0 f! ^7 p9 h- P( X+ t, A5 x; o
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
% Q8 _: t% p+ N F: n; P: I3 ?
5 N& o9 g/ b+ ^2 k# W: r% Z
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
6 a3 ?! m$ w6 V/ F: F" W& a. q+ y4 N
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
8 g& R H( A* I3 x, N( g
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
& L% W9 v0 R7 Q
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 I G5 \( ] y. H$ s
) B- N% R1 s6 ^
/****************************************************************************/
0 B* b( O/ B9 k+ `
/* */
( \ y* t+ ^5 a# r V
/* 宏定义 */
$ ^/ T0 r9 r! l* X0 i
/* */
8 X6 l- P" [4 k
/****************************************************************************/
) B j7 O/ y" w& A; h( C
// 时钟
) C6 \5 F7 i/ s3 a i
#define SYSCLK_1_FREQ (456000000)
8 x, @/ E# O$ a8 `8 P/ g5 d
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
+ z. s. c/ X9 V
#define UART_2_FREQ (SYSCLK_2_FREQ)
2 Y# I1 S$ y0 v6 y
$ m9 A% _2 D' P+ u3 M, G
/****************************************************************************/
7 ~( _+ I: o$ W$ h6 v5 ^1 b
/* */
! K/ \1 g: R) l! I/ R2 c" k
/* 全局变量 */
L3 U3 Z5 g6 L5 h; |' q, J! @7 {
/* */
+ u, @ w3 t3 Y5 U4 b2 p# i
/****************************************************************************/
' t6 r! ?( G! K/ D8 ^! M3 R
char txArray[] = "Tronlong UART2 Application......\n\r";
- N, }* a3 j1 k
' ?7 s2 D" w- s0 \( @+ p
/****************************************************************************/
6 N* |% n2 e1 N: m" |4 z
/* */
! I2 ]3 Y& j- c+ b! q0 _
/* 函数声明 */
. y8 [" h7 }* N4 _. I* v
/* */
0 F; d* O2 D4 W' S
/****************************************************************************/
0 f0 b% T- O$ O5 r
// 外设使能配置
7 ?% e( H# f* ^% {. N/ o
void PSCInit(void);
7 c5 |/ T9 G: r0 T% M/ z. j+ Z
% {! ~: [. t& P7 S
// GPIO 管脚复用配置
, f8 G" O0 E% C( H/ D6 r1 [; `
void GPIOBankPinMuxSet();
3 J- v4 C% {8 R$ z5 I
, c& |3 V! S# Z
// UART 初始化
- D4 O S- K* M( Z$ k" |( n
void UARTInit(void);
! E5 P3 d* d7 D! ~, C z( j$ L
// ARM 中断初始化
- W9 a( _; [( O# \
void InterruptInit(void);
( j7 V2 D9 A F) {! s
// UART 中断初始化
) N, O" [- o3 Z, V. @
void UARTInterruptInit();
9 q2 m0 e# r6 {; I* B- ^- J
// UART 中断服务函数
7 l/ T$ n9 I; I3 P& Y
void UARTIsr(void);
C( H' |, b8 l
3 o& S4 W6 p( G3 q
/****************************************************************************/
' v% \4 w3 |0 `; }: `1 A1 C
/* */
. d/ f, C7 t- a. m7 M6 v
/* 主函数 */
0 ~- E; s! Z% r
/* */
5 C' n; p1 T/ o& ]; g+ Z Y
/****************************************************************************/
. d- L" [! T+ [/ Q
int main(void)
c& J8 _2 G+ X' E0 M
{
' Z! n# H$ j: i; }2 B, H- U
// 外设使能配置
8 R0 H" @! O# \% i# Z! S+ ?
PSCInit();
0 a! q. s( D4 |) [3 E; u: s
5 y5 q9 ~) ]; @* i( p( _$ [
// GPIO 管脚复用配置
1 p) p2 m/ C0 i( [- ]$ { P
GPIOBankPinMuxSet();
4 _2 ?) K% H# p. |
3 N3 ?" n& v! M8 k& ]' f4 x
// ARM 中断初始化
. c! I. w" J& [2 E0 i: ?0 Y9 }
InterruptInit();
" ~; g: U+ H! B2 N N! C) @
6 s' O! T/ F" C$ n+ h" p3 O3 x
// UART 初始化
1 q2 w! N5 u0 Y& o" Z7 B7 D
UARTInit();
: L; [* O7 B. j, t5 x- ?7 ^1 S4 n
- ^7 ^/ [4 h) Q
// UART 中断初始化
# B; Z+ R ?+ ?
UARTInterruptInit();
8 j. `1 h% ~) i$ E9 N% g$ J
( z& x% ?& L" l& Q5 J3 I9 n: b
// 主循环
7 i6 ?, ^/ ^) _5 H4 r
for(;;)
/ ~" A* J( B, N- K( v) U& n
{
/ W) L/ Q, _# R* J) g+ f8 a1 A
) \) I* g5 x' z. ^! n0 T4 c
}
2 K: F" O+ e$ C& e# [8 v
}
1 }. }9 l9 @0 [# M% g; P
0 B1 U6 V0 q9 u4 ` v
/****************************************************************************/
: F5 g) G; z8 `5 L' ?
/* */
8 r9 l5 o# n1 f; f5 z# ^* M
/* PSC 初始化 */
( {. t9 L4 b) c8 K8 i2 W* i
/* */
- W: j/ p$ g. a# z1 e
/****************************************************************************/
2 v9 Q* S- z% ]6 ~( b2 m7 }; n
void PSCInit(void)
: D) `8 v7 l& S- Q9 {* P
{
: [! w# a; L. [" N L" U
// 对相应外设模块的使能也可以在 BootLoader 中完成
- C2 y) D: ^4 r7 _6 s
// 使能 UART2 模块
2 } [; }; n; {4 K+ Q7 ?
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; f) g% o: {: H- E6 t
}
( B" y' k( Y( g4 O1 {
+ Q! d- b" o/ u W+ }) H1 t- @
/****************************************************************************/
5 j: F, V9 F% h# ?8 R p* D$ [" D
/* */
: c0 m- g+ {0 D3 I- M& F
/* GPIO 管脚复用配置 */
# R) i. V: p9 ]1 D6 }
/* */
) X/ f7 ?/ r+ W9 \5 K
/****************************************************************************/
+ O: X; U9 q4 Y4 t
void GPIOBankPinMuxSet(void)
4 k, Y2 ^( Z9 u8 O) F( u, k9 Z
{
) R U& s- J8 X& P9 d
// UART2 禁用流控
2 b% V3 L+ e6 _8 w
UARTPinMuxSetup(2, FALSE);
' x2 O8 g# A/ l: A: W$ }5 C- |0 a
}
]. D5 B0 g2 |7 _5 u
. z$ _; K% K+ A, L* @
/****************************************************************************/
; o1 \6 c1 v. I6 M" ^2 }
/* */
. C6 j5 j- t! x: q
/* ARM 中断初始化 */
4 F: b# y+ {* Z1 b
/* */
M* ^/ s; |; D% J$ x2 Y
/****************************************************************************/
1 d& I" W! x2 q' P, \2 ^
void InterruptInit(void)
+ M( `$ G3 V- o9 I) K+ U
{
" a8 r. f+ K( a" J# Z+ l! L
// 初始化 ARM 中断控制器
$ l5 P6 A) r: \+ Y" [0 c
IntAINTCInit();
) R+ m; J$ r9 l0 y6 O; a
3 v. ~/ l- S: b5 ]
// 使能 IRQ(CPSR)
, T) }. O! V" t: G
IntMasterIRQEnable();
- h+ x1 P& M h2 a2 e
9 x$ W9 L% X1 o: f; { m. G0 ` l
// 使能中断(AINTC GER)
5 M# Q# Y2 \' _" u! I% z6 B
IntGlobalEnable();
8 \; K; {, W9 }3 y# T
0 O5 t! \2 l( ], D8 d. n
// 使能中断(AINTC HIER)
/ u- _, n2 y4 e. F6 M
IntIRQEnable();
& a: c* l7 X) F4 l" ^: {
}
/ r0 w) G6 P/ E6 p/ n: E* z Z
8 {( g8 O1 A6 V! f
/****************************************************************************/
+ N3 D$ y9 r$ q* t+ K
/* */
- j, U, D3 U2 D7 B; e6 X
/* UART 初始化 */
6 t, b, X( c* y) G
/* */
) E2 G9 S/ K3 L; C
/****************************************************************************/
! _3 m( Z+ |1 `0 v
void UARTInit(void)
& W7 n. x }) H/ @
{
( ? S8 P9 |- ]) |
// 配置 UART2 参数
0 \# V9 W# s, D4 ~" {* n- }
// 波特率 115200 数据位 8 停止位 1 无校验位
) i4 Z) i- `2 `5 W" `- y/ c9 w
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
$ v, Z, U& l. r$ y1 t
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
0 W, X6 V. Z/ S' h: e4 D
// 使能 UART2
7 x7 Z3 [* k B7 [7 G" W
UARTEnable(SOC_UART_2_REGS);
L' Z4 d, t& H% S
; h' h, r- r, c1 x7 S( k+ }
// 使能接收 / 发送 FIFO
" G0 E6 D2 [. g+ l6 b% t
UARTFIFOEnable(SOC_UART_2_REGS);
) E) Z% N% ^ i7 p6 _: i
( f( V- N' _6 R/ E
// 设置 FIFO 级别
' c- r5 _# I+ D4 Y4 H; Z
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
. b9 ?* F- y |1 J. X% l+ ~+ x
}
9 J3 g( y7 `) @. F8 X; D
2 W7 q$ C# z U
/****************************************************************************/
3 Q' Q z- D8 x! d% ]7 i' ~' a
/* */
# w7 P2 p, j" O# C/ v" J( m
/* UART 中断初始化 */
% F+ r( i3 ?! z- \; |2 B4 e
/* */
2 ]- C* U. f8 m1 U$ [6 A0 K
/****************************************************************************/
X6 j- C+ U1 B$ K
void UARTInterruptInit(void)
+ S4 J+ f% |) l) d2 ~
{
! V6 H# |' e' k' a' U2 T5 n
IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 V7 J5 F- p3 a. C: N% D% `- E$ Y
IntChannelSet(SYS_INT_UARTINT2, 2);
. p7 R! W: `- j0 {
IntSystemEnable(SYS_INT_UARTINT2);
- U B3 e% ^) N- ^* ?2 m
9 Z& n8 @6 Q0 }; T$ y
// 使能中断
o9 s+ f% V' r) ?; c: ?, i
unsigned int intFlags = 0;
8 p5 w9 P2 k3 Z3 J) J, `
intFlags |= (UART_INT_LINE_STAT | \
3 S8 l i R; o' c! v0 v6 O, G
UART_INT_TX_EMPTY | \
/ r5 h% \% ], @) T: i# F9 F
UART_INT_RXDATA_CTI);
, _+ P. S9 _: y: X
UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 ]( F8 S# C3 b* S
}
% {: k6 ]! S+ `1 \0 D
) `( \8 x' f- [6 E+ y0 N! y
/****************************************************************************/
8 X: ]' d( {6 r7 p, t8 u- T6 `
/* */
3 D, H) m7 f! j4 b, H* _
/* UART 中断服务函数 */
; B7 T6 W8 }/ f: U$ a: ?
/* */
9 c' y, G7 E( M9 Y
/****************************************************************************/
& X1 S) a6 g0 {/ @) \) ^3 m
void UARTIsr()
U, }8 R; p/ E D/ l/ a4 K+ _: ^3 n
{
; C+ A% y( m' f G+ Y I9 _; j+ I
static unsigned int length = sizeof(txArray);
1 n: C4 q# R; V/ A/ p
static unsigned int count = 0;
, p8 {3 }% w; P" p
unsigned char rxData = 0;
; B$ c6 Y/ e8 `
unsigned int int_id = 0;
0 t7 u, e1 z2 E% ^8 v
- S0 w' Q( d1 ]' Y7 \. O( }! Q# J
// 确定中断源
7 S. j& i" B1 D y3 _4 k7 v* V" u6 l
int_id = UARTIntStatus(SOC_UART_2_REGS);
) ^0 Y1 E1 y6 N
% W, _9 k$ H2 D" J. g. E5 l
// 清除 UART2 系统中断
0 u5 {6 m" f9 P, a' p
IntSystemStatusClear(SYS_INT_UARTINT2);
& n/ K9 V6 { \) \# ?0 Y
/ N3 B1 C) h- W9 b$ A( D7 b
// 发送中断
) U8 `3 b& J4 _, ^4 j
if(UART_INTID_TX_EMPTY == int_id)
5 Q2 Z1 ^* M- Y p
{
1 }, F) ?8 F- M/ Q3 @
if(0 < length)
. {" ]3 l x8 K/ ?, j
{
3 `! ^( b6 Y5 L5 h. a) E
// 写一个字节到 THR
+ j' f c H2 r7 n/ x
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
6 h& [1 B2 y8 ?1 k: F( _6 `
length--;
( Z' V7 X& ]6 ^" W1 f
count++;
9 g: d2 d' P/ ?! ^ C
}
- D* B" D" H; I
if(0 == length)
" @$ U1 \: C" B4 h$ i B
{
/ f4 }- ^' T7 q5 ?
// 禁用发送中断
/ S1 P# e3 C9 T3 ]
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
9 t, {, r/ c$ k% `; b8 T- a* H
}
7 W! Q, i7 d5 M# w8 J
}
6 ^* B, s3 p, R( n/ j* R
4 ]* Z* L. k; }6 t( t) ~4 I$ G
// 接收中断
3 u4 W2 ^! v7 D/ c0 b
if(UART_INTID_RX_DATA == int_id)
' F) [, w3 y5 e7 b+ O' P
{
: p5 o7 x* ^8 g; X4 u
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" ?. n: O4 B/ C6 p
" C/ c8 c+ g4 p1 j" B( l# c/ `
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
0 N6 {; f+ K2 b0 l: t' [% w: Q
}
2 w. B8 S+ [& z) e# v5 V$ Y. [. i6 n
/ u" [/ z# F( J
// 接收错误
5 X5 W4 Z: _" }' s
if(UART_INTID_RX_LINE_STAT == int_id)
5 z7 N" K1 S1 t2 z2 \
{
7 N1 u7 k# l, ?% C
while(UARTRxErrorGet(SOC_UART_2_REGS))
" S/ U3 T% V% d' l
{
! O, i' f1 S7 Z8 J$ ^: ?$ M$ L
// 从 RBR 读一个字节
( z+ {" E% U" T! M
UARTCharGetNonBlocking(SOC_UART_2_REGS);
' d4 Y- m6 O3 l# [* P, X" s
}
5 X S9 q6 `4 N( E
}
% b; L; t i+ ?# c% w6 `
' j/ f. b0 L ]& S5 b7 F
return;
3 _) X) t K8 `
}
6 B( B# c' I- M& }9 d4 s) p/ s
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
- u8 c3 j0 S4 _" a) E
如果其它设备快速给你发送串口数据,你这边能正常通讯?
# c2 U% Z( M( T' B
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4