嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
' x4 l1 H; b" _( E A8 i/ m8 Y
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
" n3 k4 S' \& ]. Y- C
1 L$ I0 o3 n& P7 l, ], \+ G; { x
#include "TL138.h" // 创龙 TL138 开发板相关声明
2 d* f) d* F3 [) m5 J
6 Q, K+ q; Y) Q- n
#include "hw_types.h" // 宏命令
' f' W/ T7 V$ g; M+ _
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
% I5 |* S% n* {1 H
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
4 Q* Z2 B0 ?- T" Q H9 t4 t! _% D/ q
2 j3 r0 G' G; N4 {/ u
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
- F1 V+ }2 d0 U1 k( t
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
0 y( C& C- O3 l0 Y$ b
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
9 b, X( U* M/ H4 }! Z$ l
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
) @1 Q! _, P* g
% M# h/ c7 X& C+ H4 U3 J' J
/****************************************************************************/
) T% N" }; X& u1 I( }) u
/* */
( ?! }& S. O! \4 r; c! n
/* 宏定义 */
& {' r0 T0 L; D2 i+ B+ y3 d
/* */
$ s0 p) X p6 p
/****************************************************************************/
n2 m' I) H- a, [; S* I" }
// 时钟
' h3 g4 n* Q; F' L$ K r
#define SYSCLK_1_FREQ (456000000)
% N! e/ Y/ s+ v. X
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
4 k; `; O% G: | ], C |7 [
#define UART_2_FREQ (SYSCLK_2_FREQ)
9 ]% Q/ t( O! X0 E6 ?3 t8 R7 x
$ L( ]' a- w% P: c* D' z! C8 M+ u
/****************************************************************************/
* D+ l+ a% p* l
/* */
; o; }* ^6 }0 @7 i/ D
/* 全局变量 */
% m8 K! S8 F5 M. ~0 d$ U
/* */
4 ?6 I# q$ m m: X. b( ^1 O; R
/****************************************************************************/
. j2 i! M, Y5 L' H+ }0 q; B* ]
char txArray[] = "Tronlong UART2 Application......\n\r";
0 [3 Y+ g; {& @ s+ U, R: L4 p
- t5 ]1 |( I8 ^* R, s" f8 @
/****************************************************************************/
9 E9 m' j$ [9 v0 j( a' z9 g j
/* */
) ~. ^7 M0 f# z
/* 函数声明 */
% G ?4 x$ Y6 }, T% E
/* */
/ @# r j- U: q0 K
/****************************************************************************/
+ Y m% _9 ]3 ?" a* A7 |
// 外设使能配置
8 D2 z+ ?$ m' {9 j5 |4 F, c
void PSCInit(void);
+ x9 Z6 Z. n& m
/ {* C' F$ c4 a* d, v+ J H
// GPIO 管脚复用配置
3 I& v! C) w% H6 _- Q M) k' ^ w
void GPIOBankPinMuxSet();
2 A7 N0 R( J8 d/ X# B; u i% O
( T: X# j. h( q
// UART 初始化
5 l8 I+ \+ t% a: T3 E, M
void UARTInit(void);
& F7 d7 r& {: z
// ARM 中断初始化
1 F% u& k2 N j$ x( f0 b: |
void InterruptInit(void);
3 F; C6 g; i: r+ F9 F p; i
// UART 中断初始化
: K. h9 U; _9 ~ b! }* P
void UARTInterruptInit();
0 c# b$ l5 {* o: Y# K% @
// UART 中断服务函数
1 M% M" A6 ?/ x
void UARTIsr(void);
# \5 t# H8 z( @5 D4 R4 d' ^& R [
( r, a6 {- x' E
/****************************************************************************/
. r. }$ b4 v; \8 \9 s
/* */
2 `5 h7 ~: p7 ]4 c5 f5 E
/* 主函数 */
- ]/ b! Y7 O9 {& g
/* */
( j5 P- U, ~$ }0 S
/****************************************************************************/
5 w Q# w: b: B9 D% X
int main(void)
, G& W# \ N7 W. F
{
# U# K6 R/ N5 r+ M! ^; C
// 外设使能配置
3 B3 A. M- h1 R) T6 E
PSCInit();
% O' `$ ?' f5 A
% Q: y5 n0 Z# e ?
// GPIO 管脚复用配置
( n3 ]9 r1 b$ V! f- ?
GPIOBankPinMuxSet();
I$ T3 {% Z' O9 r" Q# w2 ~
8 q3 h: u6 l' p' u& S
// ARM 中断初始化
6 H D$ ~% Z" C) X/ S U, v
InterruptInit();
5 ?# g6 c- x3 E) l* C: N' D0 n
% W" e2 Q J6 }& {& ^
// UART 初始化
! d8 P7 h! Q' F2 T8 ^
UARTInit();
+ G8 \* r: g8 M2 X. G
" K) L4 ~& T0 U1 E1 I
// UART 中断初始化
4 q3 w6 K$ i6 W" _8 b
UARTInterruptInit();
$ Y; g W4 Q! p; |% s
$ n2 }( A! M2 v4 B# j8 p
// 主循环
0 o1 I* p2 O2 z: t' r
for(;;)
% p9 `9 i0 b) g! ^, H! g
{
" n; V+ j+ e+ t5 B) U
4 Z- _8 @5 M; t% y( H
}
4 S: I3 d4 ~+ h8 S- v# @
}
/ F& V9 X0 a/ X# _- b/ {8 ~1 |
6 q! T7 u7 L! l3 x. y1 A, e
/****************************************************************************/
$ C! s2 s7 ^+ g/ S* }
/* */
6 A) k/ R! y" d% b
/* PSC 初始化 */
/ X- `: i' |6 O2 o9 b
/* */
$ u9 x1 A( Q7 }
/****************************************************************************/
1 T4 J1 q3 [9 B" u) S7 t
void PSCInit(void)
5 O9 E. e& l6 J
{
/ F% n f6 a$ N2 n+ S
// 对相应外设模块的使能也可以在 BootLoader 中完成
1 e4 i- @ u/ E$ T" V6 d/ ~' O
// 使能 UART2 模块
Q& C0 H: z* G( z+ m
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, c) [4 J+ k* b/ `& n/ S" h
}
3 e; U/ C; K7 B) K6 |# Z# _
. y1 O2 A7 M, P
/****************************************************************************/
' m' l% V: K+ k
/* */
1 |7 E/ J( T( F# ^
/* GPIO 管脚复用配置 */
; F: e* _1 Y& u P5 P$ ]; F0 I4 d
/* */
: t# j' a- l) A4 `3 h2 u
/****************************************************************************/
! F3 Z8 h% d4 G& ^5 S Z
void GPIOBankPinMuxSet(void)
/ U' T- _0 W+ F2 t. C
{
6 E, m0 H+ m5 l' }
// UART2 禁用流控
$ {0 }" {+ _9 }- _+ m; r! N
UARTPinMuxSetup(2, FALSE);
0 ?! H% a/ Z$ L C
}
2 k+ Y- z8 e( y
}8 ^& D5 q' S: I! q
/****************************************************************************/
+ K5 o8 V/ V e8 K1 v' H; \ i
/* */
& q7 } a9 E, [4 p- ]+ N3 E* t
/* ARM 中断初始化 */
- B9 D& d. A/ S2 O, z* A1 d0 Q E. X+ `
/* */
$ I) A- k2 m& ?
/****************************************************************************/
# ]2 @5 s4 s. e3 d
void InterruptInit(void)
2 f3 ?0 p$ }6 g0 d
{
( F5 W+ |, T0 D! U8 Q
// 初始化 ARM 中断控制器
7 b% p& e+ z, q% ^# p1 F4 K4 S5 A
IntAINTCInit();
2 l, j1 {* {5 @( _
2 s) O" G8 v# w r) x2 F/ {: }) B
// 使能 IRQ(CPSR)
4 i+ x* i n6 h% W- L" F! v0 b0 R
IntMasterIRQEnable();
' A$ V/ W: m3 x% J" a' K/ e
0 V( l. R0 r9 e$ q- h0 J0 F: D# H
// 使能中断(AINTC GER)
, w+ q6 s! V6 m5 G) w
IntGlobalEnable();
0 l4 M- J0 e8 x+ Y' X
( s7 r2 E: p: E: _6 g
// 使能中断(AINTC HIER)
& t; Y; Q( u9 D( s0 q
IntIRQEnable();
]$ k+ ^) r. ^1 d, Z& |9 F# c( E
}
) q, A j" S0 M0 `4 _5 N
1 r3 A9 a& C1 n$ H) r/ x: ]$ O
/****************************************************************************/
" w# O+ j. e; Q0 T" L% }# a' n
/* */
7 X8 M& I2 v3 v' @, H* d
/* UART 初始化 */
& I$ a# W( T6 I1 p
/* */
9 H2 n# ]7 H+ r6 v, C$ L
/****************************************************************************/
1 ?9 o* j1 r: ?- ~5 i$ J6 A- G# S
void UARTInit(void)
% C7 V. v* z4 \% t3 X
{
+ |6 `- `" v( o3 ?, t
// 配置 UART2 参数
5 i9 I' I1 M, g& a$ [
// 波特率 115200 数据位 8 停止位 1 无校验位
' q3 X- L0 z# k, |
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
# u: L: u# I3 V$ s
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
, x2 t) p4 x) E1 s% J. g
// 使能 UART2
5 s; S! W! v9 Z% U
UARTEnable(SOC_UART_2_REGS);
; q- z3 y$ e0 ~3 L9 l% ^
, q- z1 t) H' G( q; p, z; y$ I
// 使能接收 / 发送 FIFO
) v; t5 Y8 ]- [4 L9 R/ J. b7 z: u
UARTFIFOEnable(SOC_UART_2_REGS);
( \* ?) U/ Z- \+ ^9 G
( B. F" w! o% w: c7 ]
// 设置 FIFO 级别
- [8 O+ Q3 I2 z
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ k# I, n8 P6 y& U$ J' N
}
3 F3 E( V$ a" M- ?* e
) i S$ P. a: d% `
/****************************************************************************/
& c/ d$ p& z8 n1 T0 F6 C U
/* */
& H% A6 F: A& v- h7 o+ X3 N3 E
/* UART 中断初始化 */
9 l& u& u: Y( k) [1 Q2 [" G
/* */
0 f2 N1 c8 P# {7 n/ P h* z
/****************************************************************************/
; g, ], k; y! q, v4 N1 u4 {
void UARTInterruptInit(void)
4 A H! r6 V& V* i' _/ U' u
{
3 O! G2 K# L! s
IntRegister(SYS_INT_UARTINT2, UARTIsr);
2 u6 @1 m' S) f: n5 Z# r6 s
IntChannelSet(SYS_INT_UARTINT2, 2);
% ~& [: X" O9 Y+ l* [: m- R/ g
IntSystemEnable(SYS_INT_UARTINT2);
+ r# m5 m$ g' B, W Q: c
+ W' K# ^2 F9 H3 O0 }* I5 v! j* h
// 使能中断
. B& g$ ~# K+ |! G# ]
unsigned int intFlags = 0;
) l- D$ v" y. }4 A( K
intFlags |= (UART_INT_LINE_STAT | \
3 E; ]/ C# ?. }
UART_INT_TX_EMPTY | \
1 d- z" v$ e$ K! u7 f& M* N; b9 [
UART_INT_RXDATA_CTI);
8 ?" F' L0 P! B5 W7 v
UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 u8 L7 ~) s2 }
}
* O$ U O) e/ U2 {: @3 `4 T
0 V& p1 d2 U6 Z% ]- N" B' u
/****************************************************************************/
% {4 z3 h: X1 S1 j% ^$ u
/* */
7 S+ x- D% N3 Z& l4 u1 p
/* UART 中断服务函数 */
# x$ q. a8 t# h- M0 x
/* */
5 C" m7 s. X7 o7 J- v# p; f
/****************************************************************************/
. L+ v7 _* B7 n1 y) s% M
void UARTIsr()
; U9 q* A$ E2 T! z4 g/ b
{
, Z) u2 s, j% Q2 g
static unsigned int length = sizeof(txArray);
( a2 |- _ W8 h0 [! ]4 c) I8 U
static unsigned int count = 0;
8 m) x. c8 d/ H+ P, \/ Q' b# _
unsigned char rxData = 0;
+ T% c! v; O* _/ ^
unsigned int int_id = 0;
, Q% Q9 }8 Y/ a+ s5 F b2 \
' U* @4 U, X$ F+ R7 `
// 确定中断源
0 b6 w, `6 Y. L6 P
int_id = UARTIntStatus(SOC_UART_2_REGS);
/ F# H" M% }% g# Z, I" ]/ u
. p, g' n5 o- a: t
// 清除 UART2 系统中断
7 [5 z( q% f" x& `3 d1 |; n1 i
IntSystemStatusClear(SYS_INT_UARTINT2);
8 P: `8 G9 d; o/ P# @( T
; B; Z# v- z X! y" A/ B$ k
// 发送中断
5 U* k- a: h5 _
if(UART_INTID_TX_EMPTY == int_id)
+ Y$ I$ C# a; ~3 E6 @
{
& {3 T( @& x5 y5 L- ]5 X) y4 }
if(0 < length)
! n- z6 m/ h, T6 C0 F; M
{
7 F/ J' r' a. S* {
// 写一个字节到 THR
- A5 {7 Y V) \, o" ^8 |5 E& H4 e4 g
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( ?/ b% N8 H9 i; v' E% W( Y7 E4 X8 K. B
length--;
4 Y0 T; M: J" a+ v% X# R
count++;
- n7 ]4 d6 x! e" C. l4 n
}
7 z0 p7 [# a8 h7 s; f
if(0 == length)
# c" |& U1 d$ I5 U6 [9 |* C
{
/ u1 p' v) n, p3 V
// 禁用发送中断
) i" N; P5 i0 y9 t9 t
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 D7 D- Y6 K7 P) c
}
, L) Q. w& a2 h* v1 `3 x
}
* c! N; v p& J9 X, r' }6 X/ V
2 C9 I& t# h$ K n% \3 V; l- q
// 接收中断
; |) d; e8 z# d
if(UART_INTID_RX_DATA == int_id)
$ C& _1 e7 p; u( R z
{
6 v% A1 C5 U- ?1 Y
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 G; Y' g5 _$ v! B# Q4 }- D
% y7 J& ^! M6 E" z
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
' c- c/ Y8 y7 Z! ~- ^1 V# @
}
- `) }4 R' b8 z) l) F& W V
8 e% p" Y3 ?7 P( e* [: V
// 接收错误
% H4 |$ g E: l3 X; K! o* |) O
if(UART_INTID_RX_LINE_STAT == int_id)
/ _0 C# T; u5 j
{
# g( c* C& b' r- |: i
while(UARTRxErrorGet(SOC_UART_2_REGS))
( G* x+ E2 M2 J+ }: v% X) w# t: M
{
9 u9 X9 S. N) x# s
// 从 RBR 读一个字节
0 x. S0 }& G- k8 R3 e
UARTCharGetNonBlocking(SOC_UART_2_REGS);
* q6 O( H7 |5 t4 R
}
" _' A6 H4 h% H3 o A
}
/ {) y R# `/ z- X
6 P# r* {' l' X# j
return;
: V1 u6 ]0 D# P, M
}
5 u) ?, \* o% S- P6 }- P. Q
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
- R+ ~" D" S6 y0 L2 @, J
如果其它设备快速给你发送串口数据,你这边能正常通讯?
" j5 d6 ^, r ~9 F. X' _3 h
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4