嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
1 T1 s* d4 ]' t7 A/ g2 U
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- ~1 l6 V7 @1 S* u( n7 G
$ N3 r; m- B) h1 i0 {
#include "TL138.h" // 创龙 TL138 开发板相关声明
9 f0 Z X: N+ Q, q w
/ F' I, Y* p- ?2 H& _# [
#include "hw_types.h" // 宏命令
) C3 @2 v8 v, K4 o* s0 B
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
6 j2 ]" m0 M+ U2 I. b. v {" f/ W) y0 v
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
- O7 x- [+ i4 S8 b5 c
2 g* M( _' A% r8 v: S/ P
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
: |* L; Y, A/ {' G0 `
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 D5 @5 A" s' Z' D! z8 R4 E
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
! ?. j# D" b, `1 o; }) O. j; s
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 b9 [, o+ U7 s8 y% I% p
0 _/ f% D7 Q( x( j3 r
/****************************************************************************/
5 o( O! s4 G! W2 ^9 ?
/* */
. u) S1 O) @6 k
/* 宏定义 */
( E7 @ L9 r# n4 P/ t8 r- Y$ ?
/* */
5 j+ U4 M$ t3 ]; D' W" I" n
/****************************************************************************/
' K/ \4 f' r0 {$ H5 b/ _$ {$ ^
// 时钟
2 Q& t# R0 d$ O" _+ r2 ?/ c3 I Z
#define SYSCLK_1_FREQ (456000000)
; t; j5 J) S! P/ Y- Y- Q8 G
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
1 L: A1 o* h- K! R' ]" x6 K
#define UART_2_FREQ (SYSCLK_2_FREQ)
2 x- W4 D; T) r
7 S# b* U$ _: K9 Z/ h4 _
/****************************************************************************/
& _# g: }$ o" ?6 u" o
/* */
6 X& v) |; }: w( X# z, N
/* 全局变量 */
6 Q( V) G# |; c7 S
/* */
+ `6 i# H. R8 b! j
/****************************************************************************/
- |; ^0 }7 j$ s) M3 \
char txArray[] = "Tronlong UART2 Application......\n\r";
* ]/ Y: Q+ k g) i6 A
8 o! @6 Z: c# a, \1 z2 d
/****************************************************************************/
; O9 e- p2 S& l# m4 @- N2 K5 j
/* */
, d+ A, h: J: _2 H# w/ O$ w# g7 z
/* 函数声明 */
" s: d7 B$ X6 f* @: i# S
/* */
2 E. C9 X; ^8 Y
/****************************************************************************/
+ e+ ~( d" d2 f1 l5 e% Y: J; W0 W
// 外设使能配置
- g* f' m7 E3 Q& f
void PSCInit(void);
8 o- N# h. j0 m% q) D' z# s2 r
2 m. q5 \7 I5 [% | D
// GPIO 管脚复用配置
2 d' j; V" } ^3 ]
void GPIOBankPinMuxSet();
" t0 h5 Z+ \5 q% }3 S
* U% C1 n- Z" X7 n$ ^5 u
// UART 初始化
, S6 `: k% J6 l" D T
void UARTInit(void);
. z- K9 [* o! r7 S& K$ ^0 B. w l
// ARM 中断初始化
* A3 N' m; J# g
void InterruptInit(void);
& e. {" u I5 M6 q$ I& f
// UART 中断初始化
+ |; w: R, ]! }' X
void UARTInterruptInit();
$ }4 G, S' `# E! `# W
// UART 中断服务函数
) g- E- P) a3 U; Z$ w& B* n3 V0 R! K
void UARTIsr(void);
. M3 f$ y3 k; O2 Z
" J1 f0 ^4 U& x4 T( D# j9 x% p5 X
/****************************************************************************/
( y' P7 Q1 V3 S! j
/* */
; {, P* s: |) P
/* 主函数 */
) e5 d7 G1 ^) Y5 C: Q3 ^
/* */
% O) W2 `4 H. L; O
/****************************************************************************/
4 F* X: F3 n- b$ M% Y! u) b3 @
int main(void)
( u2 I; Q+ n$ z
{
( s, i, q. |0 b! W: ^; k
// 外设使能配置
; e# H8 n" J7 L" I) C
PSCInit();
3 v5 n8 H1 Z9 _( f( N/ U" ?
8 @$ N7 j. h2 B* \& h4 x! R
// GPIO 管脚复用配置
- m5 |5 r+ g5 b2 P# K2 \/ H4 V
GPIOBankPinMuxSet();
3 N3 t- ~: v6 M6 A
8 P3 H" P3 N# p! v# g6 k5 b' h/ M
// ARM 中断初始化
) A& n. T2 g' G9 h5 t& H
InterruptInit();
8 ]" t5 d7 H% N
0 Y P. ~& y; s8 A6 g0 y/ s
// UART 初始化
/ m$ W. G: Q! b. a
UARTInit();
. P# @: H: x+ t" l6 ^' ~& f. M( s0 l
! v/ \8 r- n8 J" S
// UART 中断初始化
! I/ O; e; | d6 _# ?* R m
UARTInterruptInit();
) k4 y2 d" a" q& c
d0 U. U' b$ R2 b& g K* l
// 主循环
x8 `2 e; n. ^$ K; Q7 O
for(;;)
& j4 v7 f. t% r
{
4 f! M) ], X0 g0 J1 u
0 n# O- G1 F% T) R
}
' }1 f2 g) k% ?9 [" L
}
* i; }. I4 s& P H \- n
, b. b0 J7 L: I+ j& g2 v1 p
/****************************************************************************/
) T1 Q- m7 O0 C8 g3 m5 G
/* */
/ Z r' r5 @: l8 l: m0 O( H
/* PSC 初始化 */
" v! D* V% J( P( B9 P& g
/* */
/ k, P% `" T# o% I$ `# h1 R
/****************************************************************************/
, v- v9 |4 U/ ]5 B& u1 v
void PSCInit(void)
' F) T* F9 B7 I
{
" F! |2 z# P8 O! E* O- \
// 对相应外设模块的使能也可以在 BootLoader 中完成
) j2 U; v$ a; M: s) s: _
// 使能 UART2 模块
, A6 u3 i4 w5 e# l+ p/ ~6 C
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
& F- K6 F. ~ A! R g
}
- U2 d. N! F! H; x5 ~- I8 L
. l+ a% V1 X4 [) m
/****************************************************************************/
% @& }* }$ }" Q/ z( F) v) H! d9 ?5 a
/* */
% L9 G7 d8 y% C% O
/* GPIO 管脚复用配置 */
$ k, F: N3 L4 ?% v# `8 H
/* */
9 z+ Q4 x6 G- ]! x# O; S$ i
/****************************************************************************/
$ {4 B' L) `: G2 D+ V! ^
void GPIOBankPinMuxSet(void)
: @6 N: p- Z( B0 t' O! V
{
5 V G, Q; q2 A% |, M
// UART2 禁用流控
( a/ T3 V3 \- f3 A
UARTPinMuxSetup(2, FALSE);
. A1 k) U. m8 _2 |8 o1 t# l' ~$ ?. i
}
! n6 {5 M/ a2 `6 |$ ?) v5 i0 a2 h
6 R; r+ X/ t% D! C! H* ]2 a2 z& m
/****************************************************************************/
+ T0 _; r% O0 s6 m4 g$ F# w% q
/* */
& U+ t, ?. c8 v9 R* ?1 A& n
/* ARM 中断初始化 */
, m" F3 i6 v. Q* _8 u% g5 s
/* */
! B2 A7 j, {' h' M0 l
/****************************************************************************/
' `: Z& B. ]0 }" A+ T4 H
void InterruptInit(void)
6 F& W1 V. C& x) W0 `" ?7 ?( r* R
{
/ U) |* N( D! _8 J( v$ q5 `5 e
// 初始化 ARM 中断控制器
# h; W! e! F3 @$ ^" B
IntAINTCInit();
& ?4 F' L6 p/ a7 _
1 t" q2 n1 R6 q" }1 w
// 使能 IRQ(CPSR)
9 m4 B- v2 p. ~: n: n0 p
IntMasterIRQEnable();
& h6 I& i+ X4 l/ U( T$ h6 ?9 `
, r3 k; I5 n h8 T$ d5 P' V& ?# N
// 使能中断(AINTC GER)
) C6 f- T. h5 i- O- H5 R& O3 p0 r
IntGlobalEnable();
" t1 \/ O+ a1 H; x! G
2 s; `1 l" u- o3 y
// 使能中断(AINTC HIER)
v! ]) }! ~9 |4 d" P! Z
IntIRQEnable();
$ {* f/ u- {, J: g
}
$ q7 I" m5 R' G7 P' q* u
1 J6 d0 t9 w4 C$ ~
/****************************************************************************/
t; l% T1 b7 Y: M7 m
/* */
* u. x. W. r* [% ^. B, Y
/* UART 初始化 */
* P& u: P$ q$ A R, k' h
/* */
" e* ~8 g6 K3 d% u% P
/****************************************************************************/
3 P* Z1 `) J+ [# x5 U3 H5 n
void UARTInit(void)
1 U' K X1 m! a, `4 o( \
{
: r8 L/ ~* i; {8 c; A) \0 h
// 配置 UART2 参数
" q7 t/ M: I* e6 y. m
// 波特率 115200 数据位 8 停止位 1 无校验位
5 n$ g( L7 a2 P4 x% ^2 m4 m K
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
; x4 q+ O; b& U( `2 |
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 D- a# M4 M4 A
// 使能 UART2
( m9 q! K0 S$ Y# d
UARTEnable(SOC_UART_2_REGS);
# @" U0 }2 E; M. C& E3 f
5 T1 p7 j& Z/ i$ L# E4 `6 B8 u
// 使能接收 / 发送 FIFO
" M/ V2 U4 T( L3 [" S+ M. ?
UARTFIFOEnable(SOC_UART_2_REGS);
& P a! R! z* I" _- Y1 k4 T6 E# N# h& r( V
7 p* \! c! w# g8 @) R$ M
// 设置 FIFO 级别
2 F9 u: c* S* k" f1 n
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
5 \8 U+ f7 r+ R9 _8 w
}
( l& S) T; ~: b7 Z5 k8 k9 W( J
, Q: L, q! P& |5 {
/****************************************************************************/
5 s+ m% |5 [: Z9 f9 e
/* */
: b0 N3 a m7 y5 p# Y) H$ R2 g7 Z
/* UART 中断初始化 */
R- b& t5 R- R
/* */
5 F8 S. a. k0 b
/****************************************************************************/
% ^, H5 G, p% ~$ d0 e m: r
void UARTInterruptInit(void)
0 q& Y/ p8 z7 D
{
. w! G% R+ ~$ k: ^7 G8 u
IntRegister(SYS_INT_UARTINT2, UARTIsr);
6 c8 n, U! ?6 D2 x0 M
IntChannelSet(SYS_INT_UARTINT2, 2);
- V9 \: F. R0 k8 y
IntSystemEnable(SYS_INT_UARTINT2);
9 s. g2 B3 D* W2 A' h
4 }4 z3 K) Z3 k$ c
// 使能中断
5 B# R/ ^4 v5 s% c1 @3 F
unsigned int intFlags = 0;
* f0 N* \* }; C1 J' i
intFlags |= (UART_INT_LINE_STAT | \
& P% W1 O1 X. U) w( \& ]% ~/ _2 C5 K
UART_INT_TX_EMPTY | \
3 [, i4 S. q/ V& @) d
UART_INT_RXDATA_CTI);
( H' a: Q' a% [5 [+ }4 M3 W4 w& A
UARTIntEnable(SOC_UART_2_REGS, intFlags);
7 Z. k( `- e* w2 p* @/ i
}
0 V8 Y& e1 X. v3 @9 Z: T* @4 ^
O' ~9 E0 x' |# Z; ^/ X
/****************************************************************************/
- |8 U* _3 o8 M, c
/* */
# B8 H# Q7 U" t& G9 E
/* UART 中断服务函数 */
, O. ?; l" r9 o# o
/* */
; d: ^8 h) L& F3 X l
/****************************************************************************/
d. ? r! u+ k. g2 Z3 h. r7 c
void UARTIsr()
* x$ S7 g# s4 k9 p' T3 y
{
, I8 i& Y4 _# y' K
static unsigned int length = sizeof(txArray);
0 {# Z- X, O5 p6 Y( y
static unsigned int count = 0;
7 }$ H) ~3 A" u o& a
unsigned char rxData = 0;
! V( D) s" @- x1 u' |' H
unsigned int int_id = 0;
3 w& w% ^' R1 k! v9 k8 g
; K' [- y9 Y$ o' s
// 确定中断源
, S0 ~0 b+ ^& Y7 G, }
int_id = UARTIntStatus(SOC_UART_2_REGS);
! l, d% t2 g' T: J$ V/ @+ B& r- c
$ C8 I" Z) A2 ?$ e" E) `: T
// 清除 UART2 系统中断
' P" f2 e" a$ w$ P7 z% o0 |! Y# _
IntSystemStatusClear(SYS_INT_UARTINT2);
- D, {# h$ {& S( w3 Y7 f
$ C7 @6 `) P1 t+ {9 d: M6 \: q
// 发送中断
9 M" s+ @. @/ A/ x: B9 B
if(UART_INTID_TX_EMPTY == int_id)
+ P" e4 l* I, s+ t- |
{
( `/ i3 s4 O, u* q6 N3 f9 D
if(0 < length)
& g( {. y }6 _0 y+ s: [; R( v
{
# }& a2 R+ u/ V; \0 M
// 写一个字节到 THR
( L3 r, P0 S9 Y5 x5 D3 U5 f
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ | T1 H2 u1 e2 y, P6 w
length--;
; i$ A8 S4 B) _5 b% ?9 @
count++;
% @& R) U9 C7 R, k U! F
}
9 a" K: @" p: F+ b/ f
if(0 == length)
9 J# r, M, q* u/ A: a2 n
{
3 p3 y. s; E* c6 f
// 禁用发送中断
, p! ]9 U9 W" c! _# q1 G6 P
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
2 m3 y. g2 K1 D1 F# F
}
4 y1 t! F! f& B& `
}
B# A( _' ^; Z
8 }: n8 m/ m, r6 j5 |* N3 k' c& Y2 J$ N
// 接收中断
% N8 A0 U1 X6 H( {* X0 X" u
if(UART_INTID_RX_DATA == int_id)
2 H8 A- C' T* r$ \! M6 H0 ^, B
{
+ C& d+ ~7 K J4 r3 I) R- Y
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 \3 n6 { ]: j" H. {
1 T1 T- [# |* H& U1 N" z# C1 A% Q
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
" ^: q' m N/ A) g* C
}
) S- o6 T z9 v1 P5 q9 N$ Y
7 {3 G# {, }" d
// 接收错误
) E6 ?( l" y$ F f4 W
if(UART_INTID_RX_LINE_STAT == int_id)
: h" K& v" D7 B6 P) u
{
; G3 s4 L C' B g4 L
while(UARTRxErrorGet(SOC_UART_2_REGS))
+ e$ Y; ^5 s2 _. d% [
{
4 t9 z5 ~3 A! H# A& n _6 A# _: s! S
// 从 RBR 读一个字节
$ W" U: J4 N6 t( g
UARTCharGetNonBlocking(SOC_UART_2_REGS);
% M, F8 U; K [( {
}
; K% g, A; v0 ^; T0 S4 f
}
2 O/ J3 U0 S3 a P$ r
. n& t o; ?: @+ [# M" t5 A3 Q
return;
0 j" F2 e' l" W6 E4 K% U
}
) `) D8 Z# r2 J9 f, l
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
. h# g! u. ~1 R, Z4 h, u3 L1 i
如果其它设备快速给你发送串口数据,你这边能正常通讯?
8 }) y5 |% D, D# E1 d: L/ _& {
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://51dsp.net/)
Powered by Discuz! X3.4