|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。2 \% m; A7 K: f% _' O, }( E
2 F* A, }$ n% Y5 W* Y#include "TL138.h" // 创龙 TL138 开发板相关声明
! M7 B. U, K9 \' [. m
% N) M5 v5 a; o; b) T#include "hw_types.h" // 宏命令, ]' o0 D: {3 J) ]# j) C S/ E
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器' r1 K" s; x9 Y6 \2 H6 ] m
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器( y. ^3 f' V% y S* p
3 Q$ B1 y% T8 l6 X; M9 X, w#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
* z( a2 {/ Q7 Z" V! I1 D9 O0 F#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
- d$ h7 Z; P# D+ X! @& ?+ C* t#include "uart.h" // 通用异步串口宏及设备抽象层函数声明2 I5 ]& y! E1 z1 u Q$ k
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义& |% V6 w; i# e0 j" J
a b0 Y: H2 A5 s9 e
/****************************************************************************/7 y& t( S0 ]- a9 _. h B* n6 S
/* */
7 G* s' j7 e7 T: C0 D, r/* 宏定义 */
+ Y. }4 k: Q6 ~, ~1 @- L& u/* */
8 o D$ _ Q! `7 D; Z" R/****************************************************************************/
4 r$ Z, s2 ~/ Q/ j// 时钟0 ]6 h6 r0 E* g7 N% v. P" p$ Z
#define SYSCLK_1_FREQ (456000000)0 i0 N) a. l& N# G; T! A
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)+ w( a9 [! L( V
#define UART_2_FREQ (SYSCLK_2_FREQ)- I9 u F+ z# w W @/ C+ t- n: L
' K9 {2 ?. a# [6 S: o2 x& d
/****************************************************************************/9 o* E1 m% Y- v
/* */( {+ |$ t# c& c: h
/* 全局变量 */
$ ]+ M; X8 |' y/* */
! W& ]* m; t# V/ y5 K! k* w/****************************************************************************/5 Q( q# G, Z6 f
char txArray[] = "Tronlong UART2 Application......\n\r";: g& Z; j' m7 r4 [& ~0 B; I
+ k2 E9 S0 b& Z+ ^! m
/****************************************************************************/
% Y! W w8 `# M X/* */
2 U& Z3 ?0 B, D/* 函数声明 */
4 S/ w) J5 o7 f* M% _3 L6 s" O w/* */: A0 c: v( H2 B, I
/****************************************************************************/& E% v8 |* ?; U( q
// 外设使能配置( e0 \, ?. m1 s* y+ w$ b% r8 a
void PSCInit(void);
; d. M/ i* S) p8 y+ j- e! V) P7 O2 p. {1 J. X" a2 D& R
// GPIO 管脚复用配置" Y' s8 r+ t `
void GPIOBankPinMuxSet();1 ~1 q4 x! G s2 B$ Z' N2 W+ E
' D! K, `7 u6 @8 c6 n// UART 初始化
+ [* u+ d5 e0 y5 G# B# [# Kvoid UARTInit(void);) g r" q; S9 w
// ARM 中断初始化( c+ B. x! f) l" S7 P! K
void InterruptInit(void);
. y7 S2 N P [, q1 O/ _// UART 中断初始化
% E6 P# \5 N& r- _) w+ B7 W6 wvoid UARTInterruptInit();
( O( z( ?/ U( x# D* N8 I4 G// UART 中断服务函数
- ]# X/ R" ~7 n* q3 wvoid UARTIsr(void);
/ z3 G- u( Y- g8 f* F' p% S) F: l, j' I
* \- j! m+ X. f+ D% |% V0 D/****************************************************************************/% F9 s0 G$ x$ I/ e
/* */- |! x T6 a% {# g6 J
/* 主函数 */( _2 l; l- |* d1 n
/* */7 Z, B3 o& g! Z- A% }
/****************************************************************************/+ p/ b! ~* g S7 z' c; |3 E; Q
int main(void)
$ |4 x4 T$ R0 Y/ g* g1 I{+ A4 w5 P, ]- H0 Q! s8 B/ C
// 外设使能配置
1 s/ `3 m9 N) v PSCInit();; ~, g R& r3 e: |6 O- _2 y7 _
1 t7 `) O+ w3 p- P; i
// GPIO 管脚复用配置
& f) s9 d; z: r% b& ?) s' J GPIOBankPinMuxSet();
9 V/ B- I+ K. t/ a, F4 o% A1 v, S7 |1 M. A% D. _2 g* b! ^% ]' F# ~
// ARM 中断初始化. D" H" r" l, |6 P9 @ W8 K; o A) y
InterruptInit();5 u% Z5 o: P; p% S* s
3 x; d* W; F0 N // UART 初始化
# L) z; Y2 D& ~ UARTInit();
, A4 T1 R) d5 W1 M6 n5 c! B0 h; X3 ~
# Y n. j/ }; z* c // UART 中断初始化4 h8 E% K& p F- ]
UARTInterruptInit();
5 ^' k/ F% m q' t6 H. I5 u7 H8 a, p( Y& e: k
// 主循环5 L4 ]# F' d; t! \/ W8 n6 d
for(;;)
3 X2 F, L: f! ]/ I9 J {
5 Y: l# H% Y7 a, V! ~- R+ c: I
/ c% n3 L/ t- \6 P }6 S( u' N- B: d5 O
}7 ^6 z! h' A4 L! ~$ A9 T1 \ C; N4 o
, ?5 d9 I" t' {/****************************************************************************/
' ~1 C; z8 u- q; j( Y; y/* */1 g. T9 x: f# _3 v" d
/* PSC 初始化 */
m/ }% T- b: A/* */+ F0 e. U0 b3 ]' x+ k7 | \7 \' O
/****************************************************************************/" m" U2 H( G$ H+ e
void PSCInit(void). z( W I% S& {
{6 h! c2 D* w& s5 O7 z) g( ]
// 对相应外设模块的使能也可以在 BootLoader 中完成
% H: `. `; m" P1 V7 a0 ~ // 使能 UART2 模块
7 V/ b4 f. g5 A2 ^9 S PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
9 I3 N5 S( |- W' B0 r, i}
. x. I( T) C" V1 V+ G0 x) x- T0 \) q' _7 z7 @& l; l
/****************************************************************************/5 O, Q) B) S9 P) V
/* */3 \/ n1 R0 l7 [$ ~$ l5 q2 ~
/* GPIO 管脚复用配置 */
$ z+ @5 m9 M; I3 L4 @2 `" {& w( W/* */
, C9 J8 B4 I" G$ }/****************************************************************************/6 d& g% w: j: g; d F# d
void GPIOBankPinMuxSet(void)1 c% j9 l [5 d5 A
{
# `$ p3 O8 D- ]) R // UART2 禁用流控7 d& k# T+ r% ?6 E
UARTPinMuxSetup(2, FALSE);
% I' A1 I( X. N1 D! h) |. G}
9 c& f6 B/ I1 [
7 f9 W. \! E4 H$ D1 t! L% x# ]/****************************************************************************/
8 ~+ Y. r @/ Y/* */
( n9 @+ @4 g$ Y, [/* ARM 中断初始化 */
! Q% D0 }. W' M/* */5 w6 z- j5 T" |8 o( k" R
/****************************************************************************/+ C. }' |5 W0 L8 _
void InterruptInit(void)
2 U }. A3 i7 F- y$ ~$ K{8 A5 L" G; S7 h% A& s. r
// 初始化 ARM 中断控制器$ Z, p1 ? |7 F
IntAINTCInit();
0 K9 {- \2 a* M; @- B8 J
_0 m' y* g+ X( q X // 使能 IRQ(CPSR)
8 I; o+ U: e. l* P _ IntMasterIRQEnable();* r6 X; d$ v4 d* ~/ c: i' f2 y& W
; G- r l$ R$ p5 M3 F // 使能中断(AINTC GER)
% R+ e+ t; d3 E' u, \ IntGlobalEnable();
. t3 g% f) E m e4 V3 ^4 P
7 M- X; P6 j! [7 `8 J# [ // 使能中断(AINTC HIER)
0 ?* Z% A+ a0 U# j1 N IntIRQEnable();: k9 W6 U. J& o3 y5 |! q5 w
}1 t# r) t7 H6 m. Y( m
6 E1 s# S( x7 D9 ~5 H) J/****************************************************************************/0 o6 _7 o5 J+ T
/* */
* D7 r4 \; c. O- u) P9 v5 Q* z/* UART 初始化 */
" k: w/ b8 T; y7 I: w7 F& |/* */4 e8 C f6 [$ } Z4 S
/****************************************************************************// p1 `7 v; o" I! ~
void UARTInit(void)) W. |! @( H4 O3 ^/ l0 s
{% L2 E& V7 n: q
// 配置 UART2 参数- g5 {1 O! m6 t) @
// 波特率 115200 数据位 8 停止位 1 无校验位
& V! x; W! f8 M7 R UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ }; T( X4 p+ y8 H6 M6 {# ~7 t+ N UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ O Q4 F$ K' {7 m8 [0 u# B // 使能 UART25 K3 X+ r- R9 y a$ c5 w. `
UARTEnable(SOC_UART_2_REGS);. F! o" R: J: j1 p
' J" A5 a4 ?3 n( u // 使能接收 / 发送 FIFO. ]5 H+ b$ V* t- N4 H6 K3 n/ p5 T
UARTFIFOEnable(SOC_UART_2_REGS);& n8 u+ W% q7 ]8 g$ C& u% v
" T( V; W" K! ~( |; i6 f // 设置 FIFO 级别
0 m% P' X# s7 n UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);# O& ^$ w- }1 O9 D0 z7 ?
}
. l. `( L8 n; G8 \ i9 K: Z3 L) ]* u4 R, V& G# k
/****************************************************************************/2 O) l1 }& |. s
/* */
! U, n* @- n2 i& }5 b* N/* UART 中断初始化 */
6 M3 J, ^: c2 ]% L( |4 `8 `/* */
0 M0 a6 x) y4 t. r7 J/****************************************************************************/" s( C( r+ E6 N
void UARTInterruptInit(void)
9 _2 m1 z7 U' ~& b9 M! v6 \{5 D- E" h! q0 v, j- p" G
IntRegister(SYS_INT_UARTINT2, UARTIsr);
" |$ Q7 j8 \1 Y IntChannelSet(SYS_INT_UARTINT2, 2);
* s. }( d# L, J$ _( Z" T: ^ IntSystemEnable(SYS_INT_UARTINT2);6 P) A. }& E" r s x1 A: Y5 m7 h- v$ d/ `
; r- D. I9 Z6 Y# {# Z% u
// 使能中断& J% O8 p' d1 O _, j
unsigned int intFlags = 0;# d/ j" t1 |( x* f$ Y i" T9 k$ @
intFlags |= (UART_INT_LINE_STAT | \
" ?$ O/ a8 B7 {: d6 w UART_INT_TX_EMPTY | \( z' G) t5 U; L) R! b
UART_INT_RXDATA_CTI);
' X9 [" T6 O+ p0 L* c+ A g, y+ m UARTIntEnable(SOC_UART_2_REGS, intFlags);
. `) z# E; A: L. W* a}
9 |! J/ g% T5 d1 X& _1 X
9 q' H+ ~" G" T+ B" F# ]) t/****************************************************************************/$ A1 X/ `! N$ O" j
/* */) R) a" M4 z9 n' Z
/* UART 中断服务函数 */
5 k" R! l9 h# b: ^/* */
8 o4 B+ \" W, _9 f1 B( t8 @, V/****************************************************************************/
7 x- |. }8 a7 x" D7 y6 mvoid UARTIsr()
; W( i6 d; F) ?! e{
E w. A& q( I1 m) r4 U3 z& D static unsigned int length = sizeof(txArray);
9 X2 o8 x) h, r+ ` static unsigned int count = 0;
2 T/ x6 o& c1 Y unsigned char rxData = 0;
6 b: P" j. V- _ unsigned int int_id = 0;
# M2 l% Z8 c7 I2 ?4 ]. w4 `1 f8 ]/ t: G: ?- o
// 确定中断源
M* ]9 Z4 y6 f; B3 g int_id = UARTIntStatus(SOC_UART_2_REGS);
$ R2 e) P4 ^' D) m Z
" R5 G6 n% X! d7 I. l* P/ Z, ^ // 清除 UART2 系统中断! A- Q0 [& ?, |2 i' g
IntSystemStatusClear(SYS_INT_UARTINT2);
' W* S. S0 C1 C6 J) y C$ S
$ {: G5 U5 i8 j // 发送中断& ]4 G8 I3 `8 K1 {" |
if(UART_INTID_TX_EMPTY == int_id)
2 j8 U/ G b5 N2 U9 w5 ^ N {
$ R4 O+ e! v& S7 v, P if(0 < length). E- y% i: f7 g* ~3 R
{9 N& Y3 y9 _& g$ U" k! ?8 Y
// 写一个字节到 THR2 Z$ W, Z6 g+ ]" {
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
6 n8 D: b; ^1 Z4 j9 L+ y- N length--;
W. o$ O n, l$ A. T% ^ count++;
7 |- K2 p: }7 B5 p. H0 N }
% J6 D5 N7 w2 u4 F if(0 == length)
% U+ k5 j. q7 x* l5 } {2 D: r3 M! y" p3 w8 E& T7 C
// 禁用发送中断
+ F& a! ]2 i% E8 I6 h UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* A2 q" v+ e7 B$ {% i5 p
}& s. i! M" a) B9 e |4 s& ?1 X
}" @4 ~& g: A& i U
) d* w O+ L$ T8 _ y2 Z' A // 接收中断/ N; @% S+ } f* A( S3 r
if(UART_INTID_RX_DATA == int_id)
+ @2 }3 y" K) K5 j {
* D" y8 X6 K# F1 V F! ?) Y5 m0 f rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 B; E i. z) W' T
6 H. n6 b2 x8 @1 N* g0 f UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
* }3 r4 F; b) ]+ U }
8 ?% f: B# e4 r' V* s3 h h. A) z' g$ s7 f% e
// 接收错误
+ Q: u; X3 U& ]9 \7 t4 q7 M if(UART_INTID_RX_LINE_STAT == int_id)9 o1 g! }: Y0 u9 L& `) I9 j
{
- Q+ ?- d3 r: P) t/ ~ while(UARTRxErrorGet(SOC_UART_2_REGS))
1 p. ^, E7 O0 b+ M$ A- N1 K- R {4 L% M# T) S$ v' v4 C! }
// 从 RBR 读一个字节
2 e) J8 {* B* u$ Y3 K% X UARTCharGetNonBlocking(SOC_UART_2_REGS);: k- e# Z& O4 M- ?
}# u: Z9 h6 y5 D; l5 S
}+ C. Z7 j A. ]1 {- M
8 Z6 V! \+ F4 g# o' m" m
return;
+ c6 U* k$ \3 X( p8 @+ y. a9 f}; B! |- B( L5 F
|
|