嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
) `" O1 N1 D5 K
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
: K$ U$ a" D" K3 o$ s5 S- h
9 ~; z. z V; ?/ o0 P
#include "TL138.h" // 创龙 TL138 开发板相关声明
. N6 z, S2 Z5 }* L/ D. M$ F8 j
/ V# r3 V3 q+ ]5 C0 @# ^4 L( B
#include "hw_types.h" // 宏命令
( n# [" d9 G P! A7 P0 ~
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
4 ?; u+ q @+ T
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
r/ m4 h) M1 G7 z
" `' f0 O0 [+ q6 ^. R- j0 W& k
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
, B' s& c7 V. c" k
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
/ x5 e& [: ~! o
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
1 v) C% [$ f5 }2 I
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( ?1 H E& q( ?- I
! B4 F% p! d( G4 t; k7 O ?2 u
/****************************************************************************/
2 m9 o" F) s6 H# T a$ `3 i
/* */
0 G& s9 X" r) S+ ]
/* 宏定义 */
r1 B% x a7 E, @- |+ o
/* */
- g3 w; q G" C$ j0 |/ H! Q; Q
/****************************************************************************/
/ v0 O/ \# K$ E/ w; j u+ E1 r: o+ k
// 时钟
5 c+ w& v& V- b8 ?! b$ U) p b
#define SYSCLK_1_FREQ (456000000)
% [! [) D0 e- l! Y- ?& f8 J/ c
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
+ u' A; Q# U8 A+ [" D
#define UART_2_FREQ (SYSCLK_2_FREQ)
- C/ q! \0 I, D6 B) q3 @6 [" q- E
. O: \8 }0 t, T
/****************************************************************************/
u s n% M3 n0 m: x/ s/ O
/* */
1 ?- M' F4 c7 m# C3 u. n1 R1 Q* Z
/* 全局变量 */
/ K @0 S7 ]; X
/* */
! q5 m) s9 `/ d8 g/ X1 f
/****************************************************************************/
3 V, R; \" D* l: N6 a2 a" q1 i
char txArray[] = "Tronlong UART2 Application......\n\r";
. g1 [' @% A" G
1 b$ Y; c8 ~8 Y, D
/****************************************************************************/
# V, N- H) a+ j5 y: N
/* */
l. z0 T0 W! L& {4 i
/* 函数声明 */
: S' p3 l* d5 w6 l. j- x1 n$ Z* G
/* */
% N; I' [% ~% W
/****************************************************************************/
* q8 s/ Q, |% Y \, \
// 外设使能配置
) i7 n9 G8 Z1 U. N1 x' S
void PSCInit(void);
* m2 @+ B3 E& m, ?( m; {4 b- {
3 `' T% q* z7 P1 c) c( c' [( p6 n
// GPIO 管脚复用配置
/ v, J1 S8 A) P' A$ z
void GPIOBankPinMuxSet();
! Y9 l# M1 V. x9 \# H: {
* m" @$ j( q% I F4 ?
// UART 初始化
( n$ d& z( m6 ] u! t+ K6 e* Q9 G8 n
void UARTInit(void);
& E- O/ }1 Y1 K9 v/ R
// ARM 中断初始化
4 x% H$ i8 N5 h& @! ]) I
void InterruptInit(void);
( ?% E3 {; t4 ?: a
// UART 中断初始化
4 F9 G# Z0 F6 h
void UARTInterruptInit();
, J/ k5 W# c& s, X$ I* [
// UART 中断服务函数
6 U4 q) B4 a- z; s2 w5 H
void UARTIsr(void);
9 d8 ~7 A) u* W& ^
- f/ p6 ?+ i2 L& i
/****************************************************************************/
$ s( c$ q% r2 L: W. C) U4 [
/* */
; C/ Z# e, Q1 u9 {- T
/* 主函数 */
2 L; ]! K# N5 E$ r `5 |
/* */
3 k5 e$ {9 R t: f* F
/****************************************************************************/
2 w9 r' w8 [' A1 J. c$ E
int main(void)
6 L+ g! h- s4 q3 x T' b* g
{
5 l* S$ ?* s* U0 u' ?' S
// 外设使能配置
# M; Y, h; a! K2 P
PSCInit();
1 N8 L) d+ o5 H, N9 T& U
3 n. m: r+ k- k# f1 ^! W" l/ M* ~
// GPIO 管脚复用配置
- P6 Y' m! `- P( p9 f9 t
GPIOBankPinMuxSet();
( v6 q8 l9 s. w2 t, r
6 w$ W5 }1 q' i& f* H
// ARM 中断初始化
- ]5 R7 G% F# e6 |% Z& K
InterruptInit();
$ I$ L7 c; H1 Z' x9 x4 B
- C% V1 G$ g( u$ ?+ W0 z
// UART 初始化
& Y H# f5 y- B. T# w! W$ Z
UARTInit();
9 [: V% F( @1 ?6 l$ ?5 A6 \6 Y
: w5 i' L( A D' T6 t0 ]. S
// UART 中断初始化
& a/ b- p: h$ g" f& p, t
UARTInterruptInit();
( V* `! z0 c4 |3 X3 ^2 U/ P5 l
. a' f+ r( ]( _& h* l/ Z6 j
// 主循环
) q8 R0 C! M6 e C" k1 N4 H
for(;;)
5 O4 j4 R$ T( Q6 u; i5 C
{
/ S0 m" i" H: C5 e6 Q5 O: v
, V G7 m+ g+ @5 ] k
}
8 E. T( F0 p3 W5 |0 P4 j
}
7 v" V7 F/ a7 g/ ?( U0 W2 L$ q$ q- I( K
) L/ e5 d; _' e* U+ _2 A
/****************************************************************************/
* G8 o4 Y, L. O1 t0 z
/* */
9 C6 L7 u- i3 q) |, F- v
/* PSC 初始化 */
! ^9 X6 m9 M% {1 Q
/* */
7 H: O' V2 H9 K, Y. O' Q: K
/****************************************************************************/
4 F0 b+ L; k6 q5 P# A! L8 G7 [
void PSCInit(void)
3 r. k6 |4 `2 k
{
( V( d8 Q' w' g: @3 ~* u9 u
// 对相应外设模块的使能也可以在 BootLoader 中完成
, _: {% o9 S1 d' W, o8 \7 b
// 使能 UART2 模块
& v/ w# @8 o: H7 _! y2 k& S. }9 c! i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 T1 x4 A! N7 O L2 V. r, ]" _' z
}
X) h% Z5 U0 C0 o e2 `
+ ]2 M9 `& R1 p+ @
/****************************************************************************/
! N# w _) S5 _6 c, ]+ o& h
/* */
7 G) O7 Q4 B8 q: _0 Y: e: E
/* GPIO 管脚复用配置 */
; p, \. Z# v* S$ n: D4 P/ i. u
/* */
1 S+ y5 t/ b. z8 n% G, |- k& ]
/****************************************************************************/
/ \ ]! _: w i! [
void GPIOBankPinMuxSet(void)
; a: B' x. y2 p1 d$ e$ F
{
% @* s) h& L/ X9 _% b+ W. ?+ a- E
// UART2 禁用流控
/ L; X9 I; c1 v% \# Y. @
UARTPinMuxSetup(2, FALSE);
a, i% O; K+ w3 X
}
+ B: O0 f y: q* h F2 _. M! f# g
- Q. n4 {7 D* t& Z `' ` o0 p; F
/****************************************************************************/
+ _& E0 H. Q7 p2 `/ E0 i* f9 _
/* */
3 \8 m0 M9 x( I9 F" @1 Q& x" B
/* ARM 中断初始化 */
, H$ q) L# ~9 H6 `
/* */
5 b0 w8 V$ T" E* A6 F! c6 K5 c
/****************************************************************************/
5 a0 {9 K2 Z7 }! n+ S
void InterruptInit(void)
B. y0 x# A; B: G) ]
{
+ J( e* |* ]4 W2 a! f* Q: H
// 初始化 ARM 中断控制器
5 l) x( C7 m- {) G0 J( v; K w3 S
IntAINTCInit();
& T7 b' {: G6 v4 n" p" Y: n
2 i/ M4 M7 q. d; v% M; h
// 使能 IRQ(CPSR)
8 q7 g0 o- U$ _" `/ F
IntMasterIRQEnable();
! L }: I1 C {, m1 Z' | L
3 l" ` k5 p) p% U8 h& w
// 使能中断(AINTC GER)
) n4 |" Q/ i4 {, W, D; C
IntGlobalEnable();
) M( N. y( C( u
9 B. V1 ]* Z4 v& ]4 s( F
// 使能中断(AINTC HIER)
6 c/ A* e; M+ Z
IntIRQEnable();
6 K5 }& R* n1 f
}
7 s5 ~1 I+ T0 P0 T% |! Q9 U
$ ?" t8 I t+ S9 p$ \7 k3 ^2 p
/****************************************************************************/
; r" x' @- [+ e" R. \
/* */
n" H! e2 E8 v9 N: X2 V7 u2 u
/* UART 初始化 */
) T2 `6 {3 \. _
/* */
. r, o9 E8 M9 }7 P! y
/****************************************************************************/
8 E; L6 F: w+ q" l6 m
void UARTInit(void)
6 x4 G' z7 v7 W. Z0 u- ]
{
4 J6 h" c# \$ M, Z) K/ E ]
// 配置 UART2 参数
- L! k+ Y' Z) Y6 A
// 波特率 115200 数据位 8 停止位 1 无校验位
; O8 ?) t! j+ J( O" k7 K. o9 [, e
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
% \' C- \% h; ~7 [
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
& i- _' R$ ?+ d( T" J. Z5 ^$ C) F
// 使能 UART2
' S+ s! A: f5 R3 R
UARTEnable(SOC_UART_2_REGS);
$ W8 M+ s A+ Z( g$ k: m6 z
, p6 }, f, \# @9 v
// 使能接收 / 发送 FIFO
8 O9 Z8 d4 Y7 q4 B5 l7 y
UARTFIFOEnable(SOC_UART_2_REGS);
1 t5 c) K0 S. x% u
0 N# K' n/ M6 E, \; O2 s
// 设置 FIFO 级别
" x$ a1 h! H% @9 L
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 c4 X$ @" e- c R$ f
}
; @: n4 c" {) K* o3 b! O8 K0 h
% P9 K% ~2 V8 N4 T" Z, ~8 C) x
/****************************************************************************/
, W) N; }* R" r! y) i
/* */
; q. H/ ]* Y1 a' {# M- X5 |, E7 a
/* UART 中断初始化 */
( L$ Z, `" t4 W6 H( O
/* */
" M# c: {8 g) V o; O/ L" G+ }9 Z
/****************************************************************************/
0 v' q- K! c# @1 U
void UARTInterruptInit(void)
3 [0 C0 b6 `' D3 N0 |# [/ [
{
]3 ] t5 c- ~2 q
IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 r& p% h7 ?, B/ y% |
IntChannelSet(SYS_INT_UARTINT2, 2);
/ T6 ~# x6 {: g1 Q/ }
IntSystemEnable(SYS_INT_UARTINT2);
; V5 X" S- z8 J3 U' ^. s1 l
6 F/ o* o' L% R3 z4 n+ B) g6 I5 w
// 使能中断
s. h& J# V7 [& g9 F# |- @
unsigned int intFlags = 0;
( X$ c$ j7 ]' h' I" E0 p
intFlags |= (UART_INT_LINE_STAT | \
! t0 d0 j/ n1 T* @2 S2 S
UART_INT_TX_EMPTY | \
$ q, E; @% Q% v' E a
UART_INT_RXDATA_CTI);
9 w# g8 i: R" [3 I+ m3 Y3 p+ u
UARTIntEnable(SOC_UART_2_REGS, intFlags);
( @' D; w! P& f
}
, `" ^5 ?" @+ s1 R; h1 A4 H) a" h
+ }7 u% G, c8 ?, _
/****************************************************************************/
& K6 @ w) ~6 S" L& ^
/* */
( k }: g: g* B5 Q* V. E
/* UART 中断服务函数 */
% N5 C" C. q! `* z3 Y/ P
/* */
! ]$ I( _! w+ G& K( O
/****************************************************************************/
4 i& Z& W( |% ~4 c, }% X5 {$ x
void UARTIsr()
4 m3 s0 M2 D+ [2 v% b, R+ {3 d
{
6 Z) M7 C, R4 t# S& N4 S
static unsigned int length = sizeof(txArray);
2 F0 E3 h. n6 Y2 \ [) O1 R3 l
static unsigned int count = 0;
D; s7 X5 f8 L% n" m7 p
unsigned char rxData = 0;
0 o/ }+ Y# h U7 k4 d
unsigned int int_id = 0;
* E2 Z. j$ `1 s: f4 ~
$ o3 `) @4 t3 g9 i5 V. _% Y: W( m
// 确定中断源
$ Q; K3 N+ P% @& d# `
int_id = UARTIntStatus(SOC_UART_2_REGS);
: [4 Q% m$ M' B! F
' Q6 @8 a( r0 N% v1 Z0 d( {* q
// 清除 UART2 系统中断
( j4 S$ f- {0 G. E$ }+ F* A. p
IntSystemStatusClear(SYS_INT_UARTINT2);
4 w" N- @+ l0 J5 H; z3 w+ P3 U
6 G B7 r" L+ @4 E
// 发送中断
' M; b5 v, ?2 t3 q4 n
if(UART_INTID_TX_EMPTY == int_id)
. ^5 z5 r ` I. w
{
; ?0 L% P! E4 }* ?: x1 E+ l( X
if(0 < length)
: I2 p3 w+ X7 l; o" Q
{
/ B) ^* B+ \+ x1 x2 F# ^
// 写一个字节到 THR
+ b4 c( k2 x! N8 r* u: g' \; K5 Z
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
, O7 b* f$ ^7 b
length--;
# h2 _( U% a; ~5 e6 m" A
count++;
' j4 i6 j! j a. v e1 H
}
# h1 U) `/ t' k2 k* C* g( r
if(0 == length)
! B2 } C+ ]1 p! q
{
6 |; I/ j3 G( U2 t
// 禁用发送中断
# l" p5 h; N4 _1 u" j: R/ q& q
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
, z& B: N( l F4 \- p6 {
}
, ?+ s3 l: g) E& j& ~
}
: X) Q4 T' v) N4 X, h2 B* L
. i; X7 L1 e( S& Y9 ]9 H
// 接收中断
. y. Y- P/ T7 T' R9 K/ f% U
if(UART_INTID_RX_DATA == int_id)
6 [) U- C7 w/ _, ~( O" X
{
5 F: z2 W4 v- h: o6 M6 e
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! {( p( v( @7 b( x# W s
1 t& \5 j% v& o- p; v) E' E' x
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
( v9 Z& t. R% ^) b g+ r+ M! ]+ d
}
; c/ g+ X; S9 p7 K: l# i
- d4 v+ L0 G. d) A( o
// 接收错误
) ]3 x2 z8 A8 R1 K% m6 b' J
if(UART_INTID_RX_LINE_STAT == int_id)
; _; d6 ]* u+ S: B) o9 K8 m* l
{
! \2 m: M8 M) k/ \# ]3 [( v5 z
while(UARTRxErrorGet(SOC_UART_2_REGS))
/ j& ~7 l p- |$ j, ?
{
# w* a' f( I+ P- y3 ~
// 从 RBR 读一个字节
$ o& @, s8 F p5 C: j5 a3 H
UARTCharGetNonBlocking(SOC_UART_2_REGS);
$ p d0 `: Q! T, B. U
}
+ t/ p% R! B# |8 e- C* b
}
! o; f; i' v% J2 C' K
, N/ u0 R# A, s. I
return;
8 |, w0 Q. O! ^
}
5 h" [1 H1 t2 O. y |
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
* S% G% l- D: M2 D2 I% j% M! h
如果其它设备快速给你发送串口数据,你这边能正常通讯?
2 F$ b% _) G1 h0 Q3 R
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4