嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
0 R) ?/ U1 ~. k! S
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
; y& f: N. i$ k! Z8 Z2 }( P
5 \' I9 z# M) s* F2 e# J0 B
#include "TL138.h" // 创龙 TL138 开发板相关声明
/ L+ w" s% M6 [/ s
+ E: X1 S0 N( U+ G
#include "hw_types.h" // 宏命令
: ^1 V3 X. }" X M" f" J: M6 K
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
2 \$ L2 D( d S/ C" ~% K! |5 N
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
6 k; ?6 q5 Z9 i7 }. b Z2 ]- s
8 c8 ~( f9 ^- n5 M- G
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
$ u# u% a5 d$ S0 R( F
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
. }' d2 ]1 ^$ a
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
3 |- ~& [- |& K8 G; \
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
9 o4 _7 d( q+ V" n6 n
" n. s( M4 m8 v/ B- _, V
/****************************************************************************/
' Z* S- ?9 l: z5 L- ^
/* */
2 k1 \9 c7 `7 A3 K7 ?& _/ x
/* 宏定义 */
# t q: n0 b# J: f! |
/* */
7 T+ {; |) I- L" X$ H
/****************************************************************************/
. S4 g7 L- I* V) ]9 v
// 时钟
2 d/ e$ B! O3 Y2 _5 N
#define SYSCLK_1_FREQ (456000000)
% n4 k# J5 \. [3 T3 ?& z
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
; G# ]8 e0 R! _& E) E, z" w- M, m
#define UART_2_FREQ (SYSCLK_2_FREQ)
$ h8 K0 M, y" _
7 k: t" j! j! r5 ]2 l4 Y8 F
/****************************************************************************/
( x/ O, T r! o: O7 ~
/* */
8 a G9 \! [+ u; S% C0 d- @
/* 全局变量 */
R0 b- j( O2 ? E
/* */
8 m! H. c2 }9 y! @
/****************************************************************************/
9 V' x- m! `! K& K2 x" q# d1 g
char txArray[] = "Tronlong UART2 Application......\n\r";
* W/ b7 d! f u( \$ `/ e0 k2 t+ B
! X' e1 J' X& i1 p1 a" Z% t9 V
/****************************************************************************/
! {4 }- k6 C2 @4 L, }: ~: a
/* */
' e" c! \8 b/ g* z2 ?+ J
/* 函数声明 */
2 r& y6 {$ H' @& c; g
/* */
7 T2 m W& i8 N) U
/****************************************************************************/
1 f% B3 @# s+ k/ m1 D
// 外设使能配置
4 Q0 l& {" B6 [7 g5 F3 i$ {
void PSCInit(void);
5 Y8 x0 K8 B( P) k8 J# W
) e7 j( d/ Z: D, M
// GPIO 管脚复用配置
^% K3 {7 I u5 U g; i
void GPIOBankPinMuxSet();
/ x( t$ ]$ \. b
2 n( n# l) l! r0 o$ x: W# ?! ?
// UART 初始化
& d- Y1 e$ F0 }: K/ s& e2 z3 h
void UARTInit(void);
- F1 H" S# O; y" m1 R
// ARM 中断初始化
6 K! X7 p n& {
void InterruptInit(void);
' S9 }# U K) {- j
// UART 中断初始化
7 X# U0 G6 J5 x: p+ B
void UARTInterruptInit();
! ?) X4 n& Y& Z0 T3 z; a, d
// UART 中断服务函数
; K& e' [. r" L3 u+ |
void UARTIsr(void);
6 W* A4 z4 P( m& Y6 m+ o( Y: H
0 L. t3 G% }( A- h% c! h
/****************************************************************************/
' A9 C% @. `, e0 g# Z2 b5 I
/* */
8 O/ ~) b, e1 w2 y: ^" |
/* 主函数 */
, x6 L$ Z) j2 {+ l5 R' }0 s' M
/* */
" R# b7 i0 b9 ?! M% ]
/****************************************************************************/
- a: J( y$ t! S! C8 C/ B' f' P
int main(void)
l/ h) q( R% M+ Z9 j! e
{
& j1 i: q- I5 |3 S, f: @/ L
// 外设使能配置
; u% w* Q. \4 U* u8 p4 g D& ~
PSCInit();
$ }* ^' L# {' Y# p2 o! Y
" \/ E$ T1 c8 e1 {% C: J
// GPIO 管脚复用配置
6 ~6 O0 R+ h' }
GPIOBankPinMuxSet();
' B4 X5 H. z1 U: C1 g
, q/ z6 N# T& C3 \$ S4 _
// ARM 中断初始化
W% e7 L4 M7 o& H' x: L' p+ T
InterruptInit();
- D. i. c- m' G( ]7 N6 C; \
: l: w$ @) R/ [* j
// UART 初始化
3 O/ s( |" D" ?3 T
UARTInit();
o7 O+ i6 n) O: {& E
: N; W1 d6 a( j0 O" E* @
// UART 中断初始化
, ?% g7 L% i4 _& H U, r
UARTInterruptInit();
1 g8 N$ I* j z5 ?+ \2 L! u8 o
' |9 I) u* S; }( I1 i( I
// 主循环
% h t, W8 F4 _! q% X% G! G0 |
for(;;)
# n) x+ }: X5 _! {! |6 E
{
# H# }: A& n" s2 C( Q+ _+ ^
" E1 h5 f) o9 M R1 J
}
' R+ @7 }: I3 I3 g' m) m+ b. b1 @
}
- h7 i" b, y. A
, H% S. S/ O. k$ k5 f
/****************************************************************************/
' C6 g6 |7 R$ ]" H
/* */
' M" N: f0 G5 V J
/* PSC 初始化 */
- T& K' [+ r o4 Y- D
/* */
3 G5 a6 u" X& h5 {
/****************************************************************************/
' S& i! ~) f# \3 J" H. k. u
void PSCInit(void)
" u/ J5 m2 a$ v' o( v
{
! S) f! m \- U3 ^7 Q, j8 F
// 对相应外设模块的使能也可以在 BootLoader 中完成
. I5 X& O8 d, `# v% s6 U( A
// 使能 UART2 模块
# l% y' n' \4 e! d- @
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 D% A. z) _; P3 \0 H8 `
}
/ W" B/ _1 z9 b0 G( V0 P9 U
' E, j T$ Q5 f/ P1 }
/****************************************************************************/
n8 ]! ]3 d/ w/ p0 K, Y
/* */
* K7 d% L+ V, ]' f! J0 \
/* GPIO 管脚复用配置 */
6 P( B1 m0 H6 l5 Q3 D( u! x0 p6 n7 A
/* */
& q* i3 a& S$ t6 X
/****************************************************************************/
5 m" c, F8 a+ A/ n$ V; }! J* |8 N. ]
void GPIOBankPinMuxSet(void)
+ H) g. _ B# m& U
{
- Q$ G- x4 ?* z2 o
// UART2 禁用流控
6 N6 [% _. y' \1 {, Q7 k
UARTPinMuxSetup(2, FALSE);
% z/ l3 t( z' o. {' Z
}
3 P& Z8 w, c3 m& `* r9 L% G
3 K9 z+ ^$ ?" S5 b: y5 } a+ M1 j
/****************************************************************************/
4 ?$ d# m& Q* z/ G9 m
/* */
1 H4 R1 h1 Q( [. Q0 f/ ~
/* ARM 中断初始化 */
. W2 D% N; ~+ e: D
/* */
/ p/ S3 K- Q& l8 j( Y3 _0 o' ]4 w
/****************************************************************************/
3 F3 z5 X: Q, C- M- i8 ^- b$ F# M
void InterruptInit(void)
7 \- b0 a4 p$ L. Q! G
{
3 j: H& n2 Y! B1 D$ { p
// 初始化 ARM 中断控制器
8 j4 J9 y% k$ B7 z* g
IntAINTCInit();
{' v/ b- H3 Y3 N6 n$ @ n
% Y$ u' `3 c Z! `# }" g
// 使能 IRQ(CPSR)
H' o# j" k! ]9 n, U0 X5 O
IntMasterIRQEnable();
2 k9 K) r& w+ f. H
6 G0 }6 M7 _* q. N
// 使能中断(AINTC GER)
1 L, R* R* T/ O8 J/ J
IntGlobalEnable();
' Z% r5 S ]+ ~' ]) r
" P4 R- V8 j b
// 使能中断(AINTC HIER)
* c* I. W! k8 U# F
IntIRQEnable();
1 D9 {, P5 ?: ? B: P0 R
}
W" f5 l' t$ ]; ^* t
' A% z2 J0 J: ?0 v
/****************************************************************************/
- U0 ^; c- @0 v3 M3 E) h
/* */
# z5 v) ? g/ }: L
/* UART 初始化 */
7 [. Q: U: D) F; ~) {8 S2 r
/* */
: a6 X# y h1 e" c- b$ s( V
/****************************************************************************/
3 Q% k- L' I- V' X6 z
void UARTInit(void)
: h* ]- ~. }! O+ Z7 x4 W5 F+ k
{
1 P- t0 H7 e# G- d
// 配置 UART2 参数
0 X4 I* b- i- ^: R* y! j
// 波特率 115200 数据位 8 停止位 1 无校验位
% y/ X% m2 W& l$ f% O
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
K& o, `8 {) {9 V
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 s0 P! K. T7 m; j) H
// 使能 UART2
" Y2 g& [. J5 w
UARTEnable(SOC_UART_2_REGS);
8 \: Y# g8 \. ]+ m
: b) P* U4 Q2 ?+ m
// 使能接收 / 发送 FIFO
& n# C% p3 ]; H5 ^/ h0 U
UARTFIFOEnable(SOC_UART_2_REGS);
/ F( o7 {' D' `! s: o6 ?
: A7 h6 \. B( D
// 设置 FIFO 级别
/ F) I8 {* D8 |- X& {0 R
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
: f3 [1 t9 K5 ]. k1 Z. l
}
! Y+ I* U% r7 [# T) n. D, u; k
0 e- D+ S6 r9 ^( w; M5 B1 N
/****************************************************************************/
6 Q8 h+ }/ v# J' p
/* */
4 b% v! ^( D* f& N
/* UART 中断初始化 */
" F2 O" [! S& r5 G1 R2 V
/* */
/ x( P6 S7 b; h, ^, q. l
/****************************************************************************/
! t) [3 o' f0 e; Q+ H. R9 l4 d0 x
void UARTInterruptInit(void)
% l7 z/ O5 P `) i" Q
{
* j' R7 ]$ @' B2 C% ^- `
IntRegister(SYS_INT_UARTINT2, UARTIsr);
& B4 ?+ y; U( Q' w
IntChannelSet(SYS_INT_UARTINT2, 2);
* x4 A) F6 R- j/ k
IntSystemEnable(SYS_INT_UARTINT2);
6 u# [& n5 I' b& B% K( o* x
: i7 M$ b2 c. t, J# B9 s
// 使能中断
T' ^3 I. w/ c) i/ }+ A: e. d2 w) [
unsigned int intFlags = 0;
; |+ y# ^' t b5 V) c0 n
intFlags |= (UART_INT_LINE_STAT | \
, j! X6 y1 b& Z$ ?+ C& n6 Z. x
UART_INT_TX_EMPTY | \
9 p. @) c2 O) E7 a I7 C/ l$ B
UART_INT_RXDATA_CTI);
& q i7 [/ O! q0 H: p. U3 |
UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ S7 |3 o( g7 C6 {: m
}
. I6 E" i: _, I1 H
4 f, @! X+ t4 _5 w# ]+ e) Z! P
/****************************************************************************/
# n( P2 o/ K7 ` g9 F: A6 v) @
/* */
+ {. i! h/ j: V- o
/* UART 中断服务函数 */
9 {# m% }2 |& B, [ X3 z
/* */
) c* J8 k. \5 v
/****************************************************************************/
2 M% G8 Z( S) C! N6 g' j, m' z8 y2 H
void UARTIsr()
$ ?+ z0 k6 u2 c7 l) n
{
[6 p8 i8 z8 S, i) c; j9 k8 D
static unsigned int length = sizeof(txArray);
; q7 d2 i v9 u; H2 H3 B/ I
static unsigned int count = 0;
) o( s. r( Q7 G1 G/ M2 C. m
unsigned char rxData = 0;
& |" z+ y2 W9 \+ g) ]# s
unsigned int int_id = 0;
6 T2 [1 f/ t6 t- e. o
2 Y) R1 |. P6 v+ U
// 确定中断源
4 f0 l/ l. L" V5 z, A+ y4 v
int_id = UARTIntStatus(SOC_UART_2_REGS);
: }- C6 O% T2 T3 _% l' G) u" c, }
% Y2 G7 n2 n3 Y5 M! I0 c" x
// 清除 UART2 系统中断
* C; A, q4 T$ r8 B0 w, v
IntSystemStatusClear(SYS_INT_UARTINT2);
{2 A/ N! T* Q: [9 ^# W
) f/ x2 \5 X9 z# } [, y
// 发送中断
5 k0 ]% [; J$ F0 w: w
if(UART_INTID_TX_EMPTY == int_id)
+ i3 g5 e& J# N P# h% G! G+ n l
{
3 k5 n% l1 _' d3 V( g1 e
if(0 < length)
& M+ h5 w, w1 B! k
{
: N7 l7 ^8 S6 J3 j. h
// 写一个字节到 THR
. r# V* H, H$ H! @
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 |; ~7 D4 d% R; Z& g) z
length--;
1 b4 Y) z. H7 F+ u8 Y9 |
count++;
) f( i6 W0 l6 H
}
" C, @3 n$ a7 u, j- U
if(0 == length)
' f5 ?1 p% g7 Y) f
{
( Q9 S8 z1 v2 {% H, J! O2 P
// 禁用发送中断
( V+ |1 X1 c3 Z2 f
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& } K/ r8 H0 \& H4 g* r: P
}
% P" w; E3 N/ }7 v
}
8 C$ \0 W/ y l: E" H- y3 f7 T- R
3 w# {9 D# r3 M- L
// 接收中断
' f! e* x' b" h5 r8 Z5 j
if(UART_INTID_RX_DATA == int_id)
) d5 Z; ]" f6 ?4 \1 |1 f
{
0 P1 A' K9 n8 B4 b. Z9 w. h
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 {# T2 g' ]: K$ }: a# h
! h0 e5 r8 ~4 f: V2 Y0 E% ^
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
5 d! W8 p& R2 _- W K8 _
}
% H6 Z: u& W; ?1 _% Q0 ^3 {" j8 N1 B
9 V# E# [6 O7 p7 L' k+ q
// 接收错误
& H, G N+ l) u$ ?3 a$ C. g( Y- K
if(UART_INTID_RX_LINE_STAT == int_id)
- @/ `2 o/ Z0 O9 @. e! u
{
- a n( L, b# K8 q! \
while(UARTRxErrorGet(SOC_UART_2_REGS))
, U, t; Q+ z' W* t2 B6 i* }
{
6 d" c# X# B5 ~& T0 M: z% Z; d$ W0 k
// 从 RBR 读一个字节
) k: k3 r! g5 T. i- U1 J' n' h" `
UARTCharGetNonBlocking(SOC_UART_2_REGS);
9 l3 a6 {' c/ z4 n. v! |
}
1 d% q4 o5 y- X9 ^0 \' h$ a
}
* }. e8 a. M/ s/ [4 S, C5 f
/ B. U; t6 \2 e; Y5 \+ p
return;
. \$ L0 y# G$ A. d$ F2 u0 J
}
: x0 `9 J7 y4 p) e/ ]4 [
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
0 U. \ ^% O: {/ f2 F g
如果其它设备快速给你发送串口数据,你这边能正常通讯?
8 J' W3 M$ @: d: l
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4