嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
" X9 M7 _2 t2 j& I
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
; H5 W- |6 I1 b8 P3 S, p
+ c" e% B6 j% ?$ d" [
#include "TL138.h" // 创龙 TL138 开发板相关声明
: h+ a3 E. N2 O! {' r. G
& u* |) v5 U1 W6 I* ]3 r4 d
#include "hw_types.h" // 宏命令
- P1 w" ] s- E0 h5 s$ Q h
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
0 V: Q# q6 c$ a! I! W, }+ v. K4 d' ^
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
0 }" M* K2 I+ p1 o3 b: n5 Q; K# F c
, j5 W2 c6 V Q8 _- V7 Z
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
6 n5 `6 X0 ]1 q
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
+ T1 @/ y4 O, f; B9 G/ }$ |
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
# v2 p0 s& g) q3 d
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
! w7 w" N& G+ Y2 W
- U5 T% L% X2 } @7 ^
/****************************************************************************/
7 B" X# T2 Y2 ~( C8 Q, Q! C5 J
/* */
& @" ~7 L k- w8 K/ m( }7 A) d
/* 宏定义 */
) L. Y, O j3 y9 K- ]9 z! L
/* */
2 n9 b: ?4 s) x$ e6 K
/****************************************************************************/
+ g O/ u( P7 p6 q
// 时钟
. L* s5 E6 j0 Y" @9 ^, E
#define SYSCLK_1_FREQ (456000000)
/ q# ^: B4 t% B6 R2 v
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
! V2 g5 e: u, j& c0 m9 Y& } \
#define UART_2_FREQ (SYSCLK_2_FREQ)
b6 S2 t# P) t; N( i
- S; p( {9 c2 v- @, k1 s C
/****************************************************************************/
% _( I0 {* G$ u, l% k* U+ r
/* */
, H' F/ D5 q# v' T2 i0 f3 H4 G
/* 全局变量 */
! T6 |5 P% k; @3 `
/* */
/ T' t( f5 o" V* {3 k: W
/****************************************************************************/
) B! C* ~- \. ^
char txArray[] = "Tronlong UART2 Application......\n\r";
+ q( z' _4 g: f% F# w7 \
6 L; o/ q$ Z$ n6 D" i% u* ~
/****************************************************************************/
# e7 H8 {% W2 k3 e
/* */
( x# m% p5 N" Z5 i" n: D7 `$ B: M
/* 函数声明 */
/ Q$ Y, s+ X2 y# F9 `! C! C
/* */
5 C. m# w( G- ^# z5 O5 w. X
/****************************************************************************/
% ^1 e0 L5 Q8 L6 Z7 |: `( z& C
// 外设使能配置
* i. b7 K' \% [" O! b
void PSCInit(void);
* r/ a; e- U* l# [- N
: }% e, k* _, R" _' c, n3 C
// GPIO 管脚复用配置
; H; |% r" C9 P& O$ j% l* F- k/ i
void GPIOBankPinMuxSet();
! k5 W# t( Y. [' ]
% n% q7 Y, F8 ^+ ]6 N- F5 J- S$ l c
// UART 初始化
+ c) Q- [/ s( z* ?! S r
void UARTInit(void);
0 x# c. l) W$ y' p
// ARM 中断初始化
2 b+ I9 D4 _4 m7 t% G5 t
void InterruptInit(void);
* E- K) z2 n7 R2 c: c' w
// UART 中断初始化
( y! _3 r1 K5 h9 n: V9 l
void UARTInterruptInit();
- N/ Q0 [) ?' L8 p) \+ i$ s
// UART 中断服务函数
, k! k- |$ X. \( {9 W& I4 F8 Q
void UARTIsr(void);
: w2 u- O( z6 s+ w( |/ _
/ O& e7 ]- \+ `4 d9 h
/****************************************************************************/
4 e( E" H2 `- G( E
/* */
3 _1 {9 t. P9 F7 I- X% ~9 Z2 j: _
/* 主函数 */
& w# A6 h" M6 l1 h! y
/* */
- ]& z; X, _3 ?* X6 K2 n
/****************************************************************************/
3 T% c s% ~- A5 Q# Q: T" v
int main(void)
5 |7 Q6 d+ x8 F+ n& D: m+ i
{
" o2 W9 c& [" @* `3 a
// 外设使能配置
% D" a: g8 k3 e8 y7 l
PSCInit();
) `3 z& l' [0 G/ d; Y
6 r/ _1 @9 }9 X5 @/ T% K
// GPIO 管脚复用配置
; T4 {; w% T) w1 a2 Z1 o2 t
GPIOBankPinMuxSet();
; Y2 x, ^1 c8 ^3 ?3 I& L
* i; ^, E5 X. ~. X/ n5 b' _
// ARM 中断初始化
: B3 j; S& W3 c7 O. y& J H7 `
InterruptInit();
3 X; ` T1 n4 R) T
5 _' b! e) ^# F
// UART 初始化
5 j/ x: `; p, U h' O# K7 A! s
UARTInit();
, u* O' X6 w( @
6 [3 O3 A, x7 x) u4 `& ?# p
// UART 中断初始化
7 a1 }* ?0 v* @( u9 Q" o# M
UARTInterruptInit();
/ Y' w: I0 B1 e2 z: C" Y" l& O
8 _5 S P/ ^0 O
// 主循环
- a7 E8 i: [0 ?# X
for(;;)
) \9 N4 l/ o" I! P2 r# ^7 t& J5 p
{
5 @2 |8 c" y1 A# v0 h% \+ E- Q
3 R- J3 k) X( Y# B) h6 e
}
8 W# ?& @* T6 C) i& j
}
4 L8 K3 z& u5 d0 P
2 I# q5 [1 L# ~ D
/****************************************************************************/
; R: X0 U* M2 p8 U. X( b; k5 p
/* */
9 P4 o$ h' h. k& R% l1 X- p
/* PSC 初始化 */
3 @- N7 z' b' j$ c E/ H G1 s8 l
/* */
! U9 k: ~9 Z/ X3 D, |' [
/****************************************************************************/
3 D/ P1 L% d" r8 a/ K
void PSCInit(void)
1 P+ ?: t- e- q
{
8 E* H. P5 m3 e G/ M# C
// 对相应外设模块的使能也可以在 BootLoader 中完成
/ J8 h5 x! {1 E- U, O6 h- k
// 使能 UART2 模块
- \7 p9 m# U' s. x5 g7 Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 _( O" C8 G2 A& d0 F
}
7 S% q# B) ~: Y9 o0 U' Z2 M: l
0 t6 l& T O9 N0 d
/****************************************************************************/
$ n# y0 Y7 e T, A5 c
/* */
9 m& l2 {/ x0 V' N5 o% s
/* GPIO 管脚复用配置 */
/ [1 S5 t; t9 t5 |/ B% L
/* */
; G1 E/ g# z" e% f; @6 b, j
/****************************************************************************/
% @5 l: s6 `8 Q4 w' F
void GPIOBankPinMuxSet(void)
) q. Z( l( I+ E
{
, G3 _ P- S1 z5 ^, R
// UART2 禁用流控
& z9 R4 E4 n" }- t1 S3 D% s- ?: }
UARTPinMuxSetup(2, FALSE);
+ b) B7 t+ {* g4 B9 A
}
" L2 W3 H5 [. t# V
. w6 a6 ]1 Z1 A' ]0 z; F- N
/****************************************************************************/
' S7 O# N6 O" ^6 Z3 [0 B3 f9 Z7 w
/* */
4 X! g e4 L# I4 b
/* ARM 中断初始化 */
3 X8 ^; E2 o; t
/* */
3 i/ ^) \- R- }3 w; z# ^
/****************************************************************************/
! a0 ?: B2 n K& i! E
void InterruptInit(void)
o& A4 p& J0 f$ ^
{
4 v. _; v$ }7 \/ E
// 初始化 ARM 中断控制器
8 j! z; S8 i: U6 }* x: ]' a9 Q9 H
IntAINTCInit();
) C8 @. h# G) W6 R$ B4 @# }
* k6 ~7 n1 N& _8 o1 }+ V
// 使能 IRQ(CPSR)
" k- k3 e7 W7 a3 I/ p' y
IntMasterIRQEnable();
+ H& ]. o _4 Q5 m& E; j/ x, o
( o9 u1 k+ Q+ E" y# x) h; b
// 使能中断(AINTC GER)
2 i( l, l+ b N g4 M& S
IntGlobalEnable();
6 c( X8 }# j9 j7 h) q; e/ [0 h' x
3 x3 d) O' Q1 q3 m# `. W% D
// 使能中断(AINTC HIER)
1 t' S9 K& y2 R6 U( i
IntIRQEnable();
: p! n# h9 j3 |& B
}
/ `1 R/ c- L: @
3 e3 P1 C i; M" }
/****************************************************************************/
5 \! V: N4 m: x( f; _
/* */
/ w( n! K: N7 B" [
/* UART 初始化 */
2 X4 b4 L- L5 K0 o/ \* T
/* */
, v4 d( o4 v x. j% M' T( U
/****************************************************************************/
6 L0 k. V0 F$ `3 w) @4 t' Q, D7 U5 l
void UARTInit(void)
5 v) T; s2 N9 l4 e& R, j6 \ r2 I$ L* h
{
2 c# \& e* p d: H
// 配置 UART2 参数
) B3 o |' L8 ]: A7 P
// 波特率 115200 数据位 8 停止位 1 无校验位
" r& G0 ^0 j9 V7 O9 E
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 e7 P+ q1 \: q7 k% i" q
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; ]! C( f' v, b8 D+ g( A) y
// 使能 UART2
# Q1 A8 ^+ c& }- K$ Q8 M0 y& k8 z
UARTEnable(SOC_UART_2_REGS);
" {1 V+ j. \4 F
( N9 W; T5 b/ Z+ c# W& l
// 使能接收 / 发送 FIFO
+ X3 j6 X" e8 S. r0 u0 l
UARTFIFOEnable(SOC_UART_2_REGS);
8 |/ O1 t, b' [" H! I+ A" C
4 s$ c B4 p" m/ v" s
// 设置 FIFO 级别
5 s+ Y) I1 ]- t2 j V
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
3 `" A9 @, Y5 }
}
2 @3 C k1 q. R y4 x% G) E
$ I& d8 I; p3 F" K# h
/****************************************************************************/
. v2 ~4 b1 f6 P. u
/* */
+ a3 b, E2 |3 p( r. X( q+ _# q
/* UART 中断初始化 */
6 P9 i/ `, U! S) I9 ]& u
/* */
( `7 z! ~6 L8 N z$ n, \1 o
/****************************************************************************/
3 v; }+ j7 c6 p- y: [- N# n
void UARTInterruptInit(void)
( I# z& M! N& S* \( {0 }
{
7 H/ v$ z% B- j2 S3 g
IntRegister(SYS_INT_UARTINT2, UARTIsr);
# U% t' ~9 @" o) c
IntChannelSet(SYS_INT_UARTINT2, 2);
) `+ ^" r' e) H, P6 x1 Y' k6 R
IntSystemEnable(SYS_INT_UARTINT2);
. e; E! w; i; `
" s) F' p9 \( F; v
// 使能中断
. A( X9 h6 b! [ I* s
unsigned int intFlags = 0;
" e. ?7 f' j& {$ U K
intFlags |= (UART_INT_LINE_STAT | \
+ K' x: @: h4 }8 T; C. Y. t. v/ R, c
UART_INT_TX_EMPTY | \
3 J5 U& Z8 d, ]2 W
UART_INT_RXDATA_CTI);
! W/ T: n+ o3 Y% @
UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 j* d, e! t+ Y/ C( d3 e
}
1 `) x# ?) X E( i2 b8 p0 [
0 T! H0 a4 }( F& w8 T9 n
/****************************************************************************/
3 V- M( u! m# E' U% k
/* */
; D5 t! }: j9 `; n
/* UART 中断服务函数 */
; t9 d x; q6 G$ z; t1 V
/* */
( p6 g" [9 \; d. L0 ?, E5 ^( z
/****************************************************************************/
0 |; ? _& X8 { f
void UARTIsr()
% O% x( n) N& b; F3 Y, J8 f
{
/ \( e: b7 f/ t4 [; Q: x) b+ |
static unsigned int length = sizeof(txArray);
- v a, U) ~& l6 c1 k
static unsigned int count = 0;
7 c0 l2 U1 `' k9 `% ]; A* S
unsigned char rxData = 0;
, \; o/ {+ O$ b
unsigned int int_id = 0;
- b7 V% f4 o4 ~; Z. E- t
3 A0 ~8 q% h P4 Y
// 确定中断源
2 ^5 ~1 Q) n- Q' m3 M
int_id = UARTIntStatus(SOC_UART_2_REGS);
7 t4 F+ j( M4 A. ~- k! D
# l5 _" I( E2 L1 _
// 清除 UART2 系统中断
% N, u" ?# j9 \* p7 @3 S
IntSystemStatusClear(SYS_INT_UARTINT2);
: ?3 f" W; F& t' F3 o( h
# ]6 Y( k9 S+ |; S
// 发送中断
( ~ y3 Q* z7 T; W/ i
if(UART_INTID_TX_EMPTY == int_id)
& e0 i/ `2 H5 H) ^6 M' C, Q
{
0 P7 K# {& d9 `5 f% h7 d
if(0 < length)
9 O+ ? r& t) |/ E2 x
{
- F* o* q" {# Q
// 写一个字节到 THR
( k& ^6 D9 R, }- _8 j; V$ [
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
1 M; \5 q2 b# V$ H9 C" [# \. ~" b
length--;
3 [ q1 y/ _5 o& [: P" `
count++;
' _% v' B9 @+ ]' Y' Q0 `0 Y
}
# L7 v0 A; B' S
if(0 == length)
- [! P, L/ @# z& w$ W/ y
{
% d7 A. F4 W5 i
// 禁用发送中断
3 z- Y: R, @. j! C7 V% I% X: ?; Y) x
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
4 Y0 @$ S0 v6 K, s- m
}
! C- s& z9 G8 D; U2 O
}
' |" K @7 D1 x8 a! ^
1 ~( f+ n. g5 U* a9 O
// 接收中断
, @9 }& }; F5 }* E
if(UART_INTID_RX_DATA == int_id)
- u- r5 v' y5 h- K9 Y# _
{
$ y0 K, O, q7 c5 A& K, E
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ L# B* P; R- e2 x/ T
) z/ _$ o" v" ^0 d* _
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
+ E- M5 \. Q6 L3 j2 K; j5 T
}
$ w; n' U" u. e4 c) p" ]" a7 j3 X
9 J! _! b% Q7 N$ F4 T7 k
// 接收错误
$ y, p) G0 b: P* v: k B; ?, I* P
if(UART_INTID_RX_LINE_STAT == int_id)
+ V% K$ U: R7 R3 L. `6 i [- m
{
: m2 ^" O6 q- F: e& K) W
while(UARTRxErrorGet(SOC_UART_2_REGS))
& @# Z- O1 h; G7 Z$ F: A7 s9 t* [) s
{
1 C& n" n! S+ f) I5 @' j" G
// 从 RBR 读一个字节
* Z& a2 y: d- j _
UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 T9 z- v/ T! R
}
# x3 z# `4 c+ Y" S. L! a
}
. m; S' B* ^& |+ \, g/ B
0 {$ i. C& Y) e% W" P4 } U8 ?. J
return;
: i- W0 T( r/ W: L" H9 u( C
}
. H+ u3 \: g1 X
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
2 C9 l, S9 M: H4 ^+ R9 q2 U+ ~5 }
如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 c$ X x& j% c2 L) K
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4