嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
/ D M; b$ t v4 L+ O' {: B
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
9 }5 @( B) \. b. C( @/ z
0 S8 t, z7 L) a9 G0 \
#include "TL138.h" // 创龙 TL138 开发板相关声明
# a# W# i- K7 [9 A# k
) z- R1 Z! w3 R' E
#include "hw_types.h" // 宏命令
& `; r4 N( R, @
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
' L& t6 f& N6 C6 G5 S* ^: B* v
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
! u- x" ]$ N/ b* G/ N
0 q- o, K4 C/ f6 O- X2 j+ I5 X( U
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
3 s7 S+ I/ e) r! q
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
& t3 R9 b' Z' m4 M7 G
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
2 f2 Z5 C4 q t4 O+ L& X" a, b
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
) Y0 y6 a( a0 p) j' @" j
* z! H4 j* Z/ y9 ^
/****************************************************************************/
0 G: T" J/ I( y
/* */
. ]$ q. `" O8 J" `+ y& B+ y
/* 宏定义 */
0 y% ~+ b v& N V- i% U
/* */
2 X( A# i/ v% \& r% c# s
/****************************************************************************/
, c! c$ ~. B, | i3 x
// 时钟
; V, z1 |$ ^- L8 p
#define SYSCLK_1_FREQ (456000000)
, O# M2 L' C' I- S0 E$ K2 n
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
3 n0 v3 |6 ~9 I, V+ p9 \- R
#define UART_2_FREQ (SYSCLK_2_FREQ)
3 T2 N+ L1 U# E1 m& p! @6 A* j/ n
" Q z n! e3 M5 }, G6 F% S0 C$ M
/****************************************************************************/
7 f+ F+ }- _/ `9 J9 b
/* */
, h- }/ N4 {) ]/ h) U4 Y
/* 全局变量 */
6 d9 o( W* r: b3 e5 @# f5 m* ?
/* */
" i' L8 _( F- l/ w) R
/****************************************************************************/
* b* t( C% P8 x Z$ @/ x
char txArray[] = "Tronlong UART2 Application......\n\r";
0 ~( R% l) \0 j' z1 L
" ^+ P, I( I& B' K! |$ j
/****************************************************************************/
+ W( \. z! u! b$ T: M' @( d1 H- I
/* */
& P: g8 ]5 O. Y
/* 函数声明 */
7 g9 W3 R8 Y6 q$ W
/* */
4 u% m# ~9 d" e$ y7 W8 Y0 V- l G
/****************************************************************************/
; f6 Q5 t7 S! [1 B6 v$ P
// 外设使能配置
# I: d2 B/ Y$ D# u4 C3 m3 N6 t
void PSCInit(void);
. T/ u' B% e* L: s: D
- M! y* L9 ~; \% M4 s" o( K7 K
// GPIO 管脚复用配置
/ {; F ?( m$ V3 n, S: D# D
void GPIOBankPinMuxSet();
1 D; i/ `) L% n' ]8 S; W$ w
2 ]+ j" d/ d% v4 F I7 s( O% O
// UART 初始化
# i/ O7 i) q. ]8 @; t \
void UARTInit(void);
2 r; P4 G1 v7 Q7 j. f! \
// ARM 中断初始化
, O" p4 P3 u8 N" W
void InterruptInit(void);
! e8 A1 ?% d6 r, N) C0 }
// UART 中断初始化
+ v7 b/ `- ]' v, G/ Z- _
void UARTInterruptInit();
$ L* {1 j8 {; F+ N& K5 ^
// UART 中断服务函数
8 d8 Y, c1 Y; `3 ]
void UARTIsr(void);
1 D7 N: q- d6 o: X8 B, k
0 |4 R1 E" \5 e3 n
/****************************************************************************/
+ ?% R, w; _8 y, D: A% [8 Y8 X% ~
/* */
$ }3 j/ s0 p, l3 q6 b. {
/* 主函数 */
! O0 z" Y) i# ?& @+ v6 ?" ]% g
/* */
2 z- m" T7 |1 y. F3 I4 o+ \) {
/****************************************************************************/
& N* N( G& i: P; ~
int main(void)
3 U' M5 h3 E0 k! m1 T) p
{
% `, j4 j; [2 E6 C! E
// 外设使能配置
' T- P& f4 Y8 p8 @( Y
PSCInit();
}: `+ r; i q) W: |$ U
; F$ ^& u" j. i( g) g e5 }
// GPIO 管脚复用配置
% F# s% E3 K3 S; D8 m ^
GPIOBankPinMuxSet();
7 n, U9 A& T5 M n8 x( y
$ v/ T8 f: H, Z
// ARM 中断初始化
% V8 \! h/ ?; o
InterruptInit();
+ Q7 R+ l. f3 `$ z6 S. U5 j Q: R
5 S* J F6 Y% {0 A% h s& {
// UART 初始化
" W9 Y7 u4 i( |
UARTInit();
7 k2 u, s1 {2 w) N! @% J
" N& F, j q' o: }
// UART 中断初始化
# S% H+ q) U; u
UARTInterruptInit();
' j0 ]/ H% C2 B! W! T* {9 C
, g4 o/ ?3 y% p- {; @0 a
// 主循环
% w$ l/ n% W$ M0 J; @
for(;;)
( [3 {& r, y) K( Y) b7 S( G
{
+ a3 e/ k+ ]5 @- v9 s9 k# C8 j* i8 N4 `
9 f4 F/ q% j0 M0 S4 V( j
}
4 m H* @5 u) K) B- n* R
}
! ?4 q. Z0 y! G
& i# w: V" |6 @& _2 F7 S9 t
/****************************************************************************/
7 C: X+ c$ ]9 I% F2 A2 U
/* */
) L( l) _+ @) Z& m% C
/* PSC 初始化 */
& J0 I7 |' A1 [
/* */
( ?3 e6 ~& C% ^% |& I; @( J# [. s) V& R
/****************************************************************************/
& I6 d$ x7 U4 f
void PSCInit(void)
; E+ G9 b( D& k- L; v
{
( c Z' S o6 O! m- M, f1 X
// 对相应外设模块的使能也可以在 BootLoader 中完成
3 F2 o4 w8 I0 L3 v* j7 e
// 使能 UART2 模块
+ m; |! [9 H4 _. N `; u
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
' o: Z, A# q& c% O) X% [6 g3 O
}
/ J/ F, P9 g- ^( C# W7 b" z
& ]% [$ C( \+ g+ z
/****************************************************************************/
L+ g5 V$ i7 X }2 i% c8 v
/* */
1 e& |/ f# ^' W# c
/* GPIO 管脚复用配置 */
- D8 B; x3 P# \+ n! s! g
/* */
: z1 j/ `& \+ O; o6 n6 B. b% O4 ^
/****************************************************************************/
! [% O+ P* P/ t+ J% s
void GPIOBankPinMuxSet(void)
1 g- E( d) S6 \ a: _
{
% D# S) a; A+ W7 g
// UART2 禁用流控
) @2 s4 j) _' P3 ~% ]
UARTPinMuxSetup(2, FALSE);
3 o4 a; Y" ]5 C* U
}
& I s& y g6 R
7 K0 F+ B$ z8 h
/****************************************************************************/
4 f# r* k7 s$ z, v* k
/* */
4 F) v: T- R! H0 V- a
/* ARM 中断初始化 */
3 k' s D, W1 J5 E% b# P
/* */
M2 d. J8 y/ }; C) z/ n" _
/****************************************************************************/
! X% e+ ~5 A) i, @
void InterruptInit(void)
3 y1 ^ q1 _; J! I9 k: @/ L
{
1 P- n' i( U+ w1 I7 T
// 初始化 ARM 中断控制器
8 P7 U5 T, T$ {+ k$ g! `, c
IntAINTCInit();
& l& S( }6 V# Z3 o) g/ ]" ~0 N$ {3 t; _
! ^3 m! |* k% W- a
// 使能 IRQ(CPSR)
8 v8 b$ S7 {' }3 A9 q& o
IntMasterIRQEnable();
0 A, S) \# _9 L) o* W0 F
2 [0 `% i0 i. q# R
// 使能中断(AINTC GER)
E( _/ S! B, H7 k
IntGlobalEnable();
. g0 w; S0 g/ i0 h0 b- s
5 Q2 p+ u( q4 O; v3 B
// 使能中断(AINTC HIER)
9 \& A) K" p5 U6 q8 I. g5 N- Y
IntIRQEnable();
5 E- ]$ r$ M0 r: o! W
}
7 a! W$ Y( z* {' r0 R
& C+ C0 J" }& `# G. F3 r ~& R8 j+ {" \
/****************************************************************************/
! u- U; |4 K* r3 B7 X% H, y
/* */
! y( k0 \" a% V4 ^# D( _% B
/* UART 初始化 */
- ~; G+ ]; I: Q- U Z0 g
/* */
/ @0 H7 |' t+ }3 Q- u1 i
/****************************************************************************/
; v+ ^' k8 _! g8 k+ E
void UARTInit(void)
1 T# U v. S5 J4 w- u3 I
{
; ]& c4 F& @8 v' K2 o" q
// 配置 UART2 参数
# r1 r1 h6 x2 L4 s9 j! ~/ K+ @9 ~
// 波特率 115200 数据位 8 停止位 1 无校验位
) z1 i. m9 B$ v# U" U7 ~
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
- r' z j( g3 Z( j; l& K
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. U& ~7 ]; ^4 e/ ]
// 使能 UART2
2 z0 R5 P6 a8 B( Y, F, X& d
UARTEnable(SOC_UART_2_REGS);
3 U& X. d2 { d0 t A9 z
% b3 g' I2 I- x( A1 y+ ? _/ q
// 使能接收 / 发送 FIFO
2 S; v! U" `7 |- P% p+ h4 I
UARTFIFOEnable(SOC_UART_2_REGS);
* Z6 i( g9 w( e) U) ]9 k$ W+ k7 I; {
6 |! o( i1 V- T" [3 X* p
// 设置 FIFO 级别
5 {9 P; t( D; W6 Z3 f
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
! G1 G0 ]6 ~7 l' Q& j+ v4 S* e& [ {
}
a2 t/ {- ]1 i0 I. h' A( f" w
! v, O3 o( i) f( J7 g1 U
/****************************************************************************/
! k) `1 ]2 {' O0 w) z* Y+ _
/* */
) w. b3 w/ \9 c' s0 @- g8 u8 x
/* UART 中断初始化 */
/ X. d8 a* X* {) Q* v
/* */
7 K9 a+ `/ J+ H! r; l0 P+ Y
/****************************************************************************/
, n- ~' v8 J0 Y/ \! S
void UARTInterruptInit(void)
1 W6 T5 M3 W1 Q
{
4 d: C4 e t/ V# E; S" g
IntRegister(SYS_INT_UARTINT2, UARTIsr);
( X: \, ?, o S& F! t, U
IntChannelSet(SYS_INT_UARTINT2, 2);
' }2 X- |7 Y9 f: s6 X7 W; ]" U% c
IntSystemEnable(SYS_INT_UARTINT2);
- h+ D# n. e+ H G1 l* `+ w
v# ~( F& }7 i
// 使能中断
5 r9 E+ P* |1 `% |8 j* o
unsigned int intFlags = 0;
, n# v g! y$ h% R* }5 l
intFlags |= (UART_INT_LINE_STAT | \
+ Q: X; [- ?, m4 c! l
UART_INT_TX_EMPTY | \
, a; R% V2 R0 _: b% c9 }4 B; u8 o# j
UART_INT_RXDATA_CTI);
7 ?1 O# _, C3 q* n0 V/ b; v$ ?- t
UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 a' r. T t: \6 l0 b7 N7 p$ `
}
) }* @( y! \" i# u
! E) G* e. A4 ~0 F
/****************************************************************************/
5 \9 l$ R0 h2 T( R1 I
/* */
0 H+ h: S5 {' H( r- Z5 X6 ?
/* UART 中断服务函数 */
( m4 V! w: J* w& u/ W7 S. E& u
/* */
: X) T: b; P3 l7 a. _' o
/****************************************************************************/
6 Q5 r+ y* N4 b3 Q
void UARTIsr()
( W& ^0 Y6 h* I2 N
{
6 p0 R( }( Q F+ ^5 j& l
static unsigned int length = sizeof(txArray);
' j! `2 N7 V8 m( m" s$ \. n! [7 k
static unsigned int count = 0;
9 y8 E2 m% y8 e- O8 O4 A8 ~
unsigned char rxData = 0;
, T6 T" C9 S7 G# W
unsigned int int_id = 0;
5 E4 D2 P% s7 e3 |! ~
8 E* t! u0 |2 T; W1 x+ _! o$ `9 p' X
// 确定中断源
5 b* l' G/ P, F5 y+ _4 O: S: _
int_id = UARTIntStatus(SOC_UART_2_REGS);
+ b5 |1 y+ m. J! M" Y
9 I- o; Z$ K+ w$ p, h! o7 R
// 清除 UART2 系统中断
; G' \/ H8 A9 Q; x4 l# E* }1 m
IntSystemStatusClear(SYS_INT_UARTINT2);
( s: F" p% g9 I( j- s0 G
7 g' m" r: }/ O+ d. J, M
// 发送中断
6 m& R: p7 T8 ?
if(UART_INTID_TX_EMPTY == int_id)
7 n. D$ @0 | l/ f2 K
{
" ]) O; ]- y0 @. {+ \
if(0 < length)
/ Z0 t# H# `* w" _2 J( F
{
! L5 _+ a+ \$ {6 X; k2 ?- U& u' ^
// 写一个字节到 THR
* H/ ?$ |# z# d% e
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
8 ?2 |2 S% ^9 O( c
length--;
* ]+ f% P# I! e* m C
count++;
# k% `3 A# J* x* }) G
}
; ~8 }0 \- W0 A' c( P* U
if(0 == length)
' f! m3 v( J. Z" Z
{
+ T" i; b: X( v* T9 V6 p
// 禁用发送中断
$ B' N9 F& s" r p7 h
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
1 b9 R: y% y2 F0 M4 H" e
}
$ D1 ^$ W* n" I: x( ^
}
9 C0 `& i& ~- a4 f, Y3 E( m+ t- F8 ~, ]
' D$ ~2 u. L' Z9 ^
// 接收中断
1 F& H* x& p' G. e
if(UART_INTID_RX_DATA == int_id)
- _( R0 P. \$ f# h0 l# [4 f5 j
{
$ K! T9 ~+ a3 @/ O7 y8 `+ |0 D; q3 W, c7 d
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ R2 |+ o! t: Q1 P& T
3 p0 `8 U8 s/ |- {
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
; N7 O; K3 ?/ {1 Q
}
" i+ I$ x8 X' V5 H& m
' |$ y% C2 @/ b& j; o8 h
// 接收错误
N( m- @4 B+ G, c0 P2 M) T7 |
if(UART_INTID_RX_LINE_STAT == int_id)
X6 V& i. _5 t4 C' O
{
: D) s$ } H1 ~' i" B) }8 c
while(UARTRxErrorGet(SOC_UART_2_REGS))
' v6 W$ g4 M+ Y$ K( Y
{
( C* D- I. y& W) r( C! o, H3 ^
// 从 RBR 读一个字节
. j" x0 E- d& A2 C
UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 @4 b" G+ p4 r; d* V( F7 _
}
- L) h' j- A3 I3 m D
}
7 V7 g+ D6 \" e
( L, R* ]- o* r8 G& G, s
return;
4 p" M/ i& i' ?' X" L. D) C& {
}
2 `0 q& Y5 O7 e+ X; c5 a
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
T# B$ d9 Y8 Z u. s
如果其它设备快速给你发送串口数据,你这边能正常通讯?
% G4 `; k' v" g7 n
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4