嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
, y3 D, N5 A6 G2 @4 R( r
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
7 Y! i7 R1 y0 H' Z
/ G& K [- E1 r z: S7 G5 ]
#include "TL138.h" // 创龙 TL138 开发板相关声明
& @4 x" n0 Z- A1 k- }5 b
) e. r' |- p, N
#include "hw_types.h" // 宏命令
- M; q, Z" n' }0 J3 Z& Z
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 R$ ~0 z$ b" R9 A' n; ]
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
4 O; [, b# o/ `; Z$ G
' J. c- \. B) l9 O( g
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
' }) P% O0 |- n _+ J Z1 F
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
% [4 A# s- q% b" S6 ]
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
8 S2 v+ `2 ~* ?
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
. E* F, ~' o8 C/ O m
* V/ _ @) s4 C" p/ T( N. y
/****************************************************************************/
|3 x- s) A0 E
/* */
4 x9 j8 l5 r2 f9 q* J
/* 宏定义 */
+ z4 P" W( F3 G
/* */
+ `' ^& U, d) y0 `
/****************************************************************************/
& y2 V4 s5 W/ C6 |
// 时钟
# d/ u7 }) A4 R$ k$ S' M+ q" ~5 K
#define SYSCLK_1_FREQ (456000000)
, @+ p5 Q5 i/ z
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
m2 A, s5 P1 l& V
#define UART_2_FREQ (SYSCLK_2_FREQ)
; ~( m! c; d4 x
5 T% i, \4 {" s. Q1 [, l# o; t
/****************************************************************************/
9 R* K7 l4 {4 l. s$ p1 I4 S
/* */
) T3 E/ A6 l( s$ W2 x% A
/* 全局变量 */
8 y S5 n- r' d$ R. `
/* */
, e. u% O2 U4 G% d
/****************************************************************************/
. U* h# }( ]+ {0 Q% k4 B; Z! S
char txArray[] = "Tronlong UART2 Application......\n\r";
0 ^3 K0 l$ Q; F+ A' U8 v
5 N2 O/ Z( I1 j v* J
/****************************************************************************/
$ \; \% }6 t! d+ {6 w
/* */
2 o) `! Y* L7 l, g# V. {
/* 函数声明 */
5 J- e, t( }2 m8 e
/* */
5 [, I/ h1 J1 T0 w0 @6 r% G
/****************************************************************************/
" @+ c2 t0 O- b( y9 S# k) i& K
// 外设使能配置
: v# _" F g' @1 w: U1 D
void PSCInit(void);
3 u* h, K* L5 W# A
0 g' ^! W* I! t' l+ P/ B6 E
// GPIO 管脚复用配置
4 P' d' \+ ~# [" J! c
void GPIOBankPinMuxSet();
: P8 R$ f$ M; D, K1 U
# Y( v v$ Q' X# C- Z( P% L* I
// UART 初始化
0 @+ h( {* w% L) r6 _! G0 [- Z) z; R
void UARTInit(void);
_1 T. s: l9 F6 l) ]1 y/ j
// ARM 中断初始化
5 \* ]; G. |3 `' r' j7 {( B. [
void InterruptInit(void);
/ E4 Y5 T8 ?1 }0 b& Z( y4 s
// UART 中断初始化
; t& a. U* i: \* K' M$ [) f/ }
void UARTInterruptInit();
) {. }& I5 p% E$ e+ G( v0 l) d7 x
// UART 中断服务函数
3 M# i2 d4 K5 ^1 X/ o' Y
void UARTIsr(void);
4 Z0 l6 l/ @9 k5 m: @2 @; Y3 A+ n
% L0 I* ]* M$ \- ^7 X: }# u
/****************************************************************************/
$ N! b9 P& U. N2 y: w: O. P
/* */
6 Z4 O" S$ Q! E' Q& o7 b
/* 主函数 */
9 K- F8 W3 y( G
/* */
5 Q! S- X6 p4 N0 O6 ^
/****************************************************************************/
0 l. N8 Z$ t' E% m$ P
int main(void)
2 o1 @' s1 l) |4 M+ q
{
. ]0 A3 G% h4 K1 Y1 V$ g) c
// 外设使能配置
0 N+ u: S4 t" J5 ^4 p
PSCInit();
7 Q% C0 f' G/ p% d3 O9 ]; D& J
9 U9 ~4 z' `! ^
// GPIO 管脚复用配置
% O3 C2 G/ e- ]
GPIOBankPinMuxSet();
- O" N, b3 p: j/ F9 [' ]
" y" P( _( _$ ?4 Y) D5 ?+ A1 R
// ARM 中断初始化
* q- t$ O6 M+ } d* I
InterruptInit();
7 y" m' R) L0 N- A9 f5 W$ o
$ I' J6 j. I' ], j8 e2 t8 b
// UART 初始化
0 _% v8 h: H- A& o ~6 N
UARTInit();
! E1 X8 Z0 g* L1 a) C( i: c
- c8 V9 S& y1 V
// UART 中断初始化
6 _" H7 A7 k$ N' E" S2 P
UARTInterruptInit();
! C8 U' ]4 L! A# x3 t% o* @
, c7 I1 ~% |/ E/ Y+ \0 |( V, q
// 主循环
# Q) Y7 a* m; [
for(;;)
& y/ q' F- j; o# f# k
{
2 T: Y4 I* x/ |& m! X; L- o
' r' q, k* f ^# G# l3 T3 k
}
; e' t' D0 F1 U) S: @, I7 Y
}
2 M# l* u9 J1 J& k# X
- F" V$ v+ m" _7 p# {) D+ \
/****************************************************************************/
5 ]9 j3 p: _$ U: t, s) n% p7 I. [
/* */
9 O, R) q% f6 U3 }7 u
/* PSC 初始化 */
/ U+ Y. f8 @. ]9 U! O9 F x
/* */
, G9 `: \- j/ k6 k- D
/****************************************************************************/
# z) ?% O4 U9 k- q
void PSCInit(void)
+ { {' M8 x$ A7 b" r
{
( L4 R! E9 |( q- j; s. d
// 对相应外设模块的使能也可以在 BootLoader 中完成
* I' s8 j8 c: [0 q
// 使能 UART2 模块
. t! Y" n1 l1 D2 e8 `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 N% w7 v. m6 ~5 P
}
6 a8 c; }! D, r
2 J B2 {& c( b. J! F' L3 t @4 s
/****************************************************************************/
+ r2 {% T2 z6 n0 I
/* */
0 X3 P$ W8 H; r8 M$ z+ k6 d% c# w
/* GPIO 管脚复用配置 */
% N3 |+ B( z' M% U9 s8 n4 A& P
/* */
/ Q# ^/ W3 Y0 O, B
/****************************************************************************/
; I" p% h& F$ w! K
void GPIOBankPinMuxSet(void)
" \; H2 }( I- Q- ]) L
{
6 ~* |' M. B- L d) N; s! i
// UART2 禁用流控
. U: ?7 {' O$ b7 R; W7 Z1 o" l
UARTPinMuxSetup(2, FALSE);
9 c6 h0 W* M8 t
}
1 M+ U: R- ~9 ?& w, m; w. Z
- f y- A% Z# K' R0 m8 q8 t; ]
/****************************************************************************/
: w+ w6 k# r9 ^ U) p* e% v
/* */
8 k9 i4 g( O5 y6 m: G- O. F
/* ARM 中断初始化 */
# i2 g8 b4 N3 F2 |% x' T
/* */
! ] i1 |4 q/ E% E' R
/****************************************************************************/
4 c$ H# a$ z- g6 q0 R
void InterruptInit(void)
" _& s" ]( r# u0 n0 O$ G y
{
# }8 i) q+ O+ h. r
// 初始化 ARM 中断控制器
5 s) X+ J/ e. N, y
IntAINTCInit();
4 S5 _& h5 j' h5 }/ _
0 [+ D+ f( g, s, o" o$ x5 p/ R n
// 使能 IRQ(CPSR)
4 E* |, C& n3 ?. m& v# m S
IntMasterIRQEnable();
5 l) M3 R5 p! r1 E
. i' P/ z) q/ Q
// 使能中断(AINTC GER)
8 [9 G( U6 x* X0 f; E+ R3 A
IntGlobalEnable();
4 M) H2 G- d+ D4 K/ L0 l* @
3 E; d: @6 U7 R( N: F0 i H: W
// 使能中断(AINTC HIER)
; Y6 Q( G& i& o; U% d. I! Q
IntIRQEnable();
6 F" I2 L- ?0 C* V1 ` Q, G3 l
}
) |" \- H; M7 Z' L4 r
; e8 S, M3 m$ @% v) J0 o
/****************************************************************************/
. v% x( C" H5 _8 [, d+ Y0 F; t
/* */
) p% s" t) b# I( n7 g
/* UART 初始化 */
4 n. G6 Y; d8 ~. U9 A, z) Q
/* */
& _. p: n) E+ w% {5 [) f
/****************************************************************************/
0 G. t% r% u$ }7 ~6 A
void UARTInit(void)
( z1 j, N3 M, ~. R( M. G4 v
{
0 h) S l4 w9 u
// 配置 UART2 参数
5 J9 T$ E, P5 K* c v7 d
// 波特率 115200 数据位 8 停止位 1 无校验位
$ v! @) D4 A/ V! x1 K' a
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 i! p- ]" U! C7 T* W
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% @5 H/ t# p6 \2 |
// 使能 UART2
' j/ _& W3 D9 T% D/ B
UARTEnable(SOC_UART_2_REGS);
+ ~* `! v" }) D7 B
% a# A k1 [1 ~5 e* T; B. C7 N# Y' J
// 使能接收 / 发送 FIFO
: N5 C% r7 k( A7 @) t! M. D
UARTFIFOEnable(SOC_UART_2_REGS);
2 ^ @+ F5 b5 f2 S' t. x$ s- [
, R/ T0 a6 Y: q8 {" }2 G1 M$ {
// 设置 FIFO 级别
2 |, Y/ P& }+ D4 Z( D
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
! w4 D f# V, N1 c% O6 ~
}
0 E- v# J' k- ~5 c) u3 R* [" [& h
1 l! p" ]# ^, X4 v% r
/****************************************************************************/
2 O# M$ J5 p1 w/ F
/* */
8 R. ^/ ]8 x1 g. ?
/* UART 中断初始化 */
* x1 i+ K( t. L0 r
/* */
. F- k. n% D+ p: d$ \) ?5 Z
/****************************************************************************/
2 o/ n& I) Z# m+ d( B
void UARTInterruptInit(void)
- U! A0 {, I2 | R1 y5 x
{
' B3 i6 ?% \; [* x( |. G
IntRegister(SYS_INT_UARTINT2, UARTIsr);
6 m7 U+ W9 x( f# L
IntChannelSet(SYS_INT_UARTINT2, 2);
* d* [' j% g; ^6 n5 `! L
IntSystemEnable(SYS_INT_UARTINT2);
0 I3 N( B7 W/ W" `1 S
- C; d9 H& O2 q" u, n# q; L$ o: l
// 使能中断
( _1 E+ `# _5 V9 D; |; z n* z' j; a4 S* w
unsigned int intFlags = 0;
) e# P8 {, i N
intFlags |= (UART_INT_LINE_STAT | \
- X+ x- y) z! w
UART_INT_TX_EMPTY | \
, `6 V) g' n3 Q e% L: O
UART_INT_RXDATA_CTI);
1 F& o5 ~2 l4 ?, [1 Q% T: k1 W, |
UARTIntEnable(SOC_UART_2_REGS, intFlags);
, p: ?* D+ w3 U" n* E5 J
}
- j! c7 m+ v/ S' C0 {
! M* X+ `% x3 H; }; S7 X! B
/****************************************************************************/
6 R* [( ]1 A# g1 c& Z
/* */
2 y: C& S, w% A4 W- ?2 L
/* UART 中断服务函数 */
8 X- }( y0 r( o, o0 D
/* */
% S) t4 e( c" C& ?- |# y5 j; u8 _
/****************************************************************************/
: Q7 j( ~ S0 R) }) e. c5 ?
void UARTIsr()
' T0 t1 u& ~9 ?
{
s9 x' Y$ d( x" L& s" m) Z- c) q+ Y
static unsigned int length = sizeof(txArray);
9 v/ y- a9 I% V5 G; W+ s( e
static unsigned int count = 0;
1 g9 y6 f. [) Z3 {6 F
unsigned char rxData = 0;
- o* p/ o2 K6 h+ }7 [6 C. l
unsigned int int_id = 0;
) D, C% t' K0 N3 k
, |1 T% l# F9 z4 E3 q
// 确定中断源
) [8 q8 C! b8 G6 l- P4 d
int_id = UARTIntStatus(SOC_UART_2_REGS);
$ K6 t% ?: o1 m+ w6 ]/ D8 B3 {
4 C7 \. s1 m! L9 N( g
// 清除 UART2 系统中断
e1 T; ^! ?( A$ H1 U3 ^
IntSystemStatusClear(SYS_INT_UARTINT2);
: G# F2 v- H$ B- M3 q4 G4 G! }$ q
6 W& \; }: J& C
// 发送中断
$ e2 J% M7 I2 N
if(UART_INTID_TX_EMPTY == int_id)
) ~. W( [5 E) Y! i# P9 |
{
) O/ J+ M" k" g' ?9 l- l0 u* }
if(0 < length)
3 ~; e: F3 K t. u/ i1 }& i* T* @
{
# i K& G8 v- |. q9 Z5 |0 X2 X2 c
// 写一个字节到 THR
0 w- J9 c5 h" C7 N- V& P$ V- v
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 b9 Z2 f$ r# q& Z4 k: _
length--;
" w: D- s3 k! P4 ]# l
count++;
8 L; f% d! s e7 A" m8 J2 t" x
}
, p3 ]. Q7 d, [5 z
if(0 == length)
5 R) v( M3 N1 @1 E1 {; D
{
9 ]& ^% K% d# [% o' |+ m& w6 a) t
// 禁用发送中断
% e$ K) P4 g; h
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
7 w N# G& v+ T$ l/ K; _; o- A3 O& D
}
' p' D7 D- T- M b f
}
/ Q8 v$ `2 ~) i3 m
9 Q" w2 `" O2 N2 M. t
// 接收中断
& K; C t( ~( O2 Z! d
if(UART_INTID_RX_DATA == int_id)
- r! d- [1 J, T/ J; z
{
, Q7 d+ ~$ }; H) L$ M( j* Y J
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" \3 c8 V4 y% l2 d& y: D
" u, `% M- C m2 |4 D7 q' d
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 x( V- o+ N0 R
}
/ }1 I; b& t# p8 O, {( H
) `3 w8 V% j- `" G4 [! C
// 接收错误
% e$ M, @% N" q; r6 k( Y
if(UART_INTID_RX_LINE_STAT == int_id)
' R5 w+ h& `) ^0 R
{
& o' H/ X% L/ D2 ]. A! A
while(UARTRxErrorGet(SOC_UART_2_REGS))
7 o4 ?% x* E+ Y) p0 a/ f
{
% u! Q" l9 _% z( G
// 从 RBR 读一个字节
2 f: C; u; v& Y3 y
UARTCharGetNonBlocking(SOC_UART_2_REGS);
% Q- ?% G) g) g5 V2 k
}
; q$ W+ M9 W4 o6 B
}
7 _; X; E. ~9 ?/ W' p: O
; u3 h7 C6 u6 v; q; j( Q
return;
A2 ~$ W& ^: r
}
/ d- u+ @; w* x" B: U
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
9 [0 T4 r% s, f. e# f3 }( \
如果其它设备快速给你发送串口数据,你这边能正常通讯?
- x8 l4 z) O4 U# x
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4