|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。, |* i& l, @' ?6 h! g) Q; c, f4 ]
0 P9 j( x( Q6 W5 R1 Y% s
#include "TL138.h" // 创龙 TL138 开发板相关声明# O: M; [7 O" W, B
/ @, e6 R; j7 o8 o- N8 t
#include "hw_types.h" // 宏命令0 }8 u; l$ Z% M }6 J- v% i" A
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器' ^* ^5 d& p. `6 |, y; U, q
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
2 u# | Z3 ~. | G3 O! T% v l3 O$ R
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明" v4 J; M- V) I5 [
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明5 i) T: ^& X/ }" p2 d/ U+ [
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
) `9 L% ?# y# F# x& C4 E, ^#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- }9 Y+ r+ _( l7 r4 G) c: t+ p/ W) W$ U6 f- ^# s7 x! D! _7 A
/****************************************************************************/
) R1 w1 u, P i/* */7 g- Z0 X% w0 {% B3 k
/* 宏定义 */
/ |' d+ b; g& |+ n/* */1 Z6 m1 | N0 p9 R9 ~/ H
/****************************************************************************/
" w9 o; a g7 ?& {// 时钟
( n+ x1 c/ M2 X#define SYSCLK_1_FREQ (456000000)
9 i- F; |" S' t+ S1 d3 X#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2): A/ w' O+ [- `2 B& _! `
#define UART_2_FREQ (SYSCLK_2_FREQ)
/ Q2 B' j0 h3 |
- |+ V+ ~1 g/ K" S- ]/****************************************************************************/
; J5 t& q& A. ?" }/* */
% q% f% M2 h, h9 F: l# { I/* 全局变量 */
. ~" `0 \* c: [* r# Y/* */
- b8 z& f1 f! W; a" b; _/****************************************************************************/, ]' b. t* o3 ]& c% O
char txArray[] = "Tronlong UART2 Application......\n\r";
# Z/ \8 ]- ]5 @: }; K! T( P8 F0 N p, y- @# w w! e5 i- q+ x
/****************************************************************************/, u2 }: a) e+ R
/* */
8 z! {9 V1 U4 K+ ?, Z. Z/* 函数声明 */
/ `: V- y- n; V6 c* v$ f/* */8 Q; f. i7 c9 o) c8 L& _
/****************************************************************************/' p& v# i3 y+ B
// 外设使能配置0 J- ]0 f; M7 D
void PSCInit(void);
4 ~0 H3 I$ o5 V- h2 U: u) w! n; G1 s2 l
// GPIO 管脚复用配置" x: S4 z+ @. Z$ z* z- E
void GPIOBankPinMuxSet();4 i9 H9 f! R# P, f
# F1 \- q5 N' I l8 [2 I) ?
// UART 初始化
1 a- g( o' s$ j/ x2 Ivoid UARTInit(void);
; q/ N4 |4 X( U7 h! b* U// ARM 中断初始化
8 _- `6 S1 C" I) r; `5 }* Zvoid InterruptInit(void);
6 m) t# D$ k H+ ~// UART 中断初始化
d3 l3 ]7 a( @ b' q6 u' ]$ \7 p+ k% \+ Lvoid UARTInterruptInit();; W' x9 J- M' B6 {; G8 f
// UART 中断服务函数% p) x) D# h% S9 }
void UARTIsr(void);
- ^- J# w0 d. I" f' _; Y/ f0 x4 r' K6 s" G+ U6 E. c
/****************************************************************************/
) X0 \: |! v9 |; Z @/ w; ^/* */
9 E( c! \! Q7 }9 N9 x0 Z2 E) J/* 主函数 */+ L8 X+ E1 Y) z' _' z
/* */
! X$ W/ h) t7 s3 w2 i1 H/****************************************************************************/
" F. N8 t& I% D' [ {4 p, Qint main(void)
- @5 o4 f* b! A{, K3 l- H. K3 k4 _
// 外设使能配置
4 r3 B. {0 P9 u$ `) P8 @ ^7 I PSCInit();1 B9 T! g/ }: Q5 f: _0 _. E; O& v
1 K! X1 [3 g9 b6 v5 a
// GPIO 管脚复用配置4 {$ e. d! k0 T) N0 E6 m
GPIOBankPinMuxSet();
" L6 t! G7 i* c( } g; o+ ] Q2 u, }& o4 _" o9 M9 F
// ARM 中断初始化
- O. l( i: z$ ~9 j# S" K InterruptInit();# f2 d5 M! u- _# f
* `$ r, G. b2 _
// UART 初始化
3 u8 O- o. X: @, t UARTInit();
; _. r( j1 S/ e) S7 V8 P0 V# M# ~8 L$ ]" e" j3 P; \
// UART 中断初始化1 H! B$ [+ u2 `/ m
UARTInterruptInit();
% j* j4 ]/ d$ C$ F _" [5 h0 k+ N( i6 o
// 主循环
3 y3 x5 J1 s6 A) C$ a" o1 V5 {, d! n for(;;)
# p" {$ n& Y) ^: U+ t {
$ M! [- W2 C. z+ B0 s: @( g6 J/ P3 U5 L2 b
}2 E2 R. n8 p% \/ Q- y7 U% B
}
) h& q4 o, [" |% s1 V: r% w% p9 o: ^6 m; f% E
/****************************************************************************/
2 k l* u- ?* j, U$ g5 S/* */' Y7 {; [ u& [) N3 F l
/* PSC 初始化 */
4 O4 y- P, j, s" V/* */
% N4 _9 [" I. |+ m2 _5 b) T/****************************************************************************/' N5 |% E8 t1 q% S/ X7 G7 x
void PSCInit(void)- ~& ~9 S+ R! e5 C) f2 d! P
{7 Q. s1 Y0 u/ B/ g- X
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 E( M$ r$ V" K( v7 r5 \& D // 使能 UART2 模块
/ v: x: ?% q/ d1 H" [2 Y( J: ^: _ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ o$ \6 c$ N1 w. y+ m6 b4 x}& m- m9 S: \! Z# g, D$ P
4 p, ^+ f. F5 P% g8 u0 `/ z' x/ O$ T! O
/****************************************************************************/
2 q. o$ z- `2 N1 Q0 N/* *// m4 q/ l+ G* Z
/* GPIO 管脚复用配置 */ E8 U( G7 d/ t3 i8 u: s) U1 `! E/ z* Z
/* */
S1 Y( F/ A' w. @! g# b* Y$ c/ g9 G/****************************************************************************/
. d7 F/ X& \2 ]' B: Rvoid GPIOBankPinMuxSet(void)
% r3 _" _( U6 z, ~ y% x) q{
6 h1 S/ S. m. I8 i( @, L; w // UART2 禁用流控
7 D2 }+ h- Z% Y" J: P% n UARTPinMuxSetup(2, FALSE);
, _6 B B" {5 v1 Y; w# O# \! e0 }}
) P' \0 w5 e! p4 O6 d( @7 s( r' q. T5 ?, U" w+ I3 d6 L8 I
/****************************************************************************/7 N5 h! q3 `/ \/ D3 N+ t
/* */
: e$ R4 K; F9 y) H/ @, `+ Z9 S/* ARM 中断初始化 */
8 k! k& k9 T3 H3 I' j. ?/* *// p! V) ]6 i: J5 @
/****************************************************************************/9 j$ V- p, O7 E1 n' h
void InterruptInit(void)
, N" ]: ^1 G4 B7 j{) \* a- A8 C7 \
// 初始化 ARM 中断控制器
* P4 F: ^) z' [6 t9 @* F6 x IntAINTCInit(); a$ Z2 {7 r X3 a& f/ T1 F
5 r. b9 e* b' _
// 使能 IRQ(CPSR)
. t" B8 Y/ u) ^# }$ z* |- T IntMasterIRQEnable(); v+ e, d: t' J8 D" w: w( K
* Y5 W# O, [+ y- C; ^2 M/ N/ F
// 使能中断(AINTC GER)
2 }7 \& ~+ D7 B; C7 _& s IntGlobalEnable();
" H) \' D9 S7 p; |% d" K: t; _2 g6 L1 k* }* W6 [) ~- {2 Q
// 使能中断(AINTC HIER)5 A1 t7 i/ N: p8 d8 h o
IntIRQEnable();5 |$ t' m& a) z, S
}- Q. Z1 D, d+ R: h4 v( x4 c- W! G
6 Y+ B" q, o) ^0 _
/****************************************************************************/
( g7 @6 H3 b; `; b9 \1 Y$ ]6 K/* */. x' H+ o% B0 `
/* UART 初始化 */
* m" z' U$ J( i1 k6 g/* */
/ I: z# u: V7 a5 ?% C8 A' h$ q! Z/****************************************************************************/
& r% |. w0 }( \, A0 Ovoid UARTInit(void) n$ B' _1 n1 Q( _. X/ w8 Y
{* R6 g: d3 P! W% j
// 配置 UART2 参数
# z% C" I; W. [# p0 m // 波特率 115200 数据位 8 停止位 1 无校验位' {" p5 X, s$ X* s9 n* f
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 d* S! u2 [# [; ]0 @ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 j! j0 K( j$ ~# ~" e5 s5 b
// 使能 UART2 a0 |/ [# j3 O9 g: j* ^: H7 T9 Y
UARTEnable(SOC_UART_2_REGS);
2 h" X5 X M. R) C, L. \+ A8 w4 |: T4 X/ J8 F* p% p5 N/ ^
// 使能接收 / 发送 FIFO
; @' i2 H5 \: m6 G9 ^ UARTFIFOEnable(SOC_UART_2_REGS);( z: e* d* w: ^5 U: \0 B
( V: S) k( w p: n9 [: j* u+ ?/ v
// 设置 FIFO 级别
4 |% |' P/ t1 ~/ R UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);' x6 Y( }8 L5 ?
}* Q2 O) n9 I3 E8 z( A
& A( r9 A# D+ a/****************************************************************************/( w. E" K6 d" y! [- f# J. ]
/* */
* E0 E7 E8 X& B1 v& T/* UART 中断初始化 */
" h: X) ~( R; |/* */7 U( G# ~4 ?7 N
/****************************************************************************/" T+ B @* f( c; X
void UARTInterruptInit(void)# y/ @2 E" q- s. i+ G, B/ I7 y# Q
{
& o3 R% _6 V8 w% P( N IntRegister(SYS_INT_UARTINT2, UARTIsr);/ @5 n7 u# C3 h- N3 s
IntChannelSet(SYS_INT_UARTINT2, 2);
* @7 [6 \4 `4 C6 T% F IntSystemEnable(SYS_INT_UARTINT2);" ? Y9 ?' }" W; w1 e
- K5 v! K8 W- [( P- X // 使能中断
0 p+ a4 B3 f) a7 Y$ E# k unsigned int intFlags = 0;- G8 n2 B! E( ^5 T+ ?2 j% B
intFlags |= (UART_INT_LINE_STAT | \
: R, x; x5 F* v! B) S; X2 G UART_INT_TX_EMPTY | \
2 l9 N/ g7 t: H/ r" W x UART_INT_RXDATA_CTI);: v; s$ e4 ?8 z. b+ i
UARTIntEnable(SOC_UART_2_REGS, intFlags);, K9 Y8 k- u: B! ]. P& x
}2 h6 D+ i7 _/ P9 V5 C
. |1 F7 |) H+ m& g+ I/****************************************************************************/- J4 J3 Y# z$ e3 P1 T5 X
/* */
) D$ y. @. L, b. L* P6 j' U/* UART 中断服务函数 */
, L/ E6 i8 L$ H/* */7 z7 A4 ~9 c* [+ p) l3 C/ O2 [
/****************************************************************************/* \* ?- X* M( l3 H: f
void UARTIsr()' n! |' \$ n/ }0 G5 H/ [8 ]' P6 A
{ Z3 s+ _ t0 m/ e7 q7 P. ^
static unsigned int length = sizeof(txArray);
- s$ B- q1 E& N* @% ` static unsigned int count = 0;/ R( H. M9 u; P3 _2 F b
unsigned char rxData = 0;5 c0 C2 ?2 X0 |" h! V3 w8 k
unsigned int int_id = 0;7 n n1 v. C: e$ Z# M6 W/ @, R
5 w* j; Z% p/ v% M! V M4 z
// 确定中断源. L/ y$ k/ l8 E% f; U
int_id = UARTIntStatus(SOC_UART_2_REGS);. N2 _" V, ~ w, Q+ ~
) u7 y8 V4 S, \3 a8 O, l
// 清除 UART2 系统中断
0 O3 n4 n+ T% R6 t+ P IntSystemStatusClear(SYS_INT_UARTINT2);+ L! L4 ^5 D( B3 g+ }
; \7 [% t' k$ ]& t, Q! w+ ]: ]- I // 发送中断5 H7 _; U, |& i$ N+ j$ I
if(UART_INTID_TX_EMPTY == int_id) e# ?: w) Z2 X+ {7 Y$ Z
{6 d1 h* ^, L5 @. w9 O
if(0 < length)$ v, R, Q6 `" _* {* w
{7 \4 Q) e$ d' C" n0 O9 w, @% j) I
// 写一个字节到 THR9 V$ _6 @/ u, k/ \9 Z
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ Z2 y0 J5 z! f
length--;
1 @, H* Z/ S, D5 v+ k0 e O7 W count++;. W4 m8 I1 f/ V# J, _+ h' a' ~ W
}
, A% x5 a2 \2 j! T- f6 p if(0 == length)# e3 m( w2 x" f3 k0 o3 n
{
% u; P+ L6 |; W- B5 B1 C // 禁用发送中断
& v+ h9 W5 {% } UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 [6 L# T9 b2 f& K- g
}- [# o& J7 s+ I) ?- ^% ]" f* p
}
: H& b; y- N4 A5 G! }- k# Q8 A: ~8 _5 F1 ^3 p6 ?! @
// 接收中断
: h- R9 e, B9 E: i2 K if(UART_INTID_RX_DATA == int_id)
% g# J+ }, S2 |' @+ o* _ {* o+ z1 Q& C @* H; N1 ^$ C8 q/ J
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 s" @; I: R! @! [
7 L- w$ z; h/ _- m+ X
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
7 M: K: A1 f+ p' X# o! M! Q* h }
; }/ I/ m- G1 A5 A4 {# s
' N8 `: S( ]1 O1 y5 n1 J1 v; v- Q // 接收错误
' k7 `% x; t0 G. e0 T0 l if(UART_INTID_RX_LINE_STAT == int_id)
, i2 J% P! S8 w {
0 b+ r0 {' I$ X* {' j/ ` while(UARTRxErrorGet(SOC_UART_2_REGS))9 K& X6 l4 C" u7 V* W
{3 h" ~8 J; B" b
// 从 RBR 读一个字节3 M8 R( E" q6 p8 Z. J
UARTCharGetNonBlocking(SOC_UART_2_REGS);5 U6 o! v0 M/ G9 d( s
}
8 I7 T5 b; t$ e# f/ e1 G }# A$ l- S2 I2 h. C: {. g& d6 X
; ]2 q; W! u# S9 M; H2 S' G
return;# f+ t3 V, [0 n- R. j
}$ q" W/ y. z7 Y0 l& J0 e
|
|