嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
/ N- Q) V |/ S% i
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 |" S& O4 `8 I9 D
/ E( F8 C4 B+ A, X" s" l% ` @. |
#include "TL138.h" // 创龙 TL138 开发板相关声明
+ f" n# ]1 ~: g4 s9 ]; ?
( `: u* d) W+ r# a# p3 ?
#include "hw_types.h" // 宏命令
. e; U+ V2 J- r% g4 v: G
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
. a! ^$ m8 @, e; a
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
% z) q/ N `1 r! y3 }! {
& C8 r1 @+ H% I1 E* I
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
0 L) b: w0 f" w; Z
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
, D/ a8 Y! S' W. w* a$ l7 Y
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
, D! z1 Y2 v) s! p+ L2 C3 c
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 Q: v) l6 H: U
9 M+ [& g9 y0 \# A6 J* D! L4 E
/****************************************************************************/
, s* `, r) Z7 d
/* */
: ]0 l. k( F8 C. S
/* 宏定义 */
9 ^% K. x% N, Z2 | Y: e
/* */
& u) c9 g3 C/ r& O3 v; [! o
/****************************************************************************/
5 q; V' d7 `1 G2 O5 J' @
// 时钟
3 M6 T1 P4 }; F I. w8 I
#define SYSCLK_1_FREQ (456000000)
* b- n$ C; \) q+ a6 j% G1 s
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
1 L5 ?" K, ^4 k: _' `$ E4 \
#define UART_2_FREQ (SYSCLK_2_FREQ)
) _' D) m: @/ T- e$ ~4 o/ n v
- z3 A8 i/ P3 A' \
/****************************************************************************/
; V& z9 w9 T% h6 m( g6 J
/* */
! e6 m* d! ^' r: Y: o9 U
/* 全局变量 */
5 S N n/ U- l0 I; U2 a/ n" p# w
/* */
+ K% ?" {1 r+ d# p- S
/****************************************************************************/
) l$ I% g; J6 h. |9 r+ ~' D& t! n* ]( g6 j
char txArray[] = "Tronlong UART2 Application......\n\r";
% e' c* h5 u2 P! k& ~
( T: P7 r- e6 G/ a7 U3 c2 U
/****************************************************************************/
! ?6 `0 {5 p0 H, k+ A
/* */
% ?! ?& _6 ?' [1 `; ]
/* 函数声明 */
0 A& V+ ?2 }5 ^; a. V9 \8 s! d
/* */
# T# P. z" d5 ?* i% D
/****************************************************************************/
6 v/ d( Y, A4 | D- Q1 t# V
// 外设使能配置
2 i9 g: y% X3 h* b# c% \7 |7 {0 _
void PSCInit(void);
! ? s- t( G2 \7 o4 C
8 X. `1 z9 O' `* V: C5 p T
// GPIO 管脚复用配置
# q4 T- b% H$ H) u3 i# y
void GPIOBankPinMuxSet();
2 y/ j. C. p% W2 U
9 O4 A4 v% t+ R7 ~! Q
// UART 初始化
. X* f) E2 ?9 c$ l
void UARTInit(void);
1 p+ C) k" a$ w9 {
// ARM 中断初始化
* i3 b; x7 w2 V; L9 A
void InterruptInit(void);
) [: s; X3 e4 j
// UART 中断初始化
5 c, l9 U+ M! Q- a m6 z( P$ b
void UARTInterruptInit();
" w( |5 G; \1 r2 V
// UART 中断服务函数
. o6 Y, |# n2 G7 v) S" C
void UARTIsr(void);
% ^' s3 B- g& O
7 Q7 R( D! h3 \- }3 E6 a) [8 [
/****************************************************************************/
, o/ O2 d2 C2 L9 b6 X8 o& k
/* */
/ j, s( v0 K0 m6 }& e
/* 主函数 */
* R9 I3 c' ]4 c3 A
/* */
% @: T; D- s/ I9 F9 v, G
/****************************************************************************/
( H; j0 `7 J- g( f
int main(void)
# e" g6 g {/ d9 M: [! f. f
{
+ e; r2 g$ C4 T# R
// 外设使能配置
0 v4 k( ?# [# B& W N9 j
PSCInit();
' q( G+ o' u, D+ q
. V0 I* S+ Q$ _" g
// GPIO 管脚复用配置
9 K9 @# [4 g8 Q) p
GPIOBankPinMuxSet();
( A& r; k& K8 X. R! E0 ^/ q
9 k V1 D/ B: H( l9 ?
// ARM 中断初始化
5 m9 I6 }& A0 Q) y' p
InterruptInit();
0 ^) ~' Y+ l: Q" t
- Y/ g3 C& \, B; E5 o$ i
// UART 初始化
( O& s1 g3 o4 O8 g. T
UARTInit();
- m6 }! A9 t/ H) R' Q! y5 p
4 D4 E( p* x/ i; }. Z
// UART 中断初始化
$ r( h/ C1 N7 ~1 }
UARTInterruptInit();
1 S( V% \8 P# P2 t7 W% ?7 q
0 E0 D1 {) [* R! X
// 主循环
+ ?7 E2 o5 \6 @/ q/ ~1 m9 g
for(;;)
' h6 R9 r% {( s, `; A3 q0 J: P, u
{
- ?6 D' [+ l2 q$ h" N2 }
& f! J1 ^! Y8 F3 W
}
" U& O/ P5 S9 `' F& H
}
3 q- ~$ Y# c% I& |* m
. A) O$ ]* b# f3 d# ^' i
/****************************************************************************/
" i2 J1 s! V) o2 Y& J/ A, c9 @
/* */
o0 P5 H& H( A7 V
/* PSC 初始化 */
7 @# b4 [7 I: V$ k! o
/* */
/ K5 S4 t2 C% c- M8 V
/****************************************************************************/
Z) s1 L: s* X
void PSCInit(void)
# y8 w g: T. |+ \$ G5 k/ f, y: c# c: A& h
{
8 v* y0 ~# ?3 c" P
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 M* r0 `7 v7 E
// 使能 UART2 模块
, q" v7 F5 _" z5 p0 i/ B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
( B9 i" c3 o G! I9 ?3 i# f
}
1 D( g5 I5 G# A% ], n. ^
9 ^8 O8 j" \6 c& M. _
/****************************************************************************/
, D% Y" S5 L. S4 E% F! m
/* */
9 @# ?3 L W; \, w. s5 U3 [
/* GPIO 管脚复用配置 */
; _1 B( d3 l8 P1 T/ N5 q
/* */
/ @, }. n* e4 G* ?2 q) a
/****************************************************************************/
/ E* ^" m. j3 ?4 ]: X' ~
void GPIOBankPinMuxSet(void)
1 w; M# K4 i# ?$ y$ ?# K
{
4 o9 I9 a& ~4 j4 K0 r6 C: v9 @: @
// UART2 禁用流控
6 Q9 x" t, o. p5 M4 L ]
UARTPinMuxSetup(2, FALSE);
! x& n- m2 V2 U7 B8 y1 _9 o
}
! c! o( {& w* L! M# ?6 O; _
- K: H+ z" F* }% z; z9 S4 t% n
/****************************************************************************/
. ^, \3 C; ?% j% R, y! @* p
/* */
: b( a& W- u, X; D0 Q
/* ARM 中断初始化 */
1 Z' O- w! _" N) Z8 [/ |6 n, X
/* */
9 B; ?" O" v& C8 Z! e$ W7 ^; |
/****************************************************************************/
( J! V' B2 h: Y$ L' @
void InterruptInit(void)
. O5 m( s1 t' w
{
5 }' t4 ]' z* v5 M; V! g) d
// 初始化 ARM 中断控制器
5 T4 v. S2 J2 ^, k( T I4 [. y
IntAINTCInit();
- x) d; s; i7 o4 z' ?, A) j5 P p7 }+ H
0 o& s) \; \* |
// 使能 IRQ(CPSR)
" N' ]* |3 Z8 |$ D
IntMasterIRQEnable();
6 v7 j9 T# O" ~8 a; |4 r5 z, J2 Z
9 G5 g4 [2 P6 J8 x+ L
// 使能中断(AINTC GER)
) L9 Q0 b4 i h0 ~( W- n
IntGlobalEnable();
, n- m1 N2 K2 Y* k% J
3 _7 d! W' T& Z4 y* m" {# g( Y
// 使能中断(AINTC HIER)
7 g9 a% A4 g3 } Z
IntIRQEnable();
- N& }( y! [) s, t" S/ O& y# y6 p
}
; k7 E. y! F l
* }& g0 L% J0 P
/****************************************************************************/
" ^' s' v( L2 o0 L4 L
/* */
* n! b+ f8 @: E1 I/ C6 D0 N
/* UART 初始化 */
' c" }9 z% n1 g0 z6 B
/* */
8 j/ ]- N1 t2 w# L5 C
/****************************************************************************/
; @. i) b9 N( b2 T( t
void UARTInit(void)
( I+ F% e8 m9 S& e5 ?) v
{
9 q+ R) h" x, f1 u
// 配置 UART2 参数
7 N: e6 Y5 [/ u5 ~5 O0 x
// 波特率 115200 数据位 8 停止位 1 无校验位
$ _& Q# ?0 O( f1 h( Y" p0 a" q
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( C; y2 [4 ? E e. L7 I
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
( W! U0 k( h6 r! K3 V$ ?0 ^) S3 u: A
// 使能 UART2
2 q, K7 N$ g. ~+ r! W* V/ N8 b g
UARTEnable(SOC_UART_2_REGS);
. h) T$ o5 C* v0 ~% b
8 Z8 B$ k$ x% F/ a/ ]3 A
// 使能接收 / 发送 FIFO
. S/ ^% _; O4 o* Q8 _- t
UARTFIFOEnable(SOC_UART_2_REGS);
6 D+ M3 T a+ ]8 N2 N4 N
& ^0 K" b4 E6 [4 ?3 J% g
// 设置 FIFO 级别
9 T/ T' E I2 ~. y* j
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
5 M* ^( m0 ?) o8 m, [* F
}
: N8 A) O( h& ?
" ~# ^+ E# Q/ N
/****************************************************************************/
N$ ~! i l7 c8 J
/* */
: W! Q* |2 n3 _* I' w3 k L7 ]8 `& [
/* UART 中断初始化 */
* Z0 Q+ k1 P* j5 y/ ]% R( Y
/* */
4 f$ z* w, p: L1 e1 l' g0 Q
/****************************************************************************/
7 B6 m: {7 q, D# w1 M: l; K/ |
void UARTInterruptInit(void)
+ f5 U$ D- E, |6 {
{
& b; _4 z4 a# [
IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ M8 ~8 Y+ ?, \/ B5 c$ Y
IntChannelSet(SYS_INT_UARTINT2, 2);
8 u3 R, b+ n7 ^
IntSystemEnable(SYS_INT_UARTINT2);
6 E' ]# W2 ]9 e" P
0 y+ f6 |* G9 B2 ?- P# x/ Q
// 使能中断
4 D- M4 j- d+ c t
unsigned int intFlags = 0;
) O* {0 E5 d$ i
intFlags |= (UART_INT_LINE_STAT | \
5 B3 k6 `6 U2 O# b* w4 c3 ^0 H2 D/ R2 E
UART_INT_TX_EMPTY | \
4 {- q+ _: w7 K8 Q# B; ]) \* ~
UART_INT_RXDATA_CTI);
; l/ Q( U& K7 [, K# {
UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 @% Q3 Z. P. y9 G; R$ ]; W% x# \
}
; v" q. F2 } r& d
& L0 X9 C8 Q# _* h! b& |: G
/****************************************************************************/
( {9 j, @; l4 R& G
/* */
$ X: [( @" p- ^& D4 J1 d. k0 z. P
/* UART 中断服务函数 */
3 E$ ]: D+ O1 ?
/* */
1 f3 e! A7 ?1 p) `
/****************************************************************************/
1 {2 Z- S& v6 E. g& \* }" h& [1 p! p
void UARTIsr()
, f( I9 j. k z8 H8 B7 U* F
{
- z L! p3 g& C0 W% ~/ l Z
static unsigned int length = sizeof(txArray);
* Z# Y& s" \) T, ^
static unsigned int count = 0;
. p6 K. O9 ?8 Y! V
unsigned char rxData = 0;
8 F2 y$ c" ^/ D2 K& ^
unsigned int int_id = 0;
8 Q: e1 Y' z0 u( \' f# y: A5 ^
! U; R" J2 K; o) I8 m
// 确定中断源
& w0 L, K, c( O- Q$ H; W. W
int_id = UARTIntStatus(SOC_UART_2_REGS);
+ G$ ]' b6 f% b: `' @% f
% ]! j9 j! \: s6 q; z6 ]* |
// 清除 UART2 系统中断
6 H* O( n; s0 a. w7 Z" b3 S% e* T8 ], j
IntSystemStatusClear(SYS_INT_UARTINT2);
" e4 M0 {% S9 Z+ p% R9 f& K
1 w% l+ g5 @ K2 o5 f3 I
// 发送中断
^( B2 ]5 {# y2 d g& f
if(UART_INTID_TX_EMPTY == int_id)
1 ^. K; |" F* u" u8 T$ K
{
) ^+ I# z* ?, w1 e' V+ m
if(0 < length)
w$ Q. p. v+ c7 W
{
2 B& X: _( T. o. f
// 写一个字节到 THR
9 N4 Q9 p k. I7 b4 m- d
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 z2 ?9 P6 g3 W' E
length--;
! o8 u" b) b: E7 c: h
count++;
' T- f3 t8 m) o; z& u1 O, B; s
}
% \4 u4 G. G2 ~' k
if(0 == length)
$ A6 i2 ^" K* D. D3 e! V) e C( L
{
3 f1 T: H7 d3 H i& l2 M
// 禁用发送中断
7 F& M9 o% {) n( W/ {6 s
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
1 w' T. K; \% \
}
' q1 [( Q( d8 `. F4 c* _) W
}
, p- F! _! w3 g3 [ [
; W! w9 ]( e3 d- S2 |( H* y7 |
// 接收中断
8 `/ r' [+ O+ C+ d2 {3 l: `. L
if(UART_INTID_RX_DATA == int_id)
; D3 u2 e- c7 y( ~2 \
{
) i2 f- M6 G; V% P
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
$ o; ]+ d+ a6 a( L3 Z" W# x" Z& X8 F
' r# I- W7 m m6 {) Z
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ D7 U7 C: _1 e: N8 Q* P* x
}
1 N' M4 P$ K- O4 E( Z" V0 X$ }6 ^
2 P J* ^7 Y* t3 N
// 接收错误
. v ^; w2 T# k& P U
if(UART_INTID_RX_LINE_STAT == int_id)
2 L6 T1 d5 F( Z- K( C' T
{
% Y6 Y; b% n! b: t
while(UARTRxErrorGet(SOC_UART_2_REGS))
) d; i8 Y# t7 j d9 j" v- Y
{
! E1 u+ S. p% ~* Z
// 从 RBR 读一个字节
5 O( h! `8 z2 x& ?, [" Q
UARTCharGetNonBlocking(SOC_UART_2_REGS);
- N) ?" D) b, i3 ^
}
8 e2 ~- Z$ N/ ]& b3 M6 c
}
3 g" x$ \6 }, m! i4 P' u8 r+ I+ A
; ~/ F& T$ M: `2 y7 N
return;
# G4 \* B7 c9 c4 C1 k
}
, O$ T* ?8 _2 @+ A( l
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
$ c% c& s6 j0 A9 C s, }
如果其它设备快速给你发送串口数据,你这边能正常通讯?
l+ X7 @5 C4 L0 r
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4