嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
. A- L6 J8 W; r1 w/ Z t. c5 [
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
5 n$ p! }6 s/ l
2 b8 @1 Q% S% D! S* q
#include "TL138.h" // 创龙 TL138 开发板相关声明
D; o6 ?2 i i
8 b4 h* j1 c- ~* ]* q
#include "hw_types.h" // 宏命令
( ]6 v) v. R3 Z2 K6 ?) G+ P8 }
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
; H& p% \/ W! R s' ~/ S2 f
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
4 ~; T* L$ k/ }8 ^
5 N+ o, ]5 m' l0 m# C- R
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
9 r2 l% Z! \$ ^8 k7 \* ~( J1 `
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
) i! v8 U3 E: ~0 n5 [7 x
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
( k+ u4 J, {/ p! k# Z' x
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
5 Q* m$ u5 H; v1 C$ f& R" v' W
4 l: B9 ~- \5 M
/****************************************************************************/
; w/ U+ e q, P. f
/* */
9 u7 p- X7 X- G9 v" n3 `4 b
/* 宏定义 */
- G/ w7 n. Q# g. U0 h6 j! v
/* */
+ A( h8 c+ C1 B, ]- l$ L$ p5 m0 p
/****************************************************************************/
: p5 C7 A4 V9 K3 `+ ^
// 时钟
M, b7 ~: |* s8 s5 B( Q
#define SYSCLK_1_FREQ (456000000)
# L5 H; N) }1 d9 e
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
6 }+ n7 z3 t# B( A4 S! q. d8 z
#define UART_2_FREQ (SYSCLK_2_FREQ)
! R# S4 _7 o8 A1 S; J E1 ]% G
, F: ]8 d* O" S G. I
/****************************************************************************/
& F0 `0 d0 _1 H' P( p/ d7 k8 `) X# o
/* */
. ~! J1 v, z# n, C, V4 i9 t; ^
/* 全局变量 */
/ a3 v: h n, }( L: C0 E# d7 `
/* */
. R/ ?+ b* Y1 V- s4 b
/****************************************************************************/
+ j8 t$ Z4 O; B1 [, Q4 a* h5 @& |
char txArray[] = "Tronlong UART2 Application......\n\r";
# W4 f) @/ I c( y8 O
a. Q- N; z1 D3 l, P
/****************************************************************************/
* G; ]$ q- Q7 m' F* p& Z2 A* L) v. Z
/* */
2 Q# g v) I- c3 Z7 b, Z
/* 函数声明 */
" ?, ~6 f6 M8 }$ _* M' `, H/ D
/* */
( E: k* L; S- P) ~: E
/****************************************************************************/
& U3 R6 `& n- r5 g/ b" ]
// 外设使能配置
( p2 ]0 E# x" l) |7 `; y0 H$ a* k
void PSCInit(void);
, l" C$ R( d. ?4 e
% y) Z6 x9 z0 _; Z& p* z/ M& \
// GPIO 管脚复用配置
' D3 X% ?0 \! l' L
void GPIOBankPinMuxSet();
+ g' ]# S$ H1 k$ J0 h( A
/ y" t6 V% t- p5 i0 G" Y0 V+ Y
// UART 初始化
0 ]6 D% |7 D {" V9 _; C
void UARTInit(void);
, \" s( h p. ?7 } h
// ARM 中断初始化
2 r4 b2 {- P% r" _ [
void InterruptInit(void);
1 o7 N# y) F4 M0 V3 O% r* D
// UART 中断初始化
; e: @4 N# i. n7 m) c4 M
void UARTInterruptInit();
: f! {4 }8 ?) I, a- ~
// UART 中断服务函数
: _! Z9 k! i2 ^
void UARTIsr(void);
$ }8 A, M+ V5 K0 ]& ~) x
8 I0 w7 ~2 ~4 f) \ W4 E
/****************************************************************************/
. Q) s, z/ ~( p8 O8 Z' y ?* z) w: b
/* */
) J {( G9 d' C" A( Z
/* 主函数 */
! s3 @2 t3 s% V$ [5 h3 o
/* */
; b! s8 e& z" Y/ E2 b- j, G. x0 V
/****************************************************************************/
( {7 f8 W; V7 q* q+ q. w
int main(void)
3 T9 i0 J2 ~* ^( M2 D7 K% @1 [
{
- ^9 p( c1 X, q; @/ }* h+ ^4 I
// 外设使能配置
& l4 o* r. M% n7 N. u( \
PSCInit();
7 `4 |1 v5 B& i( C _
* `; _ Z% Y$ U0 ~: l
// GPIO 管脚复用配置
. r% d N* b* g3 f
GPIOBankPinMuxSet();
& s* w% S1 U9 d: @% ^7 Q2 Q) Q
) [8 S5 Z% ^0 T/ ^5 H8 K# y
// ARM 中断初始化
$ J* n+ {0 S- W& _
InterruptInit();
# z. F6 W* Z/ H8 h* F
5 H- M. X0 [! r, P" M$ ^
// UART 初始化
# O" c9 Y5 q# u$ C
UARTInit();
% b. V- ^" {. T- ]: J
, i7 G; r) A6 I P" f( z
// UART 中断初始化
) b' A2 Q5 Y) Q |- I1 M
UARTInterruptInit();
: m% I, \ r' b& j5 r
- N& O+ x: ~# K. O2 T2 E( W+ f; A, v
// 主循环
5 W+ r8 g) ~. v! E- w$ W8 J
for(;;)
" R% W5 R) Q; F0 @/ {. w
{
3 _/ w: w7 b! w+ p/ ~
- N% z: c! Z9 g
}
3 j; z7 U! ~5 O) g6 {
}
- p% Z' @8 ` L$ \1 B9 a; z6 ~
) c6 x5 ~" k) \, A' }
/****************************************************************************/
0 t: n z. o- N5 v' F. Y! U: z
/* */
6 z, N) y% M3 u. Q, P: Q& [, R. R
/* PSC 初始化 */
. }# u, {9 N! R: q" e! Y
/* */
/ P- A+ c) j3 m( H
/****************************************************************************/
0 u, S8 N! z# W
void PSCInit(void)
1 r5 n8 O: l" w6 A
{
n# t! T' |- `5 x7 W
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 W8 w7 ~# J* t1 G
// 使能 UART2 模块
( S, e: c8 @: V$ W. j' e
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
- M6 v9 n2 J4 y4 X7 N
}
' Q5 ~ _. @% c: R+ K( x
: K$ w3 M: Q/ {
/****************************************************************************/
* s0 k) h$ v9 h n# }6 n' f6 i
/* */
: ~% o& \2 A) w: |, `5 Q [( b
/* GPIO 管脚复用配置 */
( j8 g5 E F! \
/* */
1 p2 z) h+ Y1 ~& s/ [
/****************************************************************************/
6 {) w8 h5 n$ F! J4 F0 i! ?0 G0 `
void GPIOBankPinMuxSet(void)
$ T6 j7 ]! o# Y
{
/ g1 f0 C. U/ g7 L
// UART2 禁用流控
2 T# ?8 T* N9 W$ U
UARTPinMuxSetup(2, FALSE);
6 V/ q& C: u I: @# @
}
& o; O2 m) p: P9 y& o0 N
; ~6 {9 z, }' ~; g" ]* X& F
/****************************************************************************/
3 ~, d6 Q) B9 d- E" M5 g+ c/ H
/* */
% Y q" S# Q0 J1 l+ M
/* ARM 中断初始化 */
; f3 k0 _4 g+ t& `; a
/* */
3 K: A" ^0 l- d3 B, Z: j
/****************************************************************************/
/ E$ ]- |5 D" E' {6 B/ o4 ?
void InterruptInit(void)
' C0 c3 l3 [& S, \4 I4 C+ \- ^; o
{
G" K3 O* o( a
// 初始化 ARM 中断控制器
' }7 [* w4 o2 V9 b4 T! d0 j% h& _6 {
IntAINTCInit();
% H+ A' X/ {/ j9 P5 {8 j' s) r \" ?
# n* n# {! O) Q$ t: I
// 使能 IRQ(CPSR)
" R* I, o* w1 c- g+ _! e: ?
IntMasterIRQEnable();
1 t' ~) ?( J! ] _; p/ n* M s
E2 a% ^* V. i
// 使能中断(AINTC GER)
$ v1 z& d: W8 b# ] [& \, _( Y
IntGlobalEnable();
* i& }9 s* ]1 P( d9 k5 ?, ~ B; Z# O
2 L( O& a# l x3 ?
// 使能中断(AINTC HIER)
) _9 `) o1 ?5 e+ J6 H' [7 [% Q
IntIRQEnable();
# u1 x* [, a3 q( o7 N
}
( r6 F$ ^8 g+ f0 B- s% C9 V
- k" A- y3 X5 g% Q6 ?+ @5 V
/****************************************************************************/
: E. G0 L+ ]+ M, d0 ?. Y8 d# [
/* */
) c( a; c. g& R$ o; F/ ?. x
/* UART 初始化 */
( T! ~6 U$ E; U* A z: \) ?+ n( C
/* */
+ ]& K3 [; f3 l* h( C; v: o* U
/****************************************************************************/
9 w* }, E" a$ _) a$ P% \+ I
void UARTInit(void)
" \$ ?% \) N/ Y8 e
{
2 K3 t$ x1 K5 r' Q" C) ?
// 配置 UART2 参数
0 g* K- ^: U5 ^9 q. L
// 波特率 115200 数据位 8 停止位 1 无校验位
/ G0 \7 [+ e( n- d
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
6 K: e# b- e6 A: X# w- Z! j
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% d% z6 j* q8 ?! H. V6 [
// 使能 UART2
1 |$ J/ V: w0 L- c+ o
UARTEnable(SOC_UART_2_REGS);
3 `( f- W, a/ `: N0 i
5 @! l9 \- U [1 k) r% i
// 使能接收 / 发送 FIFO
' x! i( s2 M' f/ U
UARTFIFOEnable(SOC_UART_2_REGS);
4 h& M1 y3 [# a9 S( [
1 Z, S3 @ \; p. S d& ^& t" ]
// 设置 FIFO 级别
; l- |- a1 i) P' p. y
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
% c3 R- e8 d5 C' r
}
' Q; s' \0 m6 y
2 \: M1 e% V- \+ ~9 P- R3 W( X
/****************************************************************************/
2 Q' z8 g r+ s7 }: b9 e7 V
/* */
\" G$ `' V9 \$ X
/* UART 中断初始化 */
7 f1 a7 }: T& H" a5 f. ^9 i
/* */
: \6 I e6 g/ T7 F; ~
/****************************************************************************/
& I A* M4 X# ^* N: Z0 G
void UARTInterruptInit(void)
& J5 O' @) m- n6 u
{
$ z' }2 N) {1 r
IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 m8 v, x: N) Z4 n( j a
IntChannelSet(SYS_INT_UARTINT2, 2);
) H& C- \# N3 g! a8 V
IntSystemEnable(SYS_INT_UARTINT2);
" e* |# [5 j# H2 B# K% b
9 q1 V/ b {5 Q# g: K* m3 b
// 使能中断
9 |7 Q1 `, [ u, u6 W+ b: i
unsigned int intFlags = 0;
. }+ u9 d4 {+ y* Z; H( L9 {! O
intFlags |= (UART_INT_LINE_STAT | \
r6 c6 V4 }- \ Y$ ?, K, j" Z
UART_INT_TX_EMPTY | \
6 E2 k+ i1 r$ f5 g3 Y6 F1 N
UART_INT_RXDATA_CTI);
$ }4 k- j* r: M$ k; p' N
UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ K: o# v+ H3 z! D: @
}
: ]6 j" r8 }, P" R! ~; N v
" z! M: S( E, m0 M# k# o! J
/****************************************************************************/
& Z7 K& z3 o o
/* */
E# a1 r: e5 M1 f: j J9 R3 k
/* UART 中断服务函数 */
) x0 w1 k. P- z" G- b
/* */
& _; t y* s6 h: f+ y; I
/****************************************************************************/
" q1 _2 T+ R* B+ i
void UARTIsr()
9 i9 C- S. |7 V8 p9 ^7 i
{
- q" W2 O& H1 E. `+ h ` y
static unsigned int length = sizeof(txArray);
6 L! z* `& O; a* R D5 e6 D5 \8 l
static unsigned int count = 0;
) a) G. @2 G, _+ u- y+ x
unsigned char rxData = 0;
1 `' H( ~ l( u/ f* N: ^9 ?/ h
unsigned int int_id = 0;
0 ?! V* I/ Z* }+ x
- L% \3 A3 u$ u6 l( R W
// 确定中断源
+ B& P9 ]/ F% T
int_id = UARTIntStatus(SOC_UART_2_REGS);
% t# O& r6 M4 g M, s
, K' a1 ]0 x o" x
// 清除 UART2 系统中断
6 U, c" r$ w1 b
IntSystemStatusClear(SYS_INT_UARTINT2);
" p7 X3 N( s) u* M' l) b. ~0 }
5 [5 C9 m9 y0 y0 m
// 发送中断
) f9 j' @4 ?# W1 y9 q6 ?- v! ^
if(UART_INTID_TX_EMPTY == int_id)
- k* N7 ~/ W! ?0 I% f
{
+ A4 W+ K5 k; [. V
if(0 < length)
3 L8 I8 S+ l. M2 S, ]: {
{
, q2 N: E4 r3 f' H" [! s
// 写一个字节到 THR
7 h: k' m: _: d K+ h
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
- R8 d& b" G: d3 l) f( ~* f a
length--;
& V4 Y" V% m( j
count++;
4 b+ {8 U( p+ T3 u6 Y# P9 L
}
9 r: b& `$ s9 m& O( ~0 Z
if(0 == length)
" {$ b/ G1 \) |
{
% W! s4 l3 f0 r# R7 x: O
// 禁用发送中断
+ h! \' S2 W: p3 Z
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
3 ]. N6 z8 H% R, R5 Y+ P ]9 {% J2 K
}
5 _) Y7 Q( P, z5 S: Q4 H
}
: T ] f3 M" |6 Z
( y7 C7 v0 G( X
// 接收中断
$ f* [. O: y- ~# W
if(UART_INTID_RX_DATA == int_id)
' |) H: R* W' h/ Y' B
{
4 d# F* I" x9 H
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 t6 S9 x3 U) }
! e: Z0 N, k3 m1 U8 g: U0 E
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
t* B Y, X* Z* Z- k6 x
}
6 i' z7 y0 p3 J# r+ w
1 a. ^+ o- { H/ F/ w6 \3 l7 e' d
// 接收错误
: V7 L; d1 k B* z
if(UART_INTID_RX_LINE_STAT == int_id)
- \4 B( F* c ]% X, q9 {1 [' N
{
( t) n3 H& G& {' \' x# j1 N3 e
while(UARTRxErrorGet(SOC_UART_2_REGS))
$ a. o1 ^ _, t6 v4 l3 J3 M' Q
{
$ L h; u2 B- z& ^' _
// 从 RBR 读一个字节
. d# y% O5 a( p. O3 W
UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 p( x' T) [/ q, D
}
! J5 p& _' E! L; m
}
% }- l- b: F5 P2 C% @3 Z7 d* K
% d" A9 M7 Q+ T M8 ~5 a5 F- `
return;
5 v4 r# `: s) m+ i! A- G
}
: i v2 o1 J. A- G$ \7 m
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
$ p6 w8 S; s- g! p
如果其它设备快速给你发送串口数据,你这边能正常通讯?
) Y( b9 y/ ?% L+ q4 E
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4