|
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
5 w3 S# o2 M: v7 Q4 Z
% z" W* h9 k0 \#include "TL138.h" // 创龙 TL138 开发板相关声明% o- t$ J5 E- L, S* P; q
' D# B- G' G! k% X' k
#include "hw_types.h" // 宏命令3 _ B* h, x5 m: {/ i2 y8 d" s
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器; v+ M# t4 j& M) _; V3 z
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
e. @# d6 x) O5 O' G6 J
8 ~+ x9 d' j* [7 y#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
2 Z& a4 H" O# J0 H+ N+ J. N#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明$ i: l9 G2 n3 S' C* e8 q" `( z% v
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
4 M/ h) e$ H% l m% ^#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义# \- `& x2 L: e0 Z0 e! L
" C( E9 E4 y/ o, a- d/****************************************************************************/
* J3 b: e$ r8 ~% A/* */
' v* x; R9 w) E% R1 l& z3 N2 b% X/* 宏定义 */' ~' j" a1 J2 M/ @* y m8 w3 L# a
/* */$ [, z. L$ I4 n) ?' P
/****************************************************************************/6 ^6 E8 U/ e* ~ Z4 E! `* j
// 时钟4 r" N' P( b! f5 e3 N$ t! ^- }
#define SYSCLK_1_FREQ (456000000)( _) z' e0 Y" I( a4 a6 Z
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)4 A4 f/ n" @' z- I6 q" d% k3 c* T9 V
#define UART_2_FREQ (SYSCLK_2_FREQ)% R; A' |0 ]8 `7 E. l: i
' w" l" A; q2 i4 ~% f/ I
/****************************************************************************/, F& Y6 ^6 E p: f& {
/* */
2 }! \1 a! s6 j& [1 f" C+ B/* 全局变量 */9 u- d3 _% D$ R+ C$ U* x. }0 m
/* */2 x4 y0 i" ?# t1 P. }
/****************************************************************************/
; O. O6 ]! d. e; Y Z- ^$ echar txArray[] = "Tronlong UART2 Application......\n\r";
9 W% i6 n5 ]4 _: Z5 }# w3 f8 P6 f9 `/ ]) r, F+ Y' X
/****************************************************************************/1 P$ \+ c' N7 `
/* */
. Z- p7 ?/ `, \7 }4 o/* 函数声明 */7 K" E+ c1 I+ M8 [
/* */
+ ?/ k, p3 @. }: \/****************************************************************************/
$ W( [* ^. ~3 v// 外设使能配置
- H" Q1 f, M4 K9 xvoid PSCInit(void); x0 T: ] z- n; Z4 l
5 k+ j* ~; t/ w# @// GPIO 管脚复用配置
4 O8 Q" \) L8 {, Xvoid GPIOBankPinMuxSet();
" h$ \/ B4 E! K) h7 N4 N2 z9 F* H& A2 }# w: d
// UART 初始化
% r3 K8 K4 Q* B8 V" f; svoid UARTInit(void);
1 y$ p% e. m+ @* W' a! u# ~// ARM 中断初始化 e# p, [6 R4 O5 y2 S5 Q0 i4 W d
void InterruptInit(void);7 B- X: a- Z" { |
// UART 中断初始化
f( l i# t7 V, v1 h: zvoid UARTInterruptInit();
2 U( u4 w. S: q2 O* d, k// UART 中断服务函数
0 e' v8 B2 o% {. _void UARTIsr(void);/ d& i1 L* p4 {+ q8 E+ s. B
F3 o' y: F% }% }$ v1 b4 x# f/****************************************************************************/7 _( b$ `# R" Q" S
/* */
7 i9 i: J3 y. B/* 主函数 */) r0 g3 F: W3 R- ~. R
/* */1 z! |2 R* O6 {- o# u
/****************************************************************************/& \2 p! B/ _' ] D u
int main(void)9 _, m/ j5 p) Q% J% |6 O$ L: |/ [
{9 U! w z; O, G0 U
// 外设使能配置4 x8 l' A. q4 r: U! \8 `2 w
PSCInit();
( ], X5 x( I$ Z+ K' w' d C1 H$ C* Q / R, w2 r- {5 F) Y9 o
// GPIO 管脚复用配置
) Q8 @9 K: Q1 O4 Y3 N3 D7 s GPIOBankPinMuxSet();9 R- Z- \$ ~# s. J4 N
$ P9 A8 D) ?4 U# c, g
// ARM 中断初始化
1 `5 C) W# D7 T) W" U InterruptInit();& T; h/ A& ? f: K$ ^% j, X2 x
% t9 D3 X9 \' d8 Y
// UART 初始化5 a8 c- j8 H+ Z3 K- D* c
UARTInit();
4 j0 t, B5 }0 |5 P
( D$ }4 y4 u9 [! o% {/ y$ O9 I // UART 中断初始化
* e+ j; T. M( j" H' c4 | M, d UARTInterruptInit();; f" `; o' Z8 [
8 Y( F C& X, h0 B6 i0 F& g
// 主循环; p. G1 |4 r7 [4 t- q" l
for(;;)$ Z8 `# V' C1 B* z( }' ]$ K Y
{
! E9 P" u5 ~2 ?, p& J5 g$ l) j. ~
+ ?7 m# @& X2 U" y* k8 j }* B6 a" v& N4 m& ]
}
% F4 u6 |. @% W0 t# r4 @0 r. P
+ k4 p# y/ x3 P$ X6 M" ~- {/****************************************************************************/
" P3 H4 u4 Y( N% r& ^$ p/* */ [0 u1 E4 ^0 R& Z z0 G
/* PSC 初始化 */1 x9 e y, L- o1 `% f
/* */
4 z% q! r4 p% }/****************************************************************************/2 t' p4 _: N% d1 w' o# @
void PSCInit(void)3 l- B2 m/ c3 m- n. K+ n& Y
{
5 v( s9 {% }" Z e* E" J" T // 对相应外设模块的使能也可以在 BootLoader 中完成
; A. V1 t$ [) y. ^$ O# n // 使能 UART2 模块& D4 L& a- i; S- ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
! `' r% i; n5 V' q* D/ e}5 z" Z9 f/ X; V% \+ N
1 s E# p6 z3 j5 i( A$ R2 h
/****************************************************************************/
7 e+ H2 _# n% V3 ]8 \2 `" _3 C/ a/* */6 a4 S, P9 `9 ?
/* GPIO 管脚复用配置 */
3 `. [( b6 h" O$ Y% T: T. s6 m2 r/* */+ B) P& ~4 x, T5 I# H0 c
/****************************************************************************/
5 S U5 ?9 U: R5 x& v# \void GPIOBankPinMuxSet(void)) O8 V9 K* A. w# C
{8 _/ E" c) e. C/ }" G5 `' q
// UART2 禁用流控& d t* B5 ~ k( M! b& j1 q
UARTPinMuxSetup(2, FALSE);
6 B3 Z) Q+ v! d! _/ A1 F}' f4 o3 \3 x g
3 w: }9 g" j, B: X7 e8 B: l3 ]- x/ l/****************************************************************************/4 Y9 f: m# D/ c9 X% y0 ?
/* */
! t' ^7 [1 T: @# f! f/ K- x/* ARM 中断初始化 */
1 c7 S; g9 L& ?/* */
0 {0 a* W. m; Z0 o/****************************************************************************/
. L, _+ _; L% j8 N2 h# w3 S! Yvoid InterruptInit(void)4 _8 O( m" r) j8 ]" m
{4 X, M/ o- p! g* L _
// 初始化 ARM 中断控制器
0 x, G6 \) A" }2 _3 k IntAINTCInit();1 G# C. V) B, a
# n! f8 j0 i/ ^2 @" D# k' W* ` // 使能 IRQ(CPSR)3 o+ B) L) |, x s' a! ^. V# U: j
IntMasterIRQEnable();
# l0 r6 o" R" y% R* P l I" {/ |& ~9 M2 m. r
// 使能中断(AINTC GER)
# x. H7 ^9 f" `4 {2 p IntGlobalEnable();& g* ?- \- e: _6 _% h9 f" R r9 }
4 |' d# y, e- O! |& p( U
// 使能中断(AINTC HIER)
- O9 I& T0 m* E' B2 H( ]$ H/ [ Z0 x IntIRQEnable();$ A6 N* q# Y9 s9 w+ ]
}
% N' |4 a( j, |! @0 Z% }( @
" T1 d* @! ]7 w8 t/****************************************************************************/
[4 o) L4 h3 H5 e7 a0 w5 x1 X/* */' N0 T( l; B; S$ q3 o" h8 O- E
/* UART 初始化 */
$ P9 m: |. \6 R/* */
; s: |/ `/ O E+ v: R/****************************************************************************/) Z/ N8 o2 u; B7 _: t
void UARTInit(void)
0 J$ [' X7 \6 Z# W9 p3 [" w{
M( n, w# o2 N4 p( K/ z, q, ? // 配置 UART2 参数8 l0 x E1 ]+ U' `3 s9 i1 Q z
// 波特率 115200 数据位 8 停止位 1 无校验位
; V- R5 M8 B1 K UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,) \# Z5 f" g7 _; f" X. r
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);( N; x6 b3 C3 {. E# x9 d
// 使能 UART2
7 X0 g5 C0 C, L( H UARTEnable(SOC_UART_2_REGS);0 V% \! s0 p) @& @& X( [
& N, [5 n( _* P4 O, M // 使能接收 / 发送 FIFO+ J% f& Z" C5 ^& q( S! u" Y( T
UARTFIFOEnable(SOC_UART_2_REGS);
+ ?" W0 x9 L( S* J6 `5 ^5 ^
4 n- e! R6 e* I' V // 设置 FIFO 级别/ K! `- l5 G r2 S
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);- p \- Z. H% @# s
}
; M. u) z/ H( W" D1 w" a) @. o
0 g3 m; F: d& g8 @# n1 b/****************************************************************************/
+ F/ n6 o" F' Q8 Q6 ?' y, r- a" C/* */
0 ~! L- B& N1 e+ }" L/* UART 中断初始化 */) e& O* u0 D( g5 R( l- ^+ d
/* */
6 P$ H9 z0 R7 \! z/****************************************************************************/+ |) M& V3 `) x/ c
void UARTInterruptInit(void)
9 ]; j" l9 X: b4 Q. N{
' H: ^* B! J8 o8 }: t' n2 p IntRegister(SYS_INT_UARTINT2, UARTIsr);) X2 R( a/ D5 J5 `8 G
IntChannelSet(SYS_INT_UARTINT2, 2);
& [" {# W- Q( W IntSystemEnable(SYS_INT_UARTINT2);
2 V4 d6 u) K* y& o2 { j7 V% f' a0 o6 f$ |! b
// 使能中断
1 r. N8 e$ X3 O7 C unsigned int intFlags = 0;
, F1 Z* S/ Q( s6 Y9 L7 G+ D intFlags |= (UART_INT_LINE_STAT | \- f3 e, m, O9 E; u. l% C) G
UART_INT_TX_EMPTY | \
9 a P- j6 v* _" w) O" ~ UART_INT_RXDATA_CTI);
% S! U; }" Y# v+ c' R UARTIntEnable(SOC_UART_2_REGS, intFlags);
3 c8 r4 }% L5 j8 w! Z- o}0 k" C7 n8 f; E% j S8 k1 A. u5 J
/ m* y9 b4 Q" F8 w
/****************************************************************************/( R+ K* _2 o: P
/* */
- K# a* V! @! n! ]4 k& _/ Y0 L0 j/* UART 中断服务函数 */
6 S, p! p$ p: c- i+ w2 d2 O/* */
@2 g9 w$ u" U' k0 k/****************************************************************************/6 K3 l1 ?" y. ~% K) H
void UARTIsr()5 F) O) ?; ?4 M2 L3 e! i1 w2 s
{5 F2 F3 h& U$ N P
static unsigned int length = sizeof(txArray);) v1 x/ b2 V* [) k: h
static unsigned int count = 0;& Z6 r) u/ x* y8 |" k8 r
unsigned char rxData = 0;
, u$ {( W9 o! p unsigned int int_id = 0;
2 u$ F# @2 o4 C F2 q8 _
% u3 a6 _' D% y // 确定中断源
- v' n# B/ J! c int_id = UARTIntStatus(SOC_UART_2_REGS);
' S7 R" a; P; e; `+ s# A$ v; {; d
) {: g# C& @/ h- D4 t$ W2 v8 s* L // 清除 UART2 系统中断
[4 @' ?) L9 p2 s IntSystemStatusClear(SYS_INT_UARTINT2);# D. B) W% A: J
1 l5 x( R Y- f9 }8 p- s. x0 T7 A8 H R
// 发送中断0 f- H* K9 s, i; j# J
if(UART_INTID_TX_EMPTY == int_id)3 E! \9 G, J B0 @6 c, s
{
: U. D# W0 V+ O, U1 f5 b) m9 t if(0 < length)
' E* t+ o5 x. v- |% C! W* l {7 ]3 V4 T D' \2 ?- U' S& N% I
// 写一个字节到 THR
: L" u7 u" A/ u) l2 g$ c2 {. \: c: i UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" x/ H% a1 Q2 s- D length--;2 R T/ i' _) E& U+ ?7 U6 o
count++;6 A! B8 T4 s. C2 F
}- q2 m7 n b& w
if(0 == length); h+ N G% x/ ?9 T ^) |: a+ I; ?
{% A: x$ l/ o; n- H, L( u
// 禁用发送中断
9 H) w: `% Q' ^9 q; T' m; D UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);# C# \7 v' s: w
}
7 w5 p, h7 W8 l- O' o6 M7 G }: \9 w$ C( E. E1 C7 i
. q0 F$ ^: n ? l
// 接收中断
9 p O, o! `9 M) z) p4 T: S if(UART_INTID_RX_DATA == int_id)( f. m. e5 P2 Y3 [& q! I0 q6 q2 y1 \
{
9 C# r) ]* R7 E: Q) N5 [9 S+ j+ I& G rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);) w" I$ o6 g1 E3 y
( \! C- [) o% L# u: y1 `6 O
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ d& K+ K: b/ L+ S( Q }
+ M# k7 _2 q( A8 X; _# ^- ~6 n3 Z& j; _* P7 p+ l/ q% u( m# Y
// 接收错误
" C0 ?( u3 K8 Q: A! `/ j# z5 y if(UART_INTID_RX_LINE_STAT == int_id)
! u" f6 X, J/ E& v* w9 R {
1 A, T% [# l: p) `6 C" }2 { while(UARTRxErrorGet(SOC_UART_2_REGS))
( |- {, H& @) J$ q% T- l {
0 c, q6 A% _# y7 U+ e. e // 从 RBR 读一个字节
3 c6 [* ~$ z: ^& p! }2 G. B( o c UARTCharGetNonBlocking(SOC_UART_2_REGS);! C9 z% P4 g5 H9 ~5 }3 |7 X# l
}3 H8 }3 I2 N Y+ T
}
6 d% _. U8 X" Q [( Q _ ( J( @4 D6 Y8 ]
return;
. u6 ` Y$ B% @5 ~: `' f}
9 i# G2 W) n9 B2 N |
|