嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
! k6 Q3 `* g' J2 [& \+ f
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
5 G1 L6 u2 O6 i. R/ g7 C0 Y; b
' [7 L5 u2 S' P+ F
#include "TL138.h" // 创龙 TL138 开发板相关声明
8 ?; g" k; S: \1 T
/ C* u: H- b! N% I: }
#include "hw_types.h" // 宏命令
& Z4 l+ C9 n2 |' ~, G6 J
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
! l* V. y# a4 p' X& h+ k
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
/ q: S h3 Z5 {8 k
; k, W- b1 N% u9 u F$ y5 c$ S
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
- [. z. K: A: ^! Q- N
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
" O/ r6 D' G0 X) B! g. }
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
) I+ Z& f, l' x- J
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ V9 |+ O9 x/ }& b4 J# W. f; `3 i, r% e
2 \, D8 v3 Z& o* Q; c! g3 H
/****************************************************************************/
2 P9 A, Y: Y7 D1 g2 ^! d
/* */
+ u0 u3 d) O4 C3 O M$ F
/* 宏定义 */
. |- B/ j, Z* B5 M5 w; g
/* */
6 _: B& R) r) V4 @
/****************************************************************************/
( g. F) ~4 M, e) T
// 时钟
3 F+ ?: {5 D0 _( w/ L# G, b
#define SYSCLK_1_FREQ (456000000)
7 J; _5 S* b( D; n7 ?0 F H* a
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
& u8 T' ]5 o4 a9 ]" n% U
#define UART_2_FREQ (SYSCLK_2_FREQ)
. N: ?6 _# e4 S1 A9 A, d
/ E8 J) b6 ^0 w H) K
/****************************************************************************/
6 ?5 h8 ]1 B* y( L
/* */
% r) z3 `0 D3 E- u X7 ?
/* 全局变量 */
5 h# r" W2 ?/ e5 K* H( c
/* */
' Z- v+ [9 C0 l% \
/****************************************************************************/
; @ \ E/ e: }( ^
char txArray[] = "Tronlong UART2 Application......\n\r";
4 H, O/ T. T$ B- G n8 B
1 ?. `/ V5 P0 p
/****************************************************************************/
9 ^4 w5 o' `4 T
/* */
! _4 h4 a& r8 D4 v; Y2 K
/* 函数声明 */
8 o& [' I, i# [' o- [' A f0 \$ i
/* */
; x$ Y$ k# F5 T. {
/****************************************************************************/
9 s6 f# T5 q8 R) |; k
// 外设使能配置
3 o3 d% h8 w% Z% g b
void PSCInit(void);
* n x9 M% `6 K6 g0 m; H( Y
V. k8 H* Z8 ?9 ^( a
// GPIO 管脚复用配置
0 A) O$ A& [5 H/ a( ^
void GPIOBankPinMuxSet();
( l$ l9 f. D0 h. e j
! E& i- l8 z8 I
// UART 初始化
; b6 f9 u9 ^+ H( q6 W/ S' t: O
void UARTInit(void);
- O( G) J% M% B& t# C+ D
// ARM 中断初始化
0 f" F% z# u( b3 B# J- X
void InterruptInit(void);
2 c+ ]; Q. u! L0 g# f5 A) o, Q
// UART 中断初始化
+ {8 ?' L( o6 e+ m# A4 m) f
void UARTInterruptInit();
! F. \ H+ w/ d# Z3 u8 [% k4 T6 U
// UART 中断服务函数
3 x+ |0 u6 T% @. V" N! d
void UARTIsr(void);
, L ]2 f+ l3 b
7 ~# I' v9 S1 a9 [) r& \
/****************************************************************************/
5 G" s( j* x* O' j+ z; n
/* */
# `. }; v7 Z1 e6 F9 P/ g( \+ v7 U, q
/* 主函数 */
. Q6 g# Q' k# l8 F! n8 q
/* */
! z9 @" X9 G* \9 z
/****************************************************************************/
0 M8 w1 ^0 e, G n( k
int main(void)
) {: k0 c) q# A* M& j: _- C
{
; y3 \2 W! w, h" ~( Y
// 外设使能配置
/ x; _+ P3 u% w4 ]$ b% G$ W8 H
PSCInit();
: e7 v- w5 R7 j# y; u& j9 V8 e* @
" a X# o I2 j% B0 u: D
// GPIO 管脚复用配置
* y1 L4 {8 M% z* Z' K
GPIOBankPinMuxSet();
/ L% X* S# i& @' s: f* V
/ } h4 t! x. Q& r8 ~2 C
// ARM 中断初始化
$ U# I+ ~! F9 Q" J0 Y
InterruptInit();
: a; m/ P2 F0 w2 L' g% R, M! P& |0 O
+ Q% Q. w4 C Q
// UART 初始化
* }" f8 K: a& J# H1 v/ u
UARTInit();
8 r5 v( ]# U, j
_( S/ o* F3 I* [3 m, I
// UART 中断初始化
c* W# V2 m# C" Y( j
UARTInterruptInit();
: _6 c' e+ B+ H8 A
. ^0 e* {/ f+ e! }9 Y
// 主循环
$ [5 n' y+ O0 X8 W
for(;;)
3 K% ]5 u# E$ Z' ?0 [% a
{
- k0 f4 F1 Z% Y. {, V
. e3 w# e! U4 @
}
7 w8 q' ]9 T3 [+ k8 A- q) ?
}
/ O! u. i! K o$ B9 [0 S: B p
( ^9 P: j* r8 [% [; v8 S+ J
/****************************************************************************/
9 i4 i( F6 a% X( ?% D/ S3 F2 b
/* */
7 U. }7 Q8 E% M& n8 N+ y
/* PSC 初始化 */
i7 }" x" d$ `+ N+ ?) T
/* */
9 ~9 v ?' K5 x1 D
/****************************************************************************/
% e+ Z1 q, y5 A! U4 x
void PSCInit(void)
8 v; V; _2 w7 V" b) L( ~: B4 \
{
' N! f: s; s% W, J
// 对相应外设模块的使能也可以在 BootLoader 中完成
& T5 _8 S. ^+ K4 U4 f
// 使能 UART2 模块
$ h9 h8 E' _& _. K7 W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 m2 }8 n. H0 p8 ^4 o0 R T
}
* T' o: Q' W2 A: V
7 n e' H) }4 J' D: o6 V8 ^& R; u
/****************************************************************************/
5 K) R" s* R$ A1 y- K- f1 M
/* */
1 ]- \* _1 |. B( G+ l2 w
/* GPIO 管脚复用配置 */
7 V! [9 i1 R0 Q
/* */
+ f4 i$ E/ C1 K
/****************************************************************************/
8 S0 x; a5 n1 ?$ z5 J
void GPIOBankPinMuxSet(void)
+ @+ ?, i. [( F+ T% M$ o3 B$ H! ?( Z
{
7 z! {; b2 C( e) j/ k1 V2 T1 G& v# z# \
// UART2 禁用流控
! p2 d5 @1 u, ^
UARTPinMuxSetup(2, FALSE);
( j9 U H" ~. y9 Q) K& t( \! Z7 Q: g& p
}
8 Q- B4 |& a7 A. r( Y r% z) K s2 o
6 j- P/ v" L# r
/****************************************************************************/
' z. Y# F2 w: }9 ] g$ v5 J0 A
/* */
& n5 t; O: a3 }9 O4 I7 \* z0 o5 p
/* ARM 中断初始化 */
1 I, Q f( H$ ?2 S4 @
/* */
5 @$ c F$ @# g! P* V
/****************************************************************************/
' g# h! }) u, f/ k: h
void InterruptInit(void)
g8 _0 C0 V9 ~& o
{
9 y! G/ Y& i6 \2 P
// 初始化 ARM 中断控制器
- ?8 w' Z- h$ s) x. ~' n+ M+ `# d
IntAINTCInit();
$ D0 a( U$ }3 p( B6 X4 p
2 Q, Q8 a% }3 w% q2 \
// 使能 IRQ(CPSR)
/ O) G" I% ~/ R& l$ R( g' J, @
IntMasterIRQEnable();
% A* O+ W9 c& a, R% N7 Y! r
7 _$ N& ]: G5 F8 H& Z- R# l
// 使能中断(AINTC GER)
$ h6 d- N! r4 M+ ~6 {
IntGlobalEnable();
, v } v: N1 A" y( x* F6 _+ r
& y, G) c4 ~( b9 O3 W* H$ k
// 使能中断(AINTC HIER)
7 g- N+ C+ K, c( g6 `
IntIRQEnable();
& r& D/ g' Y. c7 t- r0 F
}
7 }( @1 u V( z& B9 ?
; m. N8 s$ v+ C; t) V! [' z
/****************************************************************************/
i* A+ |% ~; X* w% T% t* }
/* */
$ M% [5 o2 C% F4 d' B
/* UART 初始化 */
/ Z& b% p; T( `7 D& p
/* */
0 p0 l+ b# ]7 G( A- E
/****************************************************************************/
( T" z+ H: p% q6 D
void UARTInit(void)
4 m7 h0 j, R2 ]3 G' o0 [
{
* } C, l3 x3 l8 l
// 配置 UART2 参数
+ l$ @+ S- Y1 U$ @, o2 c
// 波特率 115200 数据位 8 停止位 1 无校验位
. A0 P6 ~: S, O8 c$ W' H5 I3 P
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
4 M- g: _! F& W8 s% f
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 N4 N% m, d0 c' B
// 使能 UART2
3 P0 B$ A5 h- R& i: R. ?# \$ l
UARTEnable(SOC_UART_2_REGS);
" A, M+ M% R5 Y* O/ y
* ^" _: h) G, c+ h# A2 q/ K
// 使能接收 / 发送 FIFO
3 V) k3 F5 f! n! ~; |6 ~
UARTFIFOEnable(SOC_UART_2_REGS);
8 W4 x `) _$ r' {) N% m, U: m
0 G5 n* O1 ?2 W4 y6 J3 A2 p4 J
// 设置 FIFO 级别
3 z2 a! y0 p5 {: }8 F
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, v0 ~% ^4 X3 Q+ }1 X* |
}
/ N$ w. M- \1 |' n) Q! w2 D' S
) t7 P8 r# y* H$ J6 i# U
/****************************************************************************/
$ f. J! N n, G% u
/* */
/ O. p% Z; ^7 C5 Y' e7 c$ F
/* UART 中断初始化 */
4 _; [% |4 s) T! x3 D' ? T
/* */
, D, x: `' t2 j
/****************************************************************************/
( S$ c* z7 T; A4 C+ @' R, @: u
void UARTInterruptInit(void)
" w5 l( Y x% A. _: z/ H& U) W
{
5 T+ _' Y/ w( h1 b7 D1 `2 W5 |
IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ u% C: B1 H7 Y+ p
IntChannelSet(SYS_INT_UARTINT2, 2);
. V# O* j& x/ a, q/ N; p- R8 s
IntSystemEnable(SYS_INT_UARTINT2);
2 o/ m, t& A& {3 p6 g2 _
, N/ q$ }/ n% |7 X
// 使能中断
9 k3 \2 {" g( h d4 o
unsigned int intFlags = 0;
: | S5 ^5 {! b! v) a
intFlags |= (UART_INT_LINE_STAT | \
1 h4 B, T r" |7 E5 i
UART_INT_TX_EMPTY | \
: }' ~: b8 b. E
UART_INT_RXDATA_CTI);
) G" V6 A7 k6 [1 S9 L2 f F( D; E7 O
UARTIntEnable(SOC_UART_2_REGS, intFlags);
2 ~' J M7 P# Y( I7 G! Q1 \
}
) l# z: J' k/ z2 B
' w1 q& G) h" k( V) M
/****************************************************************************/
0 G9 k. i( l' p( B5 u) s
/* */
7 y- _+ v* B' E1 c) ^
/* UART 中断服务函数 */
H7 {7 o5 `! e! l% y: w; l3 H
/* */
6 H- B' {+ e! ?% c8 H
/****************************************************************************/
9 Z! T0 F; |( e: O
void UARTIsr()
# P8 m5 @8 i( p
{
& u- d# m! l: s$ s2 L8 B* d
static unsigned int length = sizeof(txArray);
: N. R2 I% J; ~ h9 _2 P3 p
static unsigned int count = 0;
* P! f( ~: E. U) v& D: V
unsigned char rxData = 0;
; w m7 H3 e P- W! q4 l; H
unsigned int int_id = 0;
& r2 g0 B# N$ p9 x& a
" ]! L1 L" {0 U. j
// 确定中断源
6 o9 b' \/ W% E0 S
int_id = UARTIntStatus(SOC_UART_2_REGS);
0 w' p0 F' q* S( k* A
- B. g5 J( i7 @# d5 I8 C
// 清除 UART2 系统中断
. p6 R. g$ b& P, E
IntSystemStatusClear(SYS_INT_UARTINT2);
$ I- C/ n' m! \4 M' K
! @1 d& l- _5 Y/ k$ Y2 z: }
// 发送中断
+ o5 c6 ~7 ~, J$ N3 l
if(UART_INTID_TX_EMPTY == int_id)
+ q2 J2 ]4 v3 @2 V4 Y
{
8 r6 r! e* r1 a% y( m
if(0 < length)
" p8 S, ?+ Q& W$ D: @3 e$ K7 F
{
7 _: I2 e; K+ L
// 写一个字节到 THR
/ @& r; Z, n6 Q3 U) i3 [
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( s1 M# v/ f0 Q: ]
length--;
; |! A8 x0 W4 Z! A( q7 w
count++;
* @2 U% m8 i7 x; l: e
}
, _+ R6 {: d9 m' d; S' f
if(0 == length)
, X/ j1 q. M! a7 _3 x
{
1 L& ]% J0 l* L' o3 K
// 禁用发送中断
$ x) p/ f+ t! n3 |
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
" y5 q7 P. d! S- X
}
8 |' ]' u5 M3 m5 t9 T
}
- @4 u3 N$ l1 t ]7 c9 n6 l
3 U6 X5 V; S5 K. A5 [1 x
// 接收中断
; u% ~" ^2 t7 s* o
if(UART_INTID_RX_DATA == int_id)
: d3 a) _( S( ?4 w5 y0 f
{
5 e, x' F i2 M* V8 x
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ L( G$ T" K" [8 Z2 G2 q
+ M1 o7 X$ d b, k
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
. m9 a1 H$ X) V9 \8 j
}
; |# N' h% K/ D& F
, F: i/ h5 B- X6 t( m% ~' f& f- l
// 接收错误
2 C" M0 j% G2 p7 w5 U
if(UART_INTID_RX_LINE_STAT == int_id)
7 S, H, l( X, b( m6 M( y; w
{
% j- y0 q8 Q R' x4 F, }
while(UARTRxErrorGet(SOC_UART_2_REGS))
, u5 C7 q2 F4 x
{
9 @0 B' b6 W1 A8 a$ Y4 d+ W
// 从 RBR 读一个字节
' }- s" d: K) @% M5 }- J! n; k9 s3 ^
UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 M3 K2 F* z9 w& E
}
) y$ N1 }2 z1 [" Q
}
, V3 V7 y# N* @# `# ^ ?) H
* W) v; v" L, M1 }
return;
0 A6 w9 |! _/ @+ {* E
}
0 G' W% z5 w( G& c+ ^( F
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
6 v+ p# Q, Q4 |
如果其它设备快速给你发送串口数据,你这边能正常通讯?
$ x: ]: o: c0 v: j/ u
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4