嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
- A8 W6 K {5 b# ^: d6 P/ `
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
( T) h) m. l7 D" \" B# K
, r$ @- p& k. a6 {: ?2 L
#include "TL138.h" // 创龙 TL138 开发板相关声明
' s; g) z" f5 D$ E5 o6 E
, }' a% x( m* Y2 x
#include "hw_types.h" // 宏命令
8 o U( O$ Z$ v, B2 G3 N: z
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 i, ~! r6 H& g- C: J y L1 j
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
) s e' g0 Y1 J: k
5 a$ h+ {% I* h6 a0 [) j
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
/ B6 |1 }) N& R6 i
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
* f4 s; K$ t8 J) v0 ]+ e
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
( l$ t0 L, R1 t9 V5 r# H+ b
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 g; w4 O$ r# M0 B' s7 B& b
0 K2 P7 S+ _% ], p
/****************************************************************************/
' V* W* @. R5 T$ X
/* */
! J! o9 l& l: \6 ~* v0 e
/* 宏定义 */
; L! {( Q) u4 C+ t! ^3 }# e7 E+ y
/* */
D6 ~# `" M, Z% [# f- S; f2 p9 p6 z
/****************************************************************************/
3 Q8 N0 X% C$ Y$ J" T3 M: {6 w, m
// 时钟
! ^9 q( v2 C2 H. h" Q& F
#define SYSCLK_1_FREQ (456000000)
& D0 E9 a; m0 K- C2 E) i; u6 L
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
, c$ R r* d( @1 j8 w) y7 g
#define UART_2_FREQ (SYSCLK_2_FREQ)
2 T; {1 @! p) A2 y: ~
, o$ s( v5 D" O3 N
/****************************************************************************/
d( |7 j7 b5 d0 t p8 ^: L7 @" O8 {! F
/* */
6 @: t! j V% m4 Y0 o
/* 全局变量 */
' | E1 Z, h) d& @; N8 g; q
/* */
( I6 R* }! ]+ |1 J; ^3 `# ~
/****************************************************************************/
. X% g6 K, N1 l
char txArray[] = "Tronlong UART2 Application......\n\r";
5 k& ]5 U+ k8 I
2 e) t( J9 h; L* f4 n1 e% w
/****************************************************************************/
# v- G8 q8 u, l7 r) M/ g& o
/* */
$ r( g/ N+ k" S9 X+ ?- T) _
/* 函数声明 */
/ T1 v/ q" X6 ]5 A$ O3 l
/* */
& y* a S |/ L1 n- J8 l8 S- B5 W
/****************************************************************************/
# ?. t3 C1 K# S \) F0 }
// 外设使能配置
& o# U. `6 Y/ v5 ~* [9 k+ s
void PSCInit(void);
! y$ o2 }( t0 ?
2 q0 s, K }. n' A( k7 p" X
// GPIO 管脚复用配置
% I+ G7 n' e' M7 n. G# q- L2 y
void GPIOBankPinMuxSet();
2 ]: u5 t, Q1 z* s4 o
! V; ~3 O% b9 e' a g1 G, e$ t* R
// UART 初始化
- N( X# u. h j
void UARTInit(void);
0 y9 A) P8 t5 N r; A
// ARM 中断初始化
9 Y$ z- J9 E( s. w I5 a! Q/ K
void InterruptInit(void);
! F0 i+ O4 T" R5 U8 A# U& S
// UART 中断初始化
9 u, T1 F% M) D* H
void UARTInterruptInit();
( w5 D2 l, a# w6 K3 _% \% N5 Z
// UART 中断服务函数
* E* T. \/ U0 P6 c7 Y
void UARTIsr(void);
0 k: N u( [* h# U9 \* z: q
& j3 |" S- k; J
/****************************************************************************/
' O+ V% T% D G O3 o
/* */
2 ^4 a4 j2 N/ {0 F7 ?0 Z' Y
/* 主函数 */
' k* F& }+ L% I. {5 J: u; d
/* */
9 W2 ], O8 ?; G4 w* I O" t
/****************************************************************************/
5 b4 J. ]; K/ K+ k! H
int main(void)
( H' b" @8 b) O9 V' X
{
2 z5 J% h& @) s* y8 g
// 外设使能配置
2 V( q/ h/ T& m* Q9 h0 J* _8 P- }
PSCInit();
% P1 Q$ U# u% s% J% {1 \: G7 T
9 r& K3 R) G& V ^/ T6 Z J
// GPIO 管脚复用配置
" g' P. g/ a7 k# x* _7 N3 \
GPIOBankPinMuxSet();
# _- H- l% h+ x Z
7 j9 e' R) @. ~( g$ N
// ARM 中断初始化
- }" L% U* t, J: b
InterruptInit();
* K) G0 r/ T& v
# r# V/ @" t7 E5 t/ Y' z
// UART 初始化
! b: l6 q. a7 ^; {+ C) d; @; W- E' A
UARTInit();
. t+ R( b9 J. E) Q" A
; c+ V$ \! k0 P6 ?( Z! a9 s* e, H
// UART 中断初始化
/ |8 \+ g: f3 C- L4 H A$ N
UARTInterruptInit();
( a6 i5 c0 q2 _7 ?
; T0 Y- k- d. l1 g
// 主循环
, r# _8 {) _: w, o6 Q4 |
for(;;)
, ~) L" S% F o1 F
{
) y) Q, z/ \! i* e1 } f( p
& G% x# U- i9 q, @1 Q2 U
}
|9 }% d o Z6 }
}
0 A- r: i1 `' f
5 S. T% U/ T) x, H
/****************************************************************************/
+ _( b+ \$ V" c4 Y6 `! J0 v, r
/* */
; |2 z3 [4 G8 a+ B
/* PSC 初始化 */
3 s. g% a) p& h: \2 J4 `! V
/* */
* N) G" M* N+ `
/****************************************************************************/
% H& n: |8 i' c; j0 [
void PSCInit(void)
/ U1 D3 s+ r' m" `% ^/ S( r7 A- J5 T
{
+ l, f& ~5 F# r) D- K1 |
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 F8 E; f- `1 q7 I" z) e
// 使能 UART2 模块
/ `* s4 ] F9 L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 N! s- R1 T& {1 e
}
, L+ k% W* V; i
: d8 \/ W) X) _2 q+ |/ Q( c# d; c1 [
/****************************************************************************/
+ E% r* u! t. k/ _$ E
/* */
6 ~- x* k# v1 |; W
/* GPIO 管脚复用配置 */
" A$ f* h- w+ P1 a8 G7 Y( s% l
/* */
* q, N0 p3 [' W6 q7 W Y. r# X7 S
/****************************************************************************/
' [$ W7 b( q6 G. N' ]. \, z/ t
void GPIOBankPinMuxSet(void)
1 |! o/ @5 g/ T& {
{
* Z- X6 G& @$ v9 O- |0 p Y$ Z
// UART2 禁用流控
5 p% ?7 ], C1 s/ z$ E, F4 H
UARTPinMuxSetup(2, FALSE);
F, x- k7 Q. X* f8 l, F. ^# g; A
}
& p5 M; Y9 b* S9 p6 Q; c# n
- i! z+ S. f+ A2 P
/****************************************************************************/
& R. F2 P# q0 M6 t& V6 c
/* */
" R( D/ T( A* _) {7 y$ ]! h
/* ARM 中断初始化 */
/ U( F$ ^) y* I$ X/ q t6 \
/* */
1 A" s# W d7 [* z
/****************************************************************************/
# \2 @* z$ w' _- { ]
void InterruptInit(void)
) h! y( H2 U3 U9 u
{
3 K$ D" F$ p' h
// 初始化 ARM 中断控制器
% L* F3 H2 p6 P# D9 ?6 P
IntAINTCInit();
; |( H5 E) V2 D3 d2 [
% m: [# x/ S* ^6 E' \
// 使能 IRQ(CPSR)
9 n. X* E7 j, a; i& B N4 D$ X
IntMasterIRQEnable();
8 S W: T& | s7 T
# e" U7 f3 W) @/ y5 b0 U
// 使能中断(AINTC GER)
3 I7 K7 [7 T N3 v
IntGlobalEnable();
! J) E3 O! a% ]. [- u7 \
3 q8 x6 W. K: j. q% r S ^9 q
// 使能中断(AINTC HIER)
! F+ b) s4 i3 c0 B8 u! u
IntIRQEnable();
: k2 `4 b& m0 N& w7 u$ k% e5 y
}
4 N* d$ A! F5 O, h7 W
# C" e- e H& T. ?& y3 |7 k
/****************************************************************************/
0 ], |# g/ w0 ^- n
/* */
4 P' y2 ^' l5 I: i5 U5 X$ k' A h
/* UART 初始化 */
! p* n4 @ D) J4 c; G N* O
/* */
# N: c1 `& p: @
/****************************************************************************/
: h5 g: D$ d7 A; f0 e ]- g) |/ @
void UARTInit(void)
! W1 E4 N" Z. \- A3 ~
{
- \: r, {/ ^/ |4 c& O2 f
// 配置 UART2 参数
3 v/ c; a8 @5 l( V
// 波特率 115200 数据位 8 停止位 1 无校验位
* V' u& O* Z5 H# z% ^$ `2 C
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 I5 K5 K& @0 P5 i
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: ^/ q% u6 k" E) [
// 使能 UART2
7 `+ `. K, h; f) O! q* O+ S
UARTEnable(SOC_UART_2_REGS);
' W0 K. Q; w, G/ P& g
' ]# h2 q+ R8 L5 e* |$ `
// 使能接收 / 发送 FIFO
. D9 A% J; {$ k1 T
UARTFIFOEnable(SOC_UART_2_REGS);
6 y! x% Q8 {; D# {4 L
8 J ]! | r/ Q5 f4 I9 [
// 设置 FIFO 级别
- R( _& n: m* p9 Z
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
8 {/ V+ m& r+ |4 C3 z H
}
* V# M- R7 B+ Z" u/ Z, M& o
! K" Y1 S/ a% N: s
/****************************************************************************/
8 J, h8 A6 N" ?8 L
/* */
% \; i7 f; z* o3 C
/* UART 中断初始化 */
) V' o$ j- D# t; r" l v. g
/* */
5 }1 R2 \* ^" }3 h' b
/****************************************************************************/
2 l. y7 E! A7 M7 X
void UARTInterruptInit(void)
e; r& C$ J! y' B1 S
{
; O: x4 w; p2 [% g% l
IntRegister(SYS_INT_UARTINT2, UARTIsr);
1 a2 \2 y1 K2 ? k0 j
IntChannelSet(SYS_INT_UARTINT2, 2);
) _5 l# w2 X) `
IntSystemEnable(SYS_INT_UARTINT2);
! D( n8 [9 x" c: } P! N5 H! h! a
( R# k \, i C% q N0 D
// 使能中断
2 Z( d3 f( M# L v; p9 w
unsigned int intFlags = 0;
2 F) B8 @ R4 P( n u8 V
intFlags |= (UART_INT_LINE_STAT | \
) u0 ^* a- A* T5 W
UART_INT_TX_EMPTY | \
5 H& X! I v% ^; c0 A% p2 ?
UART_INT_RXDATA_CTI);
8 o+ s$ i6 H/ l
UARTIntEnable(SOC_UART_2_REGS, intFlags);
- l9 ^, o3 J! y# u+ r
}
3 T7 j* c3 A# S( F. p3 W& F$ I
2 g! [; H% F( b
/****************************************************************************/
8 \: z) @. b& `. | x ~4 o3 w" E
/* */
# a7 {* Y9 l+ T$ J5 ?; ?
/* UART 中断服务函数 */
' ]' S$ i1 ?$ x: e/ u
/* */
2 z' s S( Y5 F" A" ~2 z9 U( F
/****************************************************************************/
2 W7 ~7 U2 V; v! }1 K3 N; _! m
void UARTIsr()
% ^; [2 N6 l% F
{
, U- a& v% Q/ C2 J9 J3 L
static unsigned int length = sizeof(txArray);
" C$ O7 \1 O# ]. D
static unsigned int count = 0;
$ V7 [/ l+ m ?9 e" A
unsigned char rxData = 0;
- N- n' p* u+ z
unsigned int int_id = 0;
9 }4 S: Y+ M( m6 I7 B" e/ Q* a: C6 B
& r/ E# P0 f @# e" `8 d; u$ M& T
// 确定中断源
}% U- E# r9 C9 V4 ]
int_id = UARTIntStatus(SOC_UART_2_REGS);
; E7 g, G- O& C* k$ F3 [
% {% @& r" D! p+ x( K+ l
// 清除 UART2 系统中断
: a. P0 B- B1 v. v2 G
IntSystemStatusClear(SYS_INT_UARTINT2);
0 e4 @- t) g2 X( {0 i" L
2 e3 S. X1 |0 @7 i7 b, L( O f
// 发送中断
+ M$ d5 D' f4 C3 R8 u
if(UART_INTID_TX_EMPTY == int_id)
) \3 v! [" b; [1 [7 N6 r
{
+ Z7 x8 O2 R; m# _# b5 E3 y9 n
if(0 < length)
0 c6 C: M& {* A' M& W
{
, \" v3 s! ]0 t7 `1 x
// 写一个字节到 THR
$ v. U& k, ^: k" F0 i7 t
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 F1 s5 Q7 y/ O
length--;
& U' j k( a% P: n9 m9 k- @
count++;
4 T) y* ]4 e, J, K, \
}
1 G2 D& ?/ v/ j, u3 |4 i6 X
if(0 == length)
) i5 C/ [3 Z1 e, {
{
9 h% J0 m" I" z3 Z# t0 Z
// 禁用发送中断
2 Q3 i6 U4 [9 c: g V0 `) U: N
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
! H" u) E! q+ D- N0 S4 l( c9 [0 j
}
% u. O8 O" J8 ?+ t2 @
}
& R3 m" [ K0 ` {
5 S4 y8 Y& ]! t2 O9 V
// 接收中断
3 \% |- }+ F, D3 Y8 K
if(UART_INTID_RX_DATA == int_id)
% e6 a9 f. t4 q$ \- q1 O
{
, ?* {- {1 {7 ~
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
' j6 y' v+ Y. ]; o( t
% l2 c3 L' q% p% _" x" ~
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
0 P8 D0 K; x+ q
}
& u& U3 D1 e8 v9 I4 ?5 r; O
! u+ L: S* o7 {8 X! E) L
// 接收错误
6 L( L- A/ I7 A5 R# m. M
if(UART_INTID_RX_LINE_STAT == int_id)
' e* c/ z( n- C2 A
{
) F0 @' P# N; M- d |
while(UARTRxErrorGet(SOC_UART_2_REGS))
$ C3 L2 W8 g( _/ s
{
' h3 B! U7 p- R# v7 i9 ^# K3 |
// 从 RBR 读一个字节
5 J! b5 `, z% w
UARTCharGetNonBlocking(SOC_UART_2_REGS);
, U) T7 |* `8 W5 O7 o7 I/ |
}
+ m! H/ Q' U) c! I' u$ e
}
8 ]7 V8 D; i, I+ y
/ F6 }3 a+ D- t$ C6 c
return;
- h/ F6 O+ e" S# X) O% h3 V# A% w
}
7 Y( J+ d" _: U u, A
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
& X( q* P4 {2 f) I+ }
如果其它设备快速给你发送串口数据,你这边能正常通讯?
8 G1 O% F& `6 z" x/ g* @
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4