嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
0 M, W" w( r6 N7 r+ T6 s6 J) `2 Y
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
$ A/ R2 i2 j# h5 G1 d# L9 F
+ o# J7 T7 Y' O
#include "TL138.h" // 创龙 TL138 开发板相关声明
2 \, z# v; Q( A, f% y2 F3 i- P. j
- B7 C2 c' M- y# Y3 T& `
#include "hw_types.h" // 宏命令
5 V& N, V4 v3 H7 Q# A* |& p2 Z0 ]
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
- @* M u: M k
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
) ?$ |/ |; n z1 c& W. d* ~) S( d" e
) D% ~# ^7 B9 U/ h3 O) C1 C; x
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
3 r9 r9 ~) m( o6 P
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
8 ?/ ~+ v. i' y. u7 ?
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
( P8 r9 G$ Y" L6 v7 F7 ?
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ G3 O% l7 S+ W+ P
; R2 L* m) E6 X: \
/****************************************************************************/
. \6 | _8 z' |0 H8 _
/* */
/ Z( B, ~" g; K# K" S* s6 N
/* 宏定义 */
4 M4 ?( c8 g2 ~
/* */
2 d/ Z* H0 n, b/ B7 f8 F9 X! P
/****************************************************************************/
( x. o8 ^6 W7 J2 h
// 时钟
" t( V, P2 X2 S1 \, e$ B# m b* ~
#define SYSCLK_1_FREQ (456000000)
6 Q7 d8 D2 J5 h/ n, Z9 Q1 G
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
# I0 T; ^( X8 Q2 T: K7 V6 c* u
#define UART_2_FREQ (SYSCLK_2_FREQ)
/ L! k( p5 I) i6 \3 Y
* X7 M4 R0 ]6 n9 r
/****************************************************************************/
; b* g0 T6 i+ }7 v$ V
/* */
7 k0 e. l# {( I) v
/* 全局变量 */
# I+ `0 a- ~# x9 R# n0 ^; s
/* */
" G1 n! s. F l" b/ C1 g9 J! O- |6 c
/****************************************************************************/
7 F) ^5 j/ U0 {) ~6 ?
char txArray[] = "Tronlong UART2 Application......\n\r";
0 Y7 B. _% {: H7 I
' G# D' S) P( b
/****************************************************************************/
3 P4 s3 E$ G$ b* T. O
/* */
! z! b* ~6 M. u# V( R N* \
/* 函数声明 */
. m4 p/ z3 E! d# U& O4 w. Z; Z
/* */
. F7 j3 O" W/ K/ p! ?. @1 t! a5 p+ N0 v. e1 Y
/****************************************************************************/
! C4 E4 E6 H. t) m: l v% F
// 外设使能配置
2 q3 e. y2 G) a7 ~9 ^& F! I# P
void PSCInit(void);
5 z/ T8 f9 k2 P! I7 v2 P
8 D) B2 j, I4 Y/ I
// GPIO 管脚复用配置
1 @7 m( e" O/ i0 E; M( E4 p5 b H
void GPIOBankPinMuxSet();
: T/ @, X; M: ~; S5 X$ l# k
8 i& A& ~6 Z$ M: Q: E' T2 H6 A" Y4 x
// UART 初始化
9 u5 e3 F! g+ p( N- M
void UARTInit(void);
: S. d+ ^! c! a+ G: s7 \
// ARM 中断初始化
$ T! O4 ]5 I: I m/ B$ w! G
void InterruptInit(void);
* P5 x* b( Q; G! A0 n1 a
// UART 中断初始化
# j9 {7 \! ^+ ?% k3 a( E
void UARTInterruptInit();
. Y1 t/ l' Y' g; A c
// UART 中断服务函数
' |, M1 g8 b6 j3 C5 }
void UARTIsr(void);
/ b5 r7 Q; U; o
?- N! w5 A+ V) [5 R3 X
/****************************************************************************/
1 W% j1 A3 r. M3 }8 E4 [# N7 T* H) a
/* */
7 D, s: E; }$ x* g6 O/ m
/* 主函数 */
0 Y4 ^! \4 S0 K% H( B* @
/* */
4 q' P# H, U& I8 V4 g* w- f
/****************************************************************************/
5 b3 `2 S3 n4 {* c1 R4 @6 Z
int main(void)
! W1 s: ~2 V/ \
{
: F* R' M+ `7 v# w+ N2 y5 ]
// 外设使能配置
1 ~7 q* l1 c8 Q* ?! w
PSCInit();
! d2 \* e7 b4 ? I5 Y
) C. n+ c' j7 g$ r; a: c
// GPIO 管脚复用配置
( @2 ?$ O0 `/ D& t6 [, M
GPIOBankPinMuxSet();
' P0 j! A6 o+ z; K: r2 v
# g6 H+ {; }' ]6 l
// ARM 中断初始化
- c& r/ P$ y, G
InterruptInit();
1 S/ p- f+ f4 f) y& ~( W3 e2 u
1 N; v, E0 \+ o' n
// UART 初始化
6 i$ L9 n9 c& o0 `) N( Z
UARTInit();
# I5 \" p% D% C/ J3 h. |
5 s# Z9 d) Q' L" S
// UART 中断初始化
3 t8 B- W4 S$ k- [" `1 P" w
UARTInterruptInit();
+ R0 g" [ C' k+ M9 c& S1 J$ Q8 z
. j( G) c" K4 ~4 `: l! l3 \6 t/ ]
// 主循环
1 W* t% z6 U+ k M# P! P
for(;;)
: o. a& ?. M& M/ V; j
{
' _7 y* z( }$ f# v
: j+ Z* H% O- r( }) v
}
0 Y( b/ z% b2 e0 L; `
}
" I7 R1 u& B: V2 o# t9 u5 g
/ Q+ K- J( Y! p% w
/****************************************************************************/
+ u( p( y; z2 X4 ^. m) g2 i9 ]8 V. a
/* */
& U: b! G2 }1 J) M) V2 L/ ^
/* PSC 初始化 */
# a- V$ |5 Z% L+ O, o& d& b9 y) E
/* */
1 @9 v3 ?" t0 c+ _, g
/****************************************************************************/
* o: g q. P. ?! O# e2 I. V& [/ k
void PSCInit(void)
3 c2 M( ]5 v) Z
{
8 o2 q4 J9 ` A: v9 J3 l. `( C8 E
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 [- T: [3 ^3 e* C, ~; m
// 使能 UART2 模块
; _- d' ]$ p! J9 S8 k& s D; v8 _5 Q4 {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 ]- i1 n+ }/ ^
}
1 D8 \" V" h }- d/ \1 }3 j
- P: U0 D9 A! i. r
/****************************************************************************/
2 m% j( u% O7 h* f ]. Q. F
/* */
3 ?, A, ^" J$ b% g) ~- W- S
/* GPIO 管脚复用配置 */
$ F7 ?' x8 q( o# a% ~5 K- X
/* */
) A) h& g; R4 \9 J
/****************************************************************************/
& ~: G* u2 ]! J
void GPIOBankPinMuxSet(void)
7 Y( J( S1 L- a$ `
{
: ~( {, H9 H" {/ @
// UART2 禁用流控
3 n) E T; I, `$ a( l; x: }
UARTPinMuxSetup(2, FALSE);
, J0 n3 |4 V. ~1 l2 c6 \ I G
}
2 l0 E# ^0 F* I3 | c L
1 p0 N$ c' s5 T3 s
/****************************************************************************/
6 l* `7 z1 k$ ?3 A5 y" \* {: n) [0 x
/* */
* t7 v* F6 D3 j E8 R* k
/* ARM 中断初始化 */
5 E" T# w4 E1 O- C
/* */
! ]" x( C, [! ^2 ]
/****************************************************************************/
F' k; K0 r- m# C' q# I! V
void InterruptInit(void)
. D8 V3 _2 F [6 X+ P
{
F6 j$ R/ J- |3 i% F
// 初始化 ARM 中断控制器
$ S4 M4 |$ T0 A
IntAINTCInit();
9 q; |; @# ?# S- g& o/ h
$ y$ p/ x7 I7 h
// 使能 IRQ(CPSR)
& }- H" O5 R0 @- a' k; ^; d. [0 Y- b @
IntMasterIRQEnable();
1 i) G: V" ?- J: l/ a- F
' Q- B5 {- A& s2 n) _% Q
// 使能中断(AINTC GER)
$ y2 z. B) e( R
IntGlobalEnable();
( x L1 \* ?- W2 m) v1 m
6 ~6 R& C" _( n6 ?% P
// 使能中断(AINTC HIER)
) P% s% z, f3 o& c$ m
IntIRQEnable();
# f9 ?. l# j { `( o+ e
}
3 s5 f8 T. Z- t1 h4 u% ?
3 U# ^( ^9 W, c" ~% C4 [
/****************************************************************************/
. k7 Y0 n5 G1 z8 g
/* */
$ \7 g4 A5 O5 o. g# e# h: U
/* UART 初始化 */
7 o$ b' p+ d3 h' r; c; T! b, s3 T
/* */
" z/ b7 `3 E! c0 h8 e2 a6 j6 v8 S
/****************************************************************************/
+ m, B* `% K) C% K3 q
void UARTInit(void)
$ \; E. c( x& n0 X4 |' r' v
{
& k8 M' ? K6 t: m& c
// 配置 UART2 参数
: M5 C% ?; x2 f( F' }3 h
// 波特率 115200 数据位 8 停止位 1 无校验位
) @1 u8 I+ c/ ?" L2 f0 V$ V
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( E8 E: B. k, p9 S) P. R7 h$ h" O
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* K" Q) N Z' G0 i7 w5 W" _& t
// 使能 UART2
% _5 `* v1 |8 x$ X: Q$ G7 ~( y1 w
UARTEnable(SOC_UART_2_REGS);
$ e" ^% I: [* b, e4 ?9 v
2 \& J; c X9 R" P
// 使能接收 / 发送 FIFO
$ G( ]* q$ L0 L- W* G- k, F! j
UARTFIFOEnable(SOC_UART_2_REGS);
$ P1 A+ @* h, o, E1 U
8 k! H$ d+ A6 {5 g) |) f! W- _ C* u) l
// 设置 FIFO 级别
% h0 H# ?* I8 J' e, X; X# E7 |
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
0 t9 i6 ]& @7 {; L# j8 B# \
}
$ |: \$ f4 z( [9 s
! N8 Y! y# d, d9 ~" a7 @. G
/****************************************************************************/
. e2 B# r! @* E! g S+ ]6 u
/* */
8 `+ r( `& O* p& d( p
/* UART 中断初始化 */
I/ c7 g, b7 L O6 R% b0 [3 n6 S, h
/* */
7 d! m" Z$ n; L$ R1 V( o" T- U; c
/****************************************************************************/
2 J) Z7 t0 T' Y
void UARTInterruptInit(void)
3 W& H/ M* K% t$ H$ ~8 Y. I7 z
{
y. L3 O6 @5 L8 g- M# r1 a
IntRegister(SYS_INT_UARTINT2, UARTIsr);
9 G# G/ c' ], ?* Y% Q
IntChannelSet(SYS_INT_UARTINT2, 2);
, f) \) J: ~# L6 i
IntSystemEnable(SYS_INT_UARTINT2);
* T6 p: O; z. {" z: o" \
$ }0 X( _9 I! R
// 使能中断
6 U5 u+ o2 X. K
unsigned int intFlags = 0;
- S1 W; C d/ H- I
intFlags |= (UART_INT_LINE_STAT | \
# L) `0 z( ]4 p& V& d5 @
UART_INT_TX_EMPTY | \
0 O* K! W$ J4 d) R d: p/ P7 C
UART_INT_RXDATA_CTI);
& O4 g; _9 y5 R/ P; j/ o
UARTIntEnable(SOC_UART_2_REGS, intFlags);
( U& g" K- n+ w! }! ]
}
% W7 \( l! L! f& I0 m
7 C8 F8 p% D' j0 M# Z- A8 i' o
/****************************************************************************/
# l$ t) v' y% F. z ]4 I
/* */
' l; W8 [$ _! K" H3 x
/* UART 中断服务函数 */
3 W, n; J# g$ C. {6 m2 p
/* */
* [* h1 y4 }/ L8 q3 x
/****************************************************************************/
4 G3 L; \& D9 q; C6 K O# }% z8 v
void UARTIsr()
- D+ A; `5 _, ]. O0 {+ E8 j
{
; g# }, }: T! h
static unsigned int length = sizeof(txArray);
! O4 p+ ?- v' g9 o
static unsigned int count = 0;
t& v) \8 |, `
unsigned char rxData = 0;
t& E& V7 c( _( Z
unsigned int int_id = 0;
8 W1 H& _5 w, i, H6 ?/ X' N% d- p
8 W% {: a, G( O$ h3 x
// 确定中断源
. q" L" w- H& S$ Y: ^6 K. V
int_id = UARTIntStatus(SOC_UART_2_REGS);
. H% n9 N$ D- }; C* F5 F/ s7 u
0 N3 A" Q# Z7 u6 h7 k' F6 K
// 清除 UART2 系统中断
( ^7 {3 K( O h
IntSystemStatusClear(SYS_INT_UARTINT2);
* ^; w* m( H% ?, S6 T( k0 d& [+ ~
- c, G6 `1 _9 V9 O1 a% [0 a
// 发送中断
% q* Z L( Q9 R9 D1 C# i5 D* Z
if(UART_INTID_TX_EMPTY == int_id)
' l \) M" j, y. A
{
; F6 o8 q. }- ^( X7 x3 Q
if(0 < length)
; j! T& X7 A& j9 e- y$ L+ C1 h
{
# B' E! L7 Y4 F' T7 X! D/ u! D9 D
// 写一个字节到 THR
" s. u$ X& p5 ~$ ~5 `( O
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 q& p' ~, F8 e% m/ s5 b2 }; }
length--;
7 c2 I8 M/ N: R# S0 [/ S7 e
count++;
( k1 Q6 B. N9 A* c" Y
}
8 @; X( S; W& U& P }! x
if(0 == length)
5 w) P. j$ w* j2 W0 a, P* C
{
3 L+ g$ l2 U2 O' L- Z; }
// 禁用发送中断
' d) {) Q% y5 k3 Y
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
! ?& u9 d0 q" o1 C2 Q5 N; y2 C
}
$ J0 A8 \. j6 ?, K4 }
}
0 {7 h: a% B4 ]: I) N2 R
% o1 ~6 T) s) m# k7 R& {
// 接收中断
" e- x4 O" `# k0 j8 B* T! S" {
if(UART_INTID_RX_DATA == int_id)
( g9 e6 T2 J; }1 @4 \' o* m r
{
- V. H$ ?& p; s4 _: E+ k* h* i
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ F; P' H5 @. y; l
0 R* g! Z+ a# d- U3 g9 q: O' T
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) H# W2 P2 Q8 n3 a. p7 O
}
4 ~- G; l C% z" z+ h0 Q ^
' U {! W& v0 _1 {# ?
// 接收错误
# U) w0 b* v& U6 q* ^
if(UART_INTID_RX_LINE_STAT == int_id)
5 }+ O1 G! [0 k( H, s9 R: W
{
# A" a7 M* ?( ^! W9 @
while(UARTRxErrorGet(SOC_UART_2_REGS))
' L5 f7 R9 Y1 u a$ x- T
{
+ x; i9 \( t/ m) r
// 从 RBR 读一个字节
; H ?6 w! }0 c. C* P
UARTCharGetNonBlocking(SOC_UART_2_REGS);
) d; D) `5 U( T J* N; P0 D
}
4 _" A! B/ Y7 a* Q5 I7 F/ u$ Y) p
}
' v! e$ L0 w$ n- ]
% Q M1 o9 y. u( r' \; @$ i8 d' M
return;
: i1 S4 Z# R0 i& ?' R0 H
}
* l, {* R6 W; \1 o$ v! X% Q
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
; q( ?% `; @0 r N) V8 s
如果其它设备快速给你发送串口数据,你这边能正常通讯?
# r" r1 ?$ K) T8 i
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4