|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。) P+ |5 a* \7 K2 |; }7 e0 ~
$ e' I7 E% z/ H1 A8 q
#include "TL138.h" // 创龙 TL138 开发板相关声明
! C& f% L3 {- ~
8 y* }3 R- _, R+ \* M4 I4 H#include "hw_types.h" // 宏命令
5 A$ ~8 O3 q5 H5 U! p/ E#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
* V Z" t$ k# ]; X# x0 u, d#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
6 x6 s& v/ `* _/ ]
9 a, R/ t1 z% }: v( ]#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
- ~/ K1 O2 K9 \, r( X#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明. u4 m3 ]$ h4 U2 K% N
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
, N; R7 X5 h4 t: d6 E#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 O: ?1 f5 N( _
6 X1 Q: Y2 f) A* ^& ^
/****************************************************************************/% h9 T& _3 y1 C' M" C e6 Q
/* */
* u' R) [ t7 W8 u/* 宏定义 */. d1 j, d2 W* U- \5 X
/* */# @" H' N9 D& Y% {2 o3 T! y* X6 W
/****************************************************************************/
2 Y& U0 e0 t5 _$ A0 V7 q// 时钟
8 ^; n! P! ?( h4 A#define SYSCLK_1_FREQ (456000000)8 @% M0 y: t. X# B/ Q$ l% T
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
; J6 ^! U8 P' t+ ]2 i+ p#define UART_2_FREQ (SYSCLK_2_FREQ)
" S9 T" @% r$ _0 Q( J- T; T+ O% t( \" x5 p6 ]3 o* v/ D
/****************************************************************************/, y' S9 D1 q; l: e6 Y$ z! D4 H/ D
/* */8 `" `" }5 N( s( u _2 _) t
/* 全局变量 */9 {5 v; n8 b7 s A! l0 J; n
/* */
) _% {* |7 [" ^) z) `9 M! x: q/****************************************************************************/
" u( a8 `# h) K- X' cchar txArray[] = "Tronlong UART2 Application......\n\r";
& s2 T4 k" e1 A, u2 B( I
8 p4 h4 q1 w7 f5 R5 V- A% q/****************************************************************************/( P( L5 P: k4 ]; b8 G5 J0 ]! }, s
/* */! Z5 \5 R" z% T: \; T8 U
/* 函数声明 */
) F8 \+ l+ n h& y3 R8 G/* */
, n0 k8 {! T/ M! A' L/****************************************************************************/
' w4 |5 k- V0 d- _& i// 外设使能配置
7 O; b r$ N8 I% r$ n' E2 Y4 c6 |" Fvoid PSCInit(void); Z& l# _9 V* y3 I a
0 x' e+ v& A0 Q: j0 S
// GPIO 管脚复用配置
V8 O' B7 i4 m( k2 F Lvoid GPIOBankPinMuxSet();
# [/ j" j* N4 o) t5 U3 j2 b
7 V, L6 S+ B, U. A$ Y# j// UART 初始化, N. n6 B& V* g- M4 V
void UARTInit(void);
( T5 p$ A3 y: M3 m& `9 O// ARM 中断初始化
) g1 W8 }7 L5 U' m) e- D7 Avoid InterruptInit(void);# g7 V e; ^6 _, |+ c+ H
// UART 中断初始化0 t, F8 _0 ?8 M- P! {1 \' v! S
void UARTInterruptInit();. b0 j: W* N( g) L8 X' C; G) M3 z
// UART 中断服务函数+ G* n5 i2 k/ @9 k }
void UARTIsr(void);9 m# g' a* G7 m
/ C4 E8 p9 L& R' F6 w/ I5 X/****************************************************************************/
1 U4 y3 L4 T0 R. r6 J' F8 E/* */& w" K& x& B. z0 O) @% r1 l; ?4 \1 W
/* 主函数 */
) n: A9 @: i! X- O/* */) ^1 ]$ ?5 s$ B5 j
/****************************************************************************/
' Q, U" F5 _$ @' L/ p% rint main(void)
5 Q4 X5 G8 G' [6 e0 }* h+ i+ M{8 ]! k/ S0 W- G- Y0 ]( V* Y# b
// 外设使能配置7 f- c* \' @ q7 f' t. ]
PSCInit();
; ?# Q. Y8 M3 ~, q$ e) `) T) T 1 z" N) G7 }# b8 t3 E4 m
// GPIO 管脚复用配置7 Z& E, D" p2 C2 ^: T" ]: M4 x2 ~
GPIOBankPinMuxSet();
$ l7 `* w' R. Z% z7 G. K+ k6 Y
3 W" ~# Z1 O$ K. W) m8 J // ARM 中断初始化$ B$ T% M. E" V; J+ Z, b4 [
InterruptInit();
& q# j* a( H1 c* l. L0 l, [
4 I, C0 R. `6 G3 k j# q Z5 I. C4 b9 m // UART 初始化9 V4 g6 l0 \8 @, p5 m+ E8 S
UARTInit();% c: I: W& I' l6 ]
/ d6 i2 `3 q1 G7 Y0 P3 g, W // UART 中断初始化
- \" H& Y; L' h5 a UARTInterruptInit();
1 R/ J6 ?/ `; K8 |' K0 f. o
6 `) Y& V8 P" ~ // 主循环
, z% `8 f l6 E) m+ S for(;;)7 s, I7 a1 g* I D+ F
{" S6 J0 D1 `, K8 x* B
1 v& S- v7 R4 R( J" N
}
! D7 v" ~+ t1 s9 l# T}2 ^: T& U+ O1 D! \; N/ }# o/ d
4 v% N( z* a; F* T/****************************************************************************/# F p1 k- @. m3 B- B
/* */
4 G- E/ b# m" l' Y4 d/* PSC 初始化 */
" Q4 V( E# c) E g& v) \6 d/* */
7 [, y1 U4 F: e7 W. p/****************************************************************************/
) R3 [' j+ i' u: X5 Kvoid PSCInit(void)6 J/ ?' i# f: k. ]
{
1 w3 q1 @8 N6 N) t% m7 Q- c+ w4 w // 对相应外设模块的使能也可以在 BootLoader 中完成
+ K- |' O3 F& `7 b3 ~ // 使能 UART2 模块
( ?( e4 S5 s! z+ G$ U# p" r PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 B( l8 B* E8 p5 {
}
4 y9 u6 k$ Q4 A+ ~2 E8 J* L4 x6 I
6 _4 g1 p( U2 @" Y7 }/****************************************************************************/
0 B- R7 D& u% `6 o6 U/* */( }, E. N) n- ?. k
/* GPIO 管脚复用配置 */2 j, W% f4 I- Q7 v+ E/ }# T& y5 K
/* */
; @" m7 D, S8 M6 P$ @/****************************************************************************/ a5 S/ t, A3 D9 ^" ^
void GPIOBankPinMuxSet(void)
) ?0 m( B+ B/ e% V% {{
: c9 Q& Q8 ^, ^6 e f1 `8 M2 Z // UART2 禁用流控! L# V1 f2 O0 r. t
UARTPinMuxSetup(2, FALSE);
3 m! u0 C3 y! R}$ @/ m7 a7 M" y5 \* p; H3 m' k
% F0 s% @1 @; b- ?
/****************************************************************************/9 r6 @3 \) F0 M6 g( U" l
/* */
& o# z& P6 y+ _9 Y/* ARM 中断初始化 */7 y4 k0 a4 f; M! s5 U/ F
/* */: r F: j& I8 |7 z
/****************************************************************************/
6 \% @" P1 G B7 Y7 pvoid InterruptInit(void)
- L) V( L; y6 j4 x. {4 a7 X- _) x/ B{- }9 k% L' U0 q# ^
// 初始化 ARM 中断控制器; f' X& q. A; r" i
IntAINTCInit();7 T# _$ |0 M7 t, B/ m% x
+ Y: }" o4 Q8 G' X2 ?& P
// 使能 IRQ(CPSR)" R2 s1 ?+ W9 r* E* Y# L
IntMasterIRQEnable();$ h; ?. s# |$ w8 G' ]1 R0 a. c
4 Z* L+ q% x! x( Q+ }' r8 ?
// 使能中断(AINTC GER)0 B2 C9 v/ L9 ?: B% G
IntGlobalEnable();$ t9 ~2 w2 C2 c+ Y% s9 o0 k
+ p5 c) n8 q7 U. f: c' O9 a5 f // 使能中断(AINTC HIER)
* R$ d8 i- ]; C6 }) g IntIRQEnable();
' n" P4 ?+ J: n5 Z; n& ]/ k9 l}
' f) a7 ?- t" [2 l; D: Q7 f; b; I, g% O r
/****************************************************************************// O- _& }6 j) S9 m5 ?- F
/* */9 j& k v/ p9 v9 o% Z
/* UART 初始化 */
7 ^; G/ k- ^. f/* */' @; ^' R1 \; x
/****************************************************************************/
2 s. J+ G* @3 rvoid UARTInit(void)8 a) A; h8 `/ T: f8 D
{, `9 {, d+ l) M: C/ Y
// 配置 UART2 参数
, p6 q, Z/ e! |5 u( ?8 y; y // 波特率 115200 数据位 8 停止位 1 无校验位4 m1 d5 A# G0 {/ N& u& L
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
! [7 W9 m8 v9 p7 g UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 m# x1 }; e; e; j7 Y% |
// 使能 UART2
8 v; T1 W7 K _0 R UARTEnable(SOC_UART_2_REGS);
! ~' O. e& ?6 g1 t* A3 a' L. Z+ {5 d
// 使能接收 / 发送 FIFO
% C; O% |" n* o9 r% g UARTFIFOEnable(SOC_UART_2_REGS);" p5 T% Q% t. D( ?
5 n6 \8 ?5 X6 v! V // 设置 FIFO 级别6 G- ? C' H9 H, V& x- G% j6 p
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" K5 W8 a0 }! u
}
- ~1 _# j# X, N0 Y/ ^: P Q0 \* {. t: I6 B* [1 F* F
/****************************************************************************/
( p5 t* R6 S0 {% p2 o/* */, S w9 f) g7 h. M* w1 C
/* UART 中断初始化 */ C* w4 b5 Q3 r( ^! m! Q2 ?9 b" g
/* */ V3 b* {8 \- k. v9 s3 S6 d
/****************************************************************************/4 ^6 F( f: Y' P0 n9 H5 v, U
void UARTInterruptInit(void)
* ^: R8 }, R9 n$ f. f{
$ j* D" P2 f0 {& x4 R4 l4 @9 |- J6 ]) x IntRegister(SYS_INT_UARTINT2, UARTIsr);) j' C9 t" `* O3 d; [* x- E
IntChannelSet(SYS_INT_UARTINT2, 2);6 D. f0 v1 Z/ W" B
IntSystemEnable(SYS_INT_UARTINT2);
& V. d. L! U, s7 d2 K9 f( ~9 w \- ^) Q0 ~3 k
// 使能中断
; I. [) Z; e" S9 ^ unsigned int intFlags = 0;) A3 C( a. M. U+ @, z" g E
intFlags |= (UART_INT_LINE_STAT | \8 t) T1 q7 C$ G# ^8 m: ?+ Y
UART_INT_TX_EMPTY | \! u2 B' S$ N. j9 c& N+ ]3 F
UART_INT_RXDATA_CTI);9 r$ \3 v( }: I6 E1 t4 y, P8 ~
UARTIntEnable(SOC_UART_2_REGS, intFlags);
, N+ D1 Y/ [! I9 m* c, {7 B8 K}
, p6 b& @! Q4 z# T, H! P
+ p; f# O; Z/ _& t8 Y/****************************************************************************/
3 a; ?2 w0 v% r7 q( n0 `- R/ x/* */$ J, L- s$ X0 S n' o k7 P, q
/* UART 中断服务函数 */5 L |2 x4 f$ R& C3 ^5 ]; D
/* */# v9 L# f! K5 r" i( h
/****************************************************************************/
" @& r3 E1 N2 l! Zvoid UARTIsr()9 s8 p8 z0 d8 f5 I5 N+ i- {
{ w* X7 K, Y& B$ z) q4 I' l
static unsigned int length = sizeof(txArray);
5 B6 B: X. u! u; p7 H! P static unsigned int count = 0;
0 K1 L. H( W! x* \, y; U unsigned char rxData = 0;
( v; |9 i8 z N- i" b' M unsigned int int_id = 0;. i$ J' [8 d k6 Z! I4 H
/ B2 w* T/ R: S/ a6 g // 确定中断源' ~: N8 [# @# @3 G0 N! I
int_id = UARTIntStatus(SOC_UART_2_REGS); y$ z; t4 U. T1 N- U7 E
4 m8 |0 X: l+ U, w H. k, X
// 清除 UART2 系统中断9 h* P/ o i T) Z1 f% R
IntSystemStatusClear(SYS_INT_UARTINT2);
2 v8 a# t& t6 `- q4 {8 i* o2 E$ F5 o
// 发送中断( ?7 e2 Q& {5 w, @9 u% o
if(UART_INTID_TX_EMPTY == int_id)4 Q5 `1 G7 A# }) p' z$ y/ v
{
4 ^! O% `! D$ I7 o7 i* s, S. \4 C1 w, l if(0 < length)
- T1 y& I, ~0 c; [1 T {
( z7 l$ h z, r" G- \( b! _ // 写一个字节到 THR7 l; O" F9 D5 t1 q# N* y& x; U# \& K/ ~
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);2 ^' _4 P1 F% \8 b8 h
length--;
4 L% r$ t5 K5 v count++;$ v% Z' [4 C/ V* E' T# p
}1 [7 }; u( g- g
if(0 == length)
! b6 Y* Z1 K4 e# B5 o* H. ` {
c* p% o9 G) I5 t( Q- h // 禁用发送中断
1 Y' P# T0 d- M: m( Z# e6 ] UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
4 M( _* m0 I/ t, Q ]5 ~ }/ i8 U; x9 |* }9 c# T6 p
}% i) j) \# S8 l; }- F3 _- M! }
5 @+ \0 n& C" R. o- M2 V- P // 接收中断. e7 A |6 m$ |7 X$ U; d! W6 {
if(UART_INTID_RX_DATA == int_id)$ Y$ i: f2 u! s
{" \9 b* W9 B o2 ?. Z
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
: A6 @8 M- u8 b C$ Q; E( Z" s0 T# Y" v
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) Z& |- E* \3 q0 L }
2 P5 {7 ], b3 k4 z7 B& L. ?* U/ o, z! I' A+ Q8 r" x
// 接收错误
3 t& {2 C: z+ c$ d: l+ l if(UART_INTID_RX_LINE_STAT == int_id)$ g1 G+ A8 ~+ y! F. B
{5 {& |3 l6 ~% [+ N6 v; L
while(UARTRxErrorGet(SOC_UART_2_REGS))
2 v. R$ D8 x- c3 ]5 t1 B9 N {
: }8 `' Z' F, [9 S3 \ // 从 RBR 读一个字节# f1 u5 r5 ~4 q) t, p6 V
UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 p" W4 C0 e4 r; | }
, A# n0 ?+ @ P! w( T; U. s }
$ d2 [- s* V9 f9 q' v) |
: l' d# g' R) \. U return;
5 w9 ~) `! y8 a$ ?* p" H}# O) A0 I( N% P- v
|
|