嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
5 z' D9 i% E- v n0 @
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
$ c8 D. n2 w! R' E" @! Y, t4 O
5 a0 q1 X5 \& e; b
#include "TL138.h" // 创龙 TL138 开发板相关声明
8 h4 C! y, t# [ H0 j6 v Q
& _( }( t4 N7 c& R) n
#include "hw_types.h" // 宏命令
; a3 H7 g0 _4 S+ j" k
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
" X1 L- k* l. p$ H% O* u5 E
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
# z8 O, C" h! k# i7 ~
2 s1 L6 @$ N: J9 x* }& s' B
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
. {; G* G$ u1 d0 |2 v0 x* K& Z
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
' E' N9 H7 ^8 B7 I
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
0 z/ M2 n/ }. B3 g( |5 O
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
, O* c+ @1 e) ]: d' l ]" ]
3 y8 h& `: U0 r1 ?+ M/ L
/****************************************************************************/
" g" g" O' Z3 }
/* */
" A1 U2 Y; D5 f* {
/* 宏定义 */
( `3 o& o7 h% w/ H. c9 d
/* */
1 C+ c) t/ D4 N" m5 I
/****************************************************************************/
& Z, M; r" z4 L/ ]" p& s
// 时钟
! ~( p! Q1 R0 G( w
#define SYSCLK_1_FREQ (456000000)
& x2 @ }7 u) z2 W
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
2 c. V' X$ {8 R
#define UART_2_FREQ (SYSCLK_2_FREQ)
3 W5 @ H3 @* l- g
5 ~' k& `# y8 B i4 e3 M) U: t6 Q) A" v( u
/****************************************************************************/
+ W0 y& N$ v/ k$ S$ O- E8 ^6 k
/* */
# s s! B3 L: @
/* 全局变量 */
3 H2 j' ]* e, M, [$ y/ e0 W
/* */
- ]% `; i0 I8 j
/****************************************************************************/
6 e" f1 j, n- s! J0 d; ~9 f" c+ q
char txArray[] = "Tronlong UART2 Application......\n\r";
# G4 F2 H0 T5 Q+ m$ c: z& G
- \- }2 H! i8 v* T8 n
/****************************************************************************/
* n( q9 g0 \& H1 Z
/* */
0 I+ x! w4 |, Z. w3 R
/* 函数声明 */
0 x8 z: k0 U% ~" B, i
/* */
2 m) Q3 T! \& I% }* H
/****************************************************************************/
# [2 E! y- q* |# d
// 外设使能配置
6 Q2 k" c; ]/ ^! w
void PSCInit(void);
% w4 A) v# u+ b4 X* |
* o! ]$ `$ l$ T& E0 T; V C7 Z
// GPIO 管脚复用配置
( \. F4 H. t% p4 e' @; {1 [
void GPIOBankPinMuxSet();
N7 s5 R/ u3 w- t' P
/ @# y; J' `$ U. u7 r* Y1 ]3 I
// UART 初始化
; h; X6 n: M8 b$ f9 C& R1 K" X4 k
void UARTInit(void);
( a! S, t1 e4 n
// ARM 中断初始化
* S- \ X, ` c
void InterruptInit(void);
% M* c; N( c) l6 J; j$ H
// UART 中断初始化
* I- L1 W4 @7 c
void UARTInterruptInit();
' ~3 c0 V+ K# q9 E
// UART 中断服务函数
* D: b [4 X8 j. t9 I' L" E
void UARTIsr(void);
( q. d$ B0 ~8 Y- ]0 _6 T( ^# O
5 n2 g' R5 j0 o9 I& I2 I. V0 m) `
/****************************************************************************/
( V* [% B; V6 C7 t/ X4 J3 S' c
/* */
2 t+ H2 I/ G/ ~/ P7 c
/* 主函数 */
' @9 d: V8 _0 F5 C! Y( F3 k6 g Z& |
/* */
7 q+ U# f C3 j" D. G8 k
/****************************************************************************/
% G& h5 c' x" Q( ]6 O# `
int main(void)
+ t' j: ^$ l( U6 E
{
* X/ N$ {, X) Y) p# r
// 外设使能配置
; Z. z- ?9 D3 n+ Z# G' T
PSCInit();
7 V' k/ Q. i! Q' W/ h4 i* B
2 l6 a8 A, x) _. p* {6 B" T
// GPIO 管脚复用配置
# s9 E+ ]# v" N, Q8 W
GPIOBankPinMuxSet();
/ P+ z% G ?! y4 g
6 R2 E+ c3 E1 t$ U1 M
// ARM 中断初始化
( b' \) s7 a5 D% [8 V" T# M7 J3 h
InterruptInit();
$ n" o. D' T3 ]. i( G" \- X
. k2 q5 k: y3 o- s
// UART 初始化
" s9 R: n9 ~+ A: ~$ L: F. a, z
UARTInit();
/ A" l* S: g; H+ A" ~8 v
% p" C; [5 M* `* X( A% Z" \
// UART 中断初始化
" E+ M0 f: e( n' ?( ^" I7 b' O
UARTInterruptInit();
* U% \) Z2 T# q# n$ A
# ?' H J z! U
// 主循环
( N' K6 j2 d: e9 q
for(;;)
( y1 i6 o. J: q5 s
{
- ?. h0 k) L$ F+ c1 J2 S
$ @' `' c* \+ |2 l
}
( j0 ~# o! L) v4 e2 H% R
}
( E! N; p% V. A6 V* S- [0 h
1 A( `' S B) v7 m; x
/****************************************************************************/
: n' q: ^3 j! u
/* */
( V4 p( E, l& m( J+ U" Q0 {9 g
/* PSC 初始化 */
0 d& o3 |! x* s. k- b
/* */
0 h% c# a9 R1 l! ]+ W
/****************************************************************************/
" {) ]2 X& k3 b0 f S8 B
void PSCInit(void)
; z# [+ e; f8 B4 j# z
{
8 N, U7 Q/ K {+ P7 M" t- d
// 对相应外设模块的使能也可以在 BootLoader 中完成
3 b E4 m2 U: r8 h+ C
// 使能 UART2 模块
% E$ z. g/ f& j) _% v
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 g" h& [! o% R5 f
}
. h$ ^' a4 e+ s8 m" c* V' ?
5 q" M2 h3 P( R$ x' J
/****************************************************************************/
1 b- B. B' T- T# h
/* */
; x: M4 s. J, G: t ~
/* GPIO 管脚复用配置 */
& V2 z; y+ C$ ?) f) j
/* */
7 s" e3 a, }% b2 ]' b7 H
/****************************************************************************/
+ J/ `% O' ~8 U+ Y# i
void GPIOBankPinMuxSet(void)
) a! `1 W Z% E1 O' {- V1 |) O& p/ E
{
! W/ M* O" G2 Y8 ^, }7 A
// UART2 禁用流控
9 H. e7 m5 A% P: F) ~5 ]2 ~2 p# |
UARTPinMuxSetup(2, FALSE);
8 C' w( N" u: M z% a
}
5 Q! Y+ R8 t5 Y
: ?8 }3 _( Q4 h9 d( }1 P
/****************************************************************************/
; H; d0 n" r l( r% s, e: j
/* */
2 I. s9 }+ v0 O9 z) @& [
/* ARM 中断初始化 */
& }" U: n; j( Z$ a( ]/ n9 R
/* */
! N7 b: s5 z$ o+ g7 f/ d$ Z$ e- K; c
/****************************************************************************/
6 y* V+ Z- z L5 L) g O2 p
void InterruptInit(void)
. J/ J, P0 e/ R5 C8 c. b* A
{
- W& q* k) D0 W" f/ x5 \
// 初始化 ARM 中断控制器
2 R* ]+ \+ A7 C0 a5 E# x
IntAINTCInit();
) o( K8 P- r! H0 m: x$ C$ h
6 H6 A! t8 C Q d
// 使能 IRQ(CPSR)
; c3 P r0 e5 Z9 H% g9 t
IntMasterIRQEnable();
; D" A3 Q# \. D& F1 Z
% h9 D6 g: W- O* q$ a2 x- d2 ~( r9 y
// 使能中断(AINTC GER)
( F$ T% J% t' {1 r+ ^2 i
IntGlobalEnable();
* J. ]- ?# w2 h4 v8 {$ ?
/ Y9 @: k9 e1 _1 B
// 使能中断(AINTC HIER)
& h6 b2 V3 ]: b, a% ?
IntIRQEnable();
4 v+ v6 z8 C. w) `# Y! w
}
% z" `) H) p7 `0 s& y7 G
' P: R* a0 O9 E' C
/****************************************************************************/
. E) P8 w/ M0 Q. N- q' L
/* */
0 ?- \$ A I$ R- {
/* UART 初始化 */
5 ?5 {2 `! O4 i( S5 J- Z% f
/* */
" d# P8 Z3 F# I L; l: y) b1 n1 j3 h
/****************************************************************************/
, W* m7 m8 K: S$ N$ E4 D
void UARTInit(void)
, g, l, w- B$ Y5 G; r, b* H% O! s7 V" y
{
4 x; x- V8 h5 v$ W1 J/ M5 _
// 配置 UART2 参数
3 C+ a. o" k( @1 W/ }
// 波特率 115200 数据位 8 停止位 1 无校验位
* |. t% _6 Z) O" Q& z# l* Q* U
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 @3 x, h0 r |' o& h5 D- j. \
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; B+ A: d( R6 v+ y& f' g/ E! B
// 使能 UART2
8 y' g x+ T7 S' r }9 _* b
UARTEnable(SOC_UART_2_REGS);
' i* v5 \# h2 u1 @
$ k$ E8 h4 n/ ^; v8 K$ Y
// 使能接收 / 发送 FIFO
% v4 w! X9 w% E2 O2 M
UARTFIFOEnable(SOC_UART_2_REGS);
' v$ Q9 Y- s" v; h) t6 T0 ], T
, ~# p. ?- V# e2 }' t; C9 o( d8 Y
// 设置 FIFO 级别
( _7 S* V$ R) V
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
. i: n+ Y# N# O4 a; }; j
}
5 M( z0 K" I4 V' I% n
9 h% J- d! V$ l9 C
/****************************************************************************/
; N9 w6 R+ e1 p7 K
/* */
) x3 c4 K6 @' j% b6 f( H
/* UART 中断初始化 */
4 z6 ?6 ]. h# Y- ^( k
/* */
& N+ P e7 T, f ?! O$ t
/****************************************************************************/
# s2 I9 j+ z8 q9 r9 E
void UARTInterruptInit(void)
( t$ _9 u, G. S A6 A+ n$ c
{
' |6 V1 r9 I* C5 ]- l# ]) ~
IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 I6 y- c' M3 H1 n5 c6 F
IntChannelSet(SYS_INT_UARTINT2, 2);
* g; L( M5 L' v( m- q$ N3 ~
IntSystemEnable(SYS_INT_UARTINT2);
j6 e, t& R* s: \
B3 `4 x! H1 z, A
// 使能中断
z0 R: Z# a( n) ^& Y: s
unsigned int intFlags = 0;
k3 R: v3 u- A5 N9 a1 S8 i: J$ _
intFlags |= (UART_INT_LINE_STAT | \
" D2 ]: ?4 c7 q( D/ b+ H2 n L$ k" b! Q
UART_INT_TX_EMPTY | \
# d1 \# H/ h1 T+ |, S9 u. j @
UART_INT_RXDATA_CTI);
& Q% G3 R3 }# e( C
UARTIntEnable(SOC_UART_2_REGS, intFlags);
% \" t, e( J- [
}
; V1 j$ U5 y1 H& d
* }; K+ N( S1 ^
/****************************************************************************/
) y6 t" ?2 s: B& F8 I* g; s
/* */
" Q- g. u& Y, h
/* UART 中断服务函数 */
+ M, @2 ~# e& F/ F- [( m! X1 H8 v
/* */
% k0 L: y/ S* o; M9 }! D. q
/****************************************************************************/
: e' u: s9 w( x0 r B% Z
void UARTIsr()
2 D* n J8 c1 y3 V8 y7 G" y
{
% Z9 n, F& g- q6 R
static unsigned int length = sizeof(txArray);
, z6 { g4 A' _, i- M$ V4 N
static unsigned int count = 0;
a- o% Z. l9 S2 y3 i! c1 O s5 c
unsigned char rxData = 0;
. v. N( I- ? v, s
unsigned int int_id = 0;
8 }, Y) Q9 d4 \$ z) s" l9 ^; O3 i
, |) H) R4 M$ t4 T2 t
// 确定中断源
+ d7 S9 P3 B0 X/ C" F8 @. [9 n
int_id = UARTIntStatus(SOC_UART_2_REGS);
0 }+ B( L; Q! u' M0 Y
0 n0 \3 c3 m+ Y& j4 q4 L0 `4 U1 ]
// 清除 UART2 系统中断
& q% D4 z3 Y8 K( J+ b% U
IntSystemStatusClear(SYS_INT_UARTINT2);
3 D2 }; d# x8 }# X
* u1 Z7 F b# {4 p6 c
// 发送中断
- @' g% d! ^8 A' K( `2 b
if(UART_INTID_TX_EMPTY == int_id)
7 J9 l! E8 T1 C
{
6 W* S5 E0 d5 s6 _" A/ ^9 d
if(0 < length)
7 I! s! ]/ h) E# d
{
" s' u7 D* [. j; g( r P$ X
// 写一个字节到 THR
1 K! }! H. i; f! b+ O
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" y+ D) z2 P- \" J( i* f3 W! p
length--;
- g2 D [9 ]- l$ r- G8 w
count++;
6 c2 H8 a6 n' u6 s
}
2 T* {# e i4 G" Z! Q m) P9 ^
if(0 == length)
) e' w* Q- V \+ K
{
8 h" s. r# M9 o k; F/ H7 B& y
// 禁用发送中断
$ c9 q9 M; k4 W% k% D% x ^
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
, R0 o) L* @8 v, Z i
}
3 `3 ~! m7 E. W1 {1 b! F- \
}
: k5 I8 z6 B1 t3 ^" m0 ]
' V! p4 @7 X x0 A0 h& T
// 接收中断
! h+ [/ F; J+ q/ n1 e" n2 ]
if(UART_INTID_RX_DATA == int_id)
: c- V1 @) a( F. v, y/ |
{
" F: \" U. m% Z0 `3 `/ j
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 v9 W I0 c" M3 | [6 U7 e
1 Z e" ~ C+ n* h
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ p; w7 ~; H+ l1 E) m
}
$ p- T, u+ \6 V- I; I) L4 C
3 X% }5 d( m7 D6 z
// 接收错误
/ f( L% c8 K7 e# W
if(UART_INTID_RX_LINE_STAT == int_id)
9 R6 [7 ?( U1 R' i+ W* H# Y) n6 o
{
* j' W" l6 x$ n' N! k
while(UARTRxErrorGet(SOC_UART_2_REGS))
7 }1 a; A, S7 L
{
& G8 g5 S0 p9 a# G2 c+ b- h
// 从 RBR 读一个字节
+ T" t5 ~' q# E
UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 B" ]3 T2 V) j! Z
}
$ B" R( ^5 v0 L( b% E7 \
}
8 M: o2 U2 K: Z( L1 k5 O
# Z/ C, V9 z O
return;
' M2 f0 g0 ~0 N
}
1 _+ L, b! ^: f5 k' n% ~9 ]) g
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
5 D0 e$ E: z- G" r4 f; n
如果其它设备快速给你发送串口数据,你这边能正常通讯?
; m& I8 g8 E# v
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4