|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。6 R- K- p2 Z. K
- W* ]. y* ^0 ?" J, B5 |9 J
#include "TL138.h" // 创龙 TL138 开发板相关声明! v: L: {2 Y' g. A$ J# `1 J
. u# b- B `2 w; p/ N B- r! V- k/ C
#include "hw_types.h" // 宏命令* Y' v; k# W7 c) z
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器4 D/ D4 s6 o9 g- T$ L& ^; [
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
0 t* w4 F3 i0 I. m
, G% i7 z1 Z" e" D2 c! w#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
, a4 R9 v! c' U8 _$ `#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
6 V7 j% b) u9 c. {" P#include "uart.h" // 通用异步串口宏及设备抽象层函数声明* t8 j! K9 X9 a) V8 x
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义) u+ ^$ ^; G' D0 j6 i2 l
9 s! K. G+ Z, g) g' O6 P5 j8 ]/****************************************************************************/
5 u0 @( f8 X/ f: Y! y/* */* \, a. { C, u; {
/* 宏定义 */6 D }3 l& }5 P" S( i& `" ]( X
/* */
# F6 s8 w9 y5 c& j0 ?/****************************************************************************/" @! R. X( ^" [' B- t/ L; K
// 时钟
9 w2 {0 x1 `' A& ^! p. t7 _& f& d7 V#define SYSCLK_1_FREQ (456000000)
0 S7 W( E d' M0 d+ W#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)% n: ^4 `4 J4 ^" C9 O
#define UART_2_FREQ (SYSCLK_2_FREQ)
# O$ c' R, j- N* }5 X& m! ^! A
) `3 r! F* }+ M3 X7 I4 @1 B/****************************************************************************// p1 @! w6 {# {0 h
/* */
8 _4 s- s' \9 H* {1 X( H3 S/* 全局变量 */0 w9 O5 b4 W+ @. W% m
/* */4 @ |# w5 M6 m3 b: ?$ T
/****************************************************************************/; J9 x) b9 o+ }; p# U, ^5 D) z6 Q, _
char txArray[] = "Tronlong UART2 Application......\n\r";
7 F3 v, z& Q8 S# r: ]; T( ^1 S+ p! H7 p! ?& g: }7 u
/****************************************************************************/
! U' v3 c0 a) B, r" I/* */
# o r; J! O, m7 O5 |7 }: \8 g/* 函数声明 */+ n3 j& H" t- D( `
/* */
! v+ z9 N# u& Q K1 c H/****************************************************************************/
" W( ^, j1 r4 Q$ r1 _// 外设使能配置5 E1 m4 _5 A+ _7 R5 ]
void PSCInit(void);3 w+ s' q! ]/ q w- @
+ N8 @2 b: ]! e! d1 W) ^// GPIO 管脚复用配置/ A2 i- X" E% Q: a$ g
void GPIOBankPinMuxSet(); {. {* {/ K+ p1 \6 s
4 D6 O* U. _' F// UART 初始化
- S2 F! u9 I" R5 y2 n! nvoid UARTInit(void);# u# Q& z0 T. y0 P* V* }) y0 M" ^
// ARM 中断初始化% D, l% t1 y& V! W$ L5 Z+ c
void InterruptInit(void);& M( Q( y: D7 F# u: A9 L; m" L5 _
// UART 中断初始化$ r! i" J5 [' ^ ~- j
void UARTInterruptInit();* g5 X0 K2 \$ {, @1 e
// UART 中断服务函数7 V: [% [9 X$ _, W4 O; c
void UARTIsr(void);0 c: i; e5 r2 \7 P" [% K
6 x) M. S( d3 T. r/****************************************************************************/
0 f8 y$ n5 I2 G4 M2 o. V( A/* */
1 h! b5 V' P9 w, J- Y9 a5 C7 C/* 主函数 */
1 o; b/ H$ N: k% d/* */0 H' m S" w0 y7 ], @
/****************************************************************************/& |! h& H# J8 _ E6 \! v
int main(void)' Q$ M% t) P! {+ D, f9 c/ i# l
{; X% U% T, h6 w, ?7 b2 \
// 外设使能配置
1 Z5 E: l. K3 m* C$ Y& i; { PSCInit();
( P$ s$ j$ A8 Z
n h* q) e# C8 C // GPIO 管脚复用配置
. n: ]9 }. N8 R5 {4 r GPIOBankPinMuxSet();/ |! s8 G' @! }% S
3 `% A- [* L5 z2 W3 f( d" @' v$ f
// ARM 中断初始化
) ~+ B4 x# Y+ x' w7 b7 u InterruptInit();* |% @ O1 J. u4 v7 p
0 l: t6 o: S, _) S6 n+ j7 l( C
// UART 初始化+ c+ Z. P# D ?# h( v7 y
UARTInit();6 j" D( n- t* B. @% }" `, m
! T; T2 u0 o K8 Z // UART 中断初始化
4 ?3 z. I2 P- h( z0 U0 y/ A! E UARTInterruptInit();* K+ J9 H- m3 F- m, ^: x
7 Q* P; t- q; {- G3 ` I# s! |8 D
// 主循环( s6 N1 Z4 d B
for(;;)
% @& s; s% {* C; o {
' E& l! i+ ]+ p. a i0 d5 {6 J: y4 Z
}
, ^3 y) s' V1 ?}
" |, f4 ]6 W# A6 A- N1 g' H2 B% F
! \& K' M" L& j" H/****************************************************************************/
7 k) v& L! g, y: U, S2 ^( S$ N/* */
3 R. v6 ?" N* G/ B2 o6 R/ z/* PSC 初始化 */
" B9 i, Q. y6 _( D! q$ e0 m7 [' f/* */- ^6 q1 d! V' P( m3 ~% _
/****************************************************************************/
& y. p) S9 @, J# y' U6 z" `) B5 U Hvoid PSCInit(void)
; S; Y! S# s& c' Z. L& [ c M{
4 k N: ?$ o/ ? N# q$ q2 g0 |+ ? // 对相应外设模块的使能也可以在 BootLoader 中完成
; m) x1 Z) ^" I" l+ h // 使能 UART2 模块' Z/ }" o' |& i: [) C
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);. i9 w- d+ v c! f! `+ i
}! x: C! j7 E: f1 J- I; Z& d, i
8 Z2 e+ f0 r. A# V* R6 \+ a7 Z
/****************************************************************************/
( l" _ ]$ C' C8 q, l9 c% A/* */
# r# I0 H9 x& t/* GPIO 管脚复用配置 */
1 V# m9 t; Y! L0 t& x/* */
( y7 P# B- X5 _2 K( u z( O( Q/****************************************************************************/. @' F' f. U* ?
void GPIOBankPinMuxSet(void)
M/ y% i( p' Y% I0 s3 A2 G2 l{
1 i) E& X; E) b // UART2 禁用流控
9 f) M) X' D# Q' L UARTPinMuxSetup(2, FALSE);
$ T' V$ z! \; p7 {}
) x8 X8 |* _% u5 L6 R
5 k4 x5 f, E h c/****************************************************************************/
9 G& c, P- ?" d0 m+ O/* */" e" w. A! I+ _' k* w
/* ARM 中断初始化 */. g+ c3 \3 @3 U* [7 E" O9 N
/* */% C0 m# s/ B3 Q2 ^: S% B- X
/****************************************************************************/
& P" S* {0 m: V7 p0 ?- N4 Hvoid InterruptInit(void)
# U) K# ~* `$ t) S- V U5 J{
6 x; I9 [. ^1 {1 J7 f3 O // 初始化 ARM 中断控制器4 r/ P% k3 r$ ^# f, q( E+ N# s
IntAINTCInit();
) g& G5 o. W i) S: F5 s O3 o! t8 Z3 L: D3 M x% Z
// 使能 IRQ(CPSR)
+ d2 ]# R! e6 {* K IntMasterIRQEnable();
. H# i6 o6 T4 E1 M' h2 u
4 H: R: ]+ e$ I4 i" D9 X // 使能中断(AINTC GER)
: `# o7 s' I+ E& y) o: H9 p IntGlobalEnable();
$ A. m E1 `% G7 F1 _
# a; c! v# i" C0 U1 d // 使能中断(AINTC HIER)4 s# [) C. r0 t
IntIRQEnable();# `8 V0 y: F1 @9 N+ K' \: J% O( F
}8 e7 P6 H `8 T+ E" S
6 O0 r! Q( S' r/****************************************************************************/, n6 b/ ~9 c7 [) {$ ?8 C+ }
/* */
K, {* V4 L) [) [1 \/* UART 初始化 */
' x9 W1 V! }8 y/ D/* */
5 ?& V" x$ {# K4 {( E9 R/****************************************************************************/* D. t. H+ j2 u+ k
void UARTInit(void)
& T+ q% B# b/ e{
5 S' r" ^+ ^! i7 { l // 配置 UART2 参数
+ p* X8 m7 \. e( b" V7 L // 波特率 115200 数据位 8 停止位 1 无校验位6 k/ U; T5 b, ~& |9 H8 S
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
- [ K& Z5 Q% A UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 | b. |7 y. f' q3 _: O3 s
// 使能 UART25 c/ z/ C0 W! r
UARTEnable(SOC_UART_2_REGS);0 i& J! ^# F; y0 P. [' D
* b) s2 k9 J7 f1 Z" Q2 m
// 使能接收 / 发送 FIFO
: V3 p% r2 g) O3 }1 i8 [ |+ u UARTFIFOEnable(SOC_UART_2_REGS); }1 G% N. U8 `/ b( Q
n, v0 Z5 B3 f5 m2 y3 I
// 设置 FIFO 级别) ^8 D; ~; w* A# @* k
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 q4 X3 G% s% H/ u6 F}, r# e% W5 P( u( g
2 N: @" \) Y1 B: f9 q/****************************************************************************/% C$ u9 ^& X6 G5 E: P" d, W
/* */+ S4 B+ G) v* W; y
/* UART 中断初始化 */3 c2 q, h% c! Y: P5 ]- ~4 W
/* */- g8 @* W# d0 G0 T1 I+ Z
/****************************************************************************/
* u q1 V6 n H' vvoid UARTInterruptInit(void)
9 d. j) D. ^! V( C7 g& d) o1 k8 ?{
2 j% x3 o4 I5 R* X" I$ K4 v IntRegister(SYS_INT_UARTINT2, UARTIsr);
" u# Z5 z6 q4 u; k- d$ {' c IntChannelSet(SYS_INT_UARTINT2, 2);
8 W1 L# I0 f) E# ^( Z6 Z IntSystemEnable(SYS_INT_UARTINT2);) w6 t+ |. [) P. U a
3 ~8 R' X; k% v9 I1 H. @7 i // 使能中断
% I& L2 {/ J! b& l9 p unsigned int intFlags = 0;9 `. P8 ~/ o. u" d7 j
intFlags |= (UART_INT_LINE_STAT | \% ?+ c+ X4 T9 ?5 N9 Y- v% v' J
UART_INT_TX_EMPTY | \
/ a& G) L6 k, @0 y UART_INT_RXDATA_CTI); _7 B) R# P1 J( G# l: O1 ]
UARTIntEnable(SOC_UART_2_REGS, intFlags);. @# ` N! r+ r+ K4 O' V
}, {8 F" S# R7 e* L, m
# ~ N. S) S: a4 Z. D" [. V/****************************************************************************/
& Y3 M: @) S4 p% J4 f. Z/ e/* */: g {/ U: {, q6 r, C
/* UART 中断服务函数 */
6 |8 g/ ~2 X o& W8 ^$ b/* */. z4 [1 t. `3 S1 [8 L- Z
/****************************************************************************/% p: N7 d6 r# U
void UARTIsr()
/ d2 K* f2 o1 @' x7 s5 L7 i3 M{
9 H7 B; Z* k. @4 y, @ static unsigned int length = sizeof(txArray);
. J% Y) V9 M# Y: s2 \. P static unsigned int count = 0;. L/ K3 h: B% [6 E3 Z; A. b- K7 t
unsigned char rxData = 0;
/ @- X7 |! q3 k$ |) H1 K; W unsigned int int_id = 0;% E, q8 H; k% I5 ^4 G2 k
+ M! Y8 b$ t" q, f f* m* h+ H$ E // 确定中断源! y. T7 E! u f+ g- R
int_id = UARTIntStatus(SOC_UART_2_REGS);
, L4 [+ A) t3 F% a r0 \, g8 w, p6 j9 A0 R) L4 a, v+ Y. M, J
// 清除 UART2 系统中断( [7 O/ B0 d& U
IntSystemStatusClear(SYS_INT_UARTINT2);
3 {: d9 B! q: k" A* [
2 r: j' y8 ^; q* n* N // 发送中断
# C* H: w6 h2 x% l# F% c6 K" W if(UART_INTID_TX_EMPTY == int_id)6 X. b: }2 w9 x0 g
{
8 f3 @, a) `+ N0 s: ^" n if(0 < length)
0 g0 X3 z' a/ N% u" I- ^ {
7 t* N8 ]) m, w // 写一个字节到 THR' _1 W' S3 I6 p \7 |) x8 A) ]
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]); X4 {1 c; l# I) M; |
length--;# [; C* Y7 t/ \1 g* } O
count++;/ j* z4 J/ k7 k# ~7 D2 o
}( ^+ Q: n# ~0 [, i& u
if(0 == length)
( R7 l' e, T8 v" W, L6 e {
, |* P8 Y/ z& D; x9 i // 禁用发送中断1 D. P: K. j' b4 y: O
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);) m) N( \( F0 u& C2 P: B6 l
}+ w7 k1 t0 S" \" T
} C) T. |% I3 ]) M2 Y- x; E
8 m' c5 r% y- W: z6 |1 y; V // 接收中断) O8 B. p, v9 ]3 I1 \& S
if(UART_INTID_RX_DATA == int_id). f/ s2 q9 C% s- F. j$ ~+ Z2 F
{0 l; H6 \4 e5 \ e" [ \
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS); y; n) J! l2 u$ d( U* M$ f; r& O
8 h/ t7 [# N) H) ~
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ E* [& V( ?2 @4 W }+ `' _; P9 p9 z: @* f) }. }! u
! b" }! A8 ?1 M3 k7 |& b
// 接收错误
7 q: ]) y) n- p X/ w# F8 y( a+ ` if(UART_INTID_RX_LINE_STAT == int_id)
3 c4 [: S' r- k" C {( _& }1 Z3 X/ x4 o4 M! p; }
while(UARTRxErrorGet(SOC_UART_2_REGS))( I5 v Q" O! Q
{
+ K! ~5 a* e9 i+ K3 L2 r3 E! K // 从 RBR 读一个字节0 W: k8 U% u' \5 \
UARTCharGetNonBlocking(SOC_UART_2_REGS);9 D0 `' G8 @3 V) E
}
% x: |2 A) o$ H; a3 x }& i. Z- |" A( R) R, I3 Z
2 {0 q: Q- s. O& P
return;" U7 [- C# p# l/ A$ N8 [! _
}
. A; N; R2 X0 ]' B! K+ N4 N0 y |
|