|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
0 R- m0 C( } E1 t
/ H6 C' S3 S1 h0 s5 R; J4 h#include "TL138.h" // 创龙 TL138 开发板相关声明) w ^) W0 O% a# [" r w: `
2 G% i: T; A! P* R2 c
#include "hw_types.h" // 宏命令
. E- y' g) Y* n8 z2 [! K2 w2 a. D#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
3 y K& t! e! ^9 Q2 D% _#include "soc_OMAPL138.h" // OMAPL138 外设寄存器2 |% c4 e! _6 r
7 k% K+ {4 ~1 E$ l3 s/ O) Q3 j
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明5 D. w" c, i! k5 q
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明- U9 }. w+ x' f9 z7 U7 Z
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
" K+ Y- h% T4 l5 F* y. r#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义" I, A; L; j6 _7 D" Y, q2 ~
5 R5 i7 M; \0 n. H; ]! [5 I
/****************************************************************************/" ~4 w; X# U6 c U; D u7 Q" G
/* */+ C% m# E6 [) J. j) L6 }
/* 宏定义 */
' i& Q- ^! m- U* ]9 ]/* */
3 |! E- p' \4 i) Z0 N- D6 @6 e/****************************************************************************/8 \! b9 u% L( E' ^' c$ |9 U$ O
// 时钟! [+ ~) n& n& _' W1 a' t. V+ d
#define SYSCLK_1_FREQ (456000000)
9 X$ _& b: a' I$ W8 T* }; p#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2), H- \1 T3 Q' J+ ^" I. X
#define UART_2_FREQ (SYSCLK_2_FREQ)
+ v+ N) _- }$ {) D5 ^" S# H& U$ o) M$ o+ T, G- j |
/****************************************************************************/' g# }; L2 q5 ]( f
/* */+ ? h4 k8 H, m& [! |3 q
/* 全局变量 */
1 P: {. `: s" a( z6 l3 x/* */
+ F Z8 J& \) l7 h6 |# c/****************************************************************************/" M, C+ Y5 k1 c Z% g6 u o. {
char txArray[] = "Tronlong UART2 Application......\n\r";
8 g( H% o7 _2 t1 l6 F% ?) B3 @* i( j9 ?+ a. [+ X/ r9 q6 s4 r
/****************************************************************************/
3 @3 ^6 [) B* {" v$ Y% P d# I/* */
; K$ P C ^' B) a. s- B/* 函数声明 */4 }3 f, f* T; U: S
/* */
$ @5 K( r+ t6 L/****************************************************************************/
, x' M. Q6 I. x( l# Q// 外设使能配置 H V$ t0 f7 e9 z1 n! }+ H; b
void PSCInit(void);' O* U$ I% u7 h, p: T6 P6 V' t
& ]0 o" b2 K- d+ @7 ?7 N// GPIO 管脚复用配置
+ p$ I( J* }- _! {void GPIOBankPinMuxSet();" s% o/ X7 q% R# ]3 G6 _
% o) G5 ^8 K/ m' Q+ x3 L" n( Z* W
// UART 初始化
2 Z$ G; u' E& e4 T9 i# Lvoid UARTInit(void);
, L$ @- r( y3 E9 v5 c9 y// ARM 中断初始化* U; i9 a+ E9 b* Q `
void InterruptInit(void);( A' ?8 P/ M! } o4 I1 G" \
// UART 中断初始化! P5 j$ V) S9 u
void UARTInterruptInit();) w, g5 e* u' k9 i+ d
// UART 中断服务函数; @& R2 x$ |( o
void UARTIsr(void);: I, H; H, A; g9 n% E0 }! j, R) M
2 ]& I; T+ R; E5 h) A: J: r
/****************************************************************************/" y" ^( [. x7 s6 p R4 _
/* */% R$ | U* E: Q* Y
/* 主函数 */
9 c: Q9 B% R3 ]. v/* */1 {( F; l3 v8 A" w) p
/****************************************************************************/
5 C Q# y/ Y6 Y0 dint main(void)1 Z( m' G" d7 C# D& Z0 R S
{" o7 c3 J* F/ k8 M- ?
// 外设使能配置. k! }: a. j, H+ q [/ S0 K4 n K
PSCInit();4 ]! }: T. s; M( [1 O7 ?* i" r
3 [+ c8 {6 ~# z" G9 g
// GPIO 管脚复用配置
4 Y) t5 q3 z8 X4 K7 K2 j; F$ q GPIOBankPinMuxSet();/ N* R0 x4 ]: L
" H3 o2 @) e7 d1 Q$ H* C7 A // ARM 中断初始化
5 |7 Q7 Z8 E7 Q InterruptInit();9 ]; c, q% W" b, `+ x
# m$ _% q& G( A6 @, ]- V4 I. u4 }$ L
// UART 初始化
8 T- i" L& X9 m' x, s4 q+ R6 R UARTInit();2 b7 K8 U0 {3 Y( I, K* Z
# D8 }: t, ]* y6 d( O
// UART 中断初始化
( J0 g$ i( |4 e0 e- ~" _( ~ UARTInterruptInit();
! t8 C. i# X- m; c# S6 e5 y/ f% T2 `
// 主循环' P# U" s" @8 P
for(;;)' |/ b+ [& u8 }% T% ]- B, J) `
{
' @+ f+ H, y5 @8 W
P& H \5 H7 H- r3 n1 i9 K }! [5 J) y; L% d1 m1 {
}
, W, K/ u5 @/ |
. E0 F; M6 E) S+ H/ g/****************************************************************************/
$ o; ?) e9 e$ q3 d/* */' b, |+ ]3 \' i
/* PSC 初始化 */
3 B, i* R! S! m& t9 a- }/* */0 _- i. I `1 p& u/ _ N" `
/****************************************************************************/$ G% m/ p+ u2 z! n
void PSCInit(void)! R1 n. l! M1 L0 x
{) L' i% Q. N0 }8 U' q- ~+ B
// 对相应外设模块的使能也可以在 BootLoader 中完成
' y R/ B" K4 T+ C // 使能 UART2 模块4 _ @+ n \5 m. Z' p6 I
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 ^9 U3 [3 b" J+ u" f' n}
# ^; Z `+ f1 Y% i* i2 m! @4 ^/ J% S6 m) A- |; _6 [( K3 {
/****************************************************************************/
+ _+ q+ z6 b/ h) ]9 n$ ~- `- n3 B/* */' b" _. _+ p4 g$ j8 z) z
/* GPIO 管脚复用配置 */7 Y9 {" z5 j9 b2 r% a; ~
/* */
6 d& ^ B0 G7 V- I l/****************************************************************************/
' A3 ^% h: d! rvoid GPIOBankPinMuxSet(void)
1 M8 A- |! P* r0 ^{
0 l" S1 U" g# ]. y$ S // UART2 禁用流控) p: I9 Y$ }7 ~+ }* g3 O
UARTPinMuxSetup(2, FALSE);4 ~* R3 n( |0 j$ T" f& h$ R
}
- J7 \1 R3 n" W$ q: }- v$ C
3 @8 U: X X5 _% t( V- g. K/****************************************************************************/
' ?" ?4 F& q X: p: M4 h% K/ l/* */0 x4 s) k+ T4 ?# v9 [' ?
/* ARM 中断初始化 */ x. o: ?) L: t' w* K
/* */& D2 R. \1 [+ _6 o, G0 c
/****************************************************************************/
8 O( {: G" g' d8 Y' Y6 ]void InterruptInit(void)5 g2 P8 `5 S' Y$ I1 h& w* A
{% h) B& X5 v% W! _2 p4 K4 L- s
// 初始化 ARM 中断控制器2 S+ v8 y) B9 x) N
IntAINTCInit();9 X! ?+ ~. v0 R+ c
5 i& S- {2 z b7 r
// 使能 IRQ(CPSR)
8 c B( T3 ?+ V+ {6 T4 a IntMasterIRQEnable(); X+ O5 @0 Z t
& T9 f/ W8 {4 E5 }1 P // 使能中断(AINTC GER)
0 K C+ M* T& X5 y, P; b IntGlobalEnable();
) T. A' P' g0 Q6 a& J j: x+ _9 R; V# o" ^
// 使能中断(AINTC HIER): s% F7 Q8 T+ X$ G# P% p# K$ A
IntIRQEnable();9 J+ ? L) t: M) M. T9 ~( a
}: i% g; K+ O; ]
/ d: K( T! D8 I" L" @( Z/****************************************************************************/2 R4 A1 @$ @' ]& O0 A/ \" `2 v; `
/* */
3 \9 }: J) [1 ]/* UART 初始化 */
$ h1 [/ [! C. L/* */
. V# A9 N5 y% |6 U" Y/****************************************************************************/; w; L" B3 d+ O7 q$ d* h: b; e
void UARTInit(void)* D9 U- a2 F2 B' P4 n* V8 g2 ^
{8 h: `6 E- u% q. Y" h
// 配置 UART2 参数, g; R3 d* W k' L% i6 C7 t$ n
// 波特率 115200 数据位 8 停止位 1 无校验位2 }2 d. U* k3 O4 r0 p3 z# I: ~. `
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 d! `' R" u# q UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16); [. \1 w! _9 h9 t: k
// 使能 UART2. G$ r" S {3 {- A; T
UARTEnable(SOC_UART_2_REGS);
: d2 N3 D6 Y% F, Z, P
2 M% G, H6 z. k2 U ?5 Z3 s, J* p // 使能接收 / 发送 FIFO) P% X& p7 t! @8 O: f6 Y( d
UARTFIFOEnable(SOC_UART_2_REGS);+ N6 s' d: A6 G% O( d x! q
9 k! {- l9 ?" g! b8 S // 设置 FIFO 级别& H" g% B; y1 f7 |2 f" T
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 {( c" R5 r8 O* _. t3 T1 {}
0 X5 o* }( x( F H3 `* D# U! y1 Z# ]% T+ z7 y
/****************************************************************************/% A+ z, o0 n u4 }7 a' k
/* */: r) i0 K y1 k
/* UART 中断初始化 */# m8 z8 Y" C' O* I2 L
/* */) j: K! ?+ J8 V$ A
/****************************************************************************/
$ V* [: w1 g! ]: I" [8 vvoid UARTInterruptInit(void)# J; R" ~3 c( D% o6 e
{
- N- t, y* g! c* J( d: l, l IntRegister(SYS_INT_UARTINT2, UARTIsr);" |# I0 i0 X9 y3 s
IntChannelSet(SYS_INT_UARTINT2, 2);' a1 g& j4 |" j1 p" h: E$ g6 u
IntSystemEnable(SYS_INT_UARTINT2);" ^, G+ u; ~3 f% {+ y' P# P
' E* n4 u0 _; F' `
// 使能中断/ o6 k5 r4 |& Y* I2 ~: u8 ]9 b
unsigned int intFlags = 0;( B. g l- ?) t% m! R# Z
intFlags |= (UART_INT_LINE_STAT | \
& p1 v( t. Z2 k. Q: r7 X% E2 ? UART_INT_TX_EMPTY | \
. D! q, C1 D0 F; G, C5 ?4 j UART_INT_RXDATA_CTI);! I* V+ v) ^9 A7 ^! d. `8 q
UARTIntEnable(SOC_UART_2_REGS, intFlags);6 r' b/ T/ k+ e' J- U% _
}
' W8 J& A- @1 W X9 c# J# B3 I: J" k1 G7 s
/****************************************************************************/3 B5 ~' |! n8 g* ?
/* */! w* t$ _- u* z- m+ a* k$ f* \# O
/* UART 中断服务函数 */
5 X L8 R+ y& d) t* C: b( ^/* */
9 a+ y! r6 h# n+ c3 b/****************************************************************************/5 o' E9 p1 j' x O `$ g2 P/ r
void UARTIsr()
9 r/ U* o! |$ a+ K$ ^- m& y1 K: H{, P5 @" r2 b: I
static unsigned int length = sizeof(txArray);
- c9 E* n; Y' T* S; p' ~) k% z$ @2 J static unsigned int count = 0;2 `$ ^" p8 ]! \' [ [! ~
unsigned char rxData = 0;" p, f- I& x; R" r- g" G
unsigned int int_id = 0;
! U7 j/ s. z/ O" F- K$ r* R Z* }% V( a8 E0 O. F) D" W8 c
// 确定中断源* @. I0 r* J. O4 v5 `7 z; m$ `
int_id = UARTIntStatus(SOC_UART_2_REGS);
* k, S$ h p: ?8 J+ e( Z) t; a+ f6 _, d9 n2 ^" \) @/ ^
// 清除 UART2 系统中断
# _ N/ K/ R' p, L0 _- j( n5 [9 q; {9 h- ` IntSystemStatusClear(SYS_INT_UARTINT2);6 x6 f" y: o, }' R, @( `! l
' i1 O1 Z @: \) z$ p& l // 发送中断# s2 d' e: \; V6 y! P
if(UART_INTID_TX_EMPTY == int_id)
4 r& X* q# K4 q2 c: t {
- B' D+ U8 b) _ e i1 {9 O if(0 < length)
1 m1 X' k5 Y- @ D: W {
: h$ f% W; t- Y0 B; u! L5 q // 写一个字节到 THR
3 I `* q1 Y4 [$ a# T UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ d" _) q7 H, y6 Q+ f" m
length--;, `3 X; d" p! y7 b" s. F) ~
count++;4 K0 X/ T. i6 e2 }6 @& ^% R5 ~
}0 s$ {# i4 J) w$ N! @
if(0 == length)/ `2 \" k: Z8 {& _* d+ R
{
3 s, i8 X, d& s: [ // 禁用发送中断
5 _# r8 s2 E0 m T: T1 {) } UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
9 ?% ?# Q& D! n( O D- O# f5 } }
1 ?7 T$ e* M5 {9 ]" O7 L9 F }
3 D+ h- C6 H2 I8 p5 ]# `, F2 V# \: J$ Q+ G% w+ A
// 接收中断3 _& N6 _+ V3 P2 w0 m) }+ R1 x
if(UART_INTID_RX_DATA == int_id)) C$ ?2 I0 T8 s* s5 N
{1 T# P. l) c) B/ P4 \: {
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);) G4 Z, Z8 k6 E8 h
6 J) G4 ~* Q7 b8 H
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ O, F! ^$ v- S- r- r4 M& _! n( _ }' N- {& v/ h$ X) @) }" h
4 b9 } R0 ?. O+ \: w4 n# J3 f // 接收错误
" _' E) A6 ]6 O ?3 f if(UART_INTID_RX_LINE_STAT == int_id)
' @, X/ V5 a5 Q# A* c {8 F$ e9 L$ d, m
while(UARTRxErrorGet(SOC_UART_2_REGS))6 j( ~. ]3 A: C
{
6 _. _6 Y) k' M; F. e) \, r" ^1 v // 从 RBR 读一个字节
( Y( T# D- |1 J; x- l+ [; r UARTCharGetNonBlocking(SOC_UART_2_REGS);; [: \) N# q# ^3 x0 Q$ t$ j2 @
}/ y5 x4 ?# k. U T# u+ N
}9 p! D7 ~8 c+ G1 a: a$ U1 ~1 O
+ _3 r1 u* B3 c; k! L8 E2 O return;
/ m0 v) y/ c# s x0 u}' Q! [1 |( g6 L8 H2 m1 Y
|
|