嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
8 l" t! F2 @) Q9 _% Y
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
, T$ M, U5 F. ?* v& w3 p3 @9 ?( S/ ~6 [
, H1 ^2 H) ^ a& ~' I; M1 T# U
#include "TL138.h" // 创龙 TL138 开发板相关声明
5 O9 X5 ]1 ^6 ~; w9 Z0 e: Y) R
& n K7 u8 N# e% D; |/ e0 g
#include "hw_types.h" // 宏命令
. \$ Y. c- ~$ }. v A6 J( k3 E* Q
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
$ U0 E8 D. k/ J( \" A2 |& n* Q
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
8 |2 y1 r* `! f: T, X& v
4 p! S/ {; \. D' g4 h
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
1 B5 }& X. Q" ?6 Y' G" d1 V1 r4 D
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 j# b# X' c( m/ J. ~
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
0 f* X t' P) C: `& K0 h8 Y; R2 H; z# Z
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
7 P- h3 v& G, R7 Z, C9 E# x8 L/ a
$ \7 Z! j) C: W8 O
/****************************************************************************/
( s4 Z2 h% Q9 e
/* */
6 S; ]1 m! P% C! _0 K
/* 宏定义 */
2 n- j$ _) D" j3 I* G! h
/* */
( u. w: O: S/ d
/****************************************************************************/
5 ^2 |5 z4 F) k- a2 y
// 时钟
5 o& C5 i4 W+ g
#define SYSCLK_1_FREQ (456000000)
, H. x2 c6 N/ Y# Q- Q! j( l
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
H5 h3 c0 f2 |1 u) ]: V
#define UART_2_FREQ (SYSCLK_2_FREQ)
, {8 }6 Z! Q& `/ c
0 O# Y1 T7 j4 J/ i' h6 e
/****************************************************************************/
' a& ~3 }/ X7 X+ r
/* */
. Q% E% ^% ]" Z" M/ ?9 G
/* 全局变量 */
" W7 r& A3 C, \4 D# a' @8 W+ E* B2 Q O
/* */
9 o2 x9 c* O9 n$ K ^) Y
/****************************************************************************/
- d% M( `; |; L' J. u7 p
char txArray[] = "Tronlong UART2 Application......\n\r";
5 s6 s2 ?9 H+ o! \( N# z
" W* W" z8 r1 ~/ Q
/****************************************************************************/
4 q/ a* V3 q% x g5 o
/* */
: d4 x. W% G1 ?% M0 q* _' ~9 ~. T
/* 函数声明 */
4 F$ t5 d9 h- m) r+ D( H& L
/* */
9 O' |% a1 z. ^5 P2 K3 {
/****************************************************************************/
4 A @- Z4 i# R) r& q6 |
// 外设使能配置
% i/ j# p7 T. A: s
void PSCInit(void);
, s) [/ [4 R% ~" ^
9 o. L! \( H+ A" h% f. h) Y/ j
// GPIO 管脚复用配置
r! L. s, J+ d; [3 Q/ B
void GPIOBankPinMuxSet();
4 b, a4 M+ |0 J& e" e6 M
+ a7 }/ x) V# W; J% ]9 k' M
// UART 初始化
# f! E7 \% n7 S" N4 G
void UARTInit(void);
+ }3 z, y; `: a7 w2 c3 }, s% N& Y
// ARM 中断初始化
0 T' e# B+ ?) e" n
void InterruptInit(void);
( J* J! f( H1 h6 j
// UART 中断初始化
( }+ J6 Q/ {) ~; v) H
void UARTInterruptInit();
6 X1 x: s9 X3 o# u
// UART 中断服务函数
' o) G, a) L+ s9 ~
void UARTIsr(void);
7 K8 \" ^# l& W$ A
6 j, N5 K7 [' G% ], Q. h8 l1 W. l
/****************************************************************************/
2 }! Q9 U; H$ Q) I1 t4 ~; _& T2 l
/* */
, E: F# n2 I7 e# T5 U
/* 主函数 */
, R4 `0 F7 Z. E/ L
/* */
" J" E$ Q: A. n& H0 ]/ M
/****************************************************************************/
4 R a) @$ u! t4 C* @ [( t
int main(void)
- n( ?& a! R* T& X* k4 m! P, _2 ~
{
9 @4 m2 t) x) e Y9 D
// 外设使能配置
# M& @) [- A V* z4 J
PSCInit();
! ^1 C" A: }3 b, M/ q% b! {" s
$ |3 p* Y. H! C8 @
// GPIO 管脚复用配置
$ _( s3 b5 _& H- E6 Z1 q
GPIOBankPinMuxSet();
) u- |9 c3 J# R: V
+ W% Z% _) b- Q
// ARM 中断初始化
7 a/ I' W S0 p+ K) H0 t
InterruptInit();
* v1 G4 F( J) P5 B" j# Q
0 G$ N; A1 T e" | b4 m: }
// UART 初始化
9 R+ Q7 n$ c8 _9 m* [/ Y5 a
UARTInit();
0 @4 ]) z0 F* s9 x; }' Y q, g
: k- A. b7 O6 ?7 h) l% [$ N
// UART 中断初始化
, J* P3 ?$ b4 r' |3 u6 C8 Z. G
UARTInterruptInit();
' ]7 {' I9 ]4 g
) h7 U1 S, \7 f( G/ a' |% L0 k, @6 c
// 主循环
- Q ~+ Q( s7 _7 g# I2 ^
for(;;)
* |. [6 D. m9 P {9 q" a
{
# A8 Q) {! ]( `( C( s
* Z8 l+ Q. e& B$ i
}
- X. K' H1 @+ {4 |: l8 n2 i! {
}
/ O! Y/ F; B$ V* c1 E+ _
) P4 G6 o' S( r+ G# q# v) b+ d
/****************************************************************************/
! |, p/ _- k+ _' ~/ |* W
/* */
7 a9 O+ q9 W7 W' L* ?( g# _
/* PSC 初始化 */
' U. D- x9 ?; f' q' n+ [) K8 r9 S
/* */
4 U7 G) g! m+ d0 E4 z: ?- h; b- C
/****************************************************************************/
: S4 P% f( x/ A5 C9 G! {
void PSCInit(void)
, y5 y: g Y ]5 I% `, t
{
7 l" G; N l8 G5 z4 Y) C; [
// 对相应外设模块的使能也可以在 BootLoader 中完成
" C2 x) H' S; n4 ]
// 使能 UART2 模块
6 t9 N. r- S& |( R- Y4 C: E; Y) U
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; C1 [8 m) U$ \% n/ H' Z0 G8 |4 A: ]- a
}
, K# B: C: n0 f* D" K) l8 |
' _- B7 d; t8 R
/****************************************************************************/
! J/ x0 n3 G; \ [+ x w
/* */
1 \6 ?8 ?6 K) a% f, C, ^$ e
/* GPIO 管脚复用配置 */
: U. x W7 W" o& T) ]$ ~1 D
/* */
' r* |6 ]7 U7 x* p# Z( r4 c
/****************************************************************************/
, ?( n0 e9 C$ |8 [, s) S$ `$ ^
void GPIOBankPinMuxSet(void)
8 v2 Z: `' p9 A" G
{
+ P: @# A3 s- g7 h+ ?
// UART2 禁用流控
6 g4 V2 g9 O7 t+ M J
UARTPinMuxSetup(2, FALSE);
' j' a& u5 B z5 F8 s( q( h
}
( |/ W( L. ~8 V$ q N. ~+ {
( t% u+ X. b: W& ~- h
/****************************************************************************/
6 t9 Y% V Y; w9 G! W
/* */
6 k! R. u/ e& ^3 D# c9 L* c8 `& K- L
/* ARM 中断初始化 */
0 f9 n9 S+ G) Z2 K1 p
/* */
/ \9 H' H! z; X* p+ Q
/****************************************************************************/
- a8 j/ E8 F/ h4 n5 w$ v
void InterruptInit(void)
8 p6 a" Z( b! w* k4 n
{
6 T4 ^/ d6 u! J
// 初始化 ARM 中断控制器
) Y a: P% j. ~, o( z
IntAINTCInit();
, t/ X7 N( r9 u* T' Q( p+ a! g
6 }0 y) e3 e9 H( a! Q# A
// 使能 IRQ(CPSR)
2 [1 w: Q7 W) q) ?" G
IntMasterIRQEnable();
2 I/ t0 t2 T& \4 o/ F. ? a
* H/ z* y2 e/ R7 R `
// 使能中断(AINTC GER)
6 M" i6 ?5 m; U1 @/ H) \# ]
IntGlobalEnable();
; x4 c# L2 d/ R( t; h
, J3 H' S! T' ^, I1 n
// 使能中断(AINTC HIER)
; i1 a) q* q% P1 Z8 |
IntIRQEnable();
4 ]" o0 v& i% ?7 ^% D5 f2 v l
}
0 l; c# f6 |6 D {' e
. E6 f6 w1 m! ?1 }/ |. G7 I
/****************************************************************************/
5 H8 d4 ?, X$ o8 a# f! ?) c; i$ G/ n
/* */
; h, R- M7 Z2 S) J1 ~* U+ e o
/* UART 初始化 */
- i7 M3 `. H" A$ I0 V7 H: j, l0 y
/* */
8 J1 v1 U3 A( I5 H4 D- t; g
/****************************************************************************/
8 y" ?- |5 B; j5 P# `; t& P
void UARTInit(void)
' o9 b' p7 V7 l; s; |; m7 l
{
, v. [$ o4 o1 v- z
// 配置 UART2 参数
* |7 w: b# u' {. ~6 f, I5 `
// 波特率 115200 数据位 8 停止位 1 无校验位
# N7 t/ J$ u- P- m- V3 H
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
1 N7 @( T) y2 P+ T4 a
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# R$ d! i% n& u' C0 G; O' p+ s
// 使能 UART2
# z( U6 z d! E6 K& U: n. S
UARTEnable(SOC_UART_2_REGS);
/ Q) G2 ?# K4 Q
, D6 ^6 D- y5 y3 Y1 u' a" R
// 使能接收 / 发送 FIFO
) n% r: W+ Y6 g" \$ G: ~7 n
UARTFIFOEnable(SOC_UART_2_REGS);
, n- ?4 S. C9 l9 t: |
{, R# p- h) D% t# r* B
// 设置 FIFO 级别
, E; I5 t* {" ~
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 m2 K* K$ X" d: `* A
}
" H# W. L8 U6 g5 A8 W- ^9 R! e
% m4 u$ e5 z* i- g0 O: z. R. e
/****************************************************************************/
1 ^. Y7 C7 I$ j6 r
/* */
! n3 ]+ w3 {8 F0 }. t N4 y
/* UART 中断初始化 */
. \ \ u4 @: W' a j
/* */
2 j: m# L" ?4 t: I! _
/****************************************************************************/
5 N' H9 g* C; z* y O
void UARTInterruptInit(void)
/ O6 e9 w. f% F9 K5 `) s/ h
{
" V; n7 e$ [: _" f/ e+ B
IntRegister(SYS_INT_UARTINT2, UARTIsr);
( n# I: z- w* L% Q4 f. C
IntChannelSet(SYS_INT_UARTINT2, 2);
3 ~, \& X( F( B
IntSystemEnable(SYS_INT_UARTINT2);
v; P& Y. i& ? ~
/ @1 P# r7 u: J+ {/ o- D
// 使能中断
/ \& P8 M% _* X, _) G3 L1 Z: r
unsigned int intFlags = 0;
# f9 L: ?* T- ^
intFlags |= (UART_INT_LINE_STAT | \
7 q' H' T; g; O4 U1 a2 a0 }
UART_INT_TX_EMPTY | \
, x3 `& w7 [0 ?7 S7 `
UART_INT_RXDATA_CTI);
5 P+ `" |6 ]$ m# @7 C# Z
UARTIntEnable(SOC_UART_2_REGS, intFlags);
9 n: {* T" F3 F: _3 i# U ^' t
}
2 C- z1 x8 M& P- o! d9 Z: ~. E- ] H
' M3 N' F# \& t! G: M$ h8 [$ N$ f: d" e
/****************************************************************************/
0 U7 j" I+ C- G% p: Z( ^
/* */
# D8 [, g1 q2 ^' @+ H9 L6 a1 G
/* UART 中断服务函数 */
1 a9 ^, a* l I
/* */
( B5 |: ?5 Y* l, K3 u l
/****************************************************************************/
: d" m: @8 z1 B3 D. v
void UARTIsr()
8 E4 j# `+ e5 p" R
{
, c2 R5 k4 k/ g+ }# ]8 X
static unsigned int length = sizeof(txArray);
& f3 i" x t2 E3 O
static unsigned int count = 0;
+ U. I* G4 J1 N
unsigned char rxData = 0;
2 I3 t, Y4 _, U: K2 h: U- d
unsigned int int_id = 0;
# c8 F' n5 _* y4 P6 t
9 F* L, u% j9 D" g
// 确定中断源
y& h$ C( A5 n3 l' R7 ]
int_id = UARTIntStatus(SOC_UART_2_REGS);
- ?; n9 n5 P2 E! U6 \, x' ~
$ o/ v* B9 {1 Z# \
// 清除 UART2 系统中断
/ k* m, X& f+ k6 S/ j
IntSystemStatusClear(SYS_INT_UARTINT2);
" U A1 x/ N4 a$ v0 R- x* b/ g5 S
( P- R0 \9 A% ~
// 发送中断
3 g6 g1 }6 o1 K
if(UART_INTID_TX_EMPTY == int_id)
t: d; K8 S. v# F
{
+ {; }( ]6 J z* U
if(0 < length)
. A7 u( i1 N: @6 }2 @7 g
{
2 {# h0 g" m8 B$ H6 ~
// 写一个字节到 THR
- G/ l, k: [, F2 @! }0 w
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( m2 \ i1 l, i. y1 T: r2 a" \
length--;
! q6 y K$ {- I7 p( X; Z
count++;
: i+ Q4 F' R. l5 k- e. K* Z/ v
}
8 l& ~* P# d6 x" ]3 @
if(0 == length)
5 z/ l; H! g7 o) J- g0 ?- Q# T o
{
/ J: l# x% R, B& A2 r$ ]: {
// 禁用发送中断
3 r$ r2 B" W' `" a/ k: ~
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
; k# {" a2 O y6 Q# m
}
]& u7 a7 V. {3 k& x
}
0 P2 F+ p- X+ t$ A2 U* h0 H# o. _
; @( h& b: x1 \' w5 I2 I
// 接收中断
$ }& s" a" \# s0 ?
if(UART_INTID_RX_DATA == int_id)
/ a! k# c* @" T* W/ s
{
2 g6 W! o' W3 P8 D
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
# L$ q& h$ x, }& k+ d
' \0 C7 l! A1 F# A" t1 j& T# P
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
4 H, f! z( Z" F& k2 J, ^- K! J
}
3 m$ ]: I' E/ G, f) g' Z
K! ^; i5 @, A0 B% ]2 ^- i
// 接收错误
7 F- g" L. g6 [7 K) Q! g
if(UART_INTID_RX_LINE_STAT == int_id)
! Z9 Q1 N& I0 E
{
8 L3 B x; t3 ^* J7 [, z( T d- g
while(UARTRxErrorGet(SOC_UART_2_REGS))
- s' D5 i3 t4 ]; c6 T
{
! x7 R' ]4 a* h& ` s. h
// 从 RBR 读一个字节
! L7 |4 Y6 R- H; L* |4 w
UARTCharGetNonBlocking(SOC_UART_2_REGS);
- C' |5 E/ t% l& q
}
2 V" E6 O$ ~/ r# ]3 N/ k* R7 _
}
^5 w9 X7 h1 t/ p9 w3 z: O: E
; ]9 L3 W' ^8 |; e' E, I* [3 Q2 D k
return;
5 T: @ J) P# O4 ~4 a0 p4 c
}
2 n# L9 |9 {! \
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
/ [( E' F# B Q! K8 L
如果其它设备快速给你发送串口数据,你这边能正常通讯?
# {1 \7 s' @) L; k* S, g/ K! [
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4