嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
" y% m. ^$ K4 R
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
2 b" f* y: G y! I& t
, V) S. q) b0 l( i
#include "TL138.h" // 创龙 TL138 开发板相关声明
3 A% s8 H3 g0 f- r$ m' ]
7 w/ w5 X& b% Z/ H1 E
#include "hw_types.h" // 宏命令
0 e: B" b6 Q. H* \# A# q5 t8 C/ C
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
+ m- p6 e# y1 d3 |3 ^
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
+ B+ @" k# r# y Y/ s
( z8 z3 o. B( Y/ R
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
4 h1 `1 c/ L4 k( y
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
! m- e( ^( q% P2 G% Z2 P' o" Z; l
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
" \' H2 z" R w5 N G1 @8 A
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
% E/ W6 ?$ @5 y% v
: K5 R6 [' w9 M' C0 y
/****************************************************************************/
- D/ F9 p- E' o. E/ S5 \
/* */
6 U3 G7 d- b1 S7 _4 Z& j! G4 W
/* 宏定义 */
# O. s" I) d1 k7 n6 Z8 e2 x& P
/* */
! e1 t) z$ x D2 M5 {+ Z$ N
/****************************************************************************/
. e! s+ E% p) E: v
// 时钟
6 S( ^% z/ B/ v% ?# ~, }3 ]% R
#define SYSCLK_1_FREQ (456000000)
1 s* D9 P. _4 \( p4 j; d
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
! t: ?7 O0 s& [+ R Z
#define UART_2_FREQ (SYSCLK_2_FREQ)
( z" A# [9 _0 X
, b/ E* w* m5 z0 Z% F$ f
/****************************************************************************/
4 W% l# u2 B* D4 g. Q
/* */
( p1 t5 L. r" J. V( Q( Z5 ~
/* 全局变量 */
) o V. M. S# s0 f+ n+ [
/* */
/ E1 \( C8 @3 t0 N
/****************************************************************************/
R7 t' c8 ^/ N" T+ b; B& |0 G" s6 f
char txArray[] = "Tronlong UART2 Application......\n\r";
# Z9 p, m/ v" k% D: q# V! u
! W$ ?4 t# B2 q
/****************************************************************************/
7 @2 ~1 {1 d1 K! E5 r4 z; p" m
/* */
+ o9 {; Z: I; q2 [2 ^
/* 函数声明 */
9 D O2 Y, N4 o/ k) V. b1 t+ y7 y
/* */
2 q* g F m- ]7 }5 L" H3 l+ W
/****************************************************************************/
2 ]0 k9 D# o9 R$ y' X( k
// 外设使能配置
' Q0 }. c& n) {1 Q: w( M) O4 i9 ~
void PSCInit(void);
J& `# X6 b5 m* \1 h! R' u( O& ~
5 `0 W) w0 G) p0 e0 T
// GPIO 管脚复用配置
$ l$ |7 ?- d3 y) T/ c$ D3 u0 p! H
void GPIOBankPinMuxSet();
5 m7 b6 Y$ _7 R
% y# t) R7 P5 L9 D' c
// UART 初始化
0 _2 S' O" l3 Q0 D; P
void UARTInit(void);
. ]- h% o3 \" O* [' ^" ?
// ARM 中断初始化
+ f" y7 j% S. d. C: i
void InterruptInit(void);
( m( ~: `& M/ `2 U" o0 h
// UART 中断初始化
8 f8 t0 s- ^- p0 t/ n# @
void UARTInterruptInit();
- A6 u3 c. M" ]* \' l
// UART 中断服务函数
0 p* r* l5 c0 |! k, d- s/ {
void UARTIsr(void);
3 F7 n9 B7 g& j. I @! m( W, y) Y' q
3 c6 K/ X4 N. i
/****************************************************************************/
0 l6 m9 n4 D- ]% f3 E6 L7 O
/* */
3 F, a) Q) o a9 M# J
/* 主函数 */
( R, m/ b; j- C, u) V' F/ B; g
/* */
& A8 o' A; e7 k9 P
/****************************************************************************/
0 F# T/ N# A0 W( U, x. m
int main(void)
* Z- e5 t9 d2 x/ u S
{
0 S: Y& S! v9 t |! ~$ p
// 外设使能配置
1 l- P4 R+ X2 z/ G! T: \0 Y& c; e% @
PSCInit();
C7 ~% F8 X% g, z* Y2 p
9 J: L" O: k7 s& g
// GPIO 管脚复用配置
& i( p$ Q# y% w3 S+ C4 @; H
GPIOBankPinMuxSet();
$ {: b" E( G! O# h* A# B
$ s( i( e+ g) \! J
// ARM 中断初始化
- ]; ]2 d; _5 x( B
InterruptInit();
2 V. }& j1 N; p
9 q; c% }1 j# B6 e
// UART 初始化
8 e" _2 C. N0 z2 _) W1 S
UARTInit();
. ^& y! B7 x, ?0 ^
/ Y1 S) ^+ T% W8 U. I5 K
// UART 中断初始化
* W- e0 s% R) n2 W3 f
UARTInterruptInit();
Y6 X$ F) c U4 n2 |) z
7 [' f5 v0 A7 Y! B( J
// 主循环
, k/ {& H; f. I" N+ j
for(;;)
3 m0 h8 P; W6 F. W
{
+ h0 D0 g; e3 z1 F
% |' N! N+ M0 |4 x2 n2 P' W: y
}
. p6 h/ B+ Q( Q9 M N4 @& y3 P
}
* ?. n! V* d( F! |. k
% v5 a# y$ k. s N5 h, O3 n/ @
/****************************************************************************/
1 r" C/ W- Y6 o. i/ P7 P; v- l
/* */
- ]; |! ?* M6 c
/* PSC 初始化 */
3 m( B: B( k5 B8 h6 }/ m
/* */
7 x, T& I; r! U% X4 X
/****************************************************************************/
: {; R' @ [# {8 z
void PSCInit(void)
3 o9 }8 A1 j2 J- v1 U
{
4 _$ E# N3 z! q2 P( Q" |' _: M" e
// 对相应外设模块的使能也可以在 BootLoader 中完成
$ X7 m; ]3 y, w1 W. f0 o
// 使能 UART2 模块
) C+ j/ e0 n" e1 T: b+ r
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; j8 U; L: V: c2 \6 Y. L
}
. [$ ]& m% b- }) I
1 { }7 |, n0 n9 ^% \* |% i/ M1 X
/****************************************************************************/
1 U! t6 P8 ^# D+ A/ Z; \
/* */
2 z! d+ I2 l5 z* [: {% q& [
/* GPIO 管脚复用配置 */
- v! _& W* |1 |3 T+ n* D
/* */
: T( c/ N: ]# }6 ]$ i1 @' ~ k
/****************************************************************************/
2 `5 B/ Q' m- @0 j
void GPIOBankPinMuxSet(void)
% S" O7 ] n+ K* ^9 q
{
. L: K7 V8 {0 k! F
// UART2 禁用流控
H _; R6 U" c( a+ U$ a
UARTPinMuxSetup(2, FALSE);
9 K' K- W7 I0 I0 t# G. [4 g/ r
}
( v1 N d9 D# @* y# r
# j! N- K! L& ?5 T. l! q2 x8 Z7 D
/****************************************************************************/
2 c5 A6 }0 c, A+ H0 o1 U3 A' a
/* */
% N" I/ ]- f5 b) B; d
/* ARM 中断初始化 */
! t: L7 Z. p7 R$ K
/* */
& V& x" Y' r; p o7 Y7 B5 z- Q
/****************************************************************************/
$ A9 B; G: ^+ I8 I/ P3 i
void InterruptInit(void)
& x. ~; a+ E" F4 ]7 ~( ~
{
# s4 p1 B' M4 T/ g6 \8 I: @
// 初始化 ARM 中断控制器
% }' ?1 i) T l3 I9 Z: T7 C
IntAINTCInit();
; P$ ]. n& `9 A3 j1 ]4 m
" C/ H& @5 A/ P$ _5 {
// 使能 IRQ(CPSR)
; S+ L1 @8 k* n
IntMasterIRQEnable();
% J& f X" Y- ^4 J( |8 P$ b
2 f3 U8 i' M# C
// 使能中断(AINTC GER)
) w9 z& Z W; r: b7 e- A# ?# T2 M
IntGlobalEnable();
4 G1 ~% |& U4 X1 ~- E. {
8 \9 [; i1 o# C; L- M
// 使能中断(AINTC HIER)
# F7 i, `# y, I2 H6 \
IntIRQEnable();
/ n( f# ~4 E X1 b: ^! o+ _/ g
}
) A' K, y0 R& {, Z. ^8 v4 v
0 J5 r5 q8 k! s. r
/****************************************************************************/
- Z) b' B( n! y3 M1 S
/* */
) Q6 I8 z" v" } u
/* UART 初始化 */
, o, e: _0 Y2 W
/* */
* A5 Q! a, \6 b9 H7 E z
/****************************************************************************/
& X* z/ g$ Z, q/ [( @9 G
void UARTInit(void)
4 B* O) Y, y7 i
{
e' _4 f" w3 h8 @* E- q
// 配置 UART2 参数
! v, D# S, j) \$ X' ~" p, F/ l
// 波特率 115200 数据位 8 停止位 1 无校验位
3 i# G! q# \6 y# ]# z- B' g
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
5 Y0 X4 v; L# f( i; H5 B& A
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
! K, c1 u( Q, ^( ?
// 使能 UART2
5 N$ M/ l1 m9 N* ~" p0 v
UARTEnable(SOC_UART_2_REGS);
' d8 E5 c* ~5 G
2 R, z! X/ ~( n# K5 s$ L0 ~# K
// 使能接收 / 发送 FIFO
$ h2 J4 ]: G1 S, v7 s
UARTFIFOEnable(SOC_UART_2_REGS);
& \9 @& l/ D& T+ l5 D& Z
3 D6 O( Q8 H9 W/ o6 X" U$ m5 f
// 设置 FIFO 级别
, i' z6 y& O* q' t
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
+ Q& k# c% `8 v O9 n$ M' v
}
1 l- U3 T% @9 b( _% t
/ n; A4 R T/ _- s+ N* ]* v
/****************************************************************************/
" ?6 R* a4 @$ [% z/ N, f
/* */
/ \6 i: W" {: g. `1 n R
/* UART 中断初始化 */
. b. Q% L- L' Y2 V4 ?) A% ]5 s2 O
/* */
4 k$ K% v) A v
/****************************************************************************/
" R/ C8 D* {7 d& ~
void UARTInterruptInit(void)
# N* M& Z2 u9 s$ A) T: j5 O0 ?
{
! b- q' Q3 V& G7 T9 _7 a5 H f
IntRegister(SYS_INT_UARTINT2, UARTIsr);
8 i5 P& a) d. _2 D6 d% W* f
IntChannelSet(SYS_INT_UARTINT2, 2);
( Y- z* s) R; `7 }" n. i
IntSystemEnable(SYS_INT_UARTINT2);
8 {+ `1 d. s& Z* i& `; x! T9 ]
% y7 i. n1 K9 g4 `3 w; K" i" h
// 使能中断
' p' B; Z9 h7 Q
unsigned int intFlags = 0;
) V F" I, C9 Y: j& t
intFlags |= (UART_INT_LINE_STAT | \
; s) q6 z1 Q( N8 a7 d7 k1 |' D
UART_INT_TX_EMPTY | \
' `" X' M1 q1 i1 t$ Q. v
UART_INT_RXDATA_CTI);
. x! h) X6 ~ L
UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 F4 V3 x' j& j/ u7 l: w' O; C
}
# \) o4 U8 F; I( ?: P2 d
- c# _7 K* `* u) L
/****************************************************************************/
0 H" I" J+ [- ~4 [
/* */
t1 g( C6 o3 Y6 [7 a2 M4 x
/* UART 中断服务函数 */
" f3 S4 ?$ ]# b4 K
/* */
7 h) V: E6 n, x% W; R' t1 m1 F
/****************************************************************************/
. W0 W1 p! d: z) X9 F! D: X
void UARTIsr()
# w6 L3 u, x$ h# S3 |
{
" m! {( A* n7 D- j; U# d: i$ A" z
static unsigned int length = sizeof(txArray);
) J3 R! V% G8 I
static unsigned int count = 0;
4 U9 p( s; g! a% I9 R
unsigned char rxData = 0;
2 ^7 J, u) i5 y7 C1 `5 Z
unsigned int int_id = 0;
& b, T2 s+ q& T9 |, z9 z, k
@0 Y# n6 c* H& f$ `
// 确定中断源
0 M, _+ n. T2 U) b: ?
int_id = UARTIntStatus(SOC_UART_2_REGS);
n& `2 ]9 x- {9 V9 ^1 I0 L
' ^% ]9 A$ F. Z; ~
// 清除 UART2 系统中断
6 ^: u4 l: R/ |
IntSystemStatusClear(SYS_INT_UARTINT2);
3 u2 s; v ?( p4 d# j' Z
/ g! P* u3 m$ O
// 发送中断
; K. f _* ?5 @/ a1 d. L1 {
if(UART_INTID_TX_EMPTY == int_id)
& ]$ C- G/ q' Q
{
* k3 }; i% u$ O
if(0 < length)
4 [5 {8 w4 R0 M& z( m' b/ _3 L# c) {
{
# k: N, W$ T5 ]# X2 C
// 写一个字节到 THR
' g1 @* w# F6 C' T! O1 T. R
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! b% P4 f: f6 p% [# i
length--;
8 g5 i2 \) Z" H. _3 {1 v4 K2 i
count++;
0 A6 V9 ~- v9 O0 s2 B
}
2 J/ m% b/ a: K7 |
if(0 == length)
4 n+ |) E0 m S8 }, ^! y. q
{
1 k* S& \- y" M, @' E$ Z
// 禁用发送中断
! a1 I, ~4 O/ _. e
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
# l3 {2 T2 c; f: y0 ^: ?& g
}
0 D! Y# X% Z" S @
}
3 s) \1 y3 F+ Y2 T, r+ K6 s
- H) s- B. [+ t9 r! k4 _) ^
// 接收中断
. w: K7 V/ d; u9 \
if(UART_INTID_RX_DATA == int_id)
# w( e9 u6 f- \& _
{
6 w& ^5 y8 A, I0 _
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
v. V$ y& z% N/ ~8 ~0 B1 u$ ]
+ M5 z0 d8 b2 Z) }4 z# B2 A
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ L9 W. Y0 d- e6 q8 o1 {$ L3 C% m$ y
}
! O- S8 t' Q! D/ L3 l0 @
) R% |6 p2 J1 Y, c
// 接收错误
9 j& u% n& |0 l' b
if(UART_INTID_RX_LINE_STAT == int_id)
5 e8 J$ G* k t9 a+ t* z: ^) [
{
9 X6 ^: k) h; f" _' Y% r f# W) u
while(UARTRxErrorGet(SOC_UART_2_REGS))
3 ~5 i0 I) ]* N' m% s% J0 Y. Z" E& D
{
4 F/ `4 X+ c& L' H
// 从 RBR 读一个字节
g/ h+ A3 V4 r8 p' p) p- f3 m. i# `
UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 h; x- h( Y8 x; s0 J8 k$ E) u
}
. ^5 [* x+ C- B5 F' a$ `$ y9 x
}
$ G- |/ u! e0 b1 c+ w( i% A) D% i5 d
. m. b% b& j- Y
return;
Q. s1 m" r8 C) c
}
& l @3 h/ `! S: u W( j' Y
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
; Y& t: W$ }& }2 |
如果其它设备快速给你发送串口数据,你这边能正常通讯?
" H. |+ O& b/ q/ o# ?8 n
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4