嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
( @+ ^1 N$ Z% m9 Q7 }: B
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
: O3 F8 H" w7 B7 V! e
# Z+ Q1 u8 A+ i+ p3 x
#include "TL138.h" // 创龙 TL138 开发板相关声明
2 w8 N; z! V6 l! q; t! Q
5 {& g/ }( r8 }" g$ _ J
#include "hw_types.h" // 宏命令
* ^ N. m: _ C4 Y" O
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
! r( j0 W, @4 {8 D7 {) Q
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
* L6 `- u" o0 \6 q9 t
4 r- J" h6 l3 }' Q+ [9 l6 C6 R
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
0 Z# P% l A. C! Z- f7 X
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 U" n; `; A! e# Q: T2 u
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
3 I4 ~+ S* _, J8 d
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 M7 Z4 k8 b: T7 {. { g( J
, K) L# _, ^6 l) L0 P% s# G
/****************************************************************************/
1 `, Z0 B6 {8 @: r- p* I
/* */
1 g' M8 N! w* \# [ i% Y; b% G9 I5 w
/* 宏定义 */
3 W1 I: Q$ \$ o" U# |9 C5 m
/* */
7 D D8 L6 D4 w$ S; M/ H" M! ]
/****************************************************************************/
i+ f4 `8 |* D2 P) m3 e
// 时钟
% X* N" [5 E! |6 ?7 I
#define SYSCLK_1_FREQ (456000000)
w( w# S! W8 L; e3 e8 G
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
& D1 c B D: ]2 G! ]" N
#define UART_2_FREQ (SYSCLK_2_FREQ)
$ ]2 f9 j* u8 ]- o: s6 ^1 @
% N7 n+ a, a+ P2 N+ W
/****************************************************************************/
' S0 x0 Z# H8 `( s4 T
/* */
4 \7 b- v9 ]6 d) u: V/ J. S
/* 全局变量 */
: H5 d7 R$ ~ Q, i- l# r) h5 Q: {
/* */
6 J: v8 }) v' D- f
/****************************************************************************/
" G7 q* y9 G/ I$ J( Y" S
char txArray[] = "Tronlong UART2 Application......\n\r";
, J8 I! n) {; s j& \
* j. K }2 J1 T% x
/****************************************************************************/
: p3 S' T. V1 _
/* */
' @( H( e1 p$ t6 u; n/ p
/* 函数声明 */
5 [( b8 X# b. K ~0 \* [7 o' h2 ]
/* */
) u5 w7 N3 Q: J2 S. U
/****************************************************************************/
- `; i( p0 K/ f6 F
// 外设使能配置
- p0 _8 u9 e/ J8 D3 a4 U
void PSCInit(void);
9 B, N/ v h- u @7 X
& s# V4 @, z% B6 u
// GPIO 管脚复用配置
' \+ } s; n1 K, T9 Q
void GPIOBankPinMuxSet();
) f/ U, K+ O2 w1 g g$ y+ s. k
( |; V8 @: X/ A1 M
// UART 初始化
+ c2 o) [4 I R; y6 r
void UARTInit(void);
: s; |) o- r/ W& p
// ARM 中断初始化
* I0 C& T4 s$ \3 U3 C
void InterruptInit(void);
( h5 t9 T; L* W& L
// UART 中断初始化
B( X. M9 Y- e( p
void UARTInterruptInit();
" o a& J% Y9 c$ l( X
// UART 中断服务函数
+ t1 d o9 K* |# U3 Z6 z
void UARTIsr(void);
1 [5 b* E6 T, g
( g; w7 F! @ Y& B( r5 L: o- S1 G
/****************************************************************************/
- K* e3 t V5 |7 G Y f6 C
/* */
& y/ q. v' p6 A
/* 主函数 */
! v6 k% h* u& E+ @
/* */
$ E: E6 m$ D! I
/****************************************************************************/
( F2 k/ h9 ^6 \$ V
int main(void)
) I# P' j) E) p4 r9 L
{
6 u) n7 A; Y( Q) l
// 外设使能配置
* \% Z" S1 S4 i
PSCInit();
; N+ x/ ~! B1 r$ I
+ |( b1 U. n3 z/ G, L
// GPIO 管脚复用配置
2 O" ?: n1 s3 N% M8 u% z |: c
GPIOBankPinMuxSet();
3 }! Y% Z) P7 a3 O P
& {* \- v+ E8 m. C
// ARM 中断初始化
2 U) r- i5 ?" {, J, d
InterruptInit();
3 \9 q+ Y) r# o
* ^7 u. }( B+ e
// UART 初始化
2 P- h i" [" u9 E) o
UARTInit();
* w8 E6 J: W, Q- u2 u% F! y
# M. t: P7 @" {5 X6 C/ b& f; b& f6 O
// UART 中断初始化
1 _) d; r* G5 {4 v z) |
UARTInterruptInit();
5 g: r& B. W" U, T3 m9 Z8 z
4 {4 ^/ L7 i/ j$ G9 P9 s
// 主循环
1 r- G+ X; K8 J- F a% R
for(;;)
2 O7 c8 P7 s' o& K/ S# A
{
+ c2 ^* k( [" `) X7 S
0 A) z; v5 [& q2 c
}
7 `9 _, `/ d* g! K. F
}
% w! N/ ?4 ]- C3 l/ b1 I
T3 N* K3 g [; q* A6 E/ |
/****************************************************************************/
/ @3 Z" G( h5 a0 C1 \
/* */
1 I3 ^ O9 _6 Y9 I% Z
/* PSC 初始化 */
! J6 ]1 r5 u: O% p9 Q
/* */
. p5 w/ b, P( {
/****************************************************************************/
4 X8 E- s9 E7 [+ m" i
void PSCInit(void)
( Z. n% T: N/ a7 F1 P+ ^
{
. P! H/ |# k. }$ K& E
// 对相应外设模块的使能也可以在 BootLoader 中完成
0 r5 _0 }1 c+ a: {1 p
// 使能 UART2 模块
! w9 W0 i0 S" {& g+ M9 Z2 c
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
7 |4 o8 l9 ~& }! R0 x
}
7 ~# T8 ^' n# U- v$ D3 k+ ^
% o: _( `" I" N
/****************************************************************************/
$ t0 L4 `+ c& i. Z6 X! {
/* */
" A# {4 N6 k* J, N- Z9 ?
/* GPIO 管脚复用配置 */
5 t3 o5 I5 w+ P7 B$ l7 N+ [
/* */
J1 M% T' j& o( C
/****************************************************************************/
. e, j. J6 v+ I5 M: Z- h) G8 }- _
void GPIOBankPinMuxSet(void)
6 W% J6 m* _7 I8 J4 O H
{
; T R7 U8 ], |2 r2 Y7 ^4 f2 V r
// UART2 禁用流控
8 B/ [; Y( m6 p/ t0 f# N
UARTPinMuxSetup(2, FALSE);
# s; @' Y* l: r3 k5 U
}
, ]2 ]8 K7 b8 B3 U% t
: u9 F3 D+ E% I$ Z: Y, _
/****************************************************************************/
. b* S0 D: f7 ?& N
/* */
" ^5 W4 ^! y- X! z7 @4 z' O
/* ARM 中断初始化 */
1 S7 O" G1 Q. m
/* */
) a. Y; t" w2 V- X8 ~( v, J
/****************************************************************************/
( d6 }/ u$ I" N# v0 q) x0 K
void InterruptInit(void)
1 S1 @8 X8 L9 r
{
+ H9 s2 Y* r' @7 W
// 初始化 ARM 中断控制器
+ [" h( n2 k6 U7 N9 g j
IntAINTCInit();
+ u: t, P7 |: }5 B' C4 T$ r/ K0 }
) ~; o( f4 U1 g1 G; ?
// 使能 IRQ(CPSR)
* B4 X, P0 k8 L4 o# O
IntMasterIRQEnable();
7 z7 G: ?/ C& ?! k" M3 p
7 i t; y" }" z
// 使能中断(AINTC GER)
% o6 m, z" l* b% [9 V9 J. Z
IntGlobalEnable();
5 O [* g; D5 v8 a
4 J9 n2 w9 z) t, k; g, J5 Y
// 使能中断(AINTC HIER)
& g8 c' ^/ }9 K
IntIRQEnable();
* w3 y6 w6 K6 t6 T
}
: h0 e! _. m/ s& f: E+ \9 R
- M+ m' h* u$ Q! f' V, ^
/****************************************************************************/
5 Y S1 m. ~7 k5 w9 H# q
/* */
Y3 G! t$ j+ ^# \5 d4 Y
/* UART 初始化 */
2 J' H U' F$ b* H: z. j
/* */
4 D$ [! n! h% D/ w/ A
/****************************************************************************/
) t1 g" Q( G% n9 J0 Q- o
void UARTInit(void)
* C& C# }9 |4 T# V# z! a* F( E
{
4 a8 M' l$ j; U
// 配置 UART2 参数
& `+ ]/ B; T _, d! `9 d) x! ?' T
// 波特率 115200 数据位 8 停止位 1 无校验位
- K% J% ^. y3 w3 L9 X8 [% {: H; B% d
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 y9 W+ [6 M# _( W* q* B
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
! ^" X! A4 ]$ o- `' u+ L. ~# {
// 使能 UART2
$ M8 n2 I2 r1 o: |& ^& b" Y
UARTEnable(SOC_UART_2_REGS);
+ l# v/ z3 m2 h& Y7 u/ g' y0 f
/ S, c9 L# T' ^ @
// 使能接收 / 发送 FIFO
& p* y6 U* y! E: c3 r
UARTFIFOEnable(SOC_UART_2_REGS);
- Y4 g% Z5 [$ P* F8 \
' _0 t3 k3 `5 j- b
// 设置 FIFO 级别
/ W4 I* f$ U' y) w6 B
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
" D: v1 I9 ]! ]- K3 f7 o
}
! x& }% l' c% R' k
4 e) J! ^2 U1 k( k! G
/****************************************************************************/
2 U; ~4 u( W5 g. H
/* */
: j. S4 V$ _# A) [; |/ K" [
/* UART 中断初始化 */
, U: \5 {: X- }: \2 S0 c
/* */
5 p' F5 {. D& \
/****************************************************************************/
$ \, q; \) A4 c
void UARTInterruptInit(void)
; Z) E0 N, W* J5 {
{
$ {* H8 b8 E: X- _- Z3 T6 P
IntRegister(SYS_INT_UARTINT2, UARTIsr);
; ?3 v" C& S2 \, @6 r C
IntChannelSet(SYS_INT_UARTINT2, 2);
; d7 B! r, M, f+ b. [. W
IntSystemEnable(SYS_INT_UARTINT2);
0 N$ V& ?$ q6 K% c( d% K! M& U
8 R7 N1 e- @, J
// 使能中断
2 X3 j v m5 I
unsigned int intFlags = 0;
5 q, x; B$ Y, Q) X e
intFlags |= (UART_INT_LINE_STAT | \
8 u A2 W8 t' X& @
UART_INT_TX_EMPTY | \
1 Y/ H' d2 U/ Y! b8 M
UART_INT_RXDATA_CTI);
7 }9 _" C2 P' X) O
UARTIntEnable(SOC_UART_2_REGS, intFlags);
& K! M. |& D; O9 D( Z4 ?
}
' B1 x& ^0 _2 l
8 }; Y5 P3 Y K4 w( B6 b
/****************************************************************************/
% K$ h1 o! `6 X! P% C5 d
/* */
/ k6 M+ j" J2 l" R- P
/* UART 中断服务函数 */
! q/ h L+ c7 M- ?9 n7 ^
/* */
: n0 h( F) `2 Y. w, ~' ~
/****************************************************************************/
1 R+ A: K6 O, }" h9 q
void UARTIsr()
; [# q' x: N' D9 Q, V; M) L0 Q4 e
{
' T* O- b& k' F4 C* |
static unsigned int length = sizeof(txArray);
; g$ H- V1 n/ F- o/ Z
static unsigned int count = 0;
& C7 |) ~, K* C5 d1 W& r
unsigned char rxData = 0;
3 ]8 T" a; O! r: d4 j
unsigned int int_id = 0;
9 }3 v- X2 U! ]; _) B- o
% L+ ?8 W; ^ w8 U1 H1 n& ?
// 确定中断源
( P3 o6 g. a/ e1 E2 ~( M2 N
int_id = UARTIntStatus(SOC_UART_2_REGS);
6 }4 j8 k/ Q# q$ R( O
! `$ ?5 i$ g' ]5 Q' o
// 清除 UART2 系统中断
; ]; ^/ h( x& n/ \. Y0 l
IntSystemStatusClear(SYS_INT_UARTINT2);
0 c, ~9 u [6 u( A+ R7 Y
3 B v6 a" C7 _" t; U5 A5 m0 V
// 发送中断
4 K h' R: q8 n' U2 K
if(UART_INTID_TX_EMPTY == int_id)
5 R& u! w3 M; t' y& w4 W
{
R" [0 C7 T( l1 N$ ^
if(0 < length)
6 U& o x0 S7 Q4 m7 Y; L( b# d
{
; j: B9 i! e( r1 M* M+ v* T6 ` C
// 写一个字节到 THR
& I& d% z# d. ]' y9 r. T
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
1 L$ ^" d& X8 m, c2 G
length--;
1 l9 m$ S2 t J2 Z4 T
count++;
- s7 \9 z; E3 z. Q# D( \
}
4 n5 a3 }3 z+ S% c) S* v
if(0 == length)
* K! t [( [8 ]- V# Z/ W" v
{
! v* q9 I8 C* @+ q% \9 {
// 禁用发送中断
. C- R* P: O- K f! W
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
! U! H& ?8 v0 N$ d
}
+ F: W6 B5 Z( _( E
}
9 E' O# `* |+ y! y
- J8 C& }3 G& E7 j' s, M! Q6 b8 w2 v
// 接收中断
, ?6 \2 T' z7 I6 m
if(UART_INTID_RX_DATA == int_id)
7 e5 J* @1 p) d" O6 Q: L
{
! K3 M0 K2 i G) p3 q2 x. k6 e
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
, K0 J# M5 t" ~& N; ^0 d
4 o! I0 o9 ?* {8 v) H
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
v+ S: S6 k* A6 E# b4 Q C
}
: e2 U o! U' ^: ~- o0 b8 b
/ e$ G' t1 d# d' K2 B
// 接收错误
. i( s& I+ r$ Z6 u
if(UART_INTID_RX_LINE_STAT == int_id)
. f* ~* a x2 q! e+ S' E2 H1 M/ S
{
/ p- _! c$ O( q5 C) `
while(UARTRxErrorGet(SOC_UART_2_REGS))
7 V3 |3 n! [' A# M0 d
{
" [" |8 D9 t. a9 t
// 从 RBR 读一个字节
6 P# q2 f ]( Q
UARTCharGetNonBlocking(SOC_UART_2_REGS);
, O/ r6 a+ d$ Z9 Y/ r
}
( |+ z: d& @, ] o, `2 R3 X
}
! ?0 @0 N4 l G
$ _3 i( S" H% y9 _
return;
5 A) p8 ^' E& C8 j# S1 T1 w: y
}
# O1 Z, x% j3 @
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
6 C2 d' `# }/ N4 K1 F% k0 v
如果其它设备快速给你发送串口数据,你这边能正常通讯?
. S( H( `6 z" Q( o- D& ~8 q
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4