嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
) R* q9 T- w t& Z
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
! m- ?$ D+ `5 r0 c, P! |4 S m
- \7 W% _! N: M$ B4 o* q( I7 c
#include "TL138.h" // 创龙 TL138 开发板相关声明
) ~* ?9 m4 h8 l
( e6 }) j* t0 x- [( j
#include "hw_types.h" // 宏命令
4 {; |- `# z7 U h( a$ I
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 M& x/ [$ G% \$ Z
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
) {: c# d2 E5 @" N+ P
1 Q' t+ I; H2 n' F
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
- y* `. Z0 ~# ^6 V# H# y/ ~
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
: K) r& ?3 o8 \
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
9 F2 k9 @( _; a. M, h" l- V/ d, E
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
0 \: V& A1 Z: X3 A
; Y" r) t7 s# J! T# \# ?+ B6 d7 t
/****************************************************************************/
2 K4 u4 W& f; M: ?9 C! B! |& @
/* */
Z5 y. f G; J2 c6 u; s) G
/* 宏定义 */
4 ]4 M/ m% a9 {3 Q8 O# r, g8 ~7 u
/* */
. u) G- V5 s! \! N
/****************************************************************************/
; C9 H, V. [4 O4 f# G, L5 E
// 时钟
( _& o k$ h( b. D; ~; f' u
#define SYSCLK_1_FREQ (456000000)
2 ]" L! I+ h/ S5 a6 w
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
0 v! C6 @0 Q/ n* \
#define UART_2_FREQ (SYSCLK_2_FREQ)
. |- r5 `7 j7 B& D) ]. C* {
7 S5 T8 [) P5 J1 v, }! x8 F* v
/****************************************************************************/
1 h5 Y2 z w# }7 z: V
/* */
4 y2 _: _5 o1 b# q8 |
/* 全局变量 */
" B+ p% H C) L$ u1 i
/* */
! q o0 V" Y0 A) \3 D, i0 ^# n
/****************************************************************************/
L; {( H* D8 w* k# y
char txArray[] = "Tronlong UART2 Application......\n\r";
4 Z7 y1 P7 ?8 R S' @8 `2 y% ^
% N a! o3 A) |: g3 h. v
/****************************************************************************/
; k$ i) D8 j" G7 Z. H. o
/* */
: [3 _' G/ a/ c! J2 ]5 T s
/* 函数声明 */
' |9 ^) D$ y( R$ h* B
/* */
! Q- ?& }: V/ L# X' p2 p
/****************************************************************************/
8 w* y0 `) k! M; `. w
// 外设使能配置
! }% l9 u) g( A
void PSCInit(void);
( k# C- ^$ z4 K3 q
; ?3 @+ ]% ~0 [- f
// GPIO 管脚复用配置
9 L" m8 }8 R& M1 b' W
void GPIOBankPinMuxSet();
6 s) X+ x6 c7 k) w1 K1 a0 O. C* |# ^
1 T. L# {: c+ V ^, ?5 T- A8 S
// UART 初始化
3 Z3 v5 ?* r) [0 o: P
void UARTInit(void);
6 Q3 |# R) q, |+ `8 L
// ARM 中断初始化
" V4 y. L' G6 A/ ^! m
void InterruptInit(void);
: E6 c( W: y$ B. u
// UART 中断初始化
$ x6 r$ h" L+ B0 |
void UARTInterruptInit();
. T, H9 y# u5 v) d
// UART 中断服务函数
) t* `# _& U" ?8 l5 F, k: ~
void UARTIsr(void);
9 \- Y1 H6 i: a
! D+ t. G9 U+ W
/****************************************************************************/
' e3 O! u( J9 S9 [- p
/* */
: ^& E0 R0 W; O' b* v/ t9 C
/* 主函数 */
4 X7 ?% n! ?; M2 @3 B, c ~
/* */
: {% \9 R( Y, G
/****************************************************************************/
7 Z0 a2 [& I6 J" k& R# x
int main(void)
! f4 I: b5 F+ C+ D- ?
{
* S9 K+ B) w+ [, Q
// 外设使能配置
9 D+ M0 p+ Z8 d6 s7 ^2 V
PSCInit();
" Z# Q( G9 p0 f9 l) a8 l
) P; d, n7 q# T+ F
// GPIO 管脚复用配置
% p6 h5 N3 y/ V9 w
GPIOBankPinMuxSet();
2 }* {( ~ z! y5 k2 U
, Y, ` a2 D# H& s! {
// ARM 中断初始化
T3 Z8 k& P& D, z- r( w0 g' ?
InterruptInit();
1 \8 ?/ d) n! q
9 O$ E1 s) R i
// UART 初始化
" V, ~" ]9 L- d F; M: C$ O
UARTInit();
$ a+ U- l4 q9 W0 [2 w9 t
2 d2 Z3 T, U% X/ P' z0 U9 U. y: `
// UART 中断初始化
! j/ a- L: B6 a
UARTInterruptInit();
d1 ~: q* W5 O% q" k+ A- U8 _
4 a2 N5 ^$ \9 j% f0 i. B
// 主循环
* k0 |1 P- p! K
for(;;)
& k% o/ I& X1 v ^& Z) s% I
{
& q5 e1 s; ~2 x: Q- p
& r+ {% V" W6 }
}
% a$ M1 @* Z! q! \5 ~* `6 |6 v
}
: a) D/ \# Y ]2 f4 x- D$ T; j
C( y9 K v/ b6 U; A: {- o
/****************************************************************************/
N8 }& h. b, x" g; c
/* */
: [* D# A; g1 v1 K1 d
/* PSC 初始化 */
( W% y- R, a4 Y, s
/* */
; g: }& l" U7 w# ~. \7 D! A* W6 {
/****************************************************************************/
1 G Y1 n ~9 P) X" U) {; ~" ]
void PSCInit(void)
5 j# g( Y' t* g
{
+ z k/ F# g7 K1 v( X8 s
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 p2 Y8 c1 R6 {: [/ | ~
// 使能 UART2 模块
* |# J' p+ m, ~' f# ]1 [9 H I+ ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
) @) G; L4 e: q' S! k' }- Z
}
+ Q4 H1 C! D3 Q
7 y3 ^" n5 |7 u8 l$ X. G, P
/****************************************************************************/
: e& f/ [' w! T' L4 j; p% u0 b0 j
/* */
6 N& P [+ y9 f" k
/* GPIO 管脚复用配置 */
$ Q3 a( X; W o3 ~% h# Q" N! `
/* */
, ]% D9 S3 z* [- p# N2 J8 y/ y
/****************************************************************************/
: O" Z0 r. ~( ?' H' {9 p
void GPIOBankPinMuxSet(void)
* Y9 i* A% k5 S( Q. k* ?8 Z* C
{
: |5 w: w2 [6 r4 y$ I. M. }
// UART2 禁用流控
- R, z, a! | {% `! Z7 l3 \' U
UARTPinMuxSetup(2, FALSE);
$ o, k( }6 @. A& g. l
}
) a4 Q9 B$ T# W7 {$ M! g
8 v7 R" P- E! z) w3 b6 n2 S
/****************************************************************************/
$ `! W1 Y2 ]3 M! f4 C0 y
/* */
# U4 k: X9 X% l& b
/* ARM 中断初始化 */
0 { J: n$ F( f, g( p/ c. @& n
/* */
1 b* F) K: a/ [, l. x
/****************************************************************************/
3 q" A$ X/ ^, q* [) C
void InterruptInit(void)
' h" T# L* z1 p
{
6 B! f* p( W2 u7 {3 S4 p* x: A
// 初始化 ARM 中断控制器
7 C* h! I+ c" v( D7 A: w
IntAINTCInit();
4 j1 M* V7 G* [# r
8 ?3 \/ g) }4 y, o0 z
// 使能 IRQ(CPSR)
, b0 M9 b9 ]4 S7 m
IntMasterIRQEnable();
) `2 C; x, f+ G2 x
5 T+ e! r. R" c. W. k4 M; P% D2 A
// 使能中断(AINTC GER)
3 j1 v2 _0 k4 O# i. j# ~
IntGlobalEnable();
+ _4 ^4 D$ D. J0 I! J: A4 Q
. Y6 B7 O: @. [4 t+ q4 Y) i$ U
// 使能中断(AINTC HIER)
& ~* O4 U* A2 ?" p
IntIRQEnable();
( u" L* l. B7 z4 I& d# t R
}
2 y, V+ I- x* E- u" V
4 [8 |* x M! J" `7 d' Q
/****************************************************************************/
; b0 A$ u- \' i
/* */
3 |7 A, Y, E% h' X) P
/* UART 初始化 */
/ p i5 p* e! y2 c3 D. }5 Y0 `% D
/* */
9 a. f( h, v& \2 f3 n
/****************************************************************************/
6 X% S5 S, N/ J2 C5 g
void UARTInit(void)
i5 v- }$ G! ~" [; f
{
2 f! P0 {( q" r
// 配置 UART2 参数
( b; G; c U! g/ C
// 波特率 115200 数据位 8 停止位 1 无校验位
' X6 ?% y) k3 _) C" D* _- H
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
. ?- R, }6 ^; }' C) j# [ M! e
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
) [: I) Q4 z& z# H0 r
// 使能 UART2
* N# r1 W; \# J/ v
UARTEnable(SOC_UART_2_REGS);
! q( h, i7 Y8 I8 a7 J9 ^- H
. N9 l9 d8 z' N# i& Z
// 使能接收 / 发送 FIFO
# _9 d2 c2 G- R; }& s
UARTFIFOEnable(SOC_UART_2_REGS);
- m/ a/ t: C7 d% s) T
" s& ?9 [$ I, b5 B: ]
// 设置 FIFO 级别
6 J' ]" t2 O: g
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
: c) J/ l1 q! U& H& O1 T
}
X8 g: J& } a2 z3 j( h# C* [
; j3 X9 P/ L* [& p
/****************************************************************************/
) c0 \ ?8 z% X/ e/ p% B% q
/* */
`& c2 e- F3 R
/* UART 中断初始化 */
2 G6 L# G4 } c$ O6 n/ i6 j
/* */
7 D. C0 j; v4 s. T& t- q
/****************************************************************************/
( U$ S6 k: @ ~+ U1 P% ]2 ^" K3 y
void UARTInterruptInit(void)
. F' o& g4 V7 Z+ A# v" U9 F% {
{
# s9 q8 h5 Y" S' ^; i, f
IntRegister(SYS_INT_UARTINT2, UARTIsr);
& H1 R. m4 L* _ a; O- ^
IntChannelSet(SYS_INT_UARTINT2, 2);
1 @. k( n/ ?3 F+ K: U
IntSystemEnable(SYS_INT_UARTINT2);
2 R) R( F: `; }4 r' d" u, N
! {$ x" u0 x, e7 i) d
// 使能中断
+ G" f c; V$ p
unsigned int intFlags = 0;
5 U. u8 g+ i6 ]5 |
intFlags |= (UART_INT_LINE_STAT | \
! O, S: N2 k a6 J# C0 J, s
UART_INT_TX_EMPTY | \
! h: U* X$ Q( J" B4 v
UART_INT_RXDATA_CTI);
- F6 C) M( B* }
UARTIntEnable(SOC_UART_2_REGS, intFlags);
k7 S& g2 ^! k* R
}
2 {5 U1 {" ?) P, M7 g/ b' y% C
. x0 r2 z( t3 ?# t: W
/****************************************************************************/
$ Z7 g/ y g5 u$ s; W& M4 z {& g
/* */
( q& L7 ^ p: e9 P3 T! v
/* UART 中断服务函数 */
3 H) t" f9 ~5 ~
/* */
, t) i" F) {7 w9 @- d9 l0 x- H
/****************************************************************************/
+ B2 b& ?9 h$ w
void UARTIsr()
4 w4 H: h! H/ j2 l' d0 v) Y
{
/ ~, Q4 I/ _1 g: o" h' q& c
static unsigned int length = sizeof(txArray);
1 z5 Y* h D" k0 T! u9 X, I) O
static unsigned int count = 0;
+ C/ q% n1 @# u
unsigned char rxData = 0;
1 P/ J7 j- u: F( m
unsigned int int_id = 0;
( w5 ]5 F; k+ A1 X# Y
6 Y+ g2 k1 r- Z( p
// 确定中断源
7 M8 Y: @# ?% n7 x
int_id = UARTIntStatus(SOC_UART_2_REGS);
: |! Y; i1 x) S7 K( U+ k
; b( e' P/ U9 g7 @. F
// 清除 UART2 系统中断
5 {9 U' _+ Q1 v$ Z
IntSystemStatusClear(SYS_INT_UARTINT2);
3 M0 E3 e) Z5 @: U" c
7 ]+ u2 b6 i: f2 l' Z
// 发送中断
1 Q% w+ u4 e1 R& ?( ` G1 l1 H! c
if(UART_INTID_TX_EMPTY == int_id)
- \5 m' k; b0 x
{
+ X0 o8 N$ {. f4 L9 j$ u$ X
if(0 < length)
9 |; F( o0 j- L2 j1 {$ C$ }
{
3 u/ u6 s) J# @) e! s& r+ p% j
// 写一个字节到 THR
* S$ |% K, g1 P# d, I' ^
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
5 i1 f h1 `/ S! s" r5 q
length--;
/ }; w9 o3 R8 d) w% i7 t& V
count++;
- `/ A3 ~' J* _
}
# s: G3 v5 X- p" G$ z
if(0 == length)
( z I* o! r& S# y5 L
{
1 g9 T, G2 r9 j: d. d* c- ]
// 禁用发送中断
0 a' }3 x) n, t0 h1 l0 B. c
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
/ L# v: p( f( ]% Q- l l
}
' f) B5 I, W- O# R) I
}
6 Y3 u4 r* b/ K- A; U: H
. S6 |! ^" j# D3 j* M
// 接收中断
7 B. u9 G9 v$ w- E9 P q
if(UART_INTID_RX_DATA == int_id)
4 a0 e0 Z- T2 R. _2 P: X5 x
{
: M8 J0 U: J# u, T+ ~
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
% P, ~) f0 W. A B( G
% \" X, T4 u( ~) s* p) M
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
7 b1 h( [2 Y. k! ~' X
}
- M5 o: L% d o; ~
& q2 t0 r6 S. w9 T! D6 V
// 接收错误
9 b& ^/ }- r; m% v
if(UART_INTID_RX_LINE_STAT == int_id)
+ [. S7 m9 A5 m1 i2 Y
{
0 a7 O% t1 R9 f
while(UARTRxErrorGet(SOC_UART_2_REGS))
# N1 d% K0 K# F) ]
{
! g: |9 e) [( m
// 从 RBR 读一个字节
8 |/ J( E: o( h+ B* c
UARTCharGetNonBlocking(SOC_UART_2_REGS);
" f9 C a% `0 k
}
* Z$ S1 t- O: D
}
8 P/ b* o; X3 k7 l1 T5 D
. k6 a* Q8 G3 P) k5 h
return;
( A% B ~ D: `( r. C& R
}
) x: h6 v' X5 m
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
5 q( L8 U3 ]# m6 B1 O W
如果其它设备快速给你发送串口数据,你这边能正常通讯?
( G+ a( V' w: ^8 ], I+ z% V
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4