|
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。1 g' F$ N6 ^0 s4 D, W3 H
0 Z# f; S/ H7 D, t6 u; p( [
#include "TL138.h" // 创龙 TL138 开发板相关声明
0 ?* }- j) i0 ^$ @4 j1 K
: c8 n; ~" z# f3 O* d0 n) S5 n#include "hw_types.h" // 宏命令
" t* ?1 |% f0 A! q# b s#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器+ c% ~1 m+ @, E
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器% j, T/ i7 S" i" B+ _1 x" F
' L1 E, y; Y; C4 ^' H" j
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明3 K! e3 Q& ]9 z1 O; B
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明. i3 L9 ]: y1 m l6 f) R
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明$ @% c! P% o5 ]5 R; W
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
, M: k/ K7 c1 l# e; b9 G' b4 `; u% T
/****************************************************************************/$ H8 p: C3 P, z
/* */
+ \! I: {8 W4 _* @7 w! @; N; W/* 宏定义 */
& u: W! M; V6 I/ A8 \. Z* U) ?* L) X/* */
1 S+ o/ o& J$ I+ u2 _! D/****************************************************************************/
/ U$ ^4 e l8 i5 @// 时钟
7 l$ N9 I1 o5 u. f$ F) d2 J% i5 E#define SYSCLK_1_FREQ (456000000)
, L+ ~$ O- U3 `! A- _/ V#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
7 M& }7 |7 s) T8 [8 `#define UART_2_FREQ (SYSCLK_2_FREQ)9 _, u! |+ x+ {2 K: p: o6 {
, Y# r% h9 l% W; n- F/ D
/****************************************************************************/
# f6 t3 T) @6 h: S0 M7 b: I% z, D/* */. T# ]3 |) s* `7 e: o* t
/* 全局变量 */, I. P: O& W: e' _5 e9 F
/* */- I% M4 O/ F) h6 J
/****************************************************************************/
! v# n0 G, w/ b* j7 h* dchar txArray[] = "Tronlong UART2 Application......\n\r";
) c. G4 K+ e$ i: b* ]" y' Q a9 v; \) [; ~) D) o6 S
/****************************************************************************/ t* T0 T$ Z' l: g
/* */8 y1 }$ t- \8 E) H! n! l9 g
/* 函数声明 */
/ D8 Z# p' x) V% W5 I/* */
% r6 m" g/ ~% Z/ |/****************************************************************************/
7 }7 Z. T( y- c! }; t) B// 外设使能配置
# W% [* F' p; x& A' Y- l8 K7 Avoid PSCInit(void);
0 N8 f" V p3 G& k6 r" d
) r) L$ G. J# } B' C// GPIO 管脚复用配置' T2 B/ {, d& G
void GPIOBankPinMuxSet();
) V x G; @: r: k+ q. Y
8 R; W3 z$ k: J# e- G" t// UART 初始化
! b( f5 c; a. w( o7 gvoid UARTInit(void);& ]! L/ h5 H+ z7 F0 g9 G/ f# W2 @0 J
// ARM 中断初始化/ w3 J+ D& z: y) @9 G" q' t
void InterruptInit(void);, n& H+ e! c7 B% b0 r$ ~
// UART 中断初始化
# i" o/ |4 k* G K1 Tvoid UARTInterruptInit();3 v* [- h# ?( W
// UART 中断服务函数
' P! k4 |( _+ o+ k! \+ C* y$ L3 ^; }void UARTIsr(void);
# N$ O0 [! B5 h$ g! Y1 h8 e! z+ `* n' ]7 t! U! i
/****************************************************************************/
+ G. V; B. m: R* I0 _0 z) h# Y4 p/* */4 [: s/ P3 `. Q. {
/* 主函数 */. u! T6 z, J" `, W
/* */' o0 X/ T, K* w2 |; M
/****************************************************************************/! U! B" g' O4 b5 I0 b
int main(void)/ Y- u( g5 t4 V% b$ b3 \
{( E- \3 |& V9 a+ b) @: m) B
// 外设使能配置$ t5 g( h7 j3 _$ L
PSCInit();
, v. X7 o& L' a$ }- G; o
& z" m" w3 I/ m0 V // GPIO 管脚复用配置
: [1 V" ^% K8 v* X GPIOBankPinMuxSet();
; r' F! p! j2 N/ I/ W8 T# ~ X
9 _* u1 {( ^! o6 j' a // ARM 中断初始化" h3 _' \+ b9 ~& F
InterruptInit(); e6 H; h6 y) z9 N4 g+ [$ U& X
/ Q3 B9 ^5 g7 |' m; W4 n
// UART 初始化
/ p6 Q+ [* Q m9 a, L& R3 Z6 K UARTInit();8 k3 I/ Y( w+ o, u2 y
, G9 Z( O1 c8 j5 L) y; A // UART 中断初始化
3 |! n, _0 e6 f: | UARTInterruptInit();
( q, L9 i) Q: q; X; U
2 s1 p3 O7 g& C$ e6 }: T2 Q0 b4 x // 主循环
8 P( e3 t s2 C$ T0 c% Z for(;;)8 w z$ Z; x3 }, Z& H
{
4 m4 ^( q! P- M9 d8 {/ q" U9 S; [$ o/ K* }4 [) n
}
) B% c# P+ O3 F2 h" H}
# b" `/ b7 o5 |3 v" s( _8 S! d, I0 m3 K1 v
/****************************************************************************/
% H* E" [0 v4 h$ g* t, C/* */* A4 r3 Y# _8 b& J' V! ~: D
/* PSC 初始化 */" E& q# F3 P( j
/* */
) ~/ \* ]8 d5 E, L, M3 Q! B4 e; i/****************************************************************************/
* c1 Y9 J1 v: u Hvoid PSCInit(void)8 P: u3 C* m n# ?
{3 c8 a. J$ ?6 x& j1 C8 q0 D
// 对相应外设模块的使能也可以在 BootLoader 中完成
, ^/ a1 F6 i, i1 ]$ O! n // 使能 UART2 模块6 f- d- Z/ ]9 _& G, N
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);. {7 C" z W- R- Z
}0 i! ?9 A6 |$ h( W( ]( M% L: z
# m3 S2 s C) s1 T/ ?, r# f) ?
/****************************************************************************/
9 y# n+ e ?6 u* |5 ~/* */% D8 _, X) R4 j! s% G
/* GPIO 管脚复用配置 */
+ L& q* Z5 h) T! L) B; d" |/* */
9 n5 @% D+ S4 H$ i% i" n/****************************************************************************/) w# p# T8 ~% ?. `& U% E# F
void GPIOBankPinMuxSet(void); H' t1 [6 X$ O- P
{
T: g* `* M- @ // UART2 禁用流控' @. Z b1 n0 A+ e8 Y# \
UARTPinMuxSetup(2, FALSE);- L n5 \+ l: o
}& N0 W! O9 g/ x. r- C$ p( m! K2 [2 O
6 n4 l% v7 b7 W; @
/****************************************************************************/( s. Z3 c2 E# _& O0 c1 a7 l. o7 z1 c# G( j
/* */6 l3 |5 d" y7 t
/* ARM 中断初始化 */
: K+ ?' D: d; J4 h/* */* b3 d: Q. K) X- A/ C9 J- z
/****************************************************************************/- A G9 n% E+ T6 i( N( W& Z
void InterruptInit(void), n: L& D; @8 W
{
% U: t2 U& C- ^5 s H2 ~' D& o // 初始化 ARM 中断控制器
1 a! j( W6 s' h! g5 _$ x/ W$ W IntAINTCInit();
- t# F( I: [/ C! k- o. {5 C. ?+ r ^
// 使能 IRQ(CPSR)( j/ |" ^& p' O8 V7 w
IntMasterIRQEnable();
6 ^# P( R9 ?5 m' c0 N/ M
; I3 S7 W" I( g* K- A1 E4 ^8 Y" c // 使能中断(AINTC GER)
) V+ E! x0 m% B4 {% a- }) | IntGlobalEnable();2 | N. p5 B& u
6 P$ v1 D+ T c- Q, n$ H // 使能中断(AINTC HIER)
. l- ^/ |+ W" g! S% U1 j IntIRQEnable();
' H! C K' D, C( m6 ]}: r4 g) `0 q1 X P6 g
; o4 V4 w7 ]9 S. }, f7 |2 a
/****************************************************************************/$ Q5 h, a( b5 Y
/* */: h. \1 e3 V1 r% j$ D
/* UART 初始化 */
7 H% n" V$ X. i S* U/* */4 L/ m8 u$ u# ? ]. I
/****************************************************************************/6 i2 g* z9 H- c
void UARTInit(void)
, G: W( W7 R; ?9 `* e3 R/ M{/ u8 t7 i! V4 w# z+ P0 q& }- V# `
// 配置 UART2 参数
3 ]* q: {4 ?4 a/ V$ s // 波特率 115200 数据位 8 停止位 1 无校验位
. M" Q( N" @% X UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
4 B! I( q6 `+ U* Q" U; a UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 A! U$ l& W* W& K: }/ ^* o // 使能 UART2( E) u3 C2 r# P$ _; q$ E
UARTEnable(SOC_UART_2_REGS);
7 Z( _. X7 b& k& B0 z+ q4 ?6 c* ]/ X! s# P; J' |6 c( A
// 使能接收 / 发送 FIFO
6 s$ o# s) I+ V# Y; |1 H UARTFIFOEnable(SOC_UART_2_REGS);$ ^ }1 _: C2 i0 g
- ]& Y& {7 I7 d: U% g. F9 {3 v; T, `3 ?
// 设置 FIFO 级别
& U7 p2 v1 f0 t2 E8 i$ s6 k& ]1 e0 E UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
5 j. i7 \. A/ [( g4 m* a}
- ]) J; |3 Q+ B2 c' L9 V9 {* }2 g6 x& n
/****************************************************************************/
/ y, M8 u( b& J b3 X3 l5 I/* */
! T N' S0 \! d3 R2 J" ~/* UART 中断初始化 */+ E+ T1 ~: G1 |" ~7 l$ x" h* R
/* */' r+ X4 j% m' R1 u# A
/****************************************************************************/
& h/ s* T0 V3 S0 V- R' dvoid UARTInterruptInit(void)/ P4 q k/ k5 W/ [" `; r; T
{
L3 c+ B" ^$ v* @; O IntRegister(SYS_INT_UARTINT2, UARTIsr);; c% N' f# N" J$ z/ [, g9 ^: {
IntChannelSet(SYS_INT_UARTINT2, 2);' @0 T3 I! E: d9 I4 [' h" ?$ \
IntSystemEnable(SYS_INT_UARTINT2);
5 y% Z" g1 M: }0 A4 k9 Z$ ?0 E& x, m5 Z- Y8 }, C
// 使能中断
- W2 D/ p1 G# h8 l7 C$ _ unsigned int intFlags = 0;
3 D6 k: |' b' Y5 p1 y- ` intFlags |= (UART_INT_LINE_STAT | \
( \( ?8 L! O. ~8 ]( h UART_INT_TX_EMPTY | \
6 e: W, d1 b' }7 ^ B* a$ K UART_INT_RXDATA_CTI);+ `6 I4 |3 p) n! @0 v8 a! R+ t
UARTIntEnable(SOC_UART_2_REGS, intFlags);
$ C: v* j+ }5 s8 z4 l4 J& }* Z}3 h+ L1 S5 _. ^4 L
, A7 j6 i P8 Z/****************************************************************************/
! B) @+ H' A$ N: ?6 s7 b$ C/* */7 _7 Q' t/ }. }2 Q
/* UART 中断服务函数 */" d; U% t3 {1 v' }9 f7 n
/* */! V& T; a# ?. R3 w+ V
/****************************************************************************/) T& v" B* h. u9 E5 ]6 c& N3 g4 C
void UARTIsr()
% [' @ a2 c/ U8 h1 \3 r{
& y1 t) l* J0 e static unsigned int length = sizeof(txArray);
6 H( M0 o4 z _) P H; _ static unsigned int count = 0;
# W9 K# @7 N+ S0 U- ^8 m" { unsigned char rxData = 0;' A4 b! {& N7 g+ B9 ^4 Z2 N- c
unsigned int int_id = 0;
) E' ~3 |9 ]+ n# w/ z2 B6 ^$ k' U; e8 N; p* n; Z- M
// 确定中断源8 u4 W/ f2 Z1 s7 S4 t7 g; q- N; h) ^: e
int_id = UARTIntStatus(SOC_UART_2_REGS);$ G$ P; v6 t1 ]2 ]
" g$ D" K4 B' R9 b2 D
// 清除 UART2 系统中断( `, L3 G% Q) W$ ~) K! P
IntSystemStatusClear(SYS_INT_UARTINT2);
9 N$ g' Z3 P2 [% T2 J& n
! {6 U' ]8 I; P6 ^' U2 h% `; W) V // 发送中断
; R' b' q$ h" F* s& p r if(UART_INTID_TX_EMPTY == int_id)! V) ~; x8 b: D9 |! g- Q1 Z
{
6 `# d" L% r& o) m if(0 < length)
& ~7 F4 m; B5 l) X: d {3 r( ~) X$ t2 Z. E
// 写一个字节到 THR5 w5 g, Y( c/ G: f2 c
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);6 D: O/ {5 t O9 ~ u
length--;
; A6 e8 a9 n5 _, d count++;
# ^6 s t0 b! h7 r5 q }" l8 i% T# t) v
if(0 == length)
3 E5 n9 E, @2 F- A1 V! x( l0 R {
h8 z1 D" w, R // 禁用发送中断' c. D/ {4 u5 W8 q
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 f% h% w! K( w9 f% e }: I" l, z E& P. o5 D
}3 q2 ^6 i! [ I( l+ O* a% q
: C1 i/ H; g4 v8 \- ^% E4 E4 R // 接收中断0 y A4 v; E. S/ D- n7 U# H0 i! J1 c2 e% C
if(UART_INTID_RX_DATA == int_id)
$ n: ~% `7 s7 V) Z4 p {* a6 U4 a' B' ?5 t" \1 b
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);: F& n! @( T% u+ r7 o6 `; i
8 B, I5 a; V4 z2 P) A$ z' M, k
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
+ d l% f4 R- t8 q a" y. R }
5 T9 a9 N3 c" y- b
8 N! l* f8 A2 @) R1 ^4 Q' w3 p // 接收错误
( b' ]( I' j b4 K$ J/ x if(UART_INTID_RX_LINE_STAT == int_id)4 ~- K8 }* S' ]7 c, ?
{& \+ {3 Y* K" U4 E' m+ z
while(UARTRxErrorGet(SOC_UART_2_REGS))' P6 B& M! u# F/ z. J; t
{
! m4 q% E, m) y4 d2 O. K3 I // 从 RBR 读一个字节
: G" s0 F O3 }7 m8 J UARTCharGetNonBlocking(SOC_UART_2_REGS);( P% d5 g9 x( b6 ?3 b
}
+ P% `4 s( s c! S) D, h }
- ], p7 D( e1 I# Z, L, k4 f d 3 X3 a8 T) R3 d+ G. m8 g
return;; P/ `( V% X3 a, R3 K) ?
}8 D3 V0 A+ W2 T) b# m z+ c" C
|
|