|
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ Q- ], M# O+ P5 e" l* a+ m% q
! E V9 {3 d8 A8 `#include "TL138.h" // 创龙 TL138 开发板相关声明4 j" d$ s5 T+ l
/ T. m& s+ H3 g' w% t$ j
#include "hw_types.h" // 宏命令, S6 g( [$ u4 t. {+ K* |
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
, r$ j" X; }, D- J#include "soc_OMAPL138.h" // OMAPL138 外设寄存器' x4 I. m5 C& s0 ]0 S$ q$ E& ^
' Y7 X8 l7 C2 o9 ]$ V: l* F" w#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
@! e7 O3 ]7 V @" c% \#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明6 l+ D: `: p: y( |% x2 j+ W) s9 A
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明" l+ I; u8 u1 n' e, w
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
+ M7 ~! M8 {* w+ l8 B0 @ @7 B A" [& b! X# \: X0 n# i
/****************************************************************************/
/ ]2 U0 a8 R" c2 F8 x; u& x. X/* */
) A2 Y( C& A' m" \9 x; x+ d& F5 @/* 宏定义 */+ l4 z/ c' ~; \1 t! T: F5 p
/* */! `, Z4 _8 y9 K0 f! |7 s6 s
/****************************************************************************/
+ }7 I- h. c& Z( e// 时钟" g1 G4 S ]" Y* a( u) H& R
#define SYSCLK_1_FREQ (456000000)! p; P' |$ V' h
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
+ L! T H j$ N6 |#define UART_2_FREQ (SYSCLK_2_FREQ)$ l) _- w) o! f
; t e( s* Q* }* [
/****************************************************************************/
1 F: h6 e9 c f9 X/* */1 ]' ?; s9 _: a7 {( K. V; C
/* 全局变量 */8 ~' C, Z/ h5 A! b7 t7 o0 y
/* */( T: p0 |% M2 x- ~/ D( {
/****************************************************************************/5 _5 v2 ]; W: {" c9 V
char txArray[] = "Tronlong UART2 Application......\n\r";
! J$ {/ \1 H8 \/ E# ? @( Z, m- j( f3 {: H, o
/****************************************************************************/
9 W0 X( q3 Y6 p8 z$ Z/* */
( B( e- @" _# _/ D. c/* 函数声明 */
) {3 d( ? H4 R, h/* */$ X+ S* J5 x' k. I. L
/****************************************************************************/
' }9 | N4 d' R$ Z9 Z// 外设使能配置
% M2 r% J" {" P: U1 @void PSCInit(void);
5 ?/ t t3 }% [8 O5 v0 P3 l k7 A2 E4 j6 U' ]7 p0 C! D
// GPIO 管脚复用配置1 V! f' @. d$ g: Y3 ~; `0 W
void GPIOBankPinMuxSet();
$ e' m0 X) z4 Q
8 V1 Z* z- ~% j% G. d// UART 初始化
0 e+ N% ~* q! v: pvoid UARTInit(void);
: c/ j+ c; e& b8 E+ R& I& z) n$ O// ARM 中断初始化
" q% m' G/ j9 T3 P9 Fvoid InterruptInit(void);
3 G# o! g K- B2 w% Y// UART 中断初始化
9 K( m4 f: a- }. i9 @9 A$ [/ T9 dvoid UARTInterruptInit();
* _% Q5 f) O6 g, J# f. q; A% U/ ^! G; m// UART 中断服务函数3 w4 R" D# ]5 o( E3 c1 e
void UARTIsr(void);
# ~, [- w( f/ Y1 p$ g' B, B
$ S' p n" |( @: V J6 r/****************************************************************************/- t7 |: ^% W3 e5 @- k. I d8 L7 s: ^
/* */, v/ f7 E% ^: o4 F5 O
/* 主函数 */
8 Z' @. @/ D1 N u! d0 [" i& T: I/* */& D* R2 o! z) {1 r$ t
/****************************************************************************/
/ b3 h; V" e9 [2 ?, Z0 l/ u) [int main(void)
# R, E8 {5 y4 M4 q K4 G6 U{
; g7 t X% `: F A9 D // 外设使能配置
5 G p% R* N I r0 m, q7 F PSCInit();
; e/ j) E$ v3 }1 ^ v8 }. |
: S4 E8 A+ `( s3 K // GPIO 管脚复用配置
9 C/ X8 \+ h I& A GPIOBankPinMuxSet();
h1 e% Z8 n$ l& g5 p8 X
2 j! y$ c6 `2 { I // ARM 中断初始化
! H3 J3 u# g/ K+ S8 z InterruptInit();
4 G. s F9 }! y* B& M2 W/ s$ |9 T% q
$ O3 B" A, _1 U$ T1 O& P // UART 初始化0 R' [1 |- [& O0 w
UARTInit();
' p! |% u- L; _; r* k
/ s) o# p0 d$ a, N. V // UART 中断初始化% ]! W3 r9 ^* |, S* |1 w
UARTInterruptInit();
3 c; n' `2 ]# [1 S: u1 F/ n: P/ m+ [2 K
// 主循环
, |3 ^0 _1 D1 I& q( k3 G( s for(;;)& T. H4 n3 f) ?: F4 W
{$ a( _6 k# w% w0 f/ z$ Y# f$ {# K
Z9 |/ c( ^3 \1 L7 ^% o
}
" o$ @& w( o1 c8 r}
" [! W! I- _. O0 q i/ z, A' l t+ b5 G* f
/****************************************************************************/$ H8 B6 @8 C+ b% w. c
/* */& X9 X7 ~8 W* D1 h: E6 J
/* PSC 初始化 */. t+ W. X' {' N" f, p- c( O
/* */
$ P5 b. v+ d5 x/****************************************************************************/
: T3 i4 _" G$ c& H3 vvoid PSCInit(void)
+ V# P) M5 y, Z- K6 E+ ~( f{5 P* F; A+ d" M/ ~# x
// 对相应外设模块的使能也可以在 BootLoader 中完成
! U$ |. U3 W6 V" B // 使能 UART2 模块
$ M5 ?6 [- P% ? O PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);. H3 b+ ]$ g8 i+ f( |
}* E6 s% M' X4 Y
" Z& {- l5 v6 M! B! s h$ r/****************************************************************************/
) d p( d8 ^6 `! x4 N5 m6 z! k9 e/* */2 N; I& g: j+ {& o! J# L
/* GPIO 管脚复用配置 */
& I% K2 i; ]. `: u& \/* */
& [/ J; W2 ?, [/****************************************************************************/
) z l% E4 U( Q! b# cvoid GPIOBankPinMuxSet(void)9 h: E: _2 q% u, _# ]0 k
{$ H: w8 {- L9 H' l9 M
// UART2 禁用流控) z1 u) C7 B9 {
UARTPinMuxSetup(2, FALSE);( B8 H; g- q% Q/ @2 ~: `' l8 b/ b
}
- v& z: Z& t4 ]. F% i
9 T) k- `1 _* D' b/****************************************************************************/6 c7 o1 {5 D5 c
/* */; e5 F s; H, d5 L% M9 G* D# b- p1 {# u
/* ARM 中断初始化 */2 S) e) U1 g# \, k: z2 {9 O
/* */
2 d; g- Q+ {! t" m/****************************************************************************/' r8 p9 _$ G" V$ _. X, w1 m2 j4 _# T
void InterruptInit(void)
- Z" A. u! v2 v{
( Q8 O) I, W9 T' ^( y1 Y // 初始化 ARM 中断控制器+ A" y/ w+ a$ n( ?& s8 w y/ E3 A
IntAINTCInit();
7 _- |: L/ q5 |7 ?
& x9 `, [- M3 x0 x. L // 使能 IRQ(CPSR)7 r. J8 p) U$ u% {; c0 c q
IntMasterIRQEnable();! b6 }" x: I4 `8 e& h* S
9 w6 Z% w. A# j5 M // 使能中断(AINTC GER)2 Z4 Q4 _: U, C7 |! x: {
IntGlobalEnable();
; H1 @0 S" Q, T+ X
, Q3 N" ]4 Y& y! E- m" E // 使能中断(AINTC HIER)
. n. [+ @9 k l" K; d7 K IntIRQEnable();
9 g7 m' T) z7 u- Q0 d}' I2 g" h+ j4 v% O6 H- V5 L
* ^% N7 S0 j7 N/ x0 i* s/****************************************************************************/6 A, a c6 [/ N% B, o' ] a/ c) d
/* */
& y5 i" `3 G% X# ?/ P/ d. \/* UART 初始化 */
/ S+ r. r; S# U, B7 |/* */. o: d* `/ ^3 [. g: N2 b
/****************************************************************************/6 @" v* {' E* z5 `2 M% w2 M% W
void UARTInit(void)
3 L: o0 A# P0 Q* P. U* u' Q{
8 ~# H) J: g& M; h: U, x) h // 配置 UART2 参数
4 V s# y" e$ a7 q // 波特率 115200 数据位 8 停止位 1 无校验位
% V$ B8 j3 l; f' m9 e UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
' S2 z. `" O) ]# Q1 A UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 d0 H( g" u6 X; i- u5 ]. z // 使能 UART2 M$ |2 k- Z: f5 y4 N+ [
UARTEnable(SOC_UART_2_REGS);7 F. F2 T; g+ W- e9 W; O: N/ B
$ o/ J* {' I% e
// 使能接收 / 发送 FIFO
/ V+ Q6 ~+ c+ N- P- H3 }# @ UARTFIFOEnable(SOC_UART_2_REGS);* f" u& Y, w' K# ^3 y
" P2 Z1 m# X% F' D! u
// 设置 FIFO 级别' L& @+ W" t& r4 {0 v- ?$ Z
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
0 ]9 _. t2 X9 F8 L: ]# O0 F}! ^" j" L' r2 L/ s+ ^# F8 N" z3 E2 o
' C- Q, a- V, e, L+ q, f) H2 l/****************************************************************************/
7 F7 ?6 G7 P% P! ]) n6 k/* *// A& ^3 f) n Y$ b( u
/* UART 中断初始化 */
% ?$ [4 J* i" V7 Q( Z- v( P& z4 p/* */) u+ y2 k2 c. e0 q
/****************************************************************************/3 W! \$ A( u1 y5 y# ~0 U+ {4 v
void UARTInterruptInit(void)& j. B- ]: I: a# S$ L; R4 U5 B
{6 K$ ^3 K/ g% u' [* @8 o8 Q' y
IntRegister(SYS_INT_UARTINT2, UARTIsr);
- _( @& ~6 e8 [/ N3 e5 f IntChannelSet(SYS_INT_UARTINT2, 2);1 U+ U2 v& G- a. Z5 R; s% v2 z
IntSystemEnable(SYS_INT_UARTINT2);8 M, d& A* r0 Q5 n
" _2 b( o9 E6 E2 z e7 [ // 使能中断4 P7 Q8 W1 X0 ~1 I2 u
unsigned int intFlags = 0;6 B8 d) \: ^8 r6 D+ ^4 w# [* H. A
intFlags |= (UART_INT_LINE_STAT | \
, A1 p, Z1 E+ B$ i, p* V) I UART_INT_TX_EMPTY | \
# u% m9 A. t' s" d UART_INT_RXDATA_CTI);7 D O2 W, F [ ^
UARTIntEnable(SOC_UART_2_REGS, intFlags);, _' X ` l2 L* y( ^. u! m, K5 N
}
" ~5 u2 [8 {* Z
) D* B/ l8 Q2 |: b" r M/****************************************************************************/
( j) G: I) z& k0 C/* */; @# a5 O a+ P, E8 l; @
/* UART 中断服务函数 */
( _- s* _3 g6 V; u- f/ ]* [/* */4 P6 s0 ?! v$ a# Z2 {
/****************************************************************************/
% B$ n! G, d- S: ~- E5 ?void UARTIsr()8 m$ N. S# E* `3 m
{
% A) e- v* z; d3 H static unsigned int length = sizeof(txArray);0 D9 c8 x* u$ I1 [
static unsigned int count = 0;
3 R0 x& w" _( k) h# X' ^ unsigned char rxData = 0;
9 }, u6 G) b: f; N5 d' A9 h unsigned int int_id = 0;
3 ?1 r/ F- N, x
; t# s+ b Q$ _% ~ // 确定中断源' M$ Z4 ]! w( M: Y6 f0 |; j3 S$ W1 ~
int_id = UARTIntStatus(SOC_UART_2_REGS);
3 K |8 Y8 \- T1 S9 I7 N2 c+ p. K' `) n
// 清除 UART2 系统中断
* P) z8 M2 C3 b P8 p+ t IntSystemStatusClear(SYS_INT_UARTINT2);
+ h" g6 z2 G h7 z
! I* D3 \5 O; a // 发送中断' d+ @: G1 }8 ^" y' h5 l' |
if(UART_INTID_TX_EMPTY == int_id)2 u5 k# {; m# @( j; l8 e9 I+ s
{
/ A x, h; R9 ` A8 b. C( Q if(0 < length)
3 E% R4 R- {) }# B {
A8 G6 P' a! m& _3 ^% e // 写一个字节到 THR& ] a4 U) T& i- v8 B, k. M
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);* |5 G' }& W0 B; M" a
length--;
( K( V7 t8 j9 |) [ count++;( k4 e5 R- A# @* ?8 M. J9 G
}7 j% E$ w4 ~; H9 R, m
if(0 == length)
~$ g$ d7 b* j2 H! C {( s+ g& @8 n' S6 ~, g P* G; ]+ r
// 禁用发送中断% W( i4 Y. L: Q/ f$ }; h/ C
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);1 W- o, w( q3 Z, X! x" N ?, X! [0 `
}8 i0 q" I: q u- [
}9 ?$ ^2 A- R/ e. o1 r* n( ?
5 O0 o. p7 \' y9 v; g // 接收中断
: p6 G& o8 Q6 w, K if(UART_INTID_RX_DATA == int_id)2 C8 {, Z9 l& K4 m6 D+ C' P
{
, w$ M. [9 B, {; E I; j( P5 n0 g rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);! ` O0 v" H( u0 H1 d f
( N E4 k4 m' f+ [ q, K5 W
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);7 ~ F! T L$ V# d. }
}2 k& D6 O3 {& @1 B
. H- r9 j" o5 L/ m- p4 W // 接收错误' w7 h9 ?" a' e) b) ~1 e
if(UART_INTID_RX_LINE_STAT == int_id)
% M) J |" R6 c {8 v. X- K% Z" U# `% G6 Y" j7 w
while(UARTRxErrorGet(SOC_UART_2_REGS))* e$ A; _2 R+ A1 _/ m
{9 ]6 k0 m* h- k' d; G! U
// 从 RBR 读一个字节
0 E# {( m& ?, h8 G) A1 R9 p" k UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 T5 p1 P; `7 f. k6 y% [# ? }. x' d) c4 x. \' b# z
}
* L1 Y- @9 g: M) Y" S
/ j4 t6 B1 o u return;- ]- @! f( Z' M" ]
}8 d6 ~0 H4 v1 M9 g3 l
|
|