嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
; b. @0 s5 b( |% g
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 `6 A. c' l+ g' A
; C" |9 P1 T, Q
#include "TL138.h" // 创龙 TL138 开发板相关声明
: n c5 y9 T# c1 \6 `7 ~; ]
: Q) E! A x( F% F7 m$ {
#include "hw_types.h" // 宏命令
- [+ t ]- q6 j1 j0 Q
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 k: b: G _6 m; {
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
2 R0 J X; u* v0 N
/ l2 s" r6 p/ U: l5 O: ]" A
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
! w: O1 X2 V; A' U
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
% d% d; }6 z7 I- Q' I$ i) A
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
! ~0 {: k2 ~; z, I& p2 l9 x1 h
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
4 V8 W+ M l9 k4 X( H4 G
7 ~9 P9 G& w% V; h7 m
/****************************************************************************/
1 ]. H& U# `" a( |* k
/* */
/ K( U$ _/ I5 O; o4 u( N6 F
/* 宏定义 */
& ?- B. @' Q2 `$ v2 ^: o( M+ |8 F
/* */
' P! R$ `1 T, k
/****************************************************************************/
% f( s9 B' d$ Z; `0 E; Q
// 时钟
1 t8 b9 a1 |5 c9 A& Q5 i
#define SYSCLK_1_FREQ (456000000)
' g2 X9 S" N7 ~$ k1 }
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
# S/ ^1 D' `7 `3 ^
#define UART_2_FREQ (SYSCLK_2_FREQ)
; r7 M3 H0 a0 f- M( j
) N5 E1 ~8 ]1 D- b& ^
/****************************************************************************/
5 _7 m) [& f3 u6 e8 }% r- Y% a
/* */
+ r, ]" a# \( S6 l4 y! t, x
/* 全局变量 */
* h S3 T c2 Q$ @6 c2 K
/* */
0 Y8 L+ X6 u+ H; \
/****************************************************************************/
/ N8 M+ \* ] W
char txArray[] = "Tronlong UART2 Application......\n\r";
% x$ z* f- c& ~
3 a1 q2 @% W+ N3 x3 ~6 M! u! k" r
/****************************************************************************/
% j. C, T' a9 O7 B3 `
/* */
" _0 ]: s4 n6 Z; ?) ?0 d
/* 函数声明 */
* c0 O C5 {5 R$ R7 h5 ~* f& Q5 Y
/* */
# d1 O$ R' C( n4 U$ A- |* k
/****************************************************************************/
9 ^/ N6 @, `7 t" x) [) ]$ a
// 外设使能配置
7 k+ Q7 a7 S! Y! s7 I0 C
void PSCInit(void);
0 A9 M- ~* o: K$ E7 G% u4 O. C
% {* Z; t" C0 c2 B5 z
// GPIO 管脚复用配置
2 J2 S, P1 ]! _( G1 t; A: s' t/ A
void GPIOBankPinMuxSet();
& g) ~: z W. @$ k7 E+ F3 T# O! Z
1 B Z- G% n) a7 {3 m* N3 V
// UART 初始化
. u( o2 W! ~/ a! N! s/ b! w
void UARTInit(void);
! h" m4 U. L1 P# h2 A) t) x3 v
// ARM 中断初始化
' V8 d$ _$ s# ^" b+ ~2 g/ r& i
void InterruptInit(void);
3 F* K1 h1 r4 ^- G
// UART 中断初始化
/ u# i! {- ^. R2 U" U& g; z# W; K
void UARTInterruptInit();
0 M7 I- ]1 B1 L1 {* z
// UART 中断服务函数
+ v4 r8 d5 z. \ w9 c7 v# Y7 }
void UARTIsr(void);
* T- v3 ]2 G* i$ E u% q
6 T0 V, g8 w7 [; w& D1 z
/****************************************************************************/
2 `7 f' w# W5 |* {3 k9 _
/* */
4 i0 b- y7 n9 L) i7 V. N
/* 主函数 */
/ m% f) e4 T; V D& O5 V8 }
/* */
4 [- ?( V( e% c2 j4 Q) c; A
/****************************************************************************/
/ ^( G8 V4 V: y
int main(void)
: K4 y3 U! _; P9 L
{
4 i/ N4 A; U6 i# I, o: e6 V
// 外设使能配置
3 Q4 b6 K4 o3 Y" G3 H7 d2 P
PSCInit();
* j0 v( i( t* N
6 d( }6 J X: m4 S, ]
// GPIO 管脚复用配置
& {8 V! M5 P/ C0 O
GPIOBankPinMuxSet();
' V7 I; K6 L" [; @7 {7 Q, z1 o
# J, j' y) U) i
// ARM 中断初始化
" u5 R! N6 a! T; U9 \6 ^. k
InterruptInit();
$ Z+ J6 u5 B" p5 ]) _$ w P
4 J2 v5 Y5 { q2 _/ @4 t/ r# U O
// UART 初始化
0 [9 f' f: K5 _. j! M* R
UARTInit();
, a/ e0 q- [2 g3 _
9 S1 a; r5 t. V) _
// UART 中断初始化
' x1 @6 h W- a5 J
UARTInterruptInit();
) s1 ^: u f9 y
- E# Y$ b: @* I
// 主循环
7 {5 z' y. N" h8 }
for(;;)
- Z# s/ G4 y$ i3 G: \
{
" A% W, N5 [- ~# S$ \: V
! U2 i( q/ N, R2 [
}
( T+ F0 F: b3 l) `
}
9 q$ q p/ x& C- q& w8 I9 ?- A8 b9 p
* ^6 ]( q) @% f; y w& q, B8 d3 V# t
/****************************************************************************/
: p# O9 K- @# c" i& k
/* */
: ^) D' A4 \8 t. B
/* PSC 初始化 */
8 \: O0 k' ?6 W; U' k
/* */
$ I4 L/ g6 U; U H+ S* T& }6 s
/****************************************************************************/
3 P0 K2 v, R8 A0 D7 p9 _/ y; i1 j) ?
void PSCInit(void)
8 ^$ q% F- F+ V9 A: t9 \
{
) J/ ?' m* _: I
// 对相应外设模块的使能也可以在 BootLoader 中完成
; ~ B4 l: r P3 a/ p! Q
// 使能 UART2 模块
3 q+ z* I$ u2 [. a( @" n5 |
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
0 [6 S; u5 m/ ?( K, G
}
8 w3 O4 H( {* A
3 z8 i0 h* I( E" `, y( U
/****************************************************************************/
, j* ^+ I" O: }5 S( u( V M
/* */
7 c* P$ \, U; M! y
/* GPIO 管脚复用配置 */
9 Y5 Y+ d; v5 w$ E/ ~. b# t
/* */
5 ]- \: M% n8 h4 A+ K% \0 a
/****************************************************************************/
+ k# G2 r# P2 q, @9 ~4 y. \& w, s
void GPIOBankPinMuxSet(void)
$ u7 C. U2 Z1 P" v. I9 b- S! [! a; W
{
' _' v7 E {. G8 J0 y
// UART2 禁用流控
! }' n. F5 N8 v3 f# S2 ]
UARTPinMuxSetup(2, FALSE);
* S( Q+ [2 Y( t0 ?/ J8 Q) E. b
}
9 q5 q- c0 M/ N8 @
! k5 f* S* i- B; @% \
/****************************************************************************/
+ _( O$ j$ C4 c$ p
/* */
1 P6 Q7 y, S. a3 B3 B6 _
/* ARM 中断初始化 */
; G% L9 I4 {; t/ J- G
/* */
0 V3 C/ V* W' t7 D$ F& p x
/****************************************************************************/
4 ^ G) i# G2 H# e
void InterruptInit(void)
V/ w7 R e) V. o) c$ I8 A
{
8 Y$ a6 _& a# b+ e3 C
// 初始化 ARM 中断控制器
0 {8 F/ c2 w7 G# C7 Z! {! d
IntAINTCInit();
4 w7 C! k2 e ~; Z# O* j
- {3 k% M5 P" B
// 使能 IRQ(CPSR)
$ j# O1 `! b+ ^2 u' \
IntMasterIRQEnable();
- o+ T9 ]: J/ X4 Q
2 B& t$ d! q" B* Y- f3 t6 ~- A( X+ ^
// 使能中断(AINTC GER)
1 D2 p7 E+ d- p0 t- l
IntGlobalEnable();
, o5 E: W6 y/ D: X
% o, O% t0 \6 I$ \5 d8 F" ]
// 使能中断(AINTC HIER)
2 C2 M) \* s# r8 D4 h. ?6 N
IntIRQEnable();
) C% t* Z" |9 \# f
}
/ D3 |' M# F" e! Y! Z
% j. M% O) \% {! ~/ d, v
/****************************************************************************/
" f5 g7 c9 L4 c, c: c- Q% a `
/* */
( O* ~% }; k& K7 d' B
/* UART 初始化 */
8 D5 s- }, q3 m6 f$ x( v4 ?
/* */
/ m: q K% v' ]3 E6 C; W. Z! h
/****************************************************************************/
8 T3 r0 r; r+ `7 A
void UARTInit(void)
) z" J9 z) Z5 E
{
: S( O3 d# Y2 u% d
// 配置 UART2 参数
9 x) G" Z9 Q4 X' y7 E$ u" |) m
// 波特率 115200 数据位 8 停止位 1 无校验位
9 d2 H8 s9 i7 D' e2 f4 i1 N' M9 P
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
' z8 Z5 K# [0 n+ A
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ i7 o4 b$ j8 E" ~
// 使能 UART2
: n/ [+ e/ @* G/ z
UARTEnable(SOC_UART_2_REGS);
' i* E: I# _9 C: K: B! G% `2 V' j
# u" E( \! W+ w! }# k8 Z
// 使能接收 / 发送 FIFO
, L' a& Q! a- t t& I; T
UARTFIFOEnable(SOC_UART_2_REGS);
' J* K# N& [+ e: n# `: l
# k# Q( t; ?3 i7 F ]$ N6 B1 }
// 设置 FIFO 级别
q( x. }( E/ K W) b/ I; ~; d
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
2 o4 u# o3 R$ @6 o
}
! j# z8 p! ?( |6 a9 X$ w" [
7 S# H. ~0 g& j. ?9 o6 V
/****************************************************************************/
, z* q7 I! v* m/ w, b
/* */
, f3 |1 q0 Q( _
/* UART 中断初始化 */
, f- T5 n, X8 L, `& w) D
/* */
7 `8 J& G) t8 x" ?. L
/****************************************************************************/
F( E9 B& h( B% V8 f
void UARTInterruptInit(void)
6 r/ ]4 z1 F( P& i( n! l; r
{
8 x- Z9 N' V3 E5 g
IntRegister(SYS_INT_UARTINT2, UARTIsr);
: i4 ?6 [9 {& A: w2 Q- K- c" M+ {
IntChannelSet(SYS_INT_UARTINT2, 2);
% [9 g# R$ g- U
IntSystemEnable(SYS_INT_UARTINT2);
2 F; j" z: |0 \2 \3 Y2 e w
# Q, _1 n: q/ s1 H8 A9 @
// 使能中断
! l: G; W7 A8 e9 m: a
unsigned int intFlags = 0;
! N( f7 c' n3 F4 c7 m3 e: F
intFlags |= (UART_INT_LINE_STAT | \
; K# Y! ~4 @0 e. `) g2 z, H |3 a
UART_INT_TX_EMPTY | \
& f' k0 z( _7 q0 r" Q. S# s
UART_INT_RXDATA_CTI);
3 g8 G3 V" h# \7 |( X/ }
UARTIntEnable(SOC_UART_2_REGS, intFlags);
) ]: ~! u: o1 O/ K" d1 H
}
% ^/ ~" I1 ]' w$ e) Z# x& a
( Z4 }, Q0 b! e3 L( P4 C1 M: {& d
/****************************************************************************/
' k. o; ~+ k6 o% q \# q
/* */
( X/ H( O$ v& m
/* UART 中断服务函数 */
: F6 x/ [8 f+ R# [, j: U4 X
/* */
( A: a0 y" P0 z$ k
/****************************************************************************/
% U6 R( Z) S6 t
void UARTIsr()
1 N( f) m- |0 ?+ v" v6 D1 I+ d
{
+ l! ?6 Y: h' Y m; _+ i4 v9 Z
static unsigned int length = sizeof(txArray);
# E+ w6 b j7 Q e1 j" F; }
static unsigned int count = 0;
# f! m( X4 T+ u4 [% A* `9 |
unsigned char rxData = 0;
$ ^" z, c r; @$ Y
unsigned int int_id = 0;
9 E. v: v; b8 G9 v
) w) r( k# }- l+ V
// 确定中断源
+ A5 G; |8 b# e" J* g
int_id = UARTIntStatus(SOC_UART_2_REGS);
, g; Y2 n/ V% \: i1 ^
! s2 [" x2 v0 q
// 清除 UART2 系统中断
2 N/ Z* v, B2 t5 S8 P' G" k
IntSystemStatusClear(SYS_INT_UARTINT2);
2 s9 @2 {. M2 S& N8 w- E
: o( e$ a, ~( I1 I( w2 j1 `. g; Y7 m
// 发送中断
9 Z0 H/ J8 h, ^" x2 E7 F0 h: |% ~
if(UART_INTID_TX_EMPTY == int_id)
# ^- ?. p. ~, X% g9 D" K; k0 B; i
{
; s$ H' T& }5 c4 U) [
if(0 < length)
9 s% w3 g. x2 N
{
0 Q1 u; g! L1 ?
// 写一个字节到 THR
, G, Q" a/ V. c, Z- f" C
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
. p% [( h+ v0 Z4 R, f
length--;
z1 I" j! @; c: z1 G- j/ e+ r. S
count++;
, j. r6 _* s& ~
}
" l, G9 q: s# `# c3 f4 W
if(0 == length)
" H- ], @! i) J9 {
{
& t/ w7 n: o$ s- ^( }
// 禁用发送中断
" S [& T6 O9 {, a( C
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' k* H, B- n9 g: D
}
; E7 D+ I& Q# B2 R! L+ I
}
- c1 b( v/ I- O$ @# Y
, ?) T6 z8 @2 f$ t( S) E
// 接收中断
1 f9 `1 ?6 T: V; s8 |
if(UART_INTID_RX_DATA == int_id)
: @ w0 `" r! W4 _" O$ A7 A
{
, b: F( P8 E8 _* P4 n) @! u
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 u" k) L2 i9 ~7 \: I
* s- U* r3 E7 ?- I1 ?0 @6 g
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
! l/ }; q6 p; T* \; z$ i
}
3 {. L+ W9 ^' y- H- B
* ~8 g+ g+ S% I* [) m( g* }6 w
// 接收错误
9 G# M' ]9 z/ v$ y' j9 x
if(UART_INTID_RX_LINE_STAT == int_id)
( `# B$ m+ Q* x: t `; g5 m
{
( M! e' p6 {6 V/ Q7 i" g9 P- k
while(UARTRxErrorGet(SOC_UART_2_REGS))
0 I: k2 ?& z& f! G2 O% d6 l
{
6 l C7 M2 w5 c* k0 C; b1 v! Y
// 从 RBR 读一个字节
6 m. d& y. _# O8 `% R3 `
UARTCharGetNonBlocking(SOC_UART_2_REGS);
& ]" H9 P# C# E- l6 ]9 ?
}
: a4 f. N+ b* e
}
& u: Y- t1 {9 N6 t5 B5 \9 }% D/ L
9 D3 a; z1 Q2 z& i: C; P* j9 F& A F
return;
3 ]7 ^- L/ P. W, `
}
% s( v6 x0 O; ~8 R% X/ Y
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
: v- H) ?& f/ N+ C3 D E, g) L
如果其它设备快速给你发送串口数据,你这边能正常通讯?
1 g3 c# h& x. G8 |: N( m
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4