|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
% u3 p9 k( D. X3 {8 u/ ]2 a+ s- b) F; H7 ]2 F* w
#include "TL138.h" // 创龙 TL138 开发板相关声明
& _4 \4 R5 B" O0 `8 w
3 l0 N* Y( O% P: V#include "hw_types.h" // 宏命令
# ^. t) Q) N% t7 X/ I#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器5 t9 c" {- h) k& `$ I E
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器/ V9 L+ u/ @5 b7 }7 @
3 h3 ?, ]$ H, }- r% s#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
; b; C+ Q0 @: h2 o#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
; f. [' V& F* v$ B- c#include "uart.h" // 通用异步串口宏及设备抽象层函数声明9 N9 W% I/ Z% h9 R1 A
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; ^% Y% W8 w: ]- S' U- c2 P
0 M, B; f0 Y9 i" b$ d2 r8 t/****************************************************************************/5 W8 v4 G/ V" i, C/ r e, ^
/* */
" F( N" E9 W* k/* 宏定义 */1 a9 p' p& V& I0 G" K4 m
/* */
$ L4 A. X0 B; S3 r7 q/****************************************************************************/$ ~. Y+ c- ? E
// 时钟
9 M; e8 Q4 K3 Z; Q Z3 t$ j#define SYSCLK_1_FREQ (456000000)
3 X, v. i" r( {8 f; C' p#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)" |- _; `$ u; Z& Q3 N6 X
#define UART_2_FREQ (SYSCLK_2_FREQ)& h5 s& B: F) x$ b4 C& H
# @/ g4 P L5 `( b% O
/****************************************************************************/9 f" S! c$ ^' W: z& n. [+ ^: U4 k
/* */
( N C1 B' ~. z" f/ {2 g& `2 H6 @/* 全局变量 */
0 U( @" W1 P$ [' S4 d {) |# o5 c/* */, p& Q. @" A/ J2 U
/****************************************************************************/
% B R" e. M. tchar txArray[] = "Tronlong UART2 Application......\n\r";) f3 j C9 ~5 h9 s( {
" P0 E# R* X" Q0 b' L, w/****************************************************************************/
# b$ j* j; c5 c/* */
3 x3 J' b9 e4 Q" e7 b R$ z' j/* 函数声明 */+ `8 a6 l5 e' Z4 } W
/* */
( H- K6 w* F7 v* G' L4 M/****************************************************************************/: n$ A' I5 N, P
// 外设使能配置 |0 R% D0 v! G( s
void PSCInit(void);
9 }2 q# C) D0 R- O: Z4 B9 l, F* D
// GPIO 管脚复用配置0 v9 S' E, y3 }/ H
void GPIOBankPinMuxSet();# L4 Y4 ^* t- s3 }; Z, O7 u
) p7 B, Y4 Y5 I" y4 x6 G- J) L" O// UART 初始化. H% H# n% Q& K3 z1 x- Q% W
void UARTInit(void);
: x9 U0 D" x2 J! B& a" {// ARM 中断初始化
1 Q4 t* P+ d: C% J0 P" a# W" qvoid InterruptInit(void);6 [* M/ j: d/ k' i; l
// UART 中断初始化% H1 B! |8 O5 J; F2 `7 z3 X/ p4 G/ x
void UARTInterruptInit();
. J- S! s+ X5 |) S' T) x// UART 中断服务函数
, b' X( {/ Y( O0 }5 ]void UARTIsr(void);
/ y& T+ W0 w4 K* @; E& s$ n. Z, C ^" x4 M
/****************************************************************************/
4 \$ I# k' u( u( @& i* g" B" r/* */- X/ A/ _4 {9 F+ M5 ~1 P( T
/* 主函数 */
* R5 y3 K' W( ~9 Y4 c+ l& ~4 i/* */
- g v# S J6 _* g- I/****************************************************************************/
9 I ?2 ^0 f6 _int main(void)
: [3 w& k4 `5 J{
* ]* J7 L( A! s8 l T! k // 外设使能配置
% B a9 d, @) T; e$ n$ Y% S! [5 X PSCInit();
2 c/ s! z+ p$ X* E3 @& e7 q! j . Z) z6 L: w, J9 e1 n
// GPIO 管脚复用配置9 Z4 y. o. i2 i2 M9 j( S) X' F
GPIOBankPinMuxSet();
* o0 b G% J7 `: N& k3 `+ S1 @: F p
// ARM 中断初始化+ z0 T9 D% ]4 f. C& a& v
InterruptInit();! m1 z4 [7 v" M' ^7 g9 ]
9 F7 R4 e5 |" r, Q/ g // UART 初始化: J0 s' E# M( c5 _1 A! {& U
UARTInit();2 Q: X! l3 D% B' T3 a/ P; N
/ g; {1 n, e$ G @7 [7 ~/ y // UART 中断初始化3 N. `4 s$ G2 z4 a6 ~% I
UARTInterruptInit();
$ z0 @4 R+ Y) j! q7 w4 Z: k* F' U& B0 _
// 主循环
t$ z4 M g; J' { for(;;)
: I8 O& r* x4 H X {. ]: q. C! l8 Y: \
/ M7 m2 Q/ i' {& w1 f( b
}9 |# Z) m; E& B) y, Q) S, y
}2 R( B: d4 V# C! O7 E2 T
( \' g; S% y2 {" b% l/****************************************************************************/" p4 V1 ?9 w' ^: U3 `/ C
/* */ d& ^: y4 |7 N( {
/* PSC 初始化 */# A+ i- a0 @! k5 K' j% F( k/ C2 s' e
/* */4 W3 I- \7 U7 i& U
/****************************************************************************/
: @1 {7 n, U' t; l! P Avoid PSCInit(void); n& ]& }1 T0 H2 m5 ^/ s
{
) ]# b! z$ |( N7 G. w2 M // 对相应外设模块的使能也可以在 BootLoader 中完成
* B) j1 V4 t. `. f; A // 使能 UART2 模块9 T2 d( q: D- |" `1 B0 @2 n
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' E2 i0 J. M) _- z# I
}9 b( ]( E" p; ?& [
6 ]; I6 ]2 u5 k. c4 n
/****************************************************************************/) Z3 }% v3 d' s9 O& H, ~- P
/* */
4 m$ O. V; _/ @6 N3 }/* GPIO 管脚复用配置 */
- f Y+ \9 ]& D" d+ o$ v$ A5 o% @- o/* */! F Q* C) N' u) z/ d
/****************************************************************************/
. `% z6 E- a* Hvoid GPIOBankPinMuxSet(void)
6 x9 H- U r& u: C{
7 l# x6 O. ^8 G // UART2 禁用流控
' d% {; x( `3 | UARTPinMuxSetup(2, FALSE);% y' D2 b% ?% Z5 G' i. S4 I* K; z
}
" ~* v4 j% G2 `5 t; `6 _+ ]" N9 n) e5 ^ e
/****************************************************************************/
( f8 ]* _ b# |7 w/ ^. h( M9 `% X2 X/* */
. e) f! P- c7 b' e) u0 `/* ARM 中断初始化 */ B; A/ C# q) Y) {$ X' m* X
/* */7 G; ]& o; x2 n8 j$ f$ Y" s
/****************************************************************************/
! u9 ?- |" U) {/ mvoid InterruptInit(void)& s2 {/ F4 W0 H! ?2 \! K
{
- [2 L1 h8 U- I7 H/ f8 u! k; Q // 初始化 ARM 中断控制器4 ~! }1 |3 L) Q) t, j( d( n
IntAINTCInit();
% A' d% c9 q- i% F) Z* r. y+ G; I. U6 j& M" @8 ]0 r0 m) W
// 使能 IRQ(CPSR)
1 d( }, c7 b4 i, G# S/ U2 {. V IntMasterIRQEnable();
: v! z2 f% r1 {0 I7 p) G# y
# }% Z5 G2 H" D: h/ T& r2 p // 使能中断(AINTC GER)% C9 v0 W' o0 o
IntGlobalEnable();; t6 w" K* k: O' p( ]
- U Y3 O4 Q4 T, p. R
// 使能中断(AINTC HIER)
; b& n/ `% Q, K# a; p* a, W0 Z IntIRQEnable();
. N" A, r% q5 ?. v' t9 L7 \}1 k1 q) y" b0 d
6 f+ |- B7 ^( b- K# ^/****************************************************************************/) O9 i' v- O$ T$ k) u
/* */
- _* u; e. V8 Z4 u1 O0 n4 `6 ?/* UART 初始化 */
9 m5 A! G3 D7 ~ C/* */. L4 p& G0 x0 _
/****************************************************************************/
* e" t; a% {# u& N% _2 jvoid UARTInit(void)! p8 _- }" o/ P
{
. f4 v+ n! G/ N% Q( m! Z9 s // 配置 UART2 参数2 g6 e/ |3 v' I2 ~
// 波特率 115200 数据位 8 停止位 1 无校验位# E8 E4 ~/ L; |6 s, \
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 H: C7 k" @/ X" ?6 n" r; \' E UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" V# i; _! m: P( h8 @1 i // 使能 UART2
2 y Q5 i @) N/ ] UARTEnable(SOC_UART_2_REGS);
' h, t1 I$ O/ k: c) G9 d/ [$ G. E
// 使能接收 / 发送 FIFO H6 n: H0 ^9 `7 i# i$ o
UARTFIFOEnable(SOC_UART_2_REGS);9 @. ] H0 G' f" A# w6 X- g8 R
. r; e& Q) H, g1 k
// 设置 FIFO 级别, I7 ?+ n( s. R' T( b Y
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, Z) a2 l5 T, } ^- Y* e}
( \ I3 w N: }* F5 U$ e7 @
& H6 e- m& C/ ]3 K+ k: W1 _* Q- H/****************************************************************************/
/ n- U1 H) C1 |# w, r9 g/* */' p; W/ z. r* x8 [% L8 F" |
/* UART 中断初始化 */; p8 |9 Z( \& ^2 ~
/* */0 F9 j6 _3 c9 A# D9 i
/****************************************************************************/
4 g9 ]1 b" b, r$ [. @6 _7 Gvoid UARTInterruptInit(void)7 [) }; ~) C1 h u' ?) K0 @
{
( \% U. n6 j- p9 u" G! H+ Z% B IntRegister(SYS_INT_UARTINT2, UARTIsr);8 j$ Z" R8 Y/ v% o( @
IntChannelSet(SYS_INT_UARTINT2, 2);1 u2 x0 Z; t& B9 V! J% J- Q
IntSystemEnable(SYS_INT_UARTINT2);
8 I8 k4 \. ]% W- g5 b! s( H. z& g4 x1 v9 i; R
// 使能中断
5 y; S) u4 S( y E1 r K unsigned int intFlags = 0;
9 R+ T/ H3 q8 r5 n8 ^( C intFlags |= (UART_INT_LINE_STAT | \0 i$ P9 l. b+ ]5 n. ~, v& t' M
UART_INT_TX_EMPTY | \- A5 N, g5 z# L! ~7 y
UART_INT_RXDATA_CTI);
+ x8 v7 |/ R" S- _ UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 C9 _; }! S% x0 B% |9 R/ Q}7 j8 O u% Y! \$ L% F2 r
( d8 `& K/ @' r/ C$ x
/****************************************************************************/% P3 H$ W8 { n$ L5 g" Q, ?0 B
/* */
( [$ S! _) e& q/* UART 中断服务函数 */
6 r" N+ h- S6 W' A" |4 w& \/* */
0 K) f- }" q' E F1 U0 c/****************************************************************************/: U# p/ U' S: q+ L$ e' e$ `7 x
void UARTIsr()8 L! h( C+ Y l# o3 w/ `
{7 N" V; y" q2 _0 T
static unsigned int length = sizeof(txArray);
" n; ?1 b) [4 w. J1 W, H; N static unsigned int count = 0;6 Q# _/ u$ c9 Q G: J3 M8 z. v+ Z
unsigned char rxData = 0;6 Y, H' x% p9 H6 m! p: e
unsigned int int_id = 0; L1 B3 G) H u- @- ?" l8 i% E( s6 h0 U
6 f+ o/ ~( N* m# O! T7 k8 R
// 确定中断源
1 F" {2 @" u4 Y$ W- N int_id = UARTIntStatus(SOC_UART_2_REGS);
1 A K, V# k+ n# s
# @) E/ e( @/ [: K // 清除 UART2 系统中断
8 ^2 y6 _/ c9 Q7 Z1 ~- q* C! c IntSystemStatusClear(SYS_INT_UARTINT2);% \* C/ U. s; e& `# ^
3 k- N6 ~2 N6 c) Q9 A+ b6 J1 |
// 发送中断
& M: f0 u. h5 ?5 N6 ~) Y if(UART_INTID_TX_EMPTY == int_id)
' H9 s$ U& \( u- h4 |. l% I {
! D9 e4 L1 b7 k4 Q if(0 < length)
! f% h0 h i8 T+ A* b& L( r1 K$ F! w {, X" q6 X* X2 f
// 写一个字节到 THR: ?- {% E% |7 L9 v; ^$ s0 o( y
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 n8 A" d* W, L( h% U0 v length--;; d; ~% X3 w' s% A5 H. a1 G* t
count++;7 P: ] H q: B* T1 ?
}) B3 o/ w: F8 m* z. i; V
if(0 == length)
" R/ R# ^& J( x5 _1 z8 h+ E {
! D* |) |& @' [7 o: B) _, p* h) x // 禁用发送中断
& y" n X' f) R) {: Y UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
5 K' n9 W! D9 s( {1 Z }7 x* e- I4 b; B+ Q) a9 g- Y: N
}
4 t4 r: U; Z, f7 @4 V0 g% J1 S$ c% h5 s1 d/ V5 Y% k# u
// 接收中断
; t8 Y. M# \2 q$ b! ^, f/ \+ f if(UART_INTID_RX_DATA == int_id)
; T/ i9 k5 _9 |" F {
: v( B1 r X% v& I rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 H: m- l k! Y2 N1 y" l- t5 B- O3 z: X
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);; X( j; t5 L+ Q9 {5 g# Q
}# ~9 q- u5 {0 W% `& V& [ {, p
$ z) Q* J# U% D a0 I8 ]
// 接收错误
8 p9 _3 O/ c8 M6 c% |' u if(UART_INTID_RX_LINE_STAT == int_id)
$ c) U0 X% N- S) `% y4 |" `, R: ~ {* o9 W, r, ~$ H, S8 H7 X
while(UARTRxErrorGet(SOC_UART_2_REGS))
6 j, E0 R7 s6 S9 Z$ t$ d( i {
r: y: w6 f7 G( P2 u // 从 RBR 读一个字节
( O5 G- }( r- s4 V UARTCharGetNonBlocking(SOC_UART_2_REGS);: j* P* u2 c" Y$ ]
}
5 c6 x2 d# S' B& _; K% x9 { }
9 |4 u" O0 z" F3 h* u$ ?
9 _8 J2 L: ^! x& h7 U return;$ y# \; G. m# q6 |1 V
}6 I7 K" }) W* n! S; v
|
|