嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
6 A+ v1 E) m, U9 x h( h* D: k
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
z' \% {$ s4 e& }7 Z1 \
2 q/ x4 T0 N$ p( x, ?: @$ w
#include "TL138.h" // 创龙 TL138 开发板相关声明
% n3 n/ W. t3 l! f
/ p+ I# C8 g- Q+ {+ ~# B8 I
#include "hw_types.h" // 宏命令
m# J# l% ? a" `0 V( T ^
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
! b# v3 C0 P6 C6 e! H2 N# }/ R5 j
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
6 y P' s3 W4 P: U1 ^
~8 P3 Z# r, y: t2 a8 m5 L! @4 W
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
1 O; J% E* |1 C `; j5 ~$ ~
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 o; z! T1 y2 u# P, `0 L7 x0 Z
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
4 m# F* x! C- _% U$ a
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( m8 ~6 \% A9 u. h @) f
: R3 a; S3 @( S7 y6 n
/****************************************************************************/
; \# s7 t( n/ o/ @3 M
/* */
3 r8 [+ j: }7 o: K% u* R+ R2 b
/* 宏定义 */
+ A$ x$ d+ W1 c+ a- C; J1 x
/* */
7 {" M' O5 p' b+ |5 V8 F
/****************************************************************************/
4 U" }" g4 P& s6 J' F
// 时钟
! ^0 }8 A, y! D5 t- }) R$ h
#define SYSCLK_1_FREQ (456000000)
& G0 v3 ?' y. y
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
) ?$ \4 ]0 W) _( C* `" @3 |' f* c
#define UART_2_FREQ (SYSCLK_2_FREQ)
9 u. R) e3 I* n" ]; q7 J
* w; M! c/ ^' s4 D; E
/****************************************************************************/
! c: ]2 {0 S4 P
/* */
# w- {" s3 h8 v! r3 X
/* 全局变量 */
0 k/ S# A4 I$ W! B# [ s' V
/* */
; K3 H7 q- O" H# Y# _6 {8 E
/****************************************************************************/
( K9 c; d" s& P2 o
char txArray[] = "Tronlong UART2 Application......\n\r";
# @0 D" k6 l, e3 G+ c& x: {
% F. e* b# W6 P- u7 f
/****************************************************************************/
- R" A1 }9 I! w6 r$ e* K& x/ h2 X
/* */
+ \ t6 Z W: p0 c0 {; M& E. O
/* 函数声明 */
. B7 L, d0 C1 B( s& \. v
/* */
; n& M% l- N4 ]! W* L
/****************************************************************************/
( F" j n* @2 @2 J* X! h7 N
// 外设使能配置
0 Q8 r$ Y$ g' B2 d1 T0 u
void PSCInit(void);
- P q4 ?* L% s& x& c
% j. t1 \$ ?2 `$ C
// GPIO 管脚复用配置
6 x; E7 h. a" z% W5 z. i8 l
void GPIOBankPinMuxSet();
! B" [. d- v; }" r& W, g, T* E
3 T3 i5 r/ f4 e/ [1 o1 s) _
// UART 初始化
; g1 N- r) @7 W+ H3 d
void UARTInit(void);
# Y" T& }% n6 L. M
// ARM 中断初始化
+ y" ? A' @- P0 i
void InterruptInit(void);
6 _+ P- w/ o3 K( {6 n3 y9 z. E
// UART 中断初始化
" ]) x0 @# P7 |8 d5 v/ s8 U Y
void UARTInterruptInit();
2 K( L* z1 I* J& ~
// UART 中断服务函数
7 n. I5 F: R; j* Z6 F6 ]
void UARTIsr(void);
) W Z6 i- f3 Q) C3 r
& M# w S- K# k, i
/****************************************************************************/
4 B+ T9 y! ?) w; p ], }
/* */
* Y/ M- x7 h' L- q' ?$ N s& O
/* 主函数 */
9 d; `3 Q* h3 o, B' y3 L
/* */
' |( g3 s' \; [
/****************************************************************************/
/ B/ t- ?9 |) T* K5 Q2 M2 V
int main(void)
, i: Q K$ n6 j. I2 ^$ }. y8 W4 Z
{
# n) v0 C" U5 `2 p; |6 z
// 外设使能配置
3 @3 K U& J7 ~; x& H) [
PSCInit();
" o) Z* k0 @: L9 C0 K
( x8 F& T. ]8 Y$ ]$ b) t" ~# f
// GPIO 管脚复用配置
: }9 q! m9 y, t @2 F; k
GPIOBankPinMuxSet();
2 B1 I6 `- L# D/ d
% U8 \6 O* E) T5 F- e8 J; L
// ARM 中断初始化
3 H: E3 m: G! }
InterruptInit();
* a" }3 N7 B, m1 l
7 l; e2 X3 V( {6 u9 g Q
// UART 初始化
* k6 |& W* W- c2 w4 w) |' J" ?
UARTInit();
1 l2 r( @, ]% w+ h5 k: x
2 F0 k1 l% p# U9 ?6 m( @4 H9 I0 ?1 t
// UART 中断初始化
. P Z# v2 N! G3 J# y! ~* S
UARTInterruptInit();
- W% }* o8 c8 r3 ], s' S9 H& D% {" N) E
6 h- h1 ^8 l6 j. K6 @& ^) |
// 主循环
7 J! }2 f, f, D# B! u' R9 }
for(;;)
5 U4 u9 y+ `2 R n
{
1 f# f7 S- `, `$ k
: x3 G8 j: ^0 `, W" V0 m, g
}
. G3 o {2 O7 i# l `- ^( w% L% y
}
& `; Z1 T" ^$ D/ e( U j
6 w6 X# q: T% e" E3 Z% P* G
/****************************************************************************/
# M0 @1 H) c9 F+ J9 l
/* */
3 ~) `) h" n- B7 {1 n
/* PSC 初始化 */
+ f5 {4 \9 D" D% v( \" M/ T
/* */
1 I' \$ h4 u7 m2 b! x) A
/****************************************************************************/
x# e1 Y7 u: L8 U1 f& |( ^
void PSCInit(void)
2 T) G# f# E+ I7 N* t* h/ q Y; _
{
* E( l6 B) F. P7 r* N; M2 Q
// 对相应外设模块的使能也可以在 BootLoader 中完成
0 k* `# f$ O! U
// 使能 UART2 模块
: O5 c* \% I% P/ P! j- k4 K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" [6 b8 u+ E+ ]. u
}
* ^* }5 `- f; c4 J4 \) E
3 Z$ [! q1 ? Y0 P7 Y) J. u
/****************************************************************************/
) b( K+ T# }+ i
/* */
: ]4 y+ p9 L; K- V2 ]" E
/* GPIO 管脚复用配置 */
' r& I: M5 ?- K, R! t9 U
/* */
4 v$ f [, I$ o$ F) Z" ^
/****************************************************************************/
1 G. b- D2 D0 n
void GPIOBankPinMuxSet(void)
9 k! ^) ]( h( R# ~
{
" d4 B% g, w6 m- }% R8 _- O' B9 x4 ^
// UART2 禁用流控
* n8 H) g( w( V7 \; d: v4 G
UARTPinMuxSetup(2, FALSE);
* Y& s% D. `7 Y$ f! q" i
}
4 }/ [6 y0 y/ k) J* K2 G# t
8 ?# a. w# @. L. [8 t, C
/****************************************************************************/
+ q# Q2 Y9 e9 U2 \* T o# O
/* */
) m3 w0 U4 V5 q& A
/* ARM 中断初始化 */
# z3 J& z' a( e+ C1 C( v
/* */
& }- [( o" Y [8 ~. r% E4 R- E
/****************************************************************************/
+ h; J; r2 Z4 m6 J; @
void InterruptInit(void)
; B# @9 ]% g! U3 o; q } {7 A$ v6 h
{
2 m" E: r4 t$ P1 q" z" Y* O3 r' P. t0 K6 F
// 初始化 ARM 中断控制器
. X. ~0 _+ F, g9 L: _5 N( ~0 Y
IntAINTCInit();
: u! {/ W8 M( N% T( M% M* \+ z
$ A7 f* r7 Z& a
// 使能 IRQ(CPSR)
) P. o a8 S+ d
IntMasterIRQEnable();
# S& G1 i, w1 S, h$ _/ s
, u1 ~0 K, ]* H/ f3 c, j3 Z2 C! p
// 使能中断(AINTC GER)
9 K( K0 w* V; S$ P
IntGlobalEnable();
- C4 m. n/ A% P! w* ~ Z, h- C
) Y/ |1 Q3 B+ D8 k7 E. c
// 使能中断(AINTC HIER)
% L1 c6 y) [) _1 P% K* o1 z
IntIRQEnable();
" B4 z8 j6 e2 K& t u3 l2 N4 E
}
7 Q4 M9 V9 c+ R4 s. R) T$ h
N% b/ ^: y7 G+ ~$ l
/****************************************************************************/
6 |5 N1 m# A- e. \) O
/* */
4 J7 s0 {1 X) Y+ u! O' C& [
/* UART 初始化 */
, Z2 N1 A5 ~+ a) G9 t
/* */
5 `( f9 A x, a$ ?, J* b4 c
/****************************************************************************/
+ Q$ i* ^5 ]3 ?" J2 X1 Z
void UARTInit(void)
3 ^" y8 }8 } {! K
{
+ D2 s1 _/ _% A0 j8 {0 w# s
// 配置 UART2 参数
* H- p* e& h; w5 p) q
// 波特率 115200 数据位 8 停止位 1 无校验位
- B x" N4 @1 B6 [2 n* f$ A) Z( j' t
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) Q: q- ?! a u
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 u% R. P d% J. ~/ b! ]( m
// 使能 UART2
( Q6 U1 u5 ~! @& }
UARTEnable(SOC_UART_2_REGS);
9 V2 s3 m8 N2 z, G" ~$ A
2 f( U& R8 x' |$ v6 C3 d ?
// 使能接收 / 发送 FIFO
& o0 R4 V# @" H, c9 o$ y7 y8 X$ e& X
UARTFIFOEnable(SOC_UART_2_REGS);
* z. ]% n! E1 f7 M# V& P! y% {
3 w. B7 o1 @6 ]4 \
// 设置 FIFO 级别
9 Q; d* P: I/ c6 x' |3 N" |
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
- b! }. w6 R6 O# @& o
}
2 Q6 a) p3 U& J- p
; U/ G4 n+ D( N& \$ |" V8 K) w8 _
/****************************************************************************/
r( O8 f3 O) h& X) _: F
/* */
9 w F) H2 C1 i/ }
/* UART 中断初始化 */
5 a$ H2 O. A, j2 C* x
/* */
& g* j5 b8 l4 P7 f- P. R# E# f9 H
/****************************************************************************/
4 f9 K) i. s/ q! f6 O
void UARTInterruptInit(void)
1 _2 t" Y) d3 G
{
% f, a! p* C7 `4 ^4 [5 _
IntRegister(SYS_INT_UARTINT2, UARTIsr);
9 B G! p* U) C& r. K
IntChannelSet(SYS_INT_UARTINT2, 2);
. x' ?5 Y% |5 P9 k
IntSystemEnable(SYS_INT_UARTINT2);
8 e! M; n" \9 Z, ]
" Y& A9 l: n [1 S
// 使能中断
$ g% O# R; F; F& {
unsigned int intFlags = 0;
# I# C& s* t* C2 g
intFlags |= (UART_INT_LINE_STAT | \
% g1 \2 K4 X- ~
UART_INT_TX_EMPTY | \
1 Y8 \8 |) T/ I1 n0 [
UART_INT_RXDATA_CTI);
& D9 ^/ F) `- \4 S9 o
UARTIntEnable(SOC_UART_2_REGS, intFlags);
( o( v( h0 N; }9 f
}
2 T* |' K0 a$ v6 L$ m( E
$ `# k3 h g2 c. F$ ~: K
/****************************************************************************/
# k& A1 l& x( N0 v0 j. A; y5 n
/* */
9 n& ?2 o4 @3 E- B
/* UART 中断服务函数 */
) I& i6 v( Z7 S
/* */
% |- W0 n N1 L4 E% L
/****************************************************************************/
$ k' {2 p9 ]" L3 ^/ k
void UARTIsr()
0 h" s6 }2 [8 h# h2 o
{
O* R4 g7 w- r
static unsigned int length = sizeof(txArray);
9 k4 K; z# ^- Y+ \+ B/ a/ W# H
static unsigned int count = 0;
! g2 S( V% G: B6 Q* T' [
unsigned char rxData = 0;
$ U* v2 r! a+ g: G$ l- }0 x8 @
unsigned int int_id = 0;
: z6 a) c# O& Y0 M G+ y
* F/ B' S2 Z/ u } ?
// 确定中断源
( @- K W# n" t: t
int_id = UARTIntStatus(SOC_UART_2_REGS);
0 \1 A9 U* V+ [& \2 O* `
; ~# I' i! ~- L/ f
// 清除 UART2 系统中断
- ~0 ]; \) E% x$ E0 Y) I
IntSystemStatusClear(SYS_INT_UARTINT2);
, u T6 V1 U4 z+ X0 X& b% u2 K
1 H! G; l8 F( r7 `' c
// 发送中断
% d* D6 O& [) ~( Z/ t
if(UART_INTID_TX_EMPTY == int_id)
- D; c3 Y- ~6 v: W# m- l B3 j
{
+ T7 e( K) N' a! l+ D9 e
if(0 < length)
7 ~5 C( m% N d) q: {/ l' Z$ e& z
{
8 U" G( V* f0 _4 `
// 写一个字节到 THR
: Y6 X, X D% k
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" @# ~6 u/ S! j R4 W) I
length--;
3 f5 F7 R" X" |) V3 \- G
count++;
* t' A7 [( w" G& {0 o
}
/ h4 z' h9 {/ V, k* Q
if(0 == length)
4 E! T6 S2 Q# O9 ?; z: a: F
{
! U0 |/ |+ { k
// 禁用发送中断
$ N6 n" c9 u7 {9 u t9 |* g
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
" X) e' `0 d% N9 T7 j
}
( H x: N: d) y6 s6 P( h- ?# W( H
}
$ n9 a5 ]- |. a3 V
6 k# |5 h( j: N( l4 `2 k# z. j& N" f+ `
// 接收中断
& O$ r$ p8 Y# D4 E
if(UART_INTID_RX_DATA == int_id)
, w7 q& v/ R0 G) v
{
; X; Z8 {6 _0 ]4 e
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
. o. E$ f7 j8 f4 h! C/ p
: I$ A9 q( I' B( U
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# H7 P7 S6 k4 `" \
}
6 x( E2 J1 i- c# E0 c
. d9 |9 M+ n0 S* K% _
// 接收错误
9 U) L. H. l4 \/ l
if(UART_INTID_RX_LINE_STAT == int_id)
8 i$ @- f/ v+ z/ N; {4 C0 H" f
{
. \/ Y' ~9 X+ s: y9 `+ W4 w
while(UARTRxErrorGet(SOC_UART_2_REGS))
) A2 B& [- Z6 G' P( x6 T
{
8 D9 m2 H# ~: C7 D0 z R/ d- G
// 从 RBR 读一个字节
& [7 S( d" _( k3 D2 H* b- d
UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 J. c7 Z! \; a! n4 z
}
. U7 s% g/ f3 Q9 |
}
- R+ C. N) A6 o( v4 i
; O) C+ X, q3 o2 V) G# P$ N
return;
- ]* l5 N- N! A" N7 ~0 M9 Q
}
: L8 y" ?) t* K1 o1 ^* Q0 q* t& `
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
' l% e8 J$ i" \: U+ v9 J9 F
如果其它设备快速给你发送串口数据,你这边能正常通讯?
& x+ k# [, R& q9 f" F% q
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4