|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。& q- o0 N" _6 t: C6 e
+ x0 l0 x! q" d
#include "TL138.h" // 创龙 TL138 开发板相关声明8 t/ C8 {2 B8 E$ E6 k6 l
# H( a3 Y- m' a0 Y/ ~* E#include "hw_types.h" // 宏命令
; U: y0 L \+ V. S#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器# T) T& z6 Q3 E u! j! x
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
1 M: |3 R/ L; J9 }, P* q$ x8 y" F
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明" e: w) q5 z% X7 _! p4 U
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
; ^, F- X5 {! W; _, I2 O#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
' }2 s, |/ K6 P#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 X+ l2 R6 K0 m8 T0 U& K6 w' Z! O* ]! \$ c, j8 q
/****************************************************************************/) H% L7 K% H: f$ l
/* */
9 o$ c2 p1 p1 d. [+ |7 T) V1 w/* 宏定义 */
- W, @4 R- \: ?6 y/* */
6 S5 m9 w0 o( {" M0 l5 o/****************************************************************************/ L7 ]4 p, n0 U ]; c- u$ D0 T
// 时钟* e1 ]0 {4 K' y, z: H; g, o6 Z
#define SYSCLK_1_FREQ (456000000)2 r* K1 T/ ~, h8 W; t5 k
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
& D" a; H+ n/ J6 G O- ]4 a! G* O#define UART_2_FREQ (SYSCLK_2_FREQ)
; r5 W" k9 ^- f9 E
P% i; D; l, P5 c" w8 a: E2 T- j* m/****************************************************************************/0 u, V( K- Y$ i+ w" B( s
/* */
% p) q$ s" u) Y/* 全局变量 */! ^0 K. _+ C! _8 m( s
/* */
# T9 i/ a/ q2 l/ R! n9 y0 F/****************************************************************************/) {, c$ K$ C9 z' x% f9 Z' K
char txArray[] = "Tronlong UART2 Application......\n\r";
- G3 R% r1 Z' |) o, H% N: G# b
x1 B+ {% S$ Z( _/****************************************************************************/" Q) D) F7 X$ p/ e$ ~+ o c$ y0 i
/* */
: t0 f3 p. @. P. v+ z5 n6 x2 g, R3 V/* 函数声明 */
% O W8 s! I- c5 \, r# G/* */6 [2 F: W& P; u% [4 M4 R
/****************************************************************************/
3 j h$ x U1 G1 M" ?) S2 _// 外设使能配置0 @; L4 W% \" C! A9 z
void PSCInit(void);
4 U" p2 y, J8 D3 c& ]# F4 f$ w1 E+ _+ Q
// GPIO 管脚复用配置
% ~# v5 n) }# g8 M. {2 D0 U5 e6 Cvoid GPIOBankPinMuxSet(); j; B m6 w0 e/ g7 p8 t8 u
5 L; h- ^$ S1 e3 O+ G ^// UART 初始化. O9 U0 F* M) v. y
void UARTInit(void);
$ b R3 d8 H0 P// ARM 中断初始化
( O" [) R3 A1 C8 z: F+ y4 X4 ~0 p; Evoid InterruptInit(void);
- V2 ~5 W) l8 d0 T2 R: C R. |) F// UART 中断初始化
6 J5 w8 l4 }4 ]1 g8 uvoid UARTInterruptInit();
$ A2 [4 b5 l* l. t Q// UART 中断服务函数
- H2 `; G- u- s& X! G Dvoid UARTIsr(void);8 F0 }' p# |4 J# z7 V }
. ^* M. V1 h o: u6 m
/****************************************************************************/
5 j( ^) }! T# x/* */
3 O& V3 E/ E9 U9 F/* 主函数 */
" o2 z4 e' X, j3 T/* */
: e5 ^4 y" _5 H2 H/****************************************************************************/
4 S0 J# B) O ?/ D# U, g) p h0 vint main(void)
/ v# [2 m( h/ d" P. D{$ ~1 A: s* S7 n: |9 w) A
// 外设使能配置
: o' Z" E0 L0 @6 |4 d$ }( i PSCInit();
& n! o/ W: W q9 |; K( j ( `) y5 X* W p* F. p
// GPIO 管脚复用配置" X/ h% v& `2 h+ }, m: Z: F6 x
GPIOBankPinMuxSet();
- r5 B B) a; F1 q8 d7 R8 F, x. o: n: Q* ?: n( k7 \
// ARM 中断初始化
: h' q- d" u: W/ Q) d InterruptInit();
x% F: U$ ~' [4 k. o4 w& E1 u# X9 a; b3 i7 R7 d# ~+ r! e* I1 k
// UART 初始化/ |+ _9 E) T, E: X: |3 p
UARTInit();/ M& u1 q; y: e/ I8 G4 Z" P' e
4 M. O$ u) E: k4 @( q, F5 W
// UART 中断初始化
8 O2 _4 a2 { ` UARTInterruptInit();
& V( ]) t2 _1 S1 F/ x9 j7 ?! A5 x! E: I
// 主循环
* @% X! p( u' B( r/ D' u% G/ O for(;;)3 |. J& g' o& G7 }+ @
{
0 [' t# \4 s6 \1 [ S' ~, |; d7 K5 V0 j+ S" e
}
4 t. x6 o# Z, F' G1 C. g}& d; S; ]3 N) A% ^
, H B* W& U2 b# L5 ~/****************************************************************************/
* z! t# U0 X) @+ w. X! A: g6 N/* */
" I6 E0 u& l$ w, P3 O% E+ E4 V/* PSC 初始化 */$ ~+ ~/ b" k0 F9 |% a
/* */
+ Y* J+ h6 m0 m' A# o- v/****************************************************************************/% Q& b% a5 Z4 c' Q! i- C% Z, x
void PSCInit(void)$ b8 T' V/ `& t4 _5 T$ W
{% Y4 d$ i. }! ^; p* b
// 对相应外设模块的使能也可以在 BootLoader 中完成. L! r! |! M! O0 n! a0 G
// 使能 UART2 模块$ q' g4 k+ k" ~1 o* u$ ^2 J5 K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
& l6 y. S% Q/ O7 O3 n$ j}3 b3 \0 D1 g9 U' X5 y7 C
1 m$ D2 j! f0 m* l0 Z/ }& T/****************************************************************************/0 t' P$ S8 x' E- j6 s! e. p
/* */6 M; C! r% |4 a) E) C
/* GPIO 管脚复用配置 */2 T! ~/ z. }7 O; o
/* */
7 k! d% t% l2 I" {+ M) f$ N& J/****************************************************************************/% b/ _" E% H4 m W, D* D
void GPIOBankPinMuxSet(void)
5 F% I1 |1 O' ]/ w, N2 Q0 c, Y{
0 a: d. w+ [3 Y% y* u! i // UART2 禁用流控: t1 @6 \& u4 ~0 O5 g' r% o
UARTPinMuxSetup(2, FALSE);3 G2 Y! ]5 A5 `( i5 H8 ]; K
}+ ]! l+ B8 p3 {1 e
5 u2 X# Y$ h2 n. A: d
/****************************************************************************/
8 }6 j& U1 ?8 M3 h0 f$ O2 b' n/* */
, j& F. N) p8 e/* ARM 中断初始化 */
% i+ X- S, C+ B8 z; N9 \6 N/* */
* Y# A( n6 |& [! \4 W7 c/****************************************************************************/
# L& R ^2 U9 a, o4 N/ Avoid InterruptInit(void)& q: B: S1 F" V. h6 F) G
{
4 n6 l! u, y! r0 e // 初始化 ARM 中断控制器- S* g' A! I* J; |8 B
IntAINTCInit();
8 v( M1 E" k5 p5 V4 l. L0 a* R
2 Y6 Z- C. T# c. x: y // 使能 IRQ(CPSR)( S t8 P! P0 j7 y, Q7 }6 `
IntMasterIRQEnable();/ O4 G2 V) v0 p& L7 C# A- E: ?& A
- V& \0 U0 v/ B& l) | g, w0 p9 b // 使能中断(AINTC GER)
) p) P/ n6 A" w3 }( {/ ] j3 ] IntGlobalEnable();. p9 M" E$ j9 a$ n, L
. d3 V% P4 O6 Q' f& [0 Z! }% ? // 使能中断(AINTC HIER)
2 {( L# Z) R& }, o6 n$ W IntIRQEnable();$ e5 L p. v" z$ ?- z+ s+ J' [7 @
}
* F3 s( D9 C# a) Q. h* B# r
% H( O K( w4 H- }/ }/****************************************************************************/
* {" F9 w6 ~3 o2 l/* */" `+ M o0 L) W! c
/* UART 初始化 */
+ t# L+ u |5 {: C0 }/* */8 {, D6 F: R- R2 X) {4 Q. b. U
/****************************************************************************/
! m0 m- |' F4 s! v; i. hvoid UARTInit(void)
4 t1 l- c9 Q, o+ O. U- y! P2 ]{; x! U% E1 Q- m8 _+ s6 N
// 配置 UART2 参数
8 R8 k& @6 y0 C) t( A7 ~ // 波特率 115200 数据位 8 停止位 1 无校验位8 B! ^1 E2 c' }
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,) u, \5 s% V5 R' g' f' ?
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
8 [# @" a- p. B& o2 a- _7 B // 使能 UART2
- e4 m* ^2 T% t; O& R! a8 J# q3 C UARTEnable(SOC_UART_2_REGS);3 S4 j& ^5 C" K* i0 z
/ F* ?: M- n) x2 u0 t* J
// 使能接收 / 发送 FIFO& ~/ H8 }$ k% a( F4 Q! t
UARTFIFOEnable(SOC_UART_2_REGS);1 S R* B* j0 M' t
0 \. U: ]( X( y# a5 ` // 设置 FIFO 级别
% @. ~4 W$ n! a) S% L UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);' d, y" z6 X' [$ i
}: t Z6 r/ X% b5 H2 c* C0 h
2 g, l5 B m! L {3 ]; y6 C; c7 Q
/****************************************************************************/
( J7 u. f" c6 L% P/* */ N) Z; d, m# C6 Y& Y0 }
/* UART 中断初始化 */
& K% _1 \2 |6 O$ ?2 J) J/* */2 V% M9 Q- ]9 z* u2 Q( e5 N
/****************************************************************************/2 h9 T; s i0 ~1 t( _, ^+ g
void UARTInterruptInit(void), v/ Q& S! U; o
{
, J& ~9 _" m4 E: F IntRegister(SYS_INT_UARTINT2, UARTIsr);/ \5 N' U+ Q* E7 i8 S4 W6 C
IntChannelSet(SYS_INT_UARTINT2, 2);3 ^, ]' a7 W( W' F1 `. n# ?
IntSystemEnable(SYS_INT_UARTINT2);, |& _7 O( w! L, G
6 X3 A# ?; @: k, ~, J
// 使能中断7 v$ q! z1 }! z+ g6 P/ V
unsigned int intFlags = 0;
+ r. c, l6 _) R" o intFlags |= (UART_INT_LINE_STAT | \
# ]5 n4 w. t) d1 L) b UART_INT_TX_EMPTY | \
$ X1 S. R: F1 ]; N% u/ Y UART_INT_RXDATA_CTI);
4 w- S) T/ `4 f- L3 ^1 g UARTIntEnable(SOC_UART_2_REGS, intFlags);- R8 p8 |* N2 G( s# R+ |: O
}
2 h- A( e2 P1 ?4 D/ ~; A) E) D- ~. w$ n" q! ^# s# C
/****************************************************************************/) Y- H* J9 j5 h4 A y1 L& T
/* */# r% T! m" v( ? l F# n: U- Q$ ^: O
/* UART 中断服务函数 */
8 {) r* h O6 O$ D/* */ k! B) t( @, K, G( O, U/ W6 X
/****************************************************************************/. t# ^1 T8 e+ ?+ V* y! Q8 _ n' I
void UARTIsr()
" f1 z3 E# k2 o A) R6 v5 v, {{ L& {/ k5 i- P% v4 b0 d+ F
static unsigned int length = sizeof(txArray);
. l* W6 W9 n& S5 X U static unsigned int count = 0;
* G: K+ Q$ A2 y) ?2 S unsigned char rxData = 0;! P8 r0 P- w$ f( s3 ]4 V; m+ w
unsigned int int_id = 0;
$ {, z# e4 L: Y" u1 U: b( p
) U* i5 u+ C+ j( z! s+ P, q/ P6 S // 确定中断源, Q) B; i* d+ w3 o) m8 }2 e
int_id = UARTIntStatus(SOC_UART_2_REGS);
( I) p* D: T j w+ g" C# o9 e# j Y& d( i( L( _
// 清除 UART2 系统中断5 S. a8 W; q+ O2 L% I
IntSystemStatusClear(SYS_INT_UARTINT2);
8 ?! `7 ^3 T1 d) B/ Q
+ M( [% i% i* {* O7 r& z& ? // 发送中断
! c2 ^ e5 Y8 c7 _& V; T* L, R if(UART_INTID_TX_EMPTY == int_id)
' x; f+ z3 g: T& k' I {
2 _& b1 v$ b+ `6 K* A7 | if(0 < length)
9 G. s8 @2 b9 k {
# j: P9 Y& F: K2 l // 写一个字节到 THR
8 d" a/ L: o* x' P UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);% H2 p$ n1 ~" {6 q# O. z' m1 e
length--;; x3 D: P6 e: s: Q8 ^7 L
count++;7 I: h1 S: S/ n& ^- ]
}
5 @9 o, b- a9 {: L7 `- n3 g4 j2 } if(0 == length), e" K1 w/ v" |0 X0 C& U3 h/ Y
{
8 Z; e+ L! x9 z) h( E // 禁用发送中断/ I% R+ g: V6 t' R. r9 b& D
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
+ R3 f, ]6 I) i3 o }; d& g f: U# J' O" d2 N5 O7 F
}! ]! T% N/ w% V) l3 W( k8 Z
; d5 b( l8 J) r // 接收中断, j$ @# ^& s* ~! I; J
if(UART_INTID_RX_DATA == int_id)
% I9 ?. X( p" H. }# ~9 K9 T5 o {
" p1 }" `( _4 v/ T0 _ rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* \: T- J& u5 ^* [7 J5 ~$ B
; D) \4 H; ~1 s8 m2 \ UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);) M3 j9 p* C1 f+ `. R9 K! D; k
}' C) H4 ^- C/ ~) ]8 e& O
) l: D3 B; x" H // 接收错误% a3 c* c6 v( C# N! h, p" j
if(UART_INTID_RX_LINE_STAT == int_id). R, m; N3 e6 T& g3 [
{0 T$ Y" Z7 A& j6 H% y# e; q% w$ \: A; H: j
while(UARTRxErrorGet(SOC_UART_2_REGS))
) c4 a( m& D" h! f9 H( v G* | {
, l; V( ^* t3 b: q // 从 RBR 读一个字节* f b2 f6 O/ l% p- _, i3 ]! h
UARTCharGetNonBlocking(SOC_UART_2_REGS);7 d6 w8 h; q, ]0 I+ `" r
}, F1 t8 V' Z! X6 o2 Y
}
$ a' }; E- j5 @. n: c8 x( C 5 V3 L; P+ Z/ F: {3 ~& T$ Q: x
return;
' [/ V! G) l8 \1 \! X}
( F z4 \+ ] r4 ^+ W |
|