嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
# J* J" ^9 U7 x1 F9 Y3 K; B% m
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- w4 ^ W+ j- c. c: o1 }- f
, Z# u; j! A) T$ X! n" ~- a
#include "TL138.h" // 创龙 TL138 开发板相关声明
8 T0 E: b8 ?5 u4 k1 T# ]
3 b" L* X; T: e6 h5 ? u2 _: ?
#include "hw_types.h" // 宏命令
# E& j! }* [ ?7 p
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
7 y/ c$ w; o, j1 F
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
* I7 }: b) [! ?/ G% G
% }. g. @# ^7 [6 E6 Y; ] C+ k7 q3 L
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
5 p% k$ R3 @+ v; `* }% D! D
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
0 j8 |- Y, i! b7 }; h$ V
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
6 D$ T! D* R+ W* h' w' E7 m7 q- B2 v
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
! x0 M1 @8 N8 I$ X' ?, H
8 |8 S# n2 H5 O. k; @6 u- }
/****************************************************************************/
R5 n. Y1 S( X- r
/* */
2 t; L$ n. t) s9 K% L3 m
/* 宏定义 */
+ B+ [$ \9 r3 R& o z- N
/* */
& x) Z9 `: ~% W2 T+ C ?3 Z3 d
/****************************************************************************/
( w* P! W5 v Y. e% q# T: u
// 时钟
& F c0 n4 \& k7 }
#define SYSCLK_1_FREQ (456000000)
/ u$ J7 ?% ?, n+ ^* \) F
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
! @1 @: f8 {) _" W: D
#define UART_2_FREQ (SYSCLK_2_FREQ)
# K0 i1 H( d1 ], N5 C5 U, _' a3 v
& y! v4 l% L) p, v9 p' Z( @+ d+ e- `" c
/****************************************************************************/
1 V. S& }; \$ Z( F+ m
/* */
# F0 }' v/ o# ^( E9 {+ L
/* 全局变量 */
( [" a- V: Z9 y
/* */
. a- l* U; K1 b' k& k" v8 `
/****************************************************************************/
* ?' r- _" a' ~1 T- A
char txArray[] = "Tronlong UART2 Application......\n\r";
8 f/ b) s2 D# y- f& q& m
( r/ j" ]& Q) m0 {
/****************************************************************************/
. ]: r! z# Z$ M3 H
/* */
/ N: W. Q) }7 i
/* 函数声明 */
& z7 O/ u. S( o: v
/* */
" a) H' x4 B# g1 `$ N K
/****************************************************************************/
1 X1 D5 t$ B4 q4 b" K( s, L+ {
// 外设使能配置
- T: ^% g; h$ k, c
void PSCInit(void);
0 G, d$ g' H7 x
0 T/ x% E: ?7 t1 _- ~3 {3 f: i9 O
// GPIO 管脚复用配置
. H6 K4 J6 Q5 a: A. C$ f+ y) D: V' |
void GPIOBankPinMuxSet();
# b6 }; h0 r1 l" W
3 A9 C4 {, ^. B3 F) j2 a! Q/ H. U
// UART 初始化
- u# x" m# x( c- N
void UARTInit(void);
' p- g6 v$ L/ o* s
// ARM 中断初始化
* w; k5 a+ w' ^' k8 H5 Q( H* E
void InterruptInit(void);
; s& ` e |& i* \# j# V
// UART 中断初始化
: s0 S1 m5 Z+ p
void UARTInterruptInit();
* c- n" b; V3 \
// UART 中断服务函数
( t) e, B( A3 M! F2 _2 f* V/ W5 U# S
void UARTIsr(void);
7 }! ?, ~. h5 d$ i* r
% u A% i& j8 b' {" d E* m, r4 F6 B. y
/****************************************************************************/
" Q7 p! {# _& i/ {) T0 F1 t
/* */
, h. i* F5 d) h: }2 y6 m
/* 主函数 */
' q: c7 r5 k- |$ p
/* */
' y$ ~% a3 z. R8 {6 w( A9 A$ l* V
/****************************************************************************/
& B( [' F [8 k# f0 V1 ]. h
int main(void)
9 w' J7 J) ~: A
{
8 K* p$ H" ]+ r) }0 x+ @
// 外设使能配置
3 Y* C \4 t! X6 y7 f
PSCInit();
3 ~( Z* m, ^3 Q6 G% y
' p1 n1 z" L6 j
// GPIO 管脚复用配置
, z+ y4 M9 w* k( F; |6 R/ b
GPIOBankPinMuxSet();
' p& |( x- D' j* A; P0 N% [' E' I
% _ z4 {% M9 i: _% p$ k
// ARM 中断初始化
?( j0 X/ t5 l; y
InterruptInit();
X4 Q9 d V! w x0 w
4 B5 D# s7 M/ {! }
// UART 初始化
0 n/ Q1 _! G" v) S8 R
UARTInit();
+ G3 P' u- m4 f0 }
& X2 W' m$ M2 w
// UART 中断初始化
9 T Q+ |. s1 u% b/ I) v# q6 O2 ?
UARTInterruptInit();
' L2 K$ L5 ?. ~2 t, ], q4 C4 `
/ w1 o0 H" D( l$ r/ A
// 主循环
1 O2 q' z' ], Z' \4 B
for(;;)
) L& N% O2 L, ]* c7 \2 @/ S" P2 X
{
7 e. U) c, g; r
; w- G4 C2 O7 b% \
}
7 B" ?6 B# j; ]+ j# [5 p" ~
}
9 \. h7 S" I6 d0 {# I6 B( r2 S8 F
2 S; [+ D. S9 W6 c. b
/****************************************************************************/
0 B% J) R/ m8 \% ~' a1 M7 E5 L, c
/* */
+ V. O+ u4 d: ~% ?$ v4 v6 z
/* PSC 初始化 */
0 ^$ ]' V' [% R- s# m* I+ m
/* */
6 W# T- [* v& M3 B# ]9 _7 ]
/****************************************************************************/
6 k$ D( Y1 B7 N s8 T
void PSCInit(void)
! ^4 H9 |9 A, ^& H& ~/ Z
{
; n+ ~9 T8 b$ u6 _3 R A
// 对相应外设模块的使能也可以在 BootLoader 中完成
$ O+ l P5 l* G! U4 E4 \
// 使能 UART2 模块
. _" P) U! ~; o$ s% k$ q4 l
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
5 w( P3 I! U/ v3 T7 o" K
}
7 B4 R* T9 W" |+ t- [6 Q
# K! E+ L. ?0 c8 }# J, |: `
/****************************************************************************/
3 S6 ? d ?9 M
/* */
. `; \( j/ K* O6 d
/* GPIO 管脚复用配置 */
# Q# H, F0 x5 e
/* */
3 l0 D- k$ ]/ m4 \
/****************************************************************************/
6 q- ]. J' H2 s2 X, L5 e2 Y" L
void GPIOBankPinMuxSet(void)
* W3 Q9 n! X$ E4 S" _, @
{
$ q, J- Q) E5 n0 D8 E7 Y
// UART2 禁用流控
: p8 T A" r/ `; x5 a
UARTPinMuxSetup(2, FALSE);
7 \. N( d0 T# e' y
}
3 g/ K" D& { z& I
; z( C1 ?/ g. j' \" T
/****************************************************************************/
8 O2 S- p; I4 R [: i4 k, h* }
/* */
0 t5 H) N1 r5 w1 ~ |& E" ~
/* ARM 中断初始化 */
' r) l+ |" W5 P" v* r, Q8 y( N4 W: y
/* */
, c Q( @6 w0 t
/****************************************************************************/
5 W+ [/ c' ]2 R; E3 Z& `
void InterruptInit(void)
: O9 I" T/ F# G: K H2 g6 h
{
- A" W% J9 u- _; r. R
// 初始化 ARM 中断控制器
0 s, \+ {0 [) N, L1 g5 |! x+ _
IntAINTCInit();
! ^. d" B$ D0 |- }% {0 [) j) o
7 a. y$ W' K; b1 h1 t# N2 s; Q
// 使能 IRQ(CPSR)
7 Y& R" K3 `, [' I( l& q' z4 Y) P
IntMasterIRQEnable();
" M3 Z* v; s3 l7 N& E/ B7 D6 W! e
! X s5 G/ b# p6 ^
// 使能中断(AINTC GER)
) T; q- B6 o% x' S A" \
IntGlobalEnable();
8 z7 G, {' ]6 ~' {& ?
3 a2 P1 |! k; D7 J
// 使能中断(AINTC HIER)
1 i4 i8 l* L3 a- U% N
IntIRQEnable();
- o/ x/ l- G4 p2 }" U8 {
}
6 L7 H7 g" q" S* F8 z; {, T% j8 b/ _
9 T: M8 ?0 J; E
/****************************************************************************/
8 _4 K) n# n4 X0 q
/* */
# q; C5 D7 @& y( I7 X# X
/* UART 初始化 */
0 A; y2 `& O8 W8 o/ U- c; e* k
/* */
$ ~$ ~& u2 Y0 J% l* N& |/ g
/****************************************************************************/
; v" ]( @# I' B ~, L5 r
void UARTInit(void)
' A3 f5 L) w% K' e
{
2 Z) a' N/ D7 w7 j
// 配置 UART2 参数
7 B* X5 Q& I3 D/ k0 P1 C, ]3 Q8 r
// 波特率 115200 数据位 8 停止位 1 无校验位
( G% W! G- {" _' Q2 S2 P$ E, b( K
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
; K2 o3 [5 Z* l! A0 c
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
! g0 b8 j6 ~: e2 [; }0 n
// 使能 UART2
) P1 s! ]( L! K: j: Z0 _
UARTEnable(SOC_UART_2_REGS);
! H# S$ Z+ b; E2 P0 L
" Y* h$ I% \; S' K
// 使能接收 / 发送 FIFO
) f' ^# I' Q# J' B8 H; j
UARTFIFOEnable(SOC_UART_2_REGS);
" S) n) }' `7 e3 S# F
$ o5 ?( k! s- \- R q4 c. {. g
// 设置 FIFO 级别
! l2 [6 k* D) q, {
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
8 r! ^% W J" v9 l. f9 M9 \
}
/ i% U9 U/ D! l, \ b
: u' o; W) H. B
/****************************************************************************/
' }0 J: F8 X2 `" T p+ V8 r
/* */
+ }7 T) H3 |& r& W
/* UART 中断初始化 */
4 K) @1 ^* C3 j, s* U+ l8 p0 ?
/* */
; c2 @1 i, A% l/ P9 i! s; b
/****************************************************************************/
8 n% s! v2 s$ G9 ~
void UARTInterruptInit(void)
/ b4 Q y5 t1 \* q% G( _5 P
{
5 e' @+ z: J3 Z' Y( ^! M2 d
IntRegister(SYS_INT_UARTINT2, UARTIsr);
4 F) ~6 g- k# J9 K- C- [
IntChannelSet(SYS_INT_UARTINT2, 2);
3 M1 K" U) T6 U8 N/ ?
IntSystemEnable(SYS_INT_UARTINT2);
" Y! x+ C: z! @# O. y4 S7 _
1 i. L' z0 z3 h5 J1 m
// 使能中断
0 e. i$ i% X, s2 W: h& J- X
unsigned int intFlags = 0;
& {/ Q: z) G( T; o' W
intFlags |= (UART_INT_LINE_STAT | \
# B9 L3 {$ Y8 R" D0 ~% p0 ?
UART_INT_TX_EMPTY | \
6 q7 A8 ^" h9 W# e6 y
UART_INT_RXDATA_CTI);
w2 H4 o. y. ^
UARTIntEnable(SOC_UART_2_REGS, intFlags);
& [: B3 c, k8 \. v5 }2 |( e( e
}
% M8 Y; Y5 W9 `
1 s' j" Y. f! V' j
/****************************************************************************/
1 n+ g- a$ g! U' b4 d
/* */
& j. `; t* b% {1 [ l
/* UART 中断服务函数 */
/ H: a4 h" R3 h% v+ d
/* */
4 K! r5 I; d; M- c( a7 E8 z- I
/****************************************************************************/
6 {0 ?/ u, \" z8 s7 U
void UARTIsr()
$ A; l( v" w: }2 r4 l) V
{
" m- D3 r, _% T% K; s) r
static unsigned int length = sizeof(txArray);
1 k/ Y9 O8 X, g1 b
static unsigned int count = 0;
5 z# W+ ^, r1 J, h
unsigned char rxData = 0;
! t; c5 T& @2 y+ C% ]! a
unsigned int int_id = 0;
+ }( W, W( k4 T# u9 Z. j
: r* l( C& {# L* ?. L
// 确定中断源
8 d: i5 a" S- W! i
int_id = UARTIntStatus(SOC_UART_2_REGS);
3 o" w0 T1 G5 k: j
/ @0 C, n3 }- m0 U* D5 X8 `
// 清除 UART2 系统中断
& _2 ?! L1 N6 ]/ W2 m6 ~ v* x
IntSystemStatusClear(SYS_INT_UARTINT2);
; F# z0 R4 _+ z- `% N u0 p4 D
( E" X/ E! u6 q$ n6 l% T0 B
// 发送中断
! e7 u" c( v1 P" k, |4 Z4 N: ?
if(UART_INTID_TX_EMPTY == int_id)
" k6 z# z! T( i9 H" o
{
" @3 \* ?- t; L& F( B# D( y
if(0 < length)
5 q' D3 C0 |7 z: ~/ {
{
& O$ a3 Z$ Z! p% p
// 写一个字节到 THR
& H0 c) N B0 ]+ e, S
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
0 H+ q4 w0 a6 z! f( x
length--;
% g$ U: s& p. h2 s% Q
count++;
2 [3 w, g; L( u5 g# \6 D& D& ]- e
}
8 V6 p1 t* ]- `0 \: {- s
if(0 == length)
: k/ ~2 j0 V3 B, z* f
{
& k; k; k% g/ \2 l4 r7 b& `4 N+ n1 ^
// 禁用发送中断
% q# ^0 t' V1 E
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' e3 U: }: z$ d- i& x7 H/ O
}
& m3 ?5 @9 a# I0 p
}
% w) k# F* Y5 F5 s" W
; A {6 S% c* `6 Z O
// 接收中断
) c. {1 W3 p( ^5 N& ]4 b
if(UART_INTID_RX_DATA == int_id)
1 i1 }8 e& Y8 ]
{
/ c4 m* x6 S$ F/ U
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 q, k! {9 |( R% n
7 j# N: V- z$ M i' x3 M
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
2 |8 a9 T$ V/ Y
}
/ o5 A3 {5 W6 t h3 `7 O' ^
" l4 I: u/ r2 ~- i/ y. j S$ C
// 接收错误
! C; w1 W) b$ F) J/ M
if(UART_INTID_RX_LINE_STAT == int_id)
1 t8 h/ m1 D% Z% F
{
' H, @6 ^; F5 r* f
while(UARTRxErrorGet(SOC_UART_2_REGS))
+ U6 I; }: }1 \7 X
{
0 X, n( B: ^8 J7 y$ A$ Y
// 从 RBR 读一个字节
, o. @6 K) k% g- j4 Z9 u4 E
UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ T7 N6 W$ o# q: i) q8 _. B/ Z
}
& d) x, c6 q4 |% T R/ n4 O
}
1 j' T+ ~( M. S4 ?' C2 Y4 ?
* D% b+ U1 _5 }* k$ o
return;
! v" u8 n- j1 Z
}
1 I4 i2 f3 t+ r% n9 I" l
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
7 \2 M9 q: ?+ Z5 \- W5 a# F9 R, N
如果其它设备快速给你发送串口数据,你这边能正常通讯?
" F& W8 A- F# i/ Y
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4