嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
+ v( \1 X& s+ }
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 k8 F2 @; L8 O: u7 p: [' G
x* y; A7 f# G
#include "TL138.h" // 创龙 TL138 开发板相关声明
! Y' {( C; {+ ]
9 W3 h( [" }; @7 M. ?+ y' P# H0 y
#include "hw_types.h" // 宏命令
& \" t; `* R4 r0 x4 L4 L
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
0 ?1 U1 i/ ~; r C
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
7 _4 C/ p+ r6 H5 h! T( }0 D5 l0 J6 ?
$ c. o+ a4 V2 Z$ Z+ {" q# F: Y
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
i$ |0 z2 V8 t3 `
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
# B. I4 Z5 h3 I5 Z# }8 n2 V
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
" @' `3 u- T8 q/ Y
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- U7 T8 p$ D5 |+ n
5 e' o' R- B9 A; i% o1 y8 L
/****************************************************************************/
" k" @' q: D9 l( K! ]. Z0 U
/* */
7 i4 V0 ~* w. B- J7 l
/* 宏定义 */
% h" r) e# G/ g) {+ |, ^" W% x$ p
/* */
: r/ A& G; V% C
/****************************************************************************/
$ y! C# `/ ^, h& A, ?' X( N
// 时钟
/ j; [& V' B5 w4 F! L% l
#define SYSCLK_1_FREQ (456000000)
, p2 y2 c O/ p6 o: O/ k
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
0 Z/ V, k0 M; n$ G( Y
#define UART_2_FREQ (SYSCLK_2_FREQ)
2 E1 R' ]9 ?# E8 m1 L# q5 `# l$ S$ X
8 I' [; u7 `- O2 }+ R# y
/****************************************************************************/
: \9 `: d+ W" }; t. P! ?$ I+ U& v( C
/* */
, q8 h1 T t w7 Z- _( I/ Z: ^6 j
/* 全局变量 */
) A2 Q8 B0 g. U7 i, i" Y
/* */
" y$ N4 k; \: `7 }* p( V
/****************************************************************************/
1 W3 f E' J2 B* r$ @
char txArray[] = "Tronlong UART2 Application......\n\r";
$ d4 j; p+ z E. W
' c8 }1 [4 o" c$ q
/****************************************************************************/
( e- q. K- Q8 Y `
/* */
/ O, }4 ^, [& H' n( X$ F/ h* {
/* 函数声明 */
6 ]9 Y- e8 n6 i$ e
/* */
3 C1 e+ F( r, a; l& M
/****************************************************************************/
- c8 }' T- G: S
// 外设使能配置
6 x! j, N8 o: o/ r. l3 n
void PSCInit(void);
: L7 Z; E- n' u M1 S$ a" I
+ ^5 o1 r& K7 v9 O/ Y4 C! q' Y: A
// GPIO 管脚复用配置
5 w" L& ~4 \6 O8 m: i U
void GPIOBankPinMuxSet();
. f% `) @( H8 D, e& l C0 N( p
" _( y; n& f* s9 {" ^
// UART 初始化
2 a( F) D! r" e4 d7 b
void UARTInit(void);
+ V7 h0 s9 V+ Y, s
// ARM 中断初始化
$ J* w$ a l5 \& B8 ^, Q7 ~+ W
void InterruptInit(void);
3 q* Y4 ], O* l5 z
// UART 中断初始化
3 @$ Y+ n9 s/ b" h" s. N
void UARTInterruptInit();
, ^" y; U1 M8 i5 Q5 K6 P
// UART 中断服务函数
! O+ @' B2 j0 s% p
void UARTIsr(void);
; v& M5 o: y' x6 T% B% P& G& W
9 n r X! E+ v5 V& Z
/****************************************************************************/
. l Y, i( A9 C1 s4 R
/* */
6 W: x* R$ f5 B
/* 主函数 */
- F1 E% x1 B5 y) o/ m
/* */
/ {5 L" D: w F5 L
/****************************************************************************/
; D5 }( t6 j1 z( S7 ^0 l
int main(void)
# O# f0 y( k7 `) M3 `/ ^
{
* Y" |& x* n5 m6 }% U
// 外设使能配置
% Z4 y0 m+ V. k: S+ k- k- [* x4 y
PSCInit();
: P4 M. ]- k+ u4 P1 M
$ d5 T6 f* m$ S% j$ o. _2 w( d2 ?8 x
// GPIO 管脚复用配置
. r+ i% N; v$ E. S4 i9 n' T2 h
GPIOBankPinMuxSet();
" g# x; }2 p8 e
) d: i+ j( v& N5 K
// ARM 中断初始化
/ ^0 {3 m, u: ?& X
InterruptInit();
u0 b/ A) l3 G1 f7 z+ E
4 [2 p' q; x4 u
// UART 初始化
5 ^, I4 l+ e/ [: k+ u3 K+ w2 J
UARTInit();
7 T% }1 W, y( Y1 w* N/ U$ t
: X3 Z: b P4 q" M
// UART 中断初始化
# z' E4 w+ s* T+ f0 G' X$ w! s
UARTInterruptInit();
* a: F3 \ G3 R( u; ]% [
: f1 g/ f% i0 S4 u2 Y; \. ~2 b
// 主循环
5 D- k& I6 n* G* P; W
for(;;)
9 C* u2 K6 o" z! H
{
$ Y4 a$ G8 I# q
% T( e4 B* h( [6 }: b
}
! F: P- I$ A" _& K* Y; ~, A' _- c
}
6 F! ~6 ?6 ~; J1 ^. X* H7 t
0 K2 P' u& H( U, v7 d
/****************************************************************************/
) i: I5 z }/ S8 |. E
/* */
3 w2 \3 ~" Y6 B6 I
/* PSC 初始化 */
' s O, C: C: F% w
/* */
$ @, I3 A2 }+ E) h% Q% j& X' }0 F( }
/****************************************************************************/
# n# l2 j' Z+ g3 q" b1 E! v) F0 @. ^
void PSCInit(void)
- k4 g2 o, i6 V3 ^
{
3 }6 o8 p+ w# o* y; Z% {) {" j# n
// 对相应外设模块的使能也可以在 BootLoader 中完成
! v9 w9 S( ^# k
// 使能 UART2 模块
( N* k/ a0 U) E4 w0 Z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
% E! D0 s, \5 G8 J M
}
: N3 M* M# e1 s6 ]2 e
) \8 G$ ?9 |6 g J' i
/****************************************************************************/
( Q5 Z) f- T+ B0 z6 }6 t3 \8 b
/* */
/ ^; x8 @( N7 p' f$ }
/* GPIO 管脚复用配置 */
! v1 i' m, t7 V% e- K ~& K6 Y3 J W
/* */
% D1 Y) b* D' E9 k- k' Q
/****************************************************************************/
2 I8 C* f" I/ w- @, G, _8 T6 t
void GPIOBankPinMuxSet(void)
8 Y$ n( D+ A3 |9 W
{
( w3 Q: P! \" O4 t; o, f
// UART2 禁用流控
( S8 |& M& e, h) ~" y0 t; Z
UARTPinMuxSetup(2, FALSE);
6 @1 Y% W8 {) Q/ f
}
. \) d1 l. j" j4 X w
( Z- ^: A( m, Z4 j
/****************************************************************************/
7 r7 P5 M$ ~! b) Q9 D! W
/* */
( R' x2 S" j t: F
/* ARM 中断初始化 */
* o' a6 T" W- v* w$ I' U* N3 m( Z
/* */
' z$ {7 q* @% N8 V" v
/****************************************************************************/
( g3 S1 l' h9 W; A' @1 K( W
void InterruptInit(void)
5 o0 N3 T* ^ D y$ E
{
' G9 U0 o: X @! K4 V# [: X) G
// 初始化 ARM 中断控制器
1 W2 J( s* o# g4 r/ u x
IntAINTCInit();
) m( x5 A. W# e- M' `) ]* z& A$ a7 u
7 |* A5 j9 J/ ~. t7 @! K' w8 w
// 使能 IRQ(CPSR)
I5 g& A3 a/ W# U
IntMasterIRQEnable();
9 a m: U( y8 o) [
T3 w( {- n; J" M; b2 Y
// 使能中断(AINTC GER)
' z4 g9 ^3 p9 Y4 v
IntGlobalEnable();
! P) X' H: P8 Z! B
. q& l, e Y) i$ y" H; x
// 使能中断(AINTC HIER)
3 c$ ], ` s4 d9 l0 Y' s: X
IntIRQEnable();
8 A8 U/ Z0 h/ @0 X" g' d8 Y
}
% W, s- U7 m9 u( ~! F3 |9 m* o: v
1 W: o$ ^9 U' g* {
/****************************************************************************/
8 b3 {. }* X/ a3 h- i
/* */
: R8 j1 d: y5 |* n( e
/* UART 初始化 */
( m. N6 P2 ~; [6 Q
/* */
# i9 v, `& |$ t9 f# A8 t+ g3 m$ n
/****************************************************************************/
/ h$ i B: b S8 j
void UARTInit(void)
1 |3 r: Q& `+ B* ~* W9 S! r( V
{
/ F; I9 `2 X$ K) ^
// 配置 UART2 参数
( n+ ]7 M, ^& j7 V8 W
// 波特率 115200 数据位 8 停止位 1 无校验位
" A8 d; u5 {9 L+ A# z
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 W7 ]6 B! x" H* n# j$ Q
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 M4 k! D" `( ^* h) @
// 使能 UART2
1 B U+ \& s9 x7 ?/ E
UARTEnable(SOC_UART_2_REGS);
. n4 f1 _4 s3 `# t. [
8 r: n) n- Y J- `* U/ f: X
// 使能接收 / 发送 FIFO
, }3 a% v8 H7 c9 X/ t
UARTFIFOEnable(SOC_UART_2_REGS);
; C! H7 j1 ]3 n. a, ^: ~
# V4 N3 m* Y' ?% g( q6 W" E( m
// 设置 FIFO 级别
1 j4 C. R0 f+ E$ Z/ d
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
5 ?6 s1 J" t- ^- E0 V& S/ N
}
\. P0 e2 H) F# k0 q6 C* b3 M
3 Z$ f3 ]- ~- |$ Q0 Y2 S
/****************************************************************************/
: q- ^2 m& B) \: C' `6 d4 j
/* */
$ l o1 F$ e% Z U5 w
/* UART 中断初始化 */
1 W& o' B9 {1 c. m$ }% x0 s0 o
/* */
" R" s) _/ ^( e# _ h
/****************************************************************************/
) m. M5 T( w) n
void UARTInterruptInit(void)
; s$ L k a% M5 A
{
9 S2 k8 L1 y+ m1 ^; `8 U
IntRegister(SYS_INT_UARTINT2, UARTIsr);
) ?/ S* t& D. M( S
IntChannelSet(SYS_INT_UARTINT2, 2);
0 m! i7 X1 ^& w5 n1 w
IntSystemEnable(SYS_INT_UARTINT2);
& @2 |) n* B, T9 ^* o* q0 Z
& r# C' Z' X$ j
// 使能中断
8 z7 l# D/ O3 x4 q4 J6 R
unsigned int intFlags = 0;
; l$ y u7 t/ S7 W' o( }
intFlags |= (UART_INT_LINE_STAT | \
0 S) k% }# O$ Q4 C, V9 S5 ?
UART_INT_TX_EMPTY | \
. n2 x# E+ V V6 t& H" a
UART_INT_RXDATA_CTI);
1 ]$ v0 F/ Z3 B9 I
UARTIntEnable(SOC_UART_2_REGS, intFlags);
' q/ P9 {4 r4 `* p8 p
}
& ~/ V P% C. ]4 G, M C; O2 H: Z
- d7 J. A# X, V X. o0 j
/****************************************************************************/
$ o# k2 t# v, @
/* */
8 [, K2 B/ d6 D
/* UART 中断服务函数 */
/ l7 b+ U, h3 I% m! m4 n8 K
/* */
% L. A% q/ P' I* k+ d; _8 n
/****************************************************************************/
* Q. h: S7 y7 w: @
void UARTIsr()
1 X! _9 Q4 }" Z
{
) Q$ m% U- g/ }+ g1 K
static unsigned int length = sizeof(txArray);
% a+ j, }! ]5 b0 a; F2 [
static unsigned int count = 0;
) ~9 ? z4 A3 |" K/ q/ t1 i3 Z6 e# z, r
unsigned char rxData = 0;
7 \$ Z0 b: I6 c) j1 _+ U$ U- @: E$ D
unsigned int int_id = 0;
: g! q5 i1 y7 ]1 e% N8 a) B$ x
# V) o! K8 d' i% X- ^$ M7 X
// 确定中断源
7 p6 b. ^8 e- M5 q
int_id = UARTIntStatus(SOC_UART_2_REGS);
6 y9 L! R: C! _* E0 |0 b( c8 n
- l. i0 Z, V" Y
// 清除 UART2 系统中断
" }2 E! }, [9 l' S5 e; h
IntSystemStatusClear(SYS_INT_UARTINT2);
9 F b7 G, {. E( q5 |" c \
|+ U2 _ k, g$ k
// 发送中断
; D g7 F( n8 B+ G4 @6 [5 M
if(UART_INTID_TX_EMPTY == int_id)
. n+ `0 }: G' R! @
{
0 {/ C. ?) z1 e2 L- }# H; K
if(0 < length)
* P% t" g. ]+ [" E4 ?- t
{
( O8 ]" ^' E$ U: t
// 写一个字节到 THR
' W2 k' Z- `3 X- o9 h+ Z' X6 R
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
7 S. ?% r1 {9 m
length--;
$ b ]' u; c( r" |
count++;
8 n |) T, L. y; v0 L1 I& A& j0 }9 s
}
' p1 U- X5 ?% Z5 r
if(0 == length)
Q2 V5 \5 d+ B S4 y
{
* R% m4 A- T6 x. e/ {
// 禁用发送中断
5 r) C9 b2 V3 C. m% v/ ^6 U' L
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
2 u" p7 }8 ^9 u- A* ~
}
$ f7 v( `' L: Z% ^
}
6 x* b+ d1 Z$ N ~; L; W* J
5 \8 T8 y, |9 T5 z
// 接收中断
7 _6 T2 h$ [$ d5 Q! T; ?
if(UART_INTID_RX_DATA == int_id)
$ a. [/ {3 L/ D$ o Y/ A
{
* s( O) C U# V2 E& R
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
9 @# n) [9 v9 o+ K9 n3 |
! T7 [/ [+ {# h* _4 X
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
, L# R; i0 ^- |
}
4 g* k/ D. |( ?
5 K: }- K! U. s0 N% X
// 接收错误
, } z. r0 {$ `( `; Y1 L9 C' l
if(UART_INTID_RX_LINE_STAT == int_id)
& x% R6 P5 n$ a
{
3 _' F* P. N2 ^# ]" [/ k. j5 h# k
while(UARTRxErrorGet(SOC_UART_2_REGS))
( _6 O& a) A- [$ ?2 W) u0 N+ J! Q( }" m' C
{
1 ]* n8 c! I# L" @. z2 E
// 从 RBR 读一个字节
. m" e4 Y) p. o) G8 ~
UARTCharGetNonBlocking(SOC_UART_2_REGS);
% Q/ \+ J" a0 C/ k
}
% n1 t- U/ p) t* v
}
( P/ z4 E( X `" p' ], Q
+ p3 x l- N5 @1 F2 ?) `
return;
! r$ R, q T+ r% Z
}
$ u3 \; r t4 ]+ G; z! v5 z
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
6 X4 a J; w5 K
如果其它设备快速给你发送串口数据,你这边能正常通讯?
! U" J2 i% }% q9 ?) O1 m Z6 o; w
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4