嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
' `+ A1 f" D, Z9 m/ j$ o
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
o+ H8 Y1 s) g" R/ Z
+ g; @& r7 G, c
#include "TL138.h" // 创龙 TL138 开发板相关声明
; x( s+ c% O0 e# n0 @/ c. i6 r
6 S( f' Y7 g6 R: s! O4 f) U
#include "hw_types.h" // 宏命令
8 t2 d( l6 X% X c: I: w1 C5 D
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
4 m# S5 U v, b/ j
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
9 r1 T* [, O* z) X+ e u
2 Q" C3 S, y- L' c4 X. l
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
/ E6 a2 |; e" t1 b/ Z
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
# v( ?1 [3 e( e: g) z
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
2 ~9 g/ D2 N/ x0 y( q5 \/ k: F# X
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( m) S# X: o: e1 i1 Y+ A
: [/ Y" b2 |* n" A( g! ^
/****************************************************************************/
) S9 [$ r I o
/* */
# w3 `6 i* j$ f; M$ t
/* 宏定义 */
. }1 ~2 K2 K7 a" Z
/* */
* c) K2 c1 T- _" a4 N
/****************************************************************************/
4 \# |0 {' J @( d1 e9 ~3 x+ ` s$ A
// 时钟
8 y; Z1 X9 k5 m# n! g- i
#define SYSCLK_1_FREQ (456000000)
) O+ L+ g/ k. ~& ?! }' X1 e
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
6 L1 H, _/ |! E) Y& ?
#define UART_2_FREQ (SYSCLK_2_FREQ)
5 V6 X9 B% K$ D- L8 H% v$ K
% ]" H/ K+ r& z. D/ p% z
/****************************************************************************/
, T/ f, [8 c: V) ?: n& h4 i
/* */
7 J; p5 i& V/ I6 _. V: q
/* 全局变量 */
7 w7 S$ Z7 |+ t7 Z9 V1 Q* c. l
/* */
9 o7 V$ c- O) F2 L; J9 t
/****************************************************************************/
: h2 S7 A6 |; o
char txArray[] = "Tronlong UART2 Application......\n\r";
" ?6 O5 G3 x. y5 K
* C& ^. W! q4 w7 S" x' H- M
/****************************************************************************/
$ u2 N" R+ t$ o+ T8 ~2 j
/* */
( _% b5 Y) X- ~7 L
/* 函数声明 */
" j# P% [& ]: d. U- I4 y8 R
/* */
' t; Y+ l2 Y& F+ J# S3 V9 }+ d
/****************************************************************************/
2 ?( u# j- Z3 v0 _4 J4 O t0 |
// 外设使能配置
! z, m: ?! c" S3 C. `
void PSCInit(void);
4 t) s) X: P1 m5 V( `6 ~* l' a
0 Q3 ?# y( Q2 v: {
// GPIO 管脚复用配置
8 Y. Q0 T" d. @0 P
void GPIOBankPinMuxSet();
" s- b+ N& L5 Z4 ?1 Z( e+ y/ C
2 |1 k: J" |9 @( `' ?; y. Q
// UART 初始化
3 K, {' `0 K! `, L5 v
void UARTInit(void);
0 @& M t5 ~; _9 r
// ARM 中断初始化
6 K! j+ @# ]* z' n/ W% V: @
void InterruptInit(void);
( H! i; F. L4 E
// UART 中断初始化
9 k' C7 Y0 j, j" _7 S' u; X9 ~
void UARTInterruptInit();
$ }, u/ `( B# [
// UART 中断服务函数
5 v+ d1 \$ P& t* N/ F/ g$ Q4 D
void UARTIsr(void);
; A# K) K( Q5 Z
/ Z! I1 n1 [* @* B- @
/****************************************************************************/
1 a2 h8 m7 p" \9 c
/* */
5 O" R- \" R" t
/* 主函数 */
$ y2 O1 Q# y( q* y
/* */
Z4 d1 `) A* J% O C8 c
/****************************************************************************/
3 e) v. J* v& L* G. x
int main(void)
# M$ R( j3 c% Y2 ]
{
' c+ F5 M, q- K: `
// 外设使能配置
4 W! f- l- p' w
PSCInit();
+ P( M) [9 A, Q: Z' {+ W, [
# j5 w6 N7 h) x) b/ L
// GPIO 管脚复用配置
" w3 y! E" k' B( V2 g% B3 W; z* N
GPIOBankPinMuxSet();
+ f: a8 r! p( G4 N* `8 E
- t4 [- g/ L7 B6 q; B% H8 V; T/ P3 J
// ARM 中断初始化
( j* }3 l2 V0 @! t' p* v
InterruptInit();
& j0 B5 v4 k" B. N, u
" T3 v" G) J- k9 V0 J+ ]
// UART 初始化
3 ]+ N9 i! `) e4 T. q1 F+ V% z
UARTInit();
6 H7 u, |( [% ^) [2 j# B
4 q1 v% M+ _7 V/ ?& U9 Q7 W1 S3 M
// UART 中断初始化
, O! J4 W% {6 E0 |$ {& y: Z) Y
UARTInterruptInit();
. N( R* I G6 Z. O7 r
) F# `" E- A9 O. j, }3 y* W0 E
// 主循环
% B3 a/ k. C; `7 d
for(;;)
2 F! c2 I% ~( g) T$ d$ g* X& Z
{
9 o6 N0 a; I: |, h, _# G3 u
% W9 v9 V8 b+ K5 w% n! `# z: L
}
" G' J6 D4 c# U$ R* K3 }0 }
}
9 h R3 c% X/ y. u& x4 d! G
% g' l7 Z: p- r; Q1 ^# S
/****************************************************************************/
3 g, Y2 O* @1 F+ e/ }; m
/* */
6 }3 E# ~. @5 D
/* PSC 初始化 */
" N" Q7 i* c8 Q- j# m% i3 H
/* */
. n4 o# C: k4 @4 O2 ~
/****************************************************************************/
. k1 f G# S( O; B' n
void PSCInit(void)
( a) K3 b! M) l3 G
{
$ B4 q; w4 f0 ` w# U, X* \0 c
// 对相应外设模块的使能也可以在 BootLoader 中完成
+ h9 n5 h& h2 P! ^/ }
// 使能 UART2 模块
d- J8 B% [8 q' h
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
' Q: M. O' ^, ` Q- S4 Y
}
7 [7 z% O. m# d) e
9 s; u6 U3 r4 N$ ^
/****************************************************************************/
' B2 g3 x h6 X
/* */
/ _$ S" v! Z6 N
/* GPIO 管脚复用配置 */
" w9 y8 v3 Y' F6 j1 F3 a3 k* ?7 ?
/* */
# A! t) k# i c
/****************************************************************************/
9 R1 v1 {, x: A6 e
void GPIOBankPinMuxSet(void)
4 Y, A+ l! O3 w. U' W1 J7 r+ ]
{
+ A7 L1 g& A( U: ?& w! v( I
// UART2 禁用流控
. N, G5 C. {& }1 h' y. q3 Q
UARTPinMuxSetup(2, FALSE);
) l+ l$ f& g% d5 d) t( T
}
/ }3 p/ S9 I, _: g3 F5 S
; T: b/ x2 v- t7 B$ f7 e, ^
/****************************************************************************/
1 A# z0 p) c: J& D- j" j( s1 J
/* */
* p \7 |' N4 u4 `- G1 ?
/* ARM 中断初始化 */
8 \; S& c8 v/ X
/* */
: S8 ]4 N& z4 O D
/****************************************************************************/
" }9 v1 m) r$ y
void InterruptInit(void)
2 A% Y0 u0 G5 @5 Y0 w
{
0 K6 Z2 u: q- Q4 L4 ]- O
// 初始化 ARM 中断控制器
5 I; ^* O. V! E: z2 P% P
IntAINTCInit();
4 [; U4 S7 ]4 N- ^/ A1 q! ^5 h
Q/ x1 W. l7 x
// 使能 IRQ(CPSR)
' c+ [' ~8 h: z" p+ e5 y
IntMasterIRQEnable();
O/ ^: j. o$ [# c
# W/ ?+ e" C0 S7 N( l5 V; q
// 使能中断(AINTC GER)
3 S) d- L/ `9 f9 n _! C' N4 [6 y
IntGlobalEnable();
7 h7 K$ o# X& y; ?4 Y0 a
! p# w. V; a# l p
// 使能中断(AINTC HIER)
q0 |. a% N: `9 Q; j7 Y- V
IntIRQEnable();
$ F" g6 I' b1 n
}
! G: i7 w, K' K2 W
, W5 D, e! _. C: x1 S
/****************************************************************************/
' V& H0 X# W0 g1 y9 p
/* */
7 B; A _# k$ P8 _3 x2 k3 A
/* UART 初始化 */
! w7 Z/ S+ K; t
/* */
6 J! M6 K. ~6 e C
/****************************************************************************/
4 Z& }% ^4 P6 x# a3 J
void UARTInit(void)
0 ~' P* g7 U* S' s
{
' Y3 I4 Q0 F* h9 w; _
// 配置 UART2 参数
, O( ~5 g. r0 ?9 {4 Y
// 波特率 115200 数据位 8 停止位 1 无校验位
( d& a F; i' M& P& g8 a
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
. X+ F6 j4 m+ S7 C/ X6 k. [. n
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 y$ u# A9 q; H1 V9 x& |# u
// 使能 UART2
1 U3 @/ \, E- c! [9 `
UARTEnable(SOC_UART_2_REGS);
6 X, R4 `8 `$ ]' S- D( t
# C$ O$ H5 c( V) N9 p
// 使能接收 / 发送 FIFO
& o8 z. z& U7 u9 R% E
UARTFIFOEnable(SOC_UART_2_REGS);
. T8 C; e- z0 \5 k7 W' e
! J' F A8 Q" I) {2 `
// 设置 FIFO 级别
+ G/ H* h# p% X5 c+ P! y% @
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 s0 q7 g7 h0 y7 m# ]' `
}
" T4 v7 Z1 e, L7 f2 C
) t$ ^* t7 ?+ {. E' n6 I7 ?% c
/****************************************************************************/
) Q; u" q+ k. K
/* */
# [5 g5 M5 ?; o4 r- z$ S/ j& H
/* UART 中断初始化 */
. s' b, z- `" @7 m7 L6 @
/* */
. {8 P9 m6 l2 P z
/****************************************************************************/
8 C5 P. n' `6 H: w: |
void UARTInterruptInit(void)
6 @ B$ g7 n' W4 ^, F6 ?' A3 t, s
{
|2 o4 M+ Q# \2 O( X: o
IntRegister(SYS_INT_UARTINT2, UARTIsr);
: x4 j# ~9 O# \+ P
IntChannelSet(SYS_INT_UARTINT2, 2);
- G- D3 S" M" g7 p9 c+ h( p
IntSystemEnable(SYS_INT_UARTINT2);
! l8 o j* f' k7 D0 D
% G6 L3 r: ~4 u6 l0 G. N
// 使能中断
( M- f8 R- |7 y& G8 r, S; r( \3 Y
unsigned int intFlags = 0;
3 _# L* I9 p. r/ l% l _( p9 I7 @
intFlags |= (UART_INT_LINE_STAT | \
) W0 v3 |4 p+ `% M, T6 o/ ^
UART_INT_TX_EMPTY | \
, o9 q% }# b' U6 {8 P
UART_INT_RXDATA_CTI);
. ^7 |7 a l( F N
UARTIntEnable(SOC_UART_2_REGS, intFlags);
) a6 A9 L! }" N, g: i- ~# a
}
* A8 ]2 L6 y h8 |/ s
- A8 a1 F( j- q5 K& a" }5 L5 z
/****************************************************************************/
7 P- |5 l. Y+ f, b# P t
/* */
* p; {" s' c3 d4 i0 N
/* UART 中断服务函数 */
# a6 C/ u: W/ V/ U7 l1 Z
/* */
; p% L# p3 S$ J, y
/****************************************************************************/
/ K3 r, b0 V0 k$ l0 Y J" v
void UARTIsr()
) {3 j3 q& ?1 S# R; y: M
{
: j5 J! E0 h6 a1 M
static unsigned int length = sizeof(txArray);
- K; a8 u1 t5 w+ ^% R% U
static unsigned int count = 0;
0 O' s/ |7 u+ ?& M N
unsigned char rxData = 0;
$ x( Y. P. y. j6 A+ g0 q4 ]. p- U
unsigned int int_id = 0;
% M( s1 U' U5 }$ |2 H( u+ w Q# ~
+ p. y7 n# t: z- t# q
// 确定中断源
3 X1 K4 c/ B% B( j7 [1 g, y
int_id = UARTIntStatus(SOC_UART_2_REGS);
" v: P$ s3 R( v5 H' `
4 J6 i3 q! Q9 M7 k" r* v" f' h" d ~* \
// 清除 UART2 系统中断
& p' q6 K, M: L
IntSystemStatusClear(SYS_INT_UARTINT2);
3 V" m1 u, t0 \* _3 u+ J$ a) o
9 I3 Q! h. p# {+ `6 {# }
// 发送中断
3 a* ?0 Q, |* h' f
if(UART_INTID_TX_EMPTY == int_id)
5 E0 q+ i1 q/ A2 _
{
7 \4 z4 ?2 c `. t( P
if(0 < length)
' G) w* k- L8 Z
{
/ i- h1 f7 K% o/ ]6 p6 V# x/ y
// 写一个字节到 THR
3 @6 u: E* ~% l
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
* S ^2 q! O2 M7 ]9 g
length--;
6 C, d7 B1 X3 a) `- E1 e
count++;
. b" j" Q8 X9 i+ k. V# q7 x* }
}
$ g% m3 _% R( Q
if(0 == length)
& X% {7 _' u/ D
{
s) `" v! M9 w: V$ {2 O3 h9 f
// 禁用发送中断
3 e( X8 A }( O. t$ c; k: o
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
9 b# b$ w! c. `6 ]+ Z
}
$ H7 w7 C, F5 a9 J3 U
}
4 R' [/ T6 A5 p$ _ C
8 d2 ~! Q+ d3 @+ z6 q
// 接收中断
- W$ A8 m2 i. H* V! n
if(UART_INTID_RX_DATA == int_id)
/ I! ^$ \% U7 \! d- a' {
{
2 b2 {6 H! x! k* H3 D8 R
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
- I5 Q- y: Y" T( L6 k+ i
/ v5 G9 U1 m. g+ v* q% E
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
6 q3 b/ U2 |& N' o/ e3 y5 i6 L
}
8 q. _% ~* `; a' L6 U4 _3 w" {
5 T! p: v/ S5 Q7 b
// 接收错误
+ ^2 I8 ~) f# a3 N$ f
if(UART_INTID_RX_LINE_STAT == int_id)
; q. X( A& h0 ^! k
{
4 C4 U, t" N7 o' y8 n5 @# h
while(UARTRxErrorGet(SOC_UART_2_REGS))
& ?5 k7 u' l5 w$ u* k( n
{
& ]/ i. H& [6 N/ H6 S
// 从 RBR 读一个字节
9 e) B4 r' I. ]# Z( ^( P
UARTCharGetNonBlocking(SOC_UART_2_REGS);
; h* Y( o/ @. C9 c
}
1 G9 ~3 \. [' H1 |% E0 @
}
5 ^( M, K% z0 [( u1 H r
( D- n. \$ F, C8 U! J2 F8 [
return;
3 k# r/ h; O7 b
}
, Z8 Q" T% B4 b/ X2 G6 e
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
8 s4 a# x5 j* r3 J' b8 E# I
如果其它设备快速给你发送串口数据,你这边能正常通讯?
; f* H* ?4 ?' e, _+ |7 e9 _
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4