嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
& H6 n' p+ M" L( G& j3 Y. n, R+ K
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
" P+ i' f/ n1 o1 w5 F
/ S( ^- g0 `6 [# ]$ m1 l
#include "TL138.h" // 创龙 TL138 开发板相关声明
) k; p; ?5 ]; w, h* A
$ x' t0 a- {' j$ H3 w+ `+ _
#include "hw_types.h" // 宏命令
% v g5 S5 E) x" M( v* E) Q6 t
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
3 O) l4 S2 f7 C" C% G
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
/ \) n" k! K8 S/ i% o/ q6 Y1 Q
: y8 e$ r# ], Z' p7 u
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
# q% V5 I! L, P, H8 X6 c1 G* b
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
* \5 s7 M b, R# `- Y( R
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
. m* o& I& v1 V0 D
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( v, a+ G. ]" U U+ N" P6 l
$ x8 F6 w4 ~9 ?' q+ o3 c
/****************************************************************************/
0 N* |3 @4 T9 }$ c
/* */
' A/ L+ B+ D' K% z) d
/* 宏定义 */
5 Y0 P0 A8 t9 ]3 w3 C0 H
/* */
/ k. I4 W" \, K. v
/****************************************************************************/
9 Z3 y- J/ K8 X' D
// 时钟
; r+ `# a, y# Z
#define SYSCLK_1_FREQ (456000000)
' `3 |7 M- N9 ?' Z# k6 _
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
0 Q4 K, G. |( J
#define UART_2_FREQ (SYSCLK_2_FREQ)
+ x& \1 f% I3 J- R) C9 i
% ~) W9 I) B, U
/****************************************************************************/
% ]0 _# w$ T1 t; ]$ V/ I7 s& A% w
/* */
& W% o% R! A: {* e
/* 全局变量 */
! ]; _: Q" @0 G# E' J- g% v6 e
/* */
# W" v' b# P; ?: ?8 O( a3 }
/****************************************************************************/
1 @) Z* |( |) W: s- w h/ s4 r
char txArray[] = "Tronlong UART2 Application......\n\r";
! w8 }6 e; ?" t4 E# ?
, S6 n; F/ k% k, W% O3 R
/****************************************************************************/
* I, P% q+ a2 M
/* */
p% y/ C! e* x7 z0 E6 i
/* 函数声明 */
! z& W: D- c; U3 j
/* */
# }5 }7 d/ K ]* s7 r
/****************************************************************************/
4 S, X5 Z: s9 }6 v+ C
// 外设使能配置
! v* h% i; v$ n' C" _. o
void PSCInit(void);
, O7 f$ S% E Z, g5 k9 g6 ]' o
- H/ p+ J( B1 ^( n# ^4 ]! u8 k
// GPIO 管脚复用配置
" S: X" h! ~$ K1 L0 ~
void GPIOBankPinMuxSet();
2 N! y. I. X2 G# G2 i8 r& u* D
1 `2 t0 d7 g8 l; p0 m; Z# y
// UART 初始化
3 o* S# q# c3 S% @2 R* g" F
void UARTInit(void);
! h4 @# E1 m" f
// ARM 中断初始化
@7 E. r7 G# E- o* Y6 y! b
void InterruptInit(void);
% Y8 Q) |! X1 I9 [8 L: Q7 J
// UART 中断初始化
# b4 M0 G3 Z. P$ l( `) N9 v- I/ X2 W) p
void UARTInterruptInit();
6 w7 G# X9 j7 s/ _! n& o
// UART 中断服务函数
0 }& K2 b1 U, t2 }) K
void UARTIsr(void);
% H; C, Q/ m7 u y# u# I7 T
% N G$ Y' J+ v, ?
/****************************************************************************/
8 }$ ?- Z0 `1 ~% x& c
/* */
" J& K9 ~. i$ J+ b2 x
/* 主函数 */
1 e0 R' ^% _ v9 l7 k
/* */
# q% _( [# u* h* j
/****************************************************************************/
: B {& O: c$ d
int main(void)
0 H) `6 Q6 f" p3 u$ {; A* K! A, d4 D
{
0 `1 Q% x* Y y" w0 A
// 外设使能配置
% l, A, \( i3 @3 }) U( L
PSCInit();
6 t. Y: Z$ W w2 L
- H7 r' d4 m ]- H! E- g
// GPIO 管脚复用配置
7 s7 _8 G+ U6 w; _, e
GPIOBankPinMuxSet();
0 c) N' R+ w. U! f
) K% k; J- e" T: }
// ARM 中断初始化
; r( x$ u+ Q% k& b" L! C) J
InterruptInit();
% y' J( s) y& \3 _9 d7 q
: ] B& g# E% p6 e+ ?9 c# }
// UART 初始化
G, V. C; y+ _' B) _. c' p) _
UARTInit();
8 D' M9 \5 R6 k! m( p
4 M" G2 T, b9 A! ]7 ]
// UART 中断初始化
" W, e# H. R- p& G
UARTInterruptInit();
1 k8 @& {7 U$ \
1 g0 R( L0 L. ~5 ^+ f2 G- C
// 主循环
1 Z' N$ a3 W% }) y% `. `
for(;;)
5 B0 k: u# w1 n6 m" Q- F* C+ i
{
/ V- F' |& ~& t, L" b) Q7 ~, j" r
3 Z9 |3 C- e) Y
}
$ C }6 |1 X( [! |8 ^4 q
}
' t9 K9 J8 K5 x- J" U7 D- H
' n5 g# b/ s p8 \1 i
/****************************************************************************/
; a3 _2 w$ j7 Y7 k" Y! t
/* */
) [! Q$ u' k1 Q+ P$ c. m+ }
/* PSC 初始化 */
6 T* n1 c; v: Q( z
/* */
& |6 d- H7 ^; _. y. a) T8 W" w
/****************************************************************************/
, a- Z9 [) J. }- b! u
void PSCInit(void)
0 x* F1 W1 e5 X+ ^) I% G9 o
{
) T5 c; G2 }& U; @
// 对相应外设模块的使能也可以在 BootLoader 中完成
/ Y8 S, {3 s! P0 e
// 使能 UART2 模块
: Q. f& m5 R7 x6 }, V* b
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
& N: K. @. c: x8 e
}
% R- {8 I( {! M1 z9 ?: t
0 o1 ~3 |+ i e( {
/****************************************************************************/
8 ~ p; k9 a0 E! [' E& N+ c- h
/* */
% E x4 @0 @' c; J1 _8 v% q
/* GPIO 管脚复用配置 */
) ~ c; h" V3 {' L, _
/* */
. w1 y+ |8 p/ H8 d
/****************************************************************************/
# }7 m, ]4 t& U9 I) N" N$ R6 A2 ]# z
void GPIOBankPinMuxSet(void)
5 V9 c# m5 l( p% A; J. R5 w4 R
{
- R; B9 a6 W2 R
// UART2 禁用流控
( ^5 ~7 ]# t3 G2 n! K
UARTPinMuxSetup(2, FALSE);
' w ^% U9 I' O; Q
}
6 T c$ w! c+ W' N Y# j: g
5 e: r% E7 h% C- G* K' q3 \9 v
/****************************************************************************/
" N0 {9 F! u' v/ F) L
/* */
, q) R6 a$ M- a- l9 t3 y
/* ARM 中断初始化 */
, g+ I# }9 S# l; }6 U* \
/* */
; n. ]( b: _; ^7 ]. o5 |- U; R
/****************************************************************************/
3 V% E W3 g! S* b0 h5 F* w
void InterruptInit(void)
$ W+ \+ B: C! D% E5 D# a' [
{
) b+ {7 v( |1 z8 F
// 初始化 ARM 中断控制器
6 C. U, p( u' r* {1 Q5 E/ b# z+ _% q
IntAINTCInit();
% H t# J0 Q: @+ a- y! N2 O7 S
% G3 u. z# e) s1 o, ^
// 使能 IRQ(CPSR)
- u; ^! _0 v* p: k
IntMasterIRQEnable();
% w+ e) w- g1 x. n8 @# @7 i3 M
7 c& m+ e' l. d' \, R+ u, I
// 使能中断(AINTC GER)
4 i) U8 a! t: @
IntGlobalEnable();
1 F b' N- a2 Q3 f& x [( D' p
7 U- N' q6 K7 k5 F4 S5 v, f
// 使能中断(AINTC HIER)
& o; A- N* N' ~9 f: E% v
IntIRQEnable();
" f! H1 P. W9 A9 ?
}
. q: O- F- m: B
0 o5 ?- O' J0 k
/****************************************************************************/
! q3 f/ |6 t3 T( X- b
/* */
' V2 D8 w* a: B- t* m* _8 C6 y
/* UART 初始化 */
: k u0 a0 L( Z/ s% h
/* */
6 T: t) m$ B! _ w5 t( N
/****************************************************************************/
+ i7 J7 r1 r7 G' |$ F0 p
void UARTInit(void)
! m4 z1 I5 u# y: w* Q8 L! a
{
5 z2 F. ^' j" j" P! C {
// 配置 UART2 参数
$ A) j8 E5 n$ l7 E: f/ M
// 波特率 115200 数据位 8 停止位 1 无校验位
. `. m) U, @2 l7 J* K9 i
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 y6 ^$ X- |& J, N/ U
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ b) [1 b& O! h+ I% b
// 使能 UART2
p8 S% H4 e; ?1 _3 m$ R9 \
UARTEnable(SOC_UART_2_REGS);
! m- R, \% o* s8 s
1 f9 t) Y, C4 A/ }- K8 W# @
// 使能接收 / 发送 FIFO
) Q7 T& k' ?# D3 G; ~5 t
UARTFIFOEnable(SOC_UART_2_REGS);
( w& T/ V+ F! O5 L. C; `
/ g- ~8 O. ]3 D) k+ f. c- g: N
// 设置 FIFO 级别
; _# x8 k7 V, @& Z7 `+ b) G
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 R, U1 V* _3 Q
}
2 }9 r* o# b0 z8 T
3 |" e3 d3 Z: _. j- I+ @
/****************************************************************************/
6 Z" f1 P# k, j8 x' T, x
/* */
8 Z/ K6 g7 ?5 {1 [
/* UART 中断初始化 */
7 X8 G: m5 _0 U- q1 n6 L: F
/* */
: i: I! M6 C0 t0 ~
/****************************************************************************/
' U4 S3 h3 }$ `. ]
void UARTInterruptInit(void)
+ u" B7 ~" \! I! k. j; l
{
: q7 S( d; r# k
IntRegister(SYS_INT_UARTINT2, UARTIsr);
7 u5 I0 `7 I6 R8 }. e+ i# |* h
IntChannelSet(SYS_INT_UARTINT2, 2);
K& j2 `. ?* [0 D
IntSystemEnable(SYS_INT_UARTINT2);
9 Z" Z" p7 S9 B% B
7 o' n; c0 ~* D3 N
// 使能中断
+ S' i Z3 x6 h2 i5 i% ~# x
unsigned int intFlags = 0;
( y5 s( S/ }; Q
intFlags |= (UART_INT_LINE_STAT | \
s! v! S& {9 r! `9 J
UART_INT_TX_EMPTY | \
1 j" G% s$ [4 E- w+ w, S
UART_INT_RXDATA_CTI);
! Z; O6 M' L5 O! d' w& o
UARTIntEnable(SOC_UART_2_REGS, intFlags);
6 I- V2 }5 S1 P t6 d; |! ]4 N1 t
}
* E+ ^4 A3 m/ r. b
3 f9 ~) L! h8 ^$ P5 y
/****************************************************************************/
/ }; B* b$ c1 W9 x0 W
/* */
- H4 U ?. d1 b
/* UART 中断服务函数 */
3 D5 _1 }" ?0 A4 o9 M8 z
/* */
! t( q: I) K3 P9 s
/****************************************************************************/
3 s/ D5 |+ v# z/ q1 Y2 _' |
void UARTIsr()
4 R+ n( t) \- f
{
+ n$ ? K6 y: k9 @' v! r3 Y* A
static unsigned int length = sizeof(txArray);
- j1 S6 b4 I: D& |# v E; I) @; v
static unsigned int count = 0;
9 Z: J" K0 ]! s) \# k+ l
unsigned char rxData = 0;
! J- D& L9 r$ L! P$ i$ A) l- T
unsigned int int_id = 0;
, F" k$ o; U6 z, F! M# z6 p
" T6 b9 {0 t$ a) p$ Q
// 确定中断源
8 c# F K' O4 F/ m8 p+ L# }; j, u
int_id = UARTIntStatus(SOC_UART_2_REGS);
! p( ]/ m- }4 a' t
' t+ ]+ @4 k8 c2 h" Z$ V! d; v
// 清除 UART2 系统中断
0 p# m$ Q' ^, D3 R. f" i4 \
IntSystemStatusClear(SYS_INT_UARTINT2);
$ d2 G4 A7 V x! m: `& ^
& l. Z3 r7 t3 X( k( f( o. ], l+ \
// 发送中断
) V4 K4 O: Y& `( W
if(UART_INTID_TX_EMPTY == int_id)
1 X2 E8 ]5 C: z2 H
{
% V$ o" g, s2 ^% c* w* d
if(0 < length)
. F" h; m3 S7 M2 d6 z3 f' H
{
3 `) G; j# M @ S4 l, @; N
// 写一个字节到 THR
# Y8 d) l3 P; F2 U1 G3 V# J
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
, W$ p: L4 M4 W0 r ^! N, Q# e
length--;
7 V8 V( |* F2 {+ U9 n
count++;
- S/ ]) q7 Q- {& h
}
2 l9 @- N5 e2 Q# A$ n/ t
if(0 == length)
8 |4 W6 O% D6 F0 G% V
{
# [/ [9 F7 F$ Q# }9 n
// 禁用发送中断
) l4 z9 e* }' S% ?+ j4 M( n
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
; T' I0 V+ {. n3 `( W& t6 l
}
' F! g5 ~) n. }9 V5 I- H7 }$ w
}
& G" z* N# x1 Z8 \. E
5 [2 L1 I- d9 o$ N) @$ R. C h2 g
// 接收中断
% L, |/ F7 Z, Y+ V& C* f
if(UART_INTID_RX_DATA == int_id)
* D# g! R/ P4 P$ G9 g% |
{
8 P/ @! \) n1 M! \( Q* _& S4 ^; {$ x
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
; v$ v" o# I2 g" N8 x; B% d8 K R
?9 _3 [8 n; E( v" Q7 ]
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ p* J5 @3 W3 b9 F( Q9 s0 }
}
* ]3 N' W7 O+ A @& d5 o
0 f3 e7 |' |$ X9 G* i) e
// 接收错误
% C/ I0 u& r' T
if(UART_INTID_RX_LINE_STAT == int_id)
, y2 v- |/ P7 r; r0 H' f' H
{
2 M( n* J; @ y# z
while(UARTRxErrorGet(SOC_UART_2_REGS))
% x- B2 i& Z( g9 Z1 `
{
) ?/ K) P+ c) t* b' X1 K6 L3 `( u- t
// 从 RBR 读一个字节
- h, c0 }! R% @) ^
UARTCharGetNonBlocking(SOC_UART_2_REGS);
0 n* S8 O- ?* ?
}
' `/ z- W1 v( j9 p3 v3 m
}
# S2 o% ^7 x/ t0 N; E1 g' G
* |2 b1 g1 P) p) t* I
return;
7 U4 Z7 z: X8 P6 ]8 E
}
: F* s! l# K) v; O
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
$ G* V2 D0 c; H- V6 a
如果其它设备快速给你发送串口数据,你这边能正常通讯?
6 W# I0 O' d6 _+ L' _) U
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4