|
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。8 H( S, v& W# f
& Y3 B6 j4 x% W
#include "TL138.h" // 创龙 TL138 开发板相关声明
$ Y/ d; O! Y W7 Q" q7 r4 ~
G q& r; F' `/ \; _9 [#include "hw_types.h" // 宏命令9 ]7 v( h" \% U. k2 U( }
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
, h8 i, X: V; i, `2 @' R' M#include "soc_OMAPL138.h" // OMAPL138 外设寄存器9 ?3 e) ?) k9 H2 o* I' w; h
2 e- K, u2 x4 X! ?/ l+ x$ \* B
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明3 a* l% ?) [0 S* R8 w1 B( T
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
* V3 G" {2 p. m; l$ [% b2 g' B#include "uart.h" // 通用异步串口宏及设备抽象层函数声明5 b9 X* {) b1 ?1 W2 v
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ y. w9 p, {7 n/ Z9 M$ P f2 p
0 Y& c) P1 c/ \ c: K2 |! N/****************************************************************************/
/ x" a* x) V; u9 u8 r) S; z5 I/* */
0 v7 x& x u4 r" i0 }/* 宏定义 */, ]1 c {% g7 x; m
/* */
3 N- e/ {% T6 z5 Q5 L1 E t! e- @6 Z/****************************************************************************/, @+ F7 V' ~3 ]/ i+ p
// 时钟, n U* O5 u. N/ _4 r
#define SYSCLK_1_FREQ (456000000)
$ B3 K5 _1 v+ @& Z: A3 k# E4 [+ I#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
- \8 Z1 c9 A' `' ~7 }; X1 o1 W9 o#define UART_2_FREQ (SYSCLK_2_FREQ)2 k) o9 ^ Z+ D# `
* L1 L3 ?/ A9 V* X
/****************************************************************************/
8 u+ r: {, S" F, n' h; i5 _/* *// S: @7 i$ ] |
/* 全局变量 *// ~8 W9 C5 T+ K
/* */
- a+ g2 u' R8 X1 C1 F/****************************************************************************/7 _4 v5 F9 b% `! m
char txArray[] = "Tronlong UART2 Application......\n\r"; ?# T+ h6 I. O7 W9 a
! N2 [; T* v, a: e$ P! j. N/****************************************************************************/7 n$ V) V- j' c3 `, X, z
/* */$ k+ t2 J8 J! Y5 @
/* 函数声明 *// w, { H" f! H, G: N$ n
/* */2 t c: ^" m# i! p' M, g2 K
/****************************************************************************/3 z! M9 j3 K( e0 G
// 外设使能配置$ _% z' F! O6 n- w# q( G; \
void PSCInit(void);
& [+ _# y7 n+ ^; c; @- a/ j7 s/ ?; R2 C0 e
// GPIO 管脚复用配置
4 T7 [6 X0 d$ o9 g* I7 Cvoid GPIOBankPinMuxSet();/ ]& e4 f9 J) C$ N( J
, ?+ k1 I0 [6 O, W. P7 I/ l1 r
// UART 初始化7 L! t3 `4 w. I
void UARTInit(void);- ~. }" ]: ~' U) e6 c
// ARM 中断初始化9 H/ u% e2 H" r* f2 |( o3 v
void InterruptInit(void);
+ _2 ]* Y! L) H) A# x- E5 k. e// UART 中断初始化
b" R, O5 t2 E" |" L; `" ?8 _void UARTInterruptInit();% ]1 }( ^% g% P5 `/ U# ~, m
// UART 中断服务函数
; m# l" `0 |7 b1 U& }% X" @void UARTIsr(void);
: x( K7 F! x* p! W2 A% R" `9 v! g2 c8 M4 j
/****************************************************************************/
1 E# b5 R: Z. s' ~/ M1 u/* */
: {; v" W4 H# v6 v9 y3 P/ }/* 主函数 */
5 U. h1 ?; x/ z% A" y/* */
: P' ^2 p0 l0 z& O% a1 S/****************************************************************************/; H! e( {6 l& y9 i# d9 q: k
int main(void), a- V$ {7 q6 p" y
{
( o4 ~6 M" p1 Z" N1 A // 外设使能配置
4 ?5 J- ~% u* e5 f/ l) f* @4 W PSCInit();) C/ @8 x) B7 q5 j; e& {+ ^5 _6 H
# c9 }1 R6 u$ t
// GPIO 管脚复用配置1 ~! |* X& S0 S3 C0 ^0 Y
GPIOBankPinMuxSet();8 d6 n9 i" P) S# V, C. U
+ Z5 n! F( V0 i% N3 n // ARM 中断初始化1 X( H) b# f3 ^
InterruptInit();
. k" D& q8 }7 V$ c2 m S6 v3 ?! o/ W! a3 B& i0 n
// UART 初始化
' Y2 ]9 ~% v4 v; } UARTInit();
5 ]0 V' Y6 s) u% W" Q: ~+ {. q5 l) ~- t& ]
// UART 中断初始化, _ ?4 H" E* X3 n Q) M' i5 m, K% p0 V
UARTInterruptInit();9 u5 N! W& t/ n7 [4 e
* Z" p- c3 k0 |4 f( D
// 主循环' z$ a; ]4 S5 ?. D5 o* |
for(;;)4 i* P7 T+ i! y5 C4 ^8 U
{
& v8 `0 m9 o+ A7 Q2 T$ |. T8 N- }$ V6 K2 h1 c( m
}
4 K4 U D, P; F% N6 c4 a}% M- B K/ L' ^8 W% s) Y
/ l- L6 x) n3 c/ \3 }; z$ ?/****************************************************************************/
. Q$ y# e9 n- t4 o. n/* */2 I- u+ M: _1 k* W* o1 }
/* PSC 初始化 */
' M0 E8 {/ E, e# D2 N- g6 f/* */
9 Z& d m# ]% h4 }! X/ b1 x& X: y: Q/****************************************************************************// D( f U" p) T, x. Z
void PSCInit(void)" l; E3 K, i$ y( W5 V1 Z' U
{% q/ T! X8 i9 o9 \3 c4 o" T# I
// 对相应外设模块的使能也可以在 BootLoader 中完成# `7 I- ^; S p+ P9 l0 u% `# p8 V& { ~
// 使能 UART2 模块
6 N' I: Y! O f) w/ I PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, B4 P+ e. r1 y8 C
}
( M1 D) d; X/ c7 i, ]
$ O# m7 \+ N/ D/****************************************************************************/
$ p- Y" t. k V j5 {1 \/* */8 Z" y4 }5 }2 b& p
/* GPIO 管脚复用配置 */3 u( H- H6 D0 t$ j4 c* h4 F
/* *// D \" U$ `- U, t5 ~! ]( v
/****************************************************************************/. J# i% ~, m" t7 Z) I) y3 m! v
void GPIOBankPinMuxSet(void)
4 ^8 I7 ^9 `3 P4 D' p6 k. {/ h{
- L7 H1 N5 n5 K7 Z! h, p // UART2 禁用流控
$ h, j3 ?4 G' J9 A UARTPinMuxSetup(2, FALSE);
3 a- s% R/ R3 J8 U. p}
! I% X- i: |( |) }: k3 ]# l- V0 _( _/ q; e: _8 |
/****************************************************************************/* K5 H2 H: Q* j8 y* b
/* */1 K6 s+ b. y4 r/ O6 z
/* ARM 中断初始化 */8 y" d1 j; l+ v+ k
/* */
- z9 q0 n6 \! T# R5 W/****************************************************************************/2 _& A7 f1 b9 ?9 }( T
void InterruptInit(void)
0 h S& j3 ~3 z' {{) g6 g, E3 l+ s2 i( }6 j0 |
// 初始化 ARM 中断控制器
3 w- J7 b3 T1 B8 Z IntAINTCInit();! }1 V' J+ X& I8 X0 Q- a2 [
4 s6 L& U' q" O // 使能 IRQ(CPSR)
: G: y& A+ ?7 J7 h- P" h1 }5 g. f+ s" Z IntMasterIRQEnable();
% D. Y; N' e' S1 X& g3 m3 q/ l2 g Z: S
// 使能中断(AINTC GER). ]) r% a# z1 @9 }% @
IntGlobalEnable();! h% v" [ D ]# J: V0 x
5 V, u% ]" _, P) N0 Z5 k" h* B // 使能中断(AINTC HIER)
4 m0 ]1 h' ], [ IntIRQEnable();2 `7 h+ b { r7 p5 i$ B
}! }6 u$ \# X3 f: a: S4 Y+ S: |
- O/ u: m" I D6 {) m5 ^5 y2 z- u
/****************************************************************************/3 B% k+ b2 {! ]# [. X, j) ]
/* */
: g1 B4 n7 e8 i. [/* UART 初始化 */
- f0 g) R' X& S/* */
) T- w- l) _4 j; p5 a; X* f- G/****************************************************************************/
: B+ E Q% m( _) R6 Evoid UARTInit(void)
; P$ V/ H8 f5 F$ P# ?% l3 |7 ~+ X{. r0 J2 p" A A/ D6 p
// 配置 UART2 参数
# m0 E: ~7 G8 { // 波特率 115200 数据位 8 停止位 1 无校验位4 ~% l, ^8 P3 X( R, Q( j/ g1 b/ T- U
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( O1 u& ~# x x! d7 T! [) C UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ |# l0 z- e# g; B // 使能 UART2, f2 [8 i) r, h+ g$ V
UARTEnable(SOC_UART_2_REGS);
, ]$ M0 s- V* d* R! ~
; B" w) M' U/ [ // 使能接收 / 发送 FIFO' N# z) Q2 f% {' P! @% }
UARTFIFOEnable(SOC_UART_2_REGS);4 O+ i7 i- b: t* | x
. V5 I4 [9 I* b- p // 设置 FIFO 级别
( T3 j# k- ^( x/ u* ?2 ?- \ UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);4 I0 h7 L; s! R5 g: b
}
" ^ X. {8 G0 k* N* L
2 C" X6 C# {" g1 F& Y8 A/****************************************************************************/
% [3 J2 M2 ? A8 D+ y6 j" H/* */* R# M$ h4 Q1 c% }
/* UART 中断初始化 */+ L1 H6 x' L$ S4 P6 O' C
/* */
. M4 E5 l' J* [3 |8 a4 d) A2 \6 L/****************************************************************************/- S5 Q4 x* \2 m$ p; g
void UARTInterruptInit(void)0 D( O9 `! X. h; I0 ^0 g
{
. b0 Y1 G1 y/ x; A2 f& k IntRegister(SYS_INT_UARTINT2, UARTIsr);
) V, J% h- @* Z6 w' z, G2 [ IntChannelSet(SYS_INT_UARTINT2, 2);
' D: o% M& \2 m* F IntSystemEnable(SYS_INT_UARTINT2);
/ P5 L# |+ j5 T! x! W) ~8 x5 K( A4 a$ ]3 U% E1 f! ^
// 使能中断3 N! s0 h" T+ G( h5 Y" f1 ?
unsigned int intFlags = 0;5 \- b4 F# J2 \+ h$ b6 i. N
intFlags |= (UART_INT_LINE_STAT | \, z( f; N# G2 H Y. M) w& |
UART_INT_TX_EMPTY | \% Y( ?) s# p$ o- s9 r; f. }6 D4 V
UART_INT_RXDATA_CTI);
( G4 V/ W/ Y' o0 _ UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ s( x9 C. Y; G. @2 }}
% X, b0 e9 z0 i) b, x3 p
% j) h8 R+ S6 T8 B0 C/****************************************************************************/
" F& _: D# t/ l6 I& L7 g. z/* */
+ f! q6 H! U; h. g/* UART 中断服务函数 */
& O, @1 i) s9 h: E% w/* */; ^: S5 c3 ?& R/ V
/****************************************************************************/
( ]' A5 O, h( J @void UARTIsr()5 y5 }; y; c" k* y% L V! f2 ~# H
{ F1 N* G$ {; u0 V! s) s
static unsigned int length = sizeof(txArray);
5 S8 T/ d! k) l( r# F static unsigned int count = 0;
4 B) D* A; n9 B% R. C0 M unsigned char rxData = 0;
7 [( b0 {4 b. [ unsigned int int_id = 0;' p, V, a4 a; T& ~; }4 o$ H' E
6 J( ~+ W) O) C) z9 s // 确定中断源6 i6 R, J; P/ ]6 s
int_id = UARTIntStatus(SOC_UART_2_REGS);
/ m, N1 L& \0 z* e: q' [
3 C- N5 \* @/ q# C3 o. x // 清除 UART2 系统中断
* N) L+ [& N. a9 _4 s3 t: ] IntSystemStatusClear(SYS_INT_UARTINT2);
% k' R5 l) x- l5 K6 G Z) n
7 ^" a) ~1 V( w9 t6 |' F; z // 发送中断
; ^* ~/ L! r; f3 T1 s' e if(UART_INTID_TX_EMPTY == int_id)
& k& Z; s! ^7 D8 ?+ e' x- o9 l$ ] {
9 e, N0 x% a- \1 h8 n5 A! f$ ] if(0 < length)
# }' Y5 A$ ^; ?' w* l {0 Z$ @% O: S4 o$ |$ z
// 写一个字节到 THR
3 n3 D" o/ a& g l UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
7 W. }5 a1 F8 I3 I- E+ U+ Y$ {, Y+ P length--;
6 s" t. k5 o; }! n4 J h* B count++;
& E% w* H+ r9 d( p$ j6 U }6 j; Z b8 m* d0 H' ?8 J
if(0 == length)
/ y1 S$ e* t7 ?+ ^ {: Z7 M/ v! {1 S: L/ L4 @
// 禁用发送中断% Q' @. _5 D- ?* ^3 b" y7 g9 x
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
; E/ A4 t% D8 ~3 p }$ H9 L/ h7 p* |- c0 D
}4 N# X6 Z3 u' h" P0 Q0 g `
: t; N" x* u+ Q3 o* [# j% c, E5 X1 y // 接收中断/ w/ g! s# H& b, V9 y
if(UART_INTID_RX_DATA == int_id)
K9 l8 K+ p* D5 |7 e1 r/ D {
% F7 g4 u5 `1 p9 K! O3 n- P2 X rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" d9 m& M5 s4 b* p! D, D* a# X/ T) }: B7 n
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 T5 A$ \! ~8 `, S. Z4 J' F }
) l5 {2 x1 ?3 n* j" y
2 U# @ K( f, y2 s# x // 接收错误
, l2 e2 U: Q1 N" r4 }% B if(UART_INTID_RX_LINE_STAT == int_id)
5 r; i p5 }# i {0 _: ], D( I" | u3 W5 Z
while(UARTRxErrorGet(SOC_UART_2_REGS))% X! p0 u! M! ?
{
, G, D* b8 c; N) `' t* |- X( I0 s // 从 RBR 读一个字节; R% O8 G* v$ Z& Z& Z5 [- h
UARTCharGetNonBlocking(SOC_UART_2_REGS);2 a$ ~7 D$ u, m0 [# P
}
( A6 e8 r7 g% T0 w* l4 Y0 M }) s& v8 m% F5 ^' O9 i5 {+ V+ [
" l, q% z1 f4 ?8 S* M; Z. T
return;! N& o- W, o3 ?6 _; `
}
2 }! K& G8 y3 y+ i |
|