嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
; R2 P7 }, S. X8 \6 k
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
s) p8 x7 N( x* }( D1 R4 V' T
: J, i3 D0 D/ t
#include "TL138.h" // 创龙 TL138 开发板相关声明
+ A8 { ~8 F) n% y4 F1 O. U( b3 c# G
# \! V7 V" y, H
#include "hw_types.h" // 宏命令
* y, r. ^. p' ?4 E! h8 ~; a
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
* R& T# g( T! V% l% z3 e
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
[9 t6 T! I2 h/ V4 W7 |6 {
1 F3 D5 q J# \3 I r
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
! w8 \$ v) K- [+ L
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
# I( f* b1 ^ h7 S4 S% d7 ?1 [+ X
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
8 a) I4 C f1 R4 e% Y
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; S$ h- Y( x5 G# T
4 f0 h( d- _8 h( L
/****************************************************************************/
v. _+ Z8 |8 i- W0 ]
/* */
" o8 F4 q) G+ k9 ?: b
/* 宏定义 */
) y7 |' j- W! w; [3 Y
/* */
1 Z. U' i* O, l0 D' w" C! S1 F
/****************************************************************************/
& Z: t3 q# y* g* b% N' F
// 时钟
0 Z2 |( @4 N5 t9 A# s2 Z0 f+ q
#define SYSCLK_1_FREQ (456000000)
% ]. |( u0 |3 g) n7 m
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
9 q5 | O; R+ A; u
#define UART_2_FREQ (SYSCLK_2_FREQ)
8 [9 S2 P7 a* Z
# o# p6 ^6 A1 O' D8 A
/****************************************************************************/
5 @0 p. [7 H% B7 `4 |$ _
/* */
$ w4 `2 u- n' i7 _! c
/* 全局变量 */
! u1 N3 e9 }4 G; a; \7 F
/* */
$ I- x# L" y6 G3 P
/****************************************************************************/
+ b8 L1 }7 h4 ^% E: i1 d, W
char txArray[] = "Tronlong UART2 Application......\n\r";
0 b3 w1 g) }+ E u. {, i7 ?$ N
+ A2 Y8 b. q9 c1 z4 @/ ]0 ^' n
/****************************************************************************/
7 W8 X- I1 j' J: i
/* */
, J" T/ {& h, [' k( O; D: t$ J$ v
/* 函数声明 */
7 t; c! H6 q( u8 ?* P3 y: C- J& {
/* */
! X. m& [6 ?9 N" U
/****************************************************************************/
" _3 @+ M9 ?& b* b9 G
// 外设使能配置
2 T2 u9 E+ I3 C$ }; Z" b! ~
void PSCInit(void);
& t& Z$ O8 C1 Z8 q8 ~
+ v0 l; |1 z9 o v1 {
// GPIO 管脚复用配置
4 E& K) ^) D5 _1 k: c- T( t2 ^0 }$ x
void GPIOBankPinMuxSet();
% ^& n2 S7 @5 {2 h7 c1 C! Z
6 c' w) V, B9 A! t$ N& e
// UART 初始化
5 l J ]7 B* y4 p
void UARTInit(void);
3 h0 F& G2 w k: u+ o' O/ P! j. j
// ARM 中断初始化
2 k. _4 @" r- j$ {/ ^5 b
void InterruptInit(void);
) M o1 z5 Z, `
// UART 中断初始化
0 j {9 z# D- F
void UARTInterruptInit();
. b/ `8 r$ A! g6 o, v0 u9 z! ^
// UART 中断服务函数
- g4 ^) J$ ~# u8 T5 c
void UARTIsr(void);
9 x; B; H; W+ f% h/ Y& {- g
* M" ~8 a; T2 o' {
/****************************************************************************/
+ S1 }7 e( X+ G; m8 ?; T% L3 d! ?' l
/* */
0 z$ h6 ^% B% }5 T4 t" @, E3 }
/* 主函数 */
' a) \$ a. C2 l
/* */
* A8 a8 p) g f6 A
/****************************************************************************/
6 V) C' O5 T, t: R, ^2 ?; Z
int main(void)
3 [7 o1 S, s2 \; F ^
{
1 J* E/ _, P6 R
// 外设使能配置
& J# j$ I" t* B; F6 D6 {; z
PSCInit();
5 P, d5 [% X, @9 y2 R
# Q- L; a) w1 `6 @+ {$ o5 h3 R
// GPIO 管脚复用配置
; n( c3 {; `. Y% c/ ]. G
GPIOBankPinMuxSet();
* T* x* o* g3 K- |/ w5 X9 |! |
! `; \( P; z& |7 C. p- c8 {6 j! ~
// ARM 中断初始化
5 i' I; ?: o9 O4 l1 C1 W! e
InterruptInit();
% Z. `% {' ^- @" F2 U) M/ ?! f9 _
4 Z1 y+ l" S- h% Y' H9 O
// UART 初始化
5 s2 L% q! X% z+ y% I) i
UARTInit();
@# a; ~% K% {" j
2 E# m+ e; @: J# e/ m
// UART 中断初始化
" x/ m- H+ q0 R8 K) O. g7 g
UARTInterruptInit();
2 e7 ]) r9 i0 m
0 U* u, ]0 a2 Y/ Y% f. I
// 主循环
$ w/ q; M" X! |
for(;;)
( T$ Q% r5 G+ A, W: J
{
1 h3 q( v) h- c& y
+ v& {) Q0 o$ h l8 p- D" o; m; {
}
7 w) A$ V/ ]* N5 O' J
}
6 W5 `3 i! a ?) S. W- N
* X) b5 q; o, U( S! o/ P
/****************************************************************************/
6 c& K5 t9 s0 O2 |7 Q
/* */
- Q' F, X- V8 C
/* PSC 初始化 */
0 J+ u. ]. n9 f
/* */
9 {$ `! m( h- U. T' D [
/****************************************************************************/
! l* W3 j6 U1 b& F x# R- }
void PSCInit(void)
% P! Z6 }- V( Z& L) r6 N+ C8 l
{
; O, b* U# _* m7 i. R# y
// 对相应外设模块的使能也可以在 BootLoader 中完成
- [( h! Y% W! A" p# o: j
// 使能 UART2 模块
7 e" w" [" U1 f$ c5 m& s0 H5 k; t5 j
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
5 R4 p+ e/ Y, e, R ]
}
# M; S: T" t$ B! M2 }. M; D3 m
: M+ h- s0 P ~/ W5 w! U( J
/****************************************************************************/
/ K- d' I; r/ I3 k5 @1 {, t+ g8 p7 C
/* */
* z3 g/ A) W1 b8 x2 S. @# B
/* GPIO 管脚复用配置 */
9 [# _8 m! }8 ^
/* */
& _" k1 I6 L" O: H/ _0 C
/****************************************************************************/
j" i# j" v' U7 x0 z, d
void GPIOBankPinMuxSet(void)
- K$ _! z: ?6 p$ q+ V! v! d$ r7 A
{
; _1 f/ `, R( v7 v. u `/ Y1 O
// UART2 禁用流控
0 C- `" m' E8 U
UARTPinMuxSetup(2, FALSE);
0 o3 q( o9 S, e
}
: c) _4 ~+ S3 ?; p3 s8 c
; m5 b) G8 n2 ?( Y8 j
/****************************************************************************/
& q1 Z6 g5 m! ]
/* */
' @+ k) j% x% L" V9 I
/* ARM 中断初始化 */
0 r# u* R) K9 z* H9 ~
/* */
; O5 `+ _" A0 g- x: M
/****************************************************************************/
% N& P7 f9 X. n |# M
void InterruptInit(void)
: g8 m4 Z$ R l* W) n) f$ d
{
( C& M9 s; E. Q1 a' J) d
// 初始化 ARM 中断控制器
- ~7 p9 c) Q$ t9 g# L6 R
IntAINTCInit();
9 D1 M; D( E' M& u7 o1 p! C) m
" v% O2 u$ [" |) | J
// 使能 IRQ(CPSR)
: }- p1 [, E( t" n9 R7 L
IntMasterIRQEnable();
' F4 E. Q2 V4 I5 h/ ], {: M$ F- V
% v2 O$ H: z4 J, l: R6 D
// 使能中断(AINTC GER)
1 V9 `: a* K5 G
IntGlobalEnable();
+ Y& t4 F' `0 g1 q( w5 L5 e
. |* A8 T+ ]5 b7 U/ W
// 使能中断(AINTC HIER)
8 X( i9 s( H1 s/ D* i
IntIRQEnable();
. o6 g4 p" G% [1 X# c
}
& s% M+ q7 `- ?5 h1 m
# q/ T- Q6 g2 T2 L3 X- ]: ~# {
/****************************************************************************/
+ m, t$ C7 D+ x4 b) R' O
/* */
3 t% O: ?0 U$ j* S
/* UART 初始化 */
n' V" u/ H2 [
/* */
) K1 M* G8 M c1 D) t$ s ]
/****************************************************************************/
, H9 v$ g: ~' }7 M* a. f" b
void UARTInit(void)
' \& a/ V8 @7 U8 _5 d* q
{
. y& G1 `9 ^3 |$ r0 u1 f
// 配置 UART2 参数
; L, Z4 Y* j8 p* N% C
// 波特率 115200 数据位 8 停止位 1 无校验位
! J8 T+ c; N6 t* j
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
: F9 @$ s( X- D1 {, h. t
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
G, x+ O% R$ O. Z, }
// 使能 UART2
+ X* p$ Y9 q3 K& ?
UARTEnable(SOC_UART_2_REGS);
; ]4 _0 z& b4 V3 U, [
" Q# F! z- {0 t. I& r7 {) N$ T
// 使能接收 / 发送 FIFO
- e' w- D7 Z; W o. l7 a6 R" O# V1 ^
UARTFIFOEnable(SOC_UART_2_REGS);
8 ?" B+ E# D/ Q* q/ G' d! n& q
" @' E3 r" j( ?6 m5 M0 Z2 L
// 设置 FIFO 级别
* s: j: Q2 ^, u
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
5 _$ V! t1 b. a. ^! v
}
% ^, v4 k, ]0 L1 `, }5 t' h
; ~: q1 D/ H1 p. `0 h$ q: F
/****************************************************************************/
2 N/ c4 y3 \6 [
/* */
& i2 {4 P2 {/ p) V
/* UART 中断初始化 */
7 K- M8 E. n4 D, `3 e9 O
/* */
) I" Q, C7 Z1 _5 a* p5 K& }' M
/****************************************************************************/
* j& n' W3 P5 P0 l5 _; ]
void UARTInterruptInit(void)
- v& N2 i! E D- ?# c. \
{
( q! W# G4 ]$ V! m; | u
IntRegister(SYS_INT_UARTINT2, UARTIsr);
9 k. N+ `: c9 Y! {
IntChannelSet(SYS_INT_UARTINT2, 2);
, ^; F: U' ]& ~ c# c+ @
IntSystemEnable(SYS_INT_UARTINT2);
( `) h* `$ P* ^8 E' @$ x Z
1 j" h! d" B$ K) d, X. O6 ?
// 使能中断
: x# i6 k! W& d% j$ o
unsigned int intFlags = 0;
- N- \5 L- X1 E2 s. n
intFlags |= (UART_INT_LINE_STAT | \
% I) G3 O( E3 P5 H& G
UART_INT_TX_EMPTY | \
- a$ b( k% E* C3 E
UART_INT_RXDATA_CTI);
- p) M! g) t4 d1 A/ S
UARTIntEnable(SOC_UART_2_REGS, intFlags);
! N6 R, |6 x2 [
}
$ D {( }$ D( z/ R/ X1 A9 k
" Z* T) \4 Y9 [" c
/****************************************************************************/
1 {; ?# s0 _4 V6 L2 l6 F
/* */
1 W! G" {! K i' Z3 {7 T
/* UART 中断服务函数 */
; f3 o2 Q( D+ @6 X$ o0 v: k
/* */
( g- `4 x9 o1 e# y8 ]: z! a
/****************************************************************************/
- `1 v5 b w* s4 ] C! s5 W
void UARTIsr()
9 \ s5 y# i) h: v# Y1 {$ B
{
G; t3 L+ z4 p4 Q3 s
static unsigned int length = sizeof(txArray);
# I$ T# k0 W, ~
static unsigned int count = 0;
! Y2 G! k. j5 ^8 V, K9 ]0 J
unsigned char rxData = 0;
6 H$ ^2 W& I3 K( `) a9 [8 c* t
unsigned int int_id = 0;
2 V1 E/ Z9 Y' }! R
1 v; K2 i8 B7 c( H5 }9 B$ P Q
// 确定中断源
8 Y4 `% x7 O$ {- Y/ q8 E
int_id = UARTIntStatus(SOC_UART_2_REGS);
' x. q* Q9 {( d
/ h$ i6 x: T( `8 w' }8 V
// 清除 UART2 系统中断
: T1 q% u# ~ G3 T8 C
IntSystemStatusClear(SYS_INT_UARTINT2);
' e: {- Q! U; C0 P) a
2 W+ w0 P% `# q! I, K
// 发送中断
2 P4 O6 P8 n; Y3 Y% o8 }9 a
if(UART_INTID_TX_EMPTY == int_id)
" b* S. t( n5 ]. U+ q: P0 x+ ?
{
* a; m q3 h# ^" @
if(0 < length)
- ]. L7 S- R/ y$ a0 I0 l5 a# M
{
, T% G" \% |7 @
// 写一个字节到 THR
k4 y) o. x( s" Q9 I1 u `6 c x
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
* x2 h& l2 T8 j: n8 h
length--;
5 p' E3 Y9 h* B0 n0 I
count++;
- [4 U1 {. c* }
}
: b' @2 Y" t3 ^: @! E
if(0 == length)
% a7 \- T) ?) z! P; S
{
0 Z! A% V6 I2 D7 v1 A: P3 t6 r
// 禁用发送中断
i; s, m6 C" ~( e! O: r6 k! S& e( W
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 p7 T! M! S, t! V( a+ q
}
5 \0 v$ u# B. T7 `; C
}
/ w8 \/ I/ f2 J/ Z4 a5 n+ Z! m
, y. F) B- V7 ]% M4 m
// 接收中断
: ^" {( c# }+ E) F( X. f2 Z1 O- O
if(UART_INTID_RX_DATA == int_id)
0 D5 Y' _7 {) N8 {
{
6 t; P6 z8 R, _$ a# w
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! B2 K( e3 {' X, |! P" [# [
3 c8 Y+ t( [/ S- |3 w% B
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
( b$ t" D" o4 C5 p' c5 n3 r
}
2 O i8 f; G+ Z% m! Q+ d! x$ J e
2 v) S) C0 ^$ ~3 b3 p2 d
// 接收错误
3 S: ?$ C: G0 o" z4 M: g+ ^1 I* \" F
if(UART_INTID_RX_LINE_STAT == int_id)
' @2 {! V0 C( J
{
8 V( | A2 Y& [4 e L
while(UARTRxErrorGet(SOC_UART_2_REGS))
1 E3 u: u& U$ x* r
{
6 t& K( h# ]7 g$ U1 S: s. S
// 从 RBR 读一个字节
, v( h8 C: X& ~7 D0 R* _( b
UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 O4 }3 p8 b& y; {' _7 v. b
}
2 m% |% H" ^" m( B T
}
1 D7 S5 C- @/ u1 m3 H. S5 @/ R) E) S
' D. f! K" a2 i% |+ s
return;
) D& Z' Z8 A) C( a: \. H
}
5 |& k& L) n5 ~, i7 ]/ J
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
+ a; u+ z; X9 x
如果其它设备快速给你发送串口数据,你这边能正常通讯?
. _. o. G2 w: l! n* h3 p9 e
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4