嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
9 y8 I Q3 Z! |$ ]6 b7 f
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
7 s; i6 u1 E/ d- h* E/ m
) o. w' M9 s: Y7 b! H E
#include "TL138.h" // 创龙 TL138 开发板相关声明
/ `) l0 U3 G: w) Q
; `0 }3 I& }; o; A; n& u4 K/ D
#include "hw_types.h" // 宏命令
2 P v) L. b. l
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
8 {1 r n6 l, J" c' k& h0 H
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
T/ L/ E. T' D% V9 @+ n- ~
7 i2 V4 @/ V1 p! V
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
9 L/ n M% ~1 k! r" k
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
" g* F6 G/ B2 C& Y; V5 m# J: R/ g/ y
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
0 e" }' q4 R* _% O+ p
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- [' i7 g! U2 C% W! N- X* c
2 V6 [% b1 F+ \4 |
/****************************************************************************/
3 `' G' S! ~: [3 ^$ X& a
/* */
Z8 G- q' ^6 @1 s L' r
/* 宏定义 */
7 D# s1 }- Z/ u5 r. @
/* */
2 C* f8 N! g8 T
/****************************************************************************/
' I! _8 C5 @/ q$ G
// 时钟
/ `6 H l4 V O7 R0 u9 R
#define SYSCLK_1_FREQ (456000000)
( R2 _, b9 y$ }: G4 c& l3 E- [1 h
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
8 I2 l7 N7 c2 h% A; a. H
#define UART_2_FREQ (SYSCLK_2_FREQ)
6 Z( z" R5 O2 C9 X
: L1 @1 J% o7 K$ t
/****************************************************************************/
, x* o V7 ~9 P8 e( f ~
/* */
% a: D7 Y; S$ I: d
/* 全局变量 */
, v& w) Q$ j# L6 \8 `
/* */
3 a/ a4 I5 j' a
/****************************************************************************/
4 x# o' [( j1 h: t0 l
char txArray[] = "Tronlong UART2 Application......\n\r";
7 C- r8 @7 x: s" m6 Y9 M
]9 ~4 k$ K9 u5 z2 L% @
/****************************************************************************/
" V) N; O9 }( Y9 I0 ?( a
/* */
& X" j. _6 f8 L, P; m
/* 函数声明 */
7 x: z/ o! T: X8 Q
/* */
# @( B6 a6 G ]+ f& u& Y
/****************************************************************************/
- L, @) z" I+ [0 \6 m0 {4 M' W* d0 |
// 外设使能配置
% T/ X2 f; W4 s$ X/ g
void PSCInit(void);
& B5 n- H. u. y8 j& Z1 o- g( \, [
& |5 k. c) Q0 Y2 K1 _" u* N
// GPIO 管脚复用配置
, E1 \; p9 _7 V4 L; c
void GPIOBankPinMuxSet();
' k! K/ c6 V& h
) D+ ~: w( G& X
// UART 初始化
# ?1 K; e# t, L1 u
void UARTInit(void);
* h7 b5 q! n, L& u3 v! F
// ARM 中断初始化
0 Q: n7 i% O# f9 \) }7 ~1 m
void InterruptInit(void);
0 e) O# O7 D8 J( A
// UART 中断初始化
" g% d2 J: w/ A0 r9 l4 m
void UARTInterruptInit();
: t- ]8 I5 t1 c. r4 N# x
// UART 中断服务函数
+ B- ]% |+ r2 j. _. X
void UARTIsr(void);
1 w3 ~" v( `& r% n7 Z7 n
k, a! Q% v- H4 j
/****************************************************************************/
f7 e* v; V1 s
/* */
( p- h; j& G: c5 j/ c/ t
/* 主函数 */
- E1 p6 ]# y* e, ?6 t* B- M
/* */
8 s/ h! b, A/ s) D/ S: K, q
/****************************************************************************/
5 f" @7 U3 s/ ]1 U4 v& Z
int main(void)
- Z" \8 s2 F) N& \
{
, R$ s2 f9 Y+ `: N7 u
// 外设使能配置
' J2 t* H5 k' b5 a! A3 p
PSCInit();
9 ]/ ^$ s2 q$ K% ?$ R0 A
1 P o1 T9 B* F( }$ f' G4 z
// GPIO 管脚复用配置
0 p+ O: Q5 @0 h% s4 W4 o( r% x \
GPIOBankPinMuxSet();
1 I. n3 s1 o. Z2 `9 [
# i# ~) @6 x$ l) C& y Y
// ARM 中断初始化
, ^, X1 B3 f* H' A
InterruptInit();
# I8 _( e& B1 l1 o5 q" f' R
. m2 o U2 T Y8 E1 n8 Q6 v( a
// UART 初始化
0 _" W! _# A! X5 J
UARTInit();
/ l8 a8 s. B% W$ W
0 X3 d8 b; n4 A
// UART 中断初始化
( L, q8 H0 l: U3 V% P8 e
UARTInterruptInit();
& |: S$ R8 X9 b
7 I1 T% C& U% ~% K, ^8 i
// 主循环
, b# {, ]$ ^! W
for(;;)
M& a, F$ c: p. f" t0 C
{
. ~1 F7 L3 v0 f9 E2 s/ f4 D7 T
4 k+ k! o( N( m* y* y3 W
}
+ F, O% B0 x6 d2 i" ]8 b& d
}
3 s, D: F1 a- f! h- V
7 z( }" d S. }
/****************************************************************************/
8 }& X `8 ^' e: e7 T
/* */
6 K. }# k& f& I: L& {
/* PSC 初始化 */
5 h3 X ?' l. J; v
/* */
2 y- n6 ]/ z4 \6 L8 Q
/****************************************************************************/
# i0 P g$ U+ @' B
void PSCInit(void)
, z: ^" S# U6 q% E! k, s2 N; R
{
2 [# ^3 R6 f# G/ z9 F
// 对相应外设模块的使能也可以在 BootLoader 中完成
/ ?' {' ^/ }$ @$ Y3 b1 m
// 使能 UART2 模块
1 {0 [; g. n! f/ W3 R+ k/ t# I
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
3 N: W7 z& @2 h7 I- m" ^3 {6 ?
}
/ S, Q7 I& h# t! N3 S9 K
+ H4 R5 _) b) E+ M5 H
/****************************************************************************/
5 i: B2 y4 n3 _& r1 F7 h0 A* D
/* */
' s/ s8 l# h3 r' Q: j8 E1 g6 k+ `+ l
/* GPIO 管脚复用配置 */
' r8 e( ~! V. C0 i
/* */
2 Q0 q+ ?% R5 y' j/ e( `. w# N
/****************************************************************************/
$ S1 ^4 G5 M2 |5 d* f4 E" a7 q$ B( @
void GPIOBankPinMuxSet(void)
1 }3 {& V3 m. Y3 `) o- l7 C9 i+ p
{
$ [- P7 y5 X$ k) l% G
// UART2 禁用流控
G( z/ g0 c9 o( f# K; ^, y9 ~
UARTPinMuxSetup(2, FALSE);
2 b6 \) x/ |! l6 B4 H& k
}
' Y1 j4 F% X/ \: K8 ?" ~# ^; Z
9 O& A8 M+ I2 a- F d8 ]( \
/****************************************************************************/
0 E3 N" }% O0 l0 U1 z+ P
/* */
5 C9 B0 P$ x+ {
/* ARM 中断初始化 */
# g7 e2 ]) E9 i6 p
/* */
6 q8 K# P1 r" n6 @% {4 D* z* x
/****************************************************************************/
/ d5 o" S$ q0 c2 W
void InterruptInit(void)
" ~/ \* q* Z+ f& a/ m
{
- E0 f+ p: r" y- p7 u- O$ E
// 初始化 ARM 中断控制器
4 x! G1 m& K- [6 ?
IntAINTCInit();
* m, F$ m* h' B F5 @0 p. \) C8 T
0 E- p( q$ h* y
// 使能 IRQ(CPSR)
* u% A4 |: Z/ E7 s4 _8 G
IntMasterIRQEnable();
: x' y" g8 o) l3 C0 c# i! y
6 q5 @5 i; D1 v" r t3 {8 C( b# }6 [
// 使能中断(AINTC GER)
8 ]4 a3 c4 W0 I6 m
IntGlobalEnable();
1 d1 |, s; C; u4 Z, c. P L( l
5 D& |, Z0 ^% f! l( \# n/ I
// 使能中断(AINTC HIER)
& I/ T( k4 P f/ r' g' M, s; V* \
IntIRQEnable();
1 u. r- q& ^' L9 g
}
i9 q& n) A! P; Q1 V/ G# m7 B3 l
1 f. f8 J. h& E ~9 a
/****************************************************************************/
T4 Y$ C, c* L
/* */
# R# X; ?2 S2 X* e) H- N4 H: g) g* p% Y
/* UART 初始化 */
* W+ i, S1 N! a
/* */
$ n1 Y. \$ A' ^& S# S# E9 F4 `( C
/****************************************************************************/
- L! d4 k) G3 y" ` u
void UARTInit(void)
, e) m" \& G3 P, P0 i; B2 D
{
5 K1 L, V" ]# ~; A0 l8 K) y
// 配置 UART2 参数
0 D0 K- g- l4 h% F
// 波特率 115200 数据位 8 停止位 1 无校验位
; Y" A4 d. r0 s0 D' A n) w
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
`/ r* u% L4 E) ~+ Y( y
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' z, P* j5 ?* Q9 e( w) C
// 使能 UART2
3 i3 h; Q( c5 H: W$ I* N
UARTEnable(SOC_UART_2_REGS);
$ ^5 x( F2 E5 C4 Y' e9 `
* \1 G$ l2 }5 T4 E5 _
// 使能接收 / 发送 FIFO
) D! C5 k6 w* `, B0 F6 h$ F
UARTFIFOEnable(SOC_UART_2_REGS);
/ r: s# C$ `( c3 R
9 Y) A% o4 B6 V
// 设置 FIFO 级别
/ p8 O4 c9 Y. _9 e5 Z9 t
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
( R7 y/ k, d t7 a0 z( Z
}
, L1 f3 G4 A. h0 |
! ]' O. l& y3 C2 t
/****************************************************************************/
5 P8 `: N% y/ V4 T' D
/* */
; u6 M$ }- r. |, v3 A- j0 z
/* UART 中断初始化 */
6 p3 b y+ O/ M5 L A% e& C9 n
/* */
7 P" T& j* W+ K& E1 b8 a2 N2 d
/****************************************************************************/
1 g4 u2 q+ O3 J. D
void UARTInterruptInit(void)
( o) q) Y; n9 A+ V; B4 u7 W
{
* s9 ?1 D$ S4 [% m% _
IntRegister(SYS_INT_UARTINT2, UARTIsr);
0 @$ J+ g& z# s
IntChannelSet(SYS_INT_UARTINT2, 2);
8 H1 m% z% c9 t) B- P) F' _( B. ~: P
IntSystemEnable(SYS_INT_UARTINT2);
3 {- D1 J: O/ g0 z& K/ j
- H. J- K( }: @2 N
// 使能中断
$ `& L" ^$ [7 G G2 ?; N9 ?
unsigned int intFlags = 0;
. y2 q; f$ o1 G# P
intFlags |= (UART_INT_LINE_STAT | \
L c2 D6 r7 @' w+ T( b
UART_INT_TX_EMPTY | \
, X8 S9 b9 o- q o. m3 N' y
UART_INT_RXDATA_CTI);
: j4 [0 Y! W: x, e8 s
UARTIntEnable(SOC_UART_2_REGS, intFlags);
. I i7 {9 D: U$ B3 [7 P
}
+ l' a: r; E# _$ {- ?
3 O6 w; g1 D' H
/****************************************************************************/
1 I% K/ |* V+ w( o
/* */
# O4 z! V& }" _2 s. I3 t5 o
/* UART 中断服务函数 */
" M, j1 c* K# t6 \' o6 }) j1 E
/* */
1 l. K6 r5 c7 B! Q# X* z' ^
/****************************************************************************/
4 B2 B! R( T X/ g; y/ r
void UARTIsr()
5 e) S4 q8 _2 L) q- g$ J$ v
{
9 U% {; j# G# r4 f. D; |
static unsigned int length = sizeof(txArray);
6 |$ m1 D, D9 P$ F
static unsigned int count = 0;
, u; b. N' A: }+ |9 `
unsigned char rxData = 0;
1 b4 ]' g1 e4 M; G9 `+ \$ j3 p
unsigned int int_id = 0;
: S$ v+ Q4 ^3 M. A Q
9 C; g1 U/ k1 X. {; N
// 确定中断源
. \. V z7 U. N0 K% z
int_id = UARTIntStatus(SOC_UART_2_REGS);
3 a1 w7 I# Y4 d5 x: u$ r$ X
) F1 q* K0 ?% }) |1 t' B
// 清除 UART2 系统中断
3 R5 `" s& c! h6 i1 v( Z, w
IntSystemStatusClear(SYS_INT_UARTINT2);
3 g; B: J7 O% v( a5 _" `! M' ^& Z
7 X; c4 ]6 u) a( Y& | S) l4 T: O {
// 发送中断
' y; ` F8 |2 x! x. e5 k/ x
if(UART_INTID_TX_EMPTY == int_id)
2 R: G, |3 A. `5 n) a. b) `
{
' U w: G5 V# x" E
if(0 < length)
7 o7 _' e& @) I1 v8 e; Q
{
8 H: d, I j3 [" R5 [8 H7 t9 I
// 写一个字节到 THR
0 x4 ?4 t$ V1 u6 }. A
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
1 s( i" a, G- B7 [* h
length--;
" B5 n1 S h! Z% u& d' _, l) U
count++;
' O' L, D) h! `$ V
}
# F) [8 ~1 c% I) L+ o
if(0 == length)
3 v1 p3 a2 Z& w/ q) J) N
{
0 u' B$ M3 f- V7 l
// 禁用发送中断
& W; e7 O6 I! Q- O
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
) x* P$ D# s: U- g9 o2 Q
}
7 B2 M D% l+ P3 U5 O2 U) C
}
, c% p3 u# f& Y% J
8 Z" Z' H' {8 s+ p. r+ {: E
// 接收中断
9 l7 Q" L S+ @& w
if(UART_INTID_RX_DATA == int_id)
+ F3 [& [! Z9 E/ r, Z
{
% p8 g1 b6 h9 R1 b8 y
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
}9 h& G, V* Y$ t6 [- }4 A. |
- L* N U9 C n- z
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
- Z' }) [' M1 H; I% {2 d
}
, U, c6 c x6 f q; g
+ ]2 p# D# k( Q! {5 g$ P/ |
// 接收错误
# q' } m7 S3 O m3 u+ r/ y- Q& H- B0 L
if(UART_INTID_RX_LINE_STAT == int_id)
. m* P1 X! Y, W! e
{
& \* \4 I# S3 O) J5 y. k
while(UARTRxErrorGet(SOC_UART_2_REGS))
, D1 t, v! o0 r7 ?. H W9 j3 ^
{
" H9 M4 t- k+ v, y. Y. R% X+ h
// 从 RBR 读一个字节
$ Q" C% a& e: I; Q/ Z/ O" N
UARTCharGetNonBlocking(SOC_UART_2_REGS);
. c" @# f. R0 m. @
}
" i9 A9 V' b: R/ M- |! R
}
9 `3 i; q J9 }/ y2 E$ S% C+ A
/ |" X8 U, {- G, K
return;
$ y ]3 m4 H6 [" X1 Z7 f
}
9 e3 {1 h4 _ B+ z9 p
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
( r% t/ Q" b* F8 Q4 M3 s
如果其它设备快速给你发送串口数据,你这边能正常通讯?
' k6 j7 j/ k! `5 E/ _
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4