嵌入式开发者社区
标题:
串口发送中断触发条件
[打印本页]
作者:
17390601072
时间:
2019-4-30 18:00
标题:
串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
: |) G* j- {8 i0 d/ v2 _( z- _: I; N
作者:
17390601072
时间:
2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
$ `4 P' Z9 U& ?$ j4 o# P o
& L* Z R2 f4 `! \! W2 G
#include "TL138.h" // 创龙 TL138 开发板相关声明
5 C0 F8 G8 k7 r) N& N6 s
2 Q0 F( l% i7 O: j. O' C7 a
#include "hw_types.h" // 宏命令
5 q/ h/ ^) _* U) s
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
, w) t) N8 t- v, ~
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
3 z6 Q; G, Z3 N4 P
0 T u9 Q4 S/ ]. O
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
6 v+ _% N9 f7 B5 u+ w3 M( F1 ^
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
5 @" d0 ~' r9 h
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
* V% B# C) S! q8 ~6 L
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
% F! t2 |% a0 S% f9 _
4 J, i- `& q) @' s1 v
/****************************************************************************/
3 E3 D5 R- O6 p
/* */
$ K7 p( N0 A/ B
/* 宏定义 */
- b* B* u& ]7 W1 H% R8 J
/* */
}& c8 k. \3 D
/****************************************************************************/
: E& y$ |* T+ A& K
// 时钟
- r, V1 Z* g+ x& l
#define SYSCLK_1_FREQ (456000000)
# f: S' W5 a% v2 G
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
# c% U" n3 @# N8 E. o
#define UART_2_FREQ (SYSCLK_2_FREQ)
5 @! G- H7 [ F: x/ C1 t1 k
0 V/ j% R }+ B
/****************************************************************************/
0 O, t9 z7 V& b
/* */
6 y# }6 a7 ^; y: [# u+ \9 f6 N
/* 全局变量 */
6 N) _* j8 L2 y9 E- |
/* */
. s& s2 M4 f' c
/****************************************************************************/
! a& A% L: X2 l( y
char txArray[] = "Tronlong UART2 Application......\n\r";
- R6 ^4 X0 h$ D( g& x+ f6 b
6 `8 j; [4 H2 r: ?' y
/****************************************************************************/
! E% p- f4 R" S" G
/* */
% O' F- h2 E+ R8 M4 d4 i; ?
/* 函数声明 */
0 c9 N# a4 S& V0 h; ~6 {
/* */
7 Q) z9 I9 O! l$ X" R- k. a+ K
/****************************************************************************/
$ S6 I: H+ c9 ~$ Q X( G5 k5 U% I$ R
// 外设使能配置
( U! t* r- w6 f5 g+ x3 J
void PSCInit(void);
) I; P/ U. W3 U4 U' z; w
# ^& J2 d1 s- Y: A; C
// GPIO 管脚复用配置
2 l' S3 _% I" V( j- I* N
void GPIOBankPinMuxSet();
$ Q4 s+ s2 O! x4 r1 G5 o
. A+ k+ X! N p* d6 z% q
// UART 初始化
+ d6 D' ^" x4 ~, V
void UARTInit(void);
% Q0 s+ B4 q r5 h- p, \6 o& ]/ Y
// ARM 中断初始化
1 y; n, d5 A) l/ g
void InterruptInit(void);
" y9 J' F' `1 ~2 ]& H0 o' ^
// UART 中断初始化
8 s$ }' [ t: n+ G' M) V7 `6 l
void UARTInterruptInit();
( |+ z/ l' e3 J: [- c$ K3 H$ k, j
// UART 中断服务函数
* W P# v N( T& x
void UARTIsr(void);
5 j- [- }( ~2 ^$ S8 ?% x+ H$ L/ Q+ ?$ l' t
& X# `0 N+ p& W7 J( a6 a
/****************************************************************************/
& `2 w; |/ C. l% B8 O$ s& T
/* */
% n. I! P! W- a1 T/ k5 _
/* 主函数 */
1 v j L3 m D( r4 b1 \% V) A! w
/* */
0 k6 N6 R/ h; { E! U
/****************************************************************************/
+ v- d# q/ }% i. |( w9 U4 [- N
int main(void)
, {. x( b% O4 \& K
{
4 y* q" p( T4 X0 Y9 a. }
// 外设使能配置
* L! m! r9 ], I0 S3 E$ Z4 ]
PSCInit();
- F! R. Z% Y) X' a$ X5 r/ K! ]+ t
# D$ y- H* g2 G1 H/ B8 E5 C$ f
// GPIO 管脚复用配置
/ z2 i6 R: f: @0 _$ V9 |
GPIOBankPinMuxSet();
3 z! B$ G6 |' I& l( v
# S j( \$ C/ j4 W1 r+ q. g! q
// ARM 中断初始化
/ @& |# o- @4 e# [- a+ {
InterruptInit();
0 K/ {5 S4 R- Z4 G
# D d9 I. S, [5 ^3 C8 {
// UART 初始化
4 z6 m! H: @1 i, K. X4 _
UARTInit();
( ]! u' _3 z! x/ W
7 D+ {3 Z( d- w- z
// UART 中断初始化
) w# V( E' m5 a2 t! [7 S
UARTInterruptInit();
8 y% D2 @; f; g% R* H' E
+ E3 [/ a- J% U( g5 V+ P( A' p
// 主循环
' h( Z# P7 i/ r: }7 @) \+ r
for(;;)
+ x& H5 A4 f1 W2 {, S1 \
{
) p+ }& p3 y) w. ?
, D" @% C8 ~0 }2 t7 k" f1 ~2 _
}
, M. r9 r; g x, ]! K- I- N6 _
}
# y2 t" W! v+ l% k- u
5 H/ w/ i; c$ d# }
/****************************************************************************/
h5 Y& V. F7 S% O0 M
/* */
8 r# L" s( X/ ~ s! k, S$ X
/* PSC 初始化 */
) _- c3 Q h* O, k: i% x; L
/* */
5 S" \, Q' \2 q q
/****************************************************************************/
; Q1 _7 R7 K- d" q8 U
void PSCInit(void)
: a/ C7 W' E2 f. Q
{
' W, S3 o) n2 r; S9 \3 N
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 S" \4 R; l7 f' U& @
// 使能 UART2 模块
0 @1 w& ^/ M5 {( V9 u! K) |/ |
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 F. F# W+ o1 P c. w. a A
}
6 [2 t+ v! a9 U3 w& Y
7 b7 Q! {) ]$ K
/****************************************************************************/
$ y$ N) f( x3 z; j) q2 [
/* */
* x# K, J3 y2 n' }
/* GPIO 管脚复用配置 */
& V G% K" {8 a9 v8 F2 Q
/* */
6 R: x, Y w; S3 T
/****************************************************************************/
* |3 i' `9 c8 w" _ M
void GPIOBankPinMuxSet(void)
' p* g. |, D% h ]* r( }+ o% h
{
5 v1 x0 G) M8 T8 r3 j( \
// UART2 禁用流控
4 L$ g/ W0 s4 o* a
UARTPinMuxSetup(2, FALSE);
0 x5 z& P# A) @4 x V: H. O
}
, y( g/ `( V+ P& M% a6 \6 x, V
. e1 L9 F! f; H
/****************************************************************************/
* K' B) x2 N( j7 B$ [7 V
/* */
/ o2 z& d; Z* h8 P5 p2 W
/* ARM 中断初始化 */
6 n: M# q! z/ w. ^. }
/* */
# P) b o( D: o7 h" k
/****************************************************************************/
; R5 x8 N& o4 Q% c
void InterruptInit(void)
6 t& ]! x; v) [/ k6 F
{
8 M2 M" D O% X+ I$ D
// 初始化 ARM 中断控制器
) u* l8 D9 ]) ~$ N
IntAINTCInit();
. ]9 i/ \1 M0 A$ l5 U: x
- Q) @- K; J% R) Q; Z% ~
// 使能 IRQ(CPSR)
8 U/ X/ k8 s+ R6 q$ Q% `6 S+ ]
IntMasterIRQEnable();
+ \: k, H$ f) n" t: A2 l0 z
+ {1 Z& Y- |; k* |3 x
// 使能中断(AINTC GER)
6 F% _: }) i6 S. ?
IntGlobalEnable();
$ b& h2 e7 {, j) t! P1 N
S( I% g; P+ Z) x" D
// 使能中断(AINTC HIER)
' [4 s. Z5 q7 p1 x
IntIRQEnable();
& ]8 ]9 Z) Q, d( z3 O
}
7 o7 k( I4 p% Q* w8 T* d+ U6 J6 m' |1 b
2 {: u5 Z! ?) t. H j
/****************************************************************************/
" ~! f c% ?( M m( Y
/* */
4 H/ I6 o# r: n. J
/* UART 初始化 */
4 g/ W& _; H* P" O O8 v( k5 }1 k
/* */
6 B) A" Q+ K! X0 N5 D
/****************************************************************************/
3 O# s8 A Z$ ?9 K2 F5 {
void UARTInit(void)
. m6 ]1 p3 @8 G+ ]! s, A$ m
{
1 X" l( |9 y) V- j8 }
// 配置 UART2 参数
! N! R% q+ d3 Q, n" o2 z4 }2 H
// 波特率 115200 数据位 8 停止位 1 无校验位
* A0 L" }9 W% B
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 v9 ?, c) d( g- s' U# D4 M/ U, h
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ T6 P: A" O' \ e
// 使能 UART2
9 ~; q# d) X, Y
UARTEnable(SOC_UART_2_REGS);
5 j" P) t$ _, g4 q' b) H
) _# x% K: W% S" d, j5 R
// 使能接收 / 发送 FIFO
: @ m5 M& A' C! g0 T5 T1 s' j
UARTFIFOEnable(SOC_UART_2_REGS);
( d0 d1 P2 M# @
5 e# X6 o9 Q1 [9 Q) |
// 设置 FIFO 级别
7 {; V. e& d% d6 d# k) {
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, [. G" Q7 n+ j/ _4 E9 G. A
}
# O) B4 K8 ~4 }6 M: x1 }
3 [2 e7 u8 q' Q! `/ L/ c8 R1 C2 B
/****************************************************************************/
3 S! a6 ]. ~/ f
/* */
4 O- F' W7 [" T' M7 ]8 w
/* UART 中断初始化 */
' s- Q: T# S9 }' a" T
/* */
9 ]$ P5 J. V7 X6 B) S* _6 `
/****************************************************************************/
" V& u3 M$ @% Z. Z- C: w7 ~
void UARTInterruptInit(void)
0 @3 ^/ b$ F+ L( m, ~
{
/ G5 i# {- f S% L9 _
IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 l5 P9 _/ K" p% H* v4 d9 y
IntChannelSet(SYS_INT_UARTINT2, 2);
8 ]3 h" T6 ^8 C: @. Q
IntSystemEnable(SYS_INT_UARTINT2);
6 _! K& b \: O( L; k
0 O2 G& y7 `8 }) x+ u
// 使能中断
1 @. H) \+ ]+ ]+ b C# M1 `/ n" Y
unsigned int intFlags = 0;
) E0 G$ M) B, G% i$ t8 X
intFlags |= (UART_INT_LINE_STAT | \
" I$ G% F9 n# _ G4 z
UART_INT_TX_EMPTY | \
+ g. `) ?+ V1 w& [
UART_INT_RXDATA_CTI);
1 h# |+ A5 o3 g/ f
UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 g- \/ d0 `$ I! Y5 H& [
}
6 {' | x4 x1 i% @! T' H
3 J, o; A% w% H; d2 m, Y4 ~ |( U
/****************************************************************************/
8 { Q9 N% w8 l! q5 p7 {: S. |, T8 Y
/* */
# z- t; f6 G) b3 P# {4 _' ^
/* UART 中断服务函数 */
; N, p' q% c4 M' b {, G
/* */
& s3 g1 F7 c: z) D$ o
/****************************************************************************/
. ?8 I+ z' p X: b; ?- {+ m
void UARTIsr()
; Z/ }/ W% e; k1 e% e: s. n* |2 g
{
2 I; L7 F) v0 {
static unsigned int length = sizeof(txArray);
1 V4 J& P# M- v" }
static unsigned int count = 0;
4 b0 |3 O K% q9 A$ G: `3 M @
unsigned char rxData = 0;
; V( e3 i Z" R
unsigned int int_id = 0;
" ]+ e$ y+ N+ E5 T% b3 L$ }6 y
6 }/ E/ }2 T: u
// 确定中断源
1 s) g9 {" V1 F6 @. T e. \
int_id = UARTIntStatus(SOC_UART_2_REGS);
9 P+ D, ?% {9 K( {" s
" t4 W- e/ y8 F, R- A3 x
// 清除 UART2 系统中断
, V# M# p* Z: f5 x2 Q
IntSystemStatusClear(SYS_INT_UARTINT2);
, b9 w; a6 c7 ]6 X; `
. Z1 Y4 I+ X5 O* C6 W
// 发送中断
7 h8 z: A3 M3 ^, ^" t/ O! d
if(UART_INTID_TX_EMPTY == int_id)
5 E# w4 A" P/ D* M, j
{
! c! |! w, O5 \+ R/ f' u. _8 B
if(0 < length)
]7 h/ G" E" g; h: q. Z! S
{
/ u/ x m$ ^: t' _$ [. u
// 写一个字节到 THR
8 R7 k- ?1 _0 @
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" o2 I, m/ _/ m# f$ O/ \+ {
length--;
5 V; o7 J) ~4 ~& {
count++;
) c& i8 T, G6 ?( I. y$ }
}
/ U& R1 j6 \6 s4 s- q
if(0 == length)
, |6 Q1 y5 p0 C9 s
{
, ^* k, r5 b2 m
// 禁用发送中断
2 w9 o& H: y- R
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
, y& b# n: v, v% Z
}
, I/ J8 h! P4 U6 u9 m
}
^& k6 g$ n1 |, D, E* P
, Q* u$ X% G% ?7 f
// 接收中断
% O& l' Q- S3 m3 E% u; `
if(UART_INTID_RX_DATA == int_id)
+ t& E! {3 ]" b" u3 g9 M
{
1 k l9 q% J8 X* e$ |& y, T+ E8 n! D
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
9 r; H0 T" G$ y
% @0 ]/ E0 y) N- B+ j( Z0 Y
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
4 j/ O0 c# z1 R9 L9 x8 J
}
. g: v6 d2 i; r7 E
8 \. u$ ~# z% g; J$ u2 S" `* ]
// 接收错误
' a9 ^5 M4 U; p2 K7 f+ a+ }
if(UART_INTID_RX_LINE_STAT == int_id)
& J5 l, f, j0 }8 z5 c
{
& O; o) S1 Y5 O# @
while(UARTRxErrorGet(SOC_UART_2_REGS))
3 w4 N" e, E- Y$ R' c5 K
{
! ~' J- L: h, n; b7 d
// 从 RBR 读一个字节
3 w) n- @% y" P' x. X; X
UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ c f& s2 _1 @# C5 P; x
}
5 A* t% d' B2 C* l( `
}
) X1 @0 x$ j1 h
" K1 S1 U/ G+ h, g; q- S
return;
! j0 N% C: ?8 K; ~
}
$ a3 W# m" S3 T x
作者:
785235014
时间:
2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者:
17390601072
时间:
2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
9 g: O/ H" X# Y; M" ^
如果其它设备快速给你发送串口数据,你这边能正常通讯?
/ b) a# C& ]& G+ S: p
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4