嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
2 h* C4 B- i5 F
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- L+ ~# Y- ^# Q; r7 Y( t
. F; n/ T. t+ a8 q6 s+ @
#include "TL138.h" // 创龙 TL138 开发板相关声明
1 s# N2 ]* ?$ n9 H
2 X# V9 j9 [: w3 t
#include "hw_types.h" // 宏命令
6 {8 n9 m+ e+ I. p; n) D' m
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 o0 ^3 U" d/ Z! ?' ]# D, w3 h
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
& J" d9 ?$ s6 @2 A- N
; c0 w$ H2 P+ ~( f
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
- \4 c- F$ l+ |! f
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
1 c& f' g" o+ V' c8 H) h
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
1 I/ c& N+ `7 ?) J3 K2 O
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 E8 p, _& }/ D% f9 o: ?
0 p& @3 ]7 ]* `5 K5 [0 `) A2 z, B
/****************************************************************************/
) N! W. t; M# _) ?
/* */
4 T) ?1 B W, O/ T/ I8 q
/* 宏定义 */
' G- ?" W- u* t- T
/* */
% |, r, ]4 I: U
/****************************************************************************/
" l# `9 u+ ?7 q/ Y( O; i
// 时钟
+ V1 N4 K6 z P
#define SYSCLK_1_FREQ (456000000)
* d; k% f- @. l3 V3 q
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
6 u, i4 d* {5 g$ ^* M+ k0 S2 P/ V- h
#define UART_2_FREQ (SYSCLK_2_FREQ)
7 p4 w# u- e. ?7 r; z# W1 W
9 q) ]5 [/ y+ ~+ w$ A% i
/****************************************************************************/
! y* `/ h' D4 K+ E$ I
/* */
7 X& m+ S; e% S6 A8 F
/* 全局变量 */
% Y9 A2 w/ f. S7 H* b
/* */
, q4 ?; \4 b; h* z2 M( y; k
/****************************************************************************/
- B2 W# k: u, B( y4 y% v
char txArray[] = "Tronlong UART2 Application......\n\r";
& x8 p1 C& b+ V
g3 a% q2 S& S
/****************************************************************************/
. \! N; K. |4 n! p. h" c
/* */
2 }/ l( C% j" ^/ ]7 @. [
/* 函数声明 */
7 s8 V [& i4 N8 p# T9 K. G, T
/* */
1 a" l, W" a7 z6 x9 U$ w3 ]
/****************************************************************************/
7 ~5 \2 E- @6 ^) Y& X. o
// 外设使能配置
; Z4 o* x3 a6 G" [9 {& n4 n P
void PSCInit(void);
# I6 Y [4 t- B; O. S# \, j- ~! T& R
% W3 \4 ]3 w% w; r
// GPIO 管脚复用配置
; Y: l- ~" H" R" ^( \
void GPIOBankPinMuxSet();
W- o) C- G ^! N- J2 ]
! M: L( A7 f9 ]$ R5 D- g& X+ ^
// UART 初始化
' ]0 G4 B& j! B f% J, @8 f
void UARTInit(void);
4 i6 x: t0 ^! ~6 G, v7 x1 P4 h3 j. ?
// ARM 中断初始化
2 m1 C* ~4 r/ o( x( b. F
void InterruptInit(void);
) b% X( V' t! |; C% B: t6 w
// UART 中断初始化
; H: a& v0 ? j, m n/ L' U
void UARTInterruptInit();
3 ~2 E" F1 U) d. D: U
// UART 中断服务函数
q' W% a& L# P8 W& I; i! \
void UARTIsr(void);
7 a$ j. A; v( ~
! p: [8 q' F, k' \" q
/****************************************************************************/
2 U/ K0 s. `0 x' D3 s4 f
/* */
; \+ l ^) B) H& H; Q0 b! M
/* 主函数 */
9 X7 g$ o& y8 k4 J8 n) c
/* */
+ ]' |+ R7 U G* b$ r2 j8 V
/****************************************************************************/
6 J# R. W3 B8 ? i- t; L8 e
int main(void)
8 [" d d! f# E7 y
{
8 }4 z' w2 K* L3 C
// 外设使能配置
+ `$ y$ k; @$ f( c1 S( m
PSCInit();
# U) I- D) N5 ^( r6 M
% [# f! e+ r b/ [5 L3 J
// GPIO 管脚复用配置
+ N4 I' {' j9 A! D
GPIOBankPinMuxSet();
a- K# S9 `$ b! Y
+ s p4 Q6 f5 L
// ARM 中断初始化
* {' ^1 s* f1 z2 [
InterruptInit();
, Y: y% K& b7 E* |
6 A Q) z; t" A! B" }- y0 n5 j. m
// UART 初始化
5 ^9 ]/ E6 a7 F7 V) f: @6 \
UARTInit();
0 j: N) J# o* a. a' H. h D$ e! Q. d" \
5 L9 h8 T/ U$ K% t) D( d5 H1 }
// UART 中断初始化
- b. }% }( w/ X7 k9 E+ F; T
UARTInterruptInit();
! j( c% o l6 a3 c* c. v0 k; {
( Z, k+ c1 R- l' U# ?* v! |0 X
// 主循环
+ w# m- m5 `) |1 p. a. s3 W
for(;;)
. w5 \1 W; n/ i% `, B: A) I
{
# o0 c/ {4 i9 v7 Z0 e
+ H( q2 y& u. F, B5 c
}
, _% q' ?' b# v7 x/ L F
}
' u& i$ \% ^* O, V1 |. O! T
& ]/ L/ B% }6 F4 }6 q0 C6 u
/****************************************************************************/
8 \$ P- E i9 }" `
/* */
7 ]+ Z7 z9 Q/ g7 G3 f: C; a6 i8 N9 s
/* PSC 初始化 */
! h5 V* n; U3 ?0 v: a
/* */
' ^1 G7 R7 x! N" \
/****************************************************************************/
; _' t6 s; F! d! S8 ~: X
void PSCInit(void)
; I3 h! Y- S% }8 f; f# R
{
& X+ o Z5 r# A$ T4 ]) ?
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 T/ h, D! i+ b0 P( N& R
// 使能 UART2 模块
6 |3 p" N# F) q* D' I. g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
1 m& I1 K4 v" S J, c3 W0 h( T
}
; @/ K/ F# g% \* i& I0 b2 W
$ r! [8 D3 {; E& h
/****************************************************************************/
' b, x* H" K/ {$ }) j( [
/* */
; E& S' s* W7 k2 S2 j( P
/* GPIO 管脚复用配置 */
" x$ u4 k, U5 u% o o( n) }" l* C. x
/* */
' B; F) w8 u" Q0 x# }
/****************************************************************************/
+ ]7 b$ {* O0 P7 H$ O( p- q
void GPIOBankPinMuxSet(void)
; V: o3 S* ]) k/ @7 |& j9 \
{
4 v+ F2 o: q1 I6 V, A
// UART2 禁用流控
) J C- p1 L3 e* ]5 b
UARTPinMuxSetup(2, FALSE);
6 [) z9 g8 {3 ]' W: J
}
D7 H' o+ O. \ U2 t: T
' B% S% @$ H+ t
/****************************************************************************/
( _$ R v# B# S! K
/* */
* F0 d3 t X" o, g; J$ {
/* ARM 中断初始化 */
1 R% o# u0 Z4 T a& d8 i) i% C
/* */
; m7 f+ Z p. c( G
/****************************************************************************/
" F1 w) Q/ q, w: }% O* P& ^4 h; z' j6 I
void InterruptInit(void)
; O* t- c0 C* {0 n3 d- f4 c1 g' o* V! X; o
{
2 e8 I( V4 |5 f2 l
// 初始化 ARM 中断控制器
: X \9 o4 r: [$ W; c5 K2 G
IntAINTCInit();
) K* X: R$ p4 P* A8 z
& p+ N4 ~* K4 y0 S3 t5 v% A. E
// 使能 IRQ(CPSR)
5 H$ {4 d$ n- S$ [) j$ w
IntMasterIRQEnable();
. s/ _3 \' z( F8 W6 i
+ b1 G5 i4 Z# r% D
// 使能中断(AINTC GER)
* C& M& G7 U3 P6 N& F! c5 R% t
IntGlobalEnable();
" v* V, B; _+ Y7 a
- r4 \2 G% S) y# F" `5 U
// 使能中断(AINTC HIER)
- k, f( U8 _: l5 h, j, v) `3 l
IntIRQEnable();
3 Z3 Y8 {6 @3 @) Y- k+ l3 h/ K
}
; m- R2 U# \1 u* X+ C" n+ P
% G0 F0 ] z0 j7 A- ^& n/ o) o+ S
/****************************************************************************/
; K) A2 D. z/ d" Z/ F" R
/* */
, h7 |' l( V( _; f
/* UART 初始化 */
. I+ y4 C8 g+ X8 `
/* */
. h0 f2 @" w7 r, u w
/****************************************************************************/
9 r$ ~: `6 w$ I' L {
void UARTInit(void)
8 \" A3 T/ W l4 ]
{
# g: ?9 r0 f' z
// 配置 UART2 参数
6 K/ G- ~" I0 G9 _& Q
// 波特率 115200 数据位 8 停止位 1 无校验位
6 D7 H0 f: z: A
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
1 P8 h& G1 ~/ X7 ]
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. ~. C2 t" R" Q5 C# d
// 使能 UART2
8 F7 i' Y: \8 {2 s" K. z. B
UARTEnable(SOC_UART_2_REGS);
& k- D J6 c) J) w
1 S7 U! Y: N' d9 _7 }! |; ~
// 使能接收 / 发送 FIFO
: ^" h' s" f- z( }2 G# d
UARTFIFOEnable(SOC_UART_2_REGS);
& M L; H$ W/ b! m* Z& S# x( {
- Q7 c3 M' e$ {+ W# j" @ c' ~
// 设置 FIFO 级别
, P7 Q3 ?5 a1 [, w8 K' \
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
# k# L# V% H f
}
& B6 i# l0 Q3 c! P' A. V) f
8 m5 A5 `" \4 [7 B4 Q
/****************************************************************************/
/ f5 ^% n" _6 ]8 t) m
/* */
" r/ T# s- D/ F* m. D
/* UART 中断初始化 */
, K+ y, ^ m" t
/* */
. @# {" @" ~$ B5 Y! l
/****************************************************************************/
3 C- G6 Y5 o4 x% w& M
void UARTInterruptInit(void)
/ y* l* A/ A9 U* F
{
/ U8 W# m; m2 a6 \: T! j
IntRegister(SYS_INT_UARTINT2, UARTIsr);
. M* p/ r0 Y( U+ ^7 ^, C
IntChannelSet(SYS_INT_UARTINT2, 2);
* u% ~3 ]% L$ I! ] _& T; f
IntSystemEnable(SYS_INT_UARTINT2);
6 L6 T/ g! e) ?( ]1 i0 Q
2 w' |- x" g! m! d1 A
// 使能中断
/ v" U0 b& q; N7 \8 m+ v+ G" Z j; e
unsigned int intFlags = 0;
Q% C) {* K) @
intFlags |= (UART_INT_LINE_STAT | \
- m& J* w- i8 p) B/ C4 s
UART_INT_TX_EMPTY | \
$ {+ w7 F$ Z5 `) M/ J
UART_INT_RXDATA_CTI);
: a2 s+ ]; U* f5 A8 I0 z% S& f
UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ S% P8 Q$ s7 ?( R; {, u4 @5 g
}
' r, W7 G, O& y( J
) Y; A* S/ l# g0 O
/****************************************************************************/
$ Y$ b3 t. k O$ \! U: X( Y
/* */
0 d" C6 ~2 ` c* i
/* UART 中断服务函数 */
( m9 }9 i' L4 H3 a& g, R3 W
/* */
7 H6 \4 _+ |1 z% B
/****************************************************************************/
1 q& \6 P& r+ O$ a
void UARTIsr()
- ~4 G5 T3 J6 ~7 T4 H+ F
{
& d% |( f& S1 b. t( c1 e
static unsigned int length = sizeof(txArray);
b- |% D3 p2 R( f; t3 r
static unsigned int count = 0;
! {9 H9 d' i8 q8 ?' p9 d& X
unsigned char rxData = 0;
. }: t- B( D; [1 i6 F
unsigned int int_id = 0;
# x7 E1 S& b K0 Z9 C
/ j2 }* ~0 Q8 D9 T) V& Q- `
// 确定中断源
" B: P0 n7 k! ]6 W) w% \
int_id = UARTIntStatus(SOC_UART_2_REGS);
5 v* @5 v& E" D: ]
( n( B1 Y8 o; S1 D
// 清除 UART2 系统中断
& F* W, W: A- h8 t* s
IntSystemStatusClear(SYS_INT_UARTINT2);
2 ^9 O, F& Z$ G& `7 G- i8 L' h
+ I4 u" a2 {# n
// 发送中断
1 t, O% N! b, D! C0 E8 i5 F3 v9 ]
if(UART_INTID_TX_EMPTY == int_id)
) _9 L1 d# ]- A& R- f" S8 ?
{
& t& D. u$ j# F: {& |) x
if(0 < length)
+ N0 D p" W6 L9 d
{
, r: T' n5 C \. C# j+ H, i, p
// 写一个字节到 THR
2 i6 N; k% r8 S6 \, v4 U6 k
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
+ r7 J3 E* d7 J" h) X
length--;
7 r6 \* ^7 }; H$ H2 d! e
count++;
) g0 c H6 E! p% ~- M5 h/ Z
}
6 S- I& S! f4 H/ ?: t+ w$ |: a: x
if(0 == length)
% u3 _; ]" u1 L
{
. \# M' Z: W8 L6 R# h! x- B
// 禁用发送中断
( ^# a5 W4 i/ d2 o
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
% A1 l* ]4 i0 {0 b2 }% A: r
}
) ~ ?" J+ X8 B+ Q \3 E- f
}
! I: Z( E5 X6 c2 p
7 f" S% @' J# q6 U6 K T p
// 接收中断
& f1 [0 l+ N4 S+ m4 E
if(UART_INTID_RX_DATA == int_id)
( w' d& v" g# ?6 a8 N0 }! m
{
" J0 A d2 M) P0 g" X
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 c$ D3 @9 x7 R0 s) M# P5 y" e7 H
$ F# v3 c i9 z, ~: T/ m
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ h& s7 t0 K" u* u( X
}
) x5 {5 h) e5 `8 C
2 w/ ~* c, U: V6 A1 [+ ]* K
// 接收错误
( p! A* T# d) a* C" p0 ]
if(UART_INTID_RX_LINE_STAT == int_id)
& ]4 u: N( F+ m0 K! M
{
9 o4 x8 o- Z3 ?5 c+ I0 C# X
while(UARTRxErrorGet(SOC_UART_2_REGS))
- R8 c/ p" h/ O5 U
{
2 G) a/ o% m) U5 q
// 从 RBR 读一个字节
1 Q9 w+ @. O* D/ c/ g6 N
UARTCharGetNonBlocking(SOC_UART_2_REGS);
! @9 ^, j& O) f# z( ]) P1 v
}
, C5 u9 l2 W( Z# f! N% N4 r; E
}
3 g6 j: Y( V7 h+ s* W0 R, `) \% n* h
( C- T. I' v4 f. s
return;
+ d; d9 J/ Y3 Y3 ~* f
}
, L! q3 \7 o$ B2 w
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
# ^5 U& X; c$ r3 ~
如果其它设备快速给你发送串口数据,你这边能正常通讯?
% e( i* a% W* o: y$ ?8 m, [8 A0 w- E
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4