|
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。! q c8 I8 M6 c. h9 w6 L& n
a+ ~/ k5 ~: W5 N0 x#include "TL138.h" // 创龙 TL138 开发板相关声明$ W+ E" f7 I) S# D6 r
+ D% i' h* N5 {0 @; `#include "hw_types.h" // 宏命令
- t @& C" V* J0 `" b* |+ Z#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器) S1 S( G/ C1 w
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
# m- d) a8 I+ ~3 X& j) X
% T* J7 }% q$ M: q g$ l#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明+ V( r7 W O7 Z6 ]( n
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明3 N& r: d& N1 i+ G1 A
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明$ U" M G. k/ {) m, i; f
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( \/ O0 o! w8 s; h/ R
* p I/ M2 J7 s' \" K/****************************************************************************/
! {: a: E* R( P3 z* l/* */0 @0 }6 C/ a" ~* d: |7 p0 {
/* 宏定义 */7 o, n4 j) v3 M) b3 o- q. F+ ?
/* */
& z! M4 ?2 Z' F" L/****************************************************************************// E- @0 L: j4 r* }. ?
// 时钟
; P7 J# f" {: l+ ?; s% u& n#define SYSCLK_1_FREQ (456000000)
7 a A2 |. o3 E#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
# {* r! \: Y6 R/ N: r0 L+ j. _% n#define UART_2_FREQ (SYSCLK_2_FREQ)) P; c# p" H$ }, S E. X
* Z/ v3 I0 x# o/****************************************************************************/
& b! F9 a7 w1 ~" u( R! w, y/* */8 ^ m" g) j: V9 _
/* 全局变量 */
3 M, ]8 s# P! b! y/* */ `3 Z1 s; U. ^3 c. [( v: C! h
/****************************************************************************/6 Q6 P1 U8 I+ n! O7 O4 m0 t3 w
char txArray[] = "Tronlong UART2 Application......\n\r";
: ]2 n1 f9 w6 H7 N4 U: A" A1 ~& F3 V3 O! c9 s
/****************************************************************************/+ C% v, J1 N0 l3 L% z4 v2 u
/* */
' |) B7 d1 h) ^2 d4 d7 z/* 函数声明 */
) r+ S+ A( M1 m3 A9 i/* */
3 ]1 \+ P7 Y- }, ?9 l/****************************************************************************/
" e7 _( h" [( A9 ^2 ]+ D8 p- J// 外设使能配置, a5 @4 V6 y( L' l. y2 t. c
void PSCInit(void);
3 ^# Q& ]) h( h3 t% L* G
) |% J* G; `- v4 p7 V4 ~// GPIO 管脚复用配置
l. r7 Z# H) R2 C! V; G: }void GPIOBankPinMuxSet();% x2 L8 N4 X' c% B! c/ j# n6 C4 V
% C4 J, @6 e8 B; O, E p1 {: B// UART 初始化& z2 l( O% I& O$ ^$ L" [
void UARTInit(void);" C: T. a* a: G
// ARM 中断初始化+ @. r* `% z! a; @/ \4 \" R
void InterruptInit(void); t9 Z* b3 f" S
// UART 中断初始化7 l/ u& a( |0 A; a# }; N
void UARTInterruptInit();
3 |% V1 g; y7 Q$ D5 g// UART 中断服务函数: G# a/ u/ l. f
void UARTIsr(void);) y4 U+ ~: K2 a( ?
2 ]4 c- h8 H2 Q4 k5 G/****************************************************************************/3 G* D" X9 N/ o7 o2 R- P' b
/* */ K4 V v: @4 w+ v. R) d4 z. L
/* 主函数 */! U% L3 |; F5 q
/* */
! o* V2 I# s2 Y/****************************************************************************/
" Z& X7 [; F4 B/ y! p/ Gint main(void)
~' k) P0 V# A5 Y. W p& X+ N t{
7 Z) R! L9 i& a& ?+ F8 ` // 外设使能配置% X+ @) `/ S; ]) ~0 w: ?0 S; K0 b
PSCInit();
0 f) |. a3 c/ }; |8 v: [3 c6 ?8 t! T; L
" P& f% Y+ R) n5 S, K, O // GPIO 管脚复用配置4 D" p* d+ h4 a; ?) ?( w
GPIOBankPinMuxSet();
) o8 { k9 M0 r2 C$ }) t7 U6 C' m$ }2 A
// ARM 中断初始化, E' V0 [2 b, e$ M( N% z" J
InterruptInit();: W/ { K& q$ I2 u0 w$ P( g
9 T0 p* a: y' E; s; ^9 _
// UART 初始化
/ J/ l# f1 [ b; r5 n% L UARTInit();
t3 T9 M! z. _, z3 R
+ @0 x* G+ }& k2 m) |" s# F // UART 中断初始化9 f1 v2 I6 n$ ^' C( }6 U
UARTInterruptInit();) W# O: n8 c! \ J
& J" |) D4 d) _- Y# e: S; `- ^) l // 主循环
5 o0 X2 ]; Q# F9 ~! D6 T8 l for(;;)* r3 n- N+ ~; W
{* L4 o- I/ N$ f+ L$ X
# T* H% F+ z! A }
$ b4 ]! K: P7 D6 m0 h}
0 t* ~3 b4 @* t' `! v7 F
9 |0 ~+ q5 d( o. ?7 b" F7 a/****************************************************************************/* |2 C4 {9 Y6 C: u, i g
/* */
& R+ O4 [9 J4 f/ i t/* PSC 初始化 */* Y: H. _/ e# i
/* */' i( B' C5 `2 w. a' E1 t; E
/****************************************************************************/
- o5 q7 X7 u4 @* fvoid PSCInit(void)% E6 _. Z4 a& _! z
{
* _8 w" _ |% [1 s* a$ v // 对相应外设模块的使能也可以在 BootLoader 中完成. z! @' \% D7 O2 ^ Q# F
// 使能 UART2 模块" T9 a/ O) F* m" f2 X% k0 R ]* B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
/ ?% [7 Q: |, Z4 Q) L, Z% g}
; F7 S/ R5 x0 d9 Q2 L
* p. A- |( d% ?/ h0 w* L2 F/****************************************************************************/
) }: C+ G, V4 }0 G1 _% G' G/* */+ D/ b+ q5 i+ N) }3 D* H
/* GPIO 管脚复用配置 */& ?0 g/ K8 p* m
/* */6 M# @) _* ]% o) Q" w& D! x
/****************************************************************************/
2 O- C; c4 ?2 G4 b" C$ {void GPIOBankPinMuxSet(void)
& O' X* I7 o! Z5 H; U- x{* @9 v8 s: B, _! T% r
// UART2 禁用流控7 @/ c$ @( u+ ~
UARTPinMuxSetup(2, FALSE);: g) P; y' R2 _1 p7 U: f6 E
}
* B |7 E: C, k& ]7 A- H- `# |4 Z2 H& {, A- h' F
/****************************************************************************/
7 ~0 g* N6 _ d+ L- P9 d; ]& C/* */
0 s$ z+ O* z0 [" T* N/* ARM 中断初始化 */
: M, m" _( Z- L8 ` @. r/* */
& \) T) f( o0 `# Z* Q/****************************************************************************/& v; q' C; m% h5 e: G) L: E
void InterruptInit(void)" q3 w j$ T; F
{
- i$ Q, x1 \, A! g // 初始化 ARM 中断控制器 c+ ?( e9 R2 \1 }9 h) L
IntAINTCInit();
- z6 B- k, Y7 V/ ?2 h0 J8 v6 A- ^: \
// 使能 IRQ(CPSR)
6 e' s2 c8 c- I4 k. ~) ~ IntMasterIRQEnable();
' M- U( G, k$ G4 \6 X9 F, \- R$ y
f/ L; Y1 v+ A, B+ v; Q7 o // 使能中断(AINTC GER)2 M0 Z6 R6 x/ {; O2 |& H, h
IntGlobalEnable();
; h) ~1 f# `6 y" C
/ v: I" A- X8 C3 @/ Q9 r // 使能中断(AINTC HIER)* `" S; w, ?( |# D
IntIRQEnable();0 R3 X( Z, i! P" F, l
}6 o# \$ r" q$ J( G
( t, |) U% w# K: I6 @" N3 |/****************************************************************************/
$ K8 _3 L" S9 m8 M1 Q; _4 M/* */
. o* g+ ]2 t j6 C5 b+ t# V/* UART 初始化 */
1 U8 |2 k( P& X0 O8 s2 {. Y/* */
) C! F2 b1 g9 f | M( g7 B8 r/****************************************************************************/ j) H# [5 c" N+ h
void UARTInit(void)& [1 v0 s8 i5 Y1 R/ X& @4 N
{
2 i5 c3 X% u$ g, ?. g // 配置 UART2 参数. _% P6 ]. i1 O `1 I5 ]6 A
// 波特率 115200 数据位 8 停止位 1 无校验位+ z8 y `4 m' `1 _* L
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 Z, v1 g, z1 ?9 ~+ `- x UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* k) [2 p* b! w
// 使能 UART2, x. D9 |9 l- D
UARTEnable(SOC_UART_2_REGS);, u4 n& y6 O# W8 U% b& u
0 E2 Y- ?! A3 A7 V8 m
// 使能接收 / 发送 FIFO; p" ~! g: F" R! c6 [% j( p
UARTFIFOEnable(SOC_UART_2_REGS);
$ b/ ~% M/ Y5 _; r) Z5 h+ B
9 k1 z' K; a, I! L, {' w {: p // 设置 FIFO 级别
0 Z5 Q1 W/ ^/ h9 r+ C2 Y UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
& z& C8 W Q3 M5 P) Q}4 E) o8 N) x. y0 }* I
0 i2 n* q T; E3 I3 C6 |, n5 {) h
/****************************************************************************/1 f o* D8 X9 j; U/ i
/* */) G2 v- \; _" ?* a( [
/* UART 中断初始化 */6 C7 @, E' [, L% R% a' a: J/ N
/* */& |0 [: @+ W# Q0 o8 e9 L
/****************************************************************************/
8 ]/ d/ e x7 Gvoid UARTInterruptInit(void)
7 b5 A0 \' v/ U5 A8 _{* Q8 P/ Q/ |. L; U' k
IntRegister(SYS_INT_UARTINT2, UARTIsr);
8 {% V6 h3 {7 z IntChannelSet(SYS_INT_UARTINT2, 2);$ P5 |' v0 A* m8 ^' f2 L
IntSystemEnable(SYS_INT_UARTINT2);. v4 |( ^& Z$ Z+ j6 [8 r+ q# W
( d5 I4 S9 ?, v# l+ l5 ~" }0 _ // 使能中断
5 s2 R( u d! G4 m, S unsigned int intFlags = 0;
* H, H# A# O& @1 m* v$ W intFlags |= (UART_INT_LINE_STAT | \
+ s( e A$ l' P1 P/ V UART_INT_TX_EMPTY | \1 U, I) i. g1 @% r
UART_INT_RXDATA_CTI);
2 i/ W Y& {' E4 Y: ^ d3 ] UARTIntEnable(SOC_UART_2_REGS, intFlags);
' c# [9 {6 B9 j$ L' x1 a( I) a} \' R2 w% O6 A4 s6 ]* U. C
: e7 W8 m& V5 r1 t
/****************************************************************************/
, k8 X! m( R* a7 S7 X3 a) M9 t/* *// p" s" A/ v+ M/ t
/* UART 中断服务函数 */
* i$ v) ]0 ^" S+ d/* */+ j0 ]- }4 K. {0 w& M1 R
/****************************************************************************/
# I* n+ F$ ~4 K. o! Fvoid UARTIsr()
d! b) j. A* g) T% b4 W{* H( T n4 _( G: t6 F$ _
static unsigned int length = sizeof(txArray);6 } c+ v, { A
static unsigned int count = 0;
+ L+ E6 i9 Z3 k0 ]3 {! y" H unsigned char rxData = 0;+ r, |$ _" p" E! [* F2 b+ r3 Y/ u
unsigned int int_id = 0;
5 T2 j! h+ J5 x0 D; N7 Y# r, S& ~% O$ D8 X" M
// 确定中断源( r$ c5 y$ W, a; q$ z- L4 {$ Z# y" K
int_id = UARTIntStatus(SOC_UART_2_REGS);
8 c" @. `- S. ]
) }' @ U6 \3 N* a3 o // 清除 UART2 系统中断
2 A/ c5 \' _- c4 v7 T5 \) e z IntSystemStatusClear(SYS_INT_UARTINT2);
, t# }, S5 C( }7 ]" \: Y; [# L( Z0 ~, y
// 发送中断
+ a# O' @* G. ]; \ if(UART_INTID_TX_EMPTY == int_id)! k) m9 ]6 x7 g( c: c. G' Z
{
! E# S. L% l; A4 Q if(0 < length)
! e" w% }- A) z% V3 f/ x1 _- o {
9 h0 r% t* A `) R4 d // 写一个字节到 THR
/ I/ \6 @3 F! U UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);% b0 Z' Q8 L4 m% b' I X/ ?
length--;' h& r6 i- H; G1 w
count++;% [$ T, [% q5 k) k, D( L
}, b. p& A- ^; p
if(0 == length)5 u3 y6 \: _; a- j. L0 m
{
% p! f) i# b: H, N7 [' N9 X3 g // 禁用发送中断4 y( ~" [1 S0 `' Q3 T
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);% w0 D" S+ E4 D4 B3 L
}
0 p& M7 N8 s2 H" j/ U& A6 b* m m# ? }0 p" @' O; Y4 G7 D* c
9 e, {, o: }. h( M7 y // 接收中断, k% z/ h' J1 A
if(UART_INTID_RX_DATA == int_id)& ?3 Y f/ q3 ^9 w0 Y
{
& N+ {; L7 {& N2 v rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);8 ~4 s0 W: j) ^5 @" e% B
7 `- c I2 L3 ]$ w, T& @, F: _
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
* C8 z" s5 E% a* i1 n }
7 m3 u) x2 W: E& ]: X8 [. H9 X) Q+ \2 R1 l9 x( M) G
// 接收错误
2 v% h7 ]# v2 M" l- X2 W3 j2 u9 p if(UART_INTID_RX_LINE_STAT == int_id)0 H2 M! T" ^$ S7 e8 m; X
{" p# o" p8 d7 N) z- h- f; d
while(UARTRxErrorGet(SOC_UART_2_REGS))
# ^. q U5 G( }( K {
$ r7 J- g. h" x d // 从 RBR 读一个字节
( {5 U2 l! j! B3 X8 A; Q/ f1 C UARTCharGetNonBlocking(SOC_UART_2_REGS);
) Z9 | f$ P1 }$ Z0 _' e- O }4 D+ U3 V# c( b6 a
}
# g# ~' _4 P% q5 ]6 K: l+ J; d + }& k8 D# j; I6 [
return;
/ p! F# i4 }2 K; j9 |, I}
; U; k' C) V* f- E2 }( I) I |
|