|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ ]9 P9 a9 i9 h" F; O
4 @4 G$ S8 O$ S$ m0 d#include "TL138.h" // 创龙 TL138 开发板相关声明 N: z9 F5 S; b4 C- B3 N/ ]
5 G, o& d8 Y. K; v e#include "hw_types.h" // 宏命令
+ d v6 x5 n0 M @& C: ?! o: M$ c#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
" F9 q" [3 k3 O& Z4 Y7 C+ c% `% b7 G#include "soc_OMAPL138.h" // OMAPL138 外设寄存器# i+ k4 H+ i5 K* I7 @' F
/ x x1 z& Z% K1 F+ L4 I8 H
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明) i5 c' H: U4 E( P3 |0 A
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明$ ?- n. y+ r$ t/ c0 X. l
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
: l! I6 x: L0 h#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
2 e) r) a& a7 o l( @6 Q, m s# M; @+ \8 y
/****************************************************************************/
5 \! v# ]& b5 O/* */& r2 j; {% i3 \
/* 宏定义 */- `6 ]( b( A; Z4 b% N; {9 ^
/* */* `% D2 c6 `3 R5 h( O n
/****************************************************************************/6 g/ m! Y7 y# Q
// 时钟. x& w8 p4 ^2 s Y9 q
#define SYSCLK_1_FREQ (456000000)0 p: `1 p+ I+ m3 U3 u
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
, g0 i6 k+ \- G& F+ n, Q5 K#define UART_2_FREQ (SYSCLK_2_FREQ)
+ P' I8 r4 { M( [# f* \; g! k; V2 ?) {' r. T* k6 V
/****************************************************************************/7 Q5 R) @& W% a/ e* Z4 F
/* */
, v* D+ n' Q1 b; h* O+ S2 K/* 全局变量 */
$ n* ]5 d" r7 D/ L; N! O! z# t. c( V/* */! V1 c- \# |$ n8 q" T4 n
/****************************************************************************/$ N: A2 o+ ?& x# c5 K' n. O
char txArray[] = "Tronlong UART2 Application......\n\r";
9 m2 V$ v# ?8 i8 A9 E
( q S* Q+ R, ~# |, H. _* h; J/****************************************************************************/
# ?( w( D+ D$ n2 E# G \/* */
9 V0 b1 F4 |0 r" C/* 函数声明 */5 P/ l* o) W X
/* */% I7 X5 U4 Q, V4 h
/****************************************************************************/
3 y" u" A& q3 Z# W/ n7 j/ f// 外设使能配置
$ C" y: F: ^2 l% Q6 k: Yvoid PSCInit(void);
. V! ^% F- P7 T( u$ r
5 _$ ], b9 S% j1 z' ^ F+ @// GPIO 管脚复用配置5 ~ T% K# f& w
void GPIOBankPinMuxSet();
. m* [/ q/ G+ T9 ^& c2 q, A: I8 f, ?0 r+ c) F! q
// UART 初始化
# [2 L* D7 D2 v( vvoid UARTInit(void);
' B3 o; B4 ]* N2 P+ p// ARM 中断初始化, Q3 Y% |) H! S$ b
void InterruptInit(void);% l) a2 }6 U b) y' y; b1 z0 l
// UART 中断初始化8 f0 n$ _! n1 E3 u" K; x
void UARTInterruptInit();& ]$ T3 C0 E+ U* z/ j, L4 b5 }
// UART 中断服务函数
. t' r6 S' X2 W0 Uvoid UARTIsr(void);
: F% }! X- g v! S
4 x! J! x) S& F# a% A. F% z/****************************************************************************/
: g+ C9 c m! k/* */
/ J5 Q2 ]! `7 ]- c. Q1 m% }/* 主函数 */
+ I) @9 o1 X( W) D2 c; k5 _& A/* */
' R4 \- Z5 _3 s4 g. x& W; X" i1 l l' Q: A/****************************************************************************/7 H5 g- Z/ R' ~3 ]2 s
int main(void), A, J1 l% x& v' s. x$ N9 I
{
8 ]( ^; h7 B* \0 m // 外设使能配置" t$ n, Q5 E, E# r/ H3 s8 `! j
PSCInit();
2 K- _4 g( O: A- h D z! ~; b9 ]
9 H( K* T2 i/ T // GPIO 管脚复用配置
& H9 w- N, I8 @ GPIOBankPinMuxSet();0 e8 {3 q! v7 Z: \4 x
/ X3 h1 W+ U# d* z8 a2 W v // ARM 中断初始化
* |' s- \" }! y, o: N. L' X InterruptInit();( Y$ U; b" D% U+ @% X; O' H
# b. ^: L: E0 U8 p1 ], a
// UART 初始化% _- S) F5 ]/ f0 P7 B. b
UARTInit();; n) B1 d8 A+ |. `& F
2 R: E% H4 g0 V
// UART 中断初始化- ~9 h) H; w4 s) n1 o" V
UARTInterruptInit();1 y( Q6 v2 ^, w
- J' d5 z: f. V8 w7 Y+ h s // 主循环# r* O) z) s* D& I4 g5 P& r
for(;;)2 x2 ?' a/ f e% T: x5 D7 S( B+ s; v
{
8 K- ~, N$ i3 `. ?* P1 ?3 R0 _& x- q" D' j1 a/ }
}
* E4 Z0 m. ~7 Q) _, O9 a}
) p9 M- w7 B- i" z) I7 Z( u+ ]5 F- e i" N
/****************************************************************************/' q$ t% @1 J5 M1 U/ T ^/ w
/* */
" _% u* x# O5 I, v/* PSC 初始化 */4 X* w% `/ P) C( r- l y9 O
/* */
6 \! L. L5 s4 W; z5 K/****************************************************************************/
c% k) w$ O% ~3 uvoid PSCInit(void)$ R6 t* j4 W2 I! t( y9 v
{2 ^0 z, [7 z" w t
// 对相应外设模块的使能也可以在 BootLoader 中完成
& Q1 \) ~, }% w2 }4 H% `* {4 m // 使能 UART2 模块+ M6 v6 e0 H( H
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 p" H/ h7 \1 `
}: `& n! Q* q8 B/ s. _4 [& p/ D
- \! |- Z4 e) {9 S' a2 ^* O9 Q/****************************************************************************/
/ e8 H7 V; l% r* A: G' r/* */
5 m8 X/ B; u% \& G- T/* GPIO 管脚复用配置 */
$ n* W7 A, V: J3 ^/* */4 d8 W( m+ q- a2 K/ R8 B% \* Q
/****************************************************************************/6 v# S6 o' I& B& [6 I
void GPIOBankPinMuxSet(void)4 [: d$ w* J$ P" W
{
. [5 i- {% u/ h8 h; @4 f // UART2 禁用流控
9 Z" W7 }0 _8 n) {& ]9 { UARTPinMuxSetup(2, FALSE);
1 _* y7 v h b! x# P! L5 D/ X" L}
; j( @4 A& V& G( i2 d- ?3 s$ P1 @& T; [2 r3 ?+ @
/****************************************************************************/ U$ Z( b( ^9 l( f6 d
/* */4 K. ~; Y* \( ]- V; l! o8 |6 V
/* ARM 中断初始化 */; a4 p9 \5 D! Z4 q+ x8 j8 n9 k% L
/* */$ d, W. j; v% ?9 T
/****************************************************************************/
2 A2 Q$ o# Q: |& `1 Nvoid InterruptInit(void)* ^7 N9 l3 l8 U: ^8 G
{9 J2 N" a) Q/ m* M* P
// 初始化 ARM 中断控制器
% P0 n, t+ @; d$ n+ L IntAINTCInit();
8 W, P5 ?3 a* o( R c6 y' X& X
9 t s q: r5 X' I8 _- H" d% i( ? // 使能 IRQ(CPSR)
% `2 ^" a) ]; L8 V/ H IntMasterIRQEnable();! C) j3 W( Y; K( I5 K: S* T
; i9 j1 K- {) ~( o9 N // 使能中断(AINTC GER)
$ t+ i& [0 R$ z" l4 M IntGlobalEnable();
& i0 P- Y1 \% t, H. l s" f, o \! ~# A4 I3 D8 U
// 使能中断(AINTC HIER)
& G- |: A& p: Y4 Y! \2 O" j- I IntIRQEnable();
. m/ _! |, D, L3 R f}: L' T# s, x& R9 j( I! @
+ {: G J- B; G5 k: Q! Y/****************************************************************************/
# N' T. j7 |+ {- p- D) N6 _/* */3 Y* F+ W- ?% J
/* UART 初始化 *// H; O1 K& N% v# I
/* */
; G+ j) H) {& R, |0 K) N/****************************************************************************/# P/ E1 G, s8 W5 s# |" m
void UARTInit(void)) p$ `/ n7 K# Y8 }8 x9 C
{
; a4 [4 s8 z/ m4 X // 配置 UART2 参数 x$ J* R8 a5 K
// 波特率 115200 数据位 8 停止位 1 无校验位
K# U. u( J9 N* E3 {1 t" _6 u UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,! X5 q; {. C) u1 @2 H2 a
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 V% b" f |6 x* y9 H // 使能 UART2- ]9 a- e% U( V% O/ U) v9 \. Q
UARTEnable(SOC_UART_2_REGS);- \4 {$ U' I& v$ c8 k' `/ \
9 h& n g: g$ W& n
// 使能接收 / 发送 FIFO) s/ O: |+ n8 z3 Q6 r% k3 Y+ F, W
UARTFIFOEnable(SOC_UART_2_REGS);
3 o9 H9 k, h( l+ T8 @# C+ ^% c- `5 S% I
// 设置 FIFO 级别! ^! |. W! w+ i2 V1 `
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
% F, @- [7 L) M1 C6 E2 ^}
4 F+ P& o7 M! B+ s+ Z- a3 c
1 R, r4 e5 F) H8 F- v/****************************************************************************/
! ]1 f; M) M# C. A1 d V/ L! l- ?+ y/* */3 Z, B# r x, [7 m( j Q
/* UART 中断初始化 */
7 Z) z c) I0 h/* */
+ u6 R9 n6 r Y: j( s) ~" Z/****************************************************************************/3 d8 U" K8 s4 _# b5 j
void UARTInterruptInit(void)
. `/ h4 k; Q6 O$ ]/ L* [2 d2 c{
. W6 q$ w8 A- C! F7 F1 E5 d IntRegister(SYS_INT_UARTINT2, UARTIsr);
7 o3 \$ S# e) i IntChannelSet(SYS_INT_UARTINT2, 2);2 B/ L6 c" b/ |/ G6 L
IntSystemEnable(SYS_INT_UARTINT2);
8 }) }+ t6 e( h+ e& o8 E3 c) E3 M# s+ [3 d3 h7 }
// 使能中断
$ W8 Y$ r7 ?, B/ Z unsigned int intFlags = 0;# Z* G( P6 h$ x* r, n, Q- @1 K
intFlags |= (UART_INT_LINE_STAT | \
8 P* J& S" k: s6 X: X UART_INT_TX_EMPTY | \& Q- c0 r3 H4 d# k& U! n
UART_INT_RXDATA_CTI);
* R X7 ~" o" u1 l# z; X Z UARTIntEnable(SOC_UART_2_REGS, intFlags);) o2 ^0 s. K$ ?4 d5 d6 ?. [
}
2 K! D4 e8 w2 G# E" v$ l; G* I6 S' W7 z* w8 l) W& r/ g' B
/****************************************************************************/( V# i4 X" k+ q
/* */* I" F' \6 r) |4 u6 d( x/ W
/* UART 中断服务函数 */
' \3 b8 u) i' _! }6 d$ C! ]/* */ p3 ~6 y$ f/ n' {9 y
/****************************************************************************/
' M, K4 g! L) ^6 P. M. Jvoid UARTIsr()" H' c" |$ }1 x5 r
{7 [5 ~2 i% |* _ \7 O
static unsigned int length = sizeof(txArray);1 \3 d4 c. r4 |- F: D' Q
static unsigned int count = 0;; e8 w7 `1 U+ J
unsigned char rxData = 0;
2 f& H0 V6 k% a+ q; S$ w4 m unsigned int int_id = 0;
$ E/ t* e9 n/ @3 t# b2 o4 L# P n2 j' a% r) R+ F- T9 `
// 确定中断源4 Z3 z' Q6 R6 d! }0 \5 N' [
int_id = UARTIntStatus(SOC_UART_2_REGS);, Q7 ~; K! n3 ^
9 n1 _% d* n- S/ j4 ~$ o X' q" o
// 清除 UART2 系统中断& |: a! l+ D, I% ^1 n; U$ l
IntSystemStatusClear(SYS_INT_UARTINT2);
7 c+ P6 K6 c( o; H4 M/ A n( [
" x$ F2 S( m% l* b3 [3 f& F$ ~ // 发送中断- t" x, T& g4 H0 l; j, K4 \
if(UART_INTID_TX_EMPTY == int_id); e# z/ V: l, y: t0 ]; x, U. r' [
{
, H) T' l8 R. ` if(0 < length)3 ^9 \2 A' U. F; d2 }8 V) t! q
{0 e# r% t& G0 z
// 写一个字节到 THR% H U; t0 b- f. x+ a
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
0 d' o9 B% b0 C) ]6 M length--;
3 v0 t* P9 v" E5 U6 _8 M w count++;
6 v" J# Y+ k: y; {/ L6 ] }
! K6 V+ w& Y$ x4 C2 e7 Q if(0 == length)
. o& g+ m3 @) {& k% @$ G {% ?4 Q# O6 Z) `+ l
// 禁用发送中断1 Y+ P* w* h/ C
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 c1 A' B- W# d- v; I1 @ }" O' o- Z/ Q9 u9 R9 _) X
}
1 X% ]! C1 \/ n# c n& a4 E- V) e, k
3 m: Y6 F' x/ T& j& ?6 e( p // 接收中断' I: O- k6 V: Q' x5 f9 W1 o) O
if(UART_INTID_RX_DATA == int_id)
, M; Z" _! a; D V2 w+ w {8 W" f6 |+ F+ i! m5 q9 s) Q3 o4 i5 z7 X
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);0 b7 G! G/ q, I, q
0 n c+ T; _. W
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 [% j8 {8 t d6 D [ }
1 {( V9 _8 o5 q0 M- B" L* j' O4 z6 y+ S }2 [
// 接收错误
8 c. p- [( |. @2 ^) d if(UART_INTID_RX_LINE_STAT == int_id)
- f* l( _/ _5 k5 b {
# b- \( J! g m6 E( ~ while(UARTRxErrorGet(SOC_UART_2_REGS))( B& u6 }0 g3 X' S6 q
{2 e% [* ^) ]# m7 A( |2 b
// 从 RBR 读一个字节+ Q. N# x0 ]0 o8 U
UARTCharGetNonBlocking(SOC_UART_2_REGS);
: G8 x! W$ e$ b6 l) ?" \) c }
; i# r4 b8 N4 L( y9 R% e }
9 E3 p/ i- s( l4 k ; w# n4 W% b+ Z
return;+ C9 ~( z% p4 A9 U8 Z' ^3 c6 z
}* c' H) l9 K5 a3 x& k" \* S5 H
|
|