|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
6 J# u( U& W% n2 U* U2 l
T6 j0 w% a4 S( t0 `#include "TL138.h" // 创龙 TL138 开发板相关声明 k' F5 Q3 D @/ h, |$ g% M8 a1 e! X3 r
8 h" V: B' d, z% a. U#include "hw_types.h" // 宏命令2 E( H6 s: T; f6 e' k
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器8 N0 j2 c+ k W& i# Y
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器/ n6 R6 Q- `$ E
' r0 u* |) L6 L+ k) d Q. S; }#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
1 U1 B% \/ r* |6 w% @#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明. }1 P* o" P; Q/ I+ a
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明- t5 |# V7 W- \9 g2 ^8 O
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 P# h$ j. x# v( Y8 O, u+ W8 n
) S! G" f) R) r; B* {: G2 W
/****************************************************************************/5 R/ [8 t( f, w1 E8 O4 L9 J$ U
/* */
: m4 ?$ j, z9 t' n; I/* 宏定义 */+ _+ z- y" C$ O% [) ?
/* */
7 v8 q `3 R& x: d0 f3 [4 v/****************************************************************************/
+ t1 d6 E% \& ?8 C8 q3 B// 时钟/ O3 |) }+ A. @" ]$ K- m
#define SYSCLK_1_FREQ (456000000)! U3 I. W- _0 ^( v
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
0 n) F& ^5 A3 n' V' y- w#define UART_2_FREQ (SYSCLK_2_FREQ)
; i# a, T* i w
8 P& R, l/ r# g; f/ d# o6 Y/****************************************************************************/
, O" D0 l; X. H V/* */1 q! c0 P' v. Z8 r: b9 e6 Q
/* 全局变量 */6 M2 c# ~1 v1 z# n3 f$ _, L
/* */
5 i1 j5 H5 b4 B! h) G/****************************************************************************/
* }) f4 H" q3 y- I$ R4 {7 p3 jchar txArray[] = "Tronlong UART2 Application......\n\r";
) ]# Y# b# n& B9 F* l
* e- m; |7 r0 x. [: |, u& X/****************************************************************************/
$ }5 T- f* s$ m' b) S2 k/* */( j; Y0 F" Q: I; s: {+ [- q: v- e
/* 函数声明 */5 l$ h: N$ J- q
/* */& e& b" |( d; ^0 d; g5 o |
/****************************************************************************/
9 h& J% ~$ X* ~// 外设使能配置8 a+ I' ~7 ^% I* Q" f+ a
void PSCInit(void);1 m Q: T. \& M" k
; z1 }, ?6 y, p4 R( K
// GPIO 管脚复用配置$ P3 W% H7 e9 P3 q6 b' z0 E6 @
void GPIOBankPinMuxSet();
4 G+ p+ a; [& }. z; E8 L [1 | R8 N- B p9 s; q1 q9 m
// UART 初始化- }; E6 b2 P/ O: Y4 Q3 p
void UARTInit(void);
# g7 f& P( @; Y; t1 @// ARM 中断初始化 n1 J3 w1 k# @3 H8 h
void InterruptInit(void);
% G% O# W4 x+ b# z// UART 中断初始化& V& o+ G" E3 {! u
void UARTInterruptInit();- g% g O) A- I, P& ~2 g! l6 d
// UART 中断服务函数. x0 `) |9 h) [9 x3 d
void UARTIsr(void);
5 f) B& N+ I" p
: K7 p1 b' `# h& ^! N& }2 B6 s/****************************************************************************/
; _" X+ |) z: C7 _6 {' `/* */7 ^# o3 Q. n" K/ z9 U' T% n
/* 主函数 */+ \/ ^- H" {% M# i$ g( D, g6 Q2 {
/* */0 ]6 i* F& n$ o9 W: _; I _9 J* A, w
/****************************************************************************/8 W$ x9 k! H5 E8 i, V9 O
int main(void)3 u8 v1 V8 S8 N% \6 A" ^
{
8 @2 Y: g. S% t // 外设使能配置0 ~8 a0 K0 }- ^& C0 p# z- I# v8 {9 ^7 `
PSCInit();
6 O% a7 r$ Z- _2 @2 c! l # O- u. j+ K6 X3 B
// GPIO 管脚复用配置
/ b. r0 b/ M s4 P2 {+ D9 h& M( h GPIOBankPinMuxSet();
) v! r1 }5 C4 l/ A% ^; U) B- \( m" v6 J+ N2 T3 Z" X
// ARM 中断初始化3 u% c- ^$ i! ~: ?
InterruptInit();
" w8 s' E7 ^+ {! c% z7 ^5 e# H7 r0 L6 _+ y4 t
// UART 初始化8 Y- [) g& ?6 u
UARTInit();; b2 E* }. Y! M/ O2 _; M
3 l( y* W3 t9 R5 w0 B( t' v
// UART 中断初始化3 p0 I' H: K3 A, j1 Z6 w
UARTInterruptInit();: Q1 U* H) X: p% t( m7 e
8 d. j& H9 C4 Q F3 ^/ {7 B; b5 L // 主循环
, J2 r0 U9 }9 ?. {8 R5 _. T% n for(;;)
/ n Y$ ~+ `5 c* f; n2 W+ i {1 `# z7 z7 f0 r: a% s
5 y2 K; z, ^( u3 H- d# P }
, f& h4 F1 U& V0 L- ?0 t5 S$ x}9 T% H- p0 u. }% W/ Q$ H
8 p" c0 C/ S2 P) G2 S2 Q
/****************************************************************************/
b }8 `4 _& x% [7 J/* */
. I6 ?: m- b( _. \1 C$ I# ^) l/* PSC 初始化 */5 o. u2 K4 @& A8 ~: ^
/* */* e/ C6 S2 ?& F+ k5 w
/****************************************************************************/
" _- b3 D8 z2 ~0 _1 O6 d5 H' R8 Y% L, Wvoid PSCInit(void)- \9 K% C2 e% y9 l: E7 _3 I1 I
{. D3 T/ n5 G! r' K) {9 _: E
// 对相应外设模块的使能也可以在 BootLoader 中完成5 ^; S: W+ A0 j O& X6 y
// 使能 UART2 模块; h3 a+ H# n% q8 S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ N: i8 q. N. |$ s1 {- ^}! s4 f' X, h( U2 c" y: G( C0 \
/ P% C, r6 Z8 c/ Z
/****************************************************************************/6 N8 u2 c) n; Z2 r j2 j
/* */
4 i2 p! f' b% E; C H8 U+ a/* GPIO 管脚复用配置 */
1 K/ K @9 K/ A1 O- U3 o! G- N/* */6 D8 P1 [8 i( |8 o
/****************************************************************************/
; z) p0 O& c; `8 xvoid GPIOBankPinMuxSet(void)7 k) j: W- ~) L# {
{: k# `4 L1 d/ J4 d
// UART2 禁用流控) V; E. S7 w. Z% h+ N9 x1 I2 R
UARTPinMuxSetup(2, FALSE);5 U- `9 C$ P0 T! y t
}2 d+ {2 }4 W* ?( k+ @; |
/ d* r1 I( V) b8 N7 U; ^
/****************************************************************************/
, s6 R3 n# w8 T: f( q6 M# Y9 f/* */
* g7 T: M9 a% O8 h/* ARM 中断初始化 */
: L5 H# B. v% w6 _3 o# h/* */% A) d( l5 F/ k3 ^% ?( A5 m* @8 D
/****************************************************************************/+ l' L3 m2 k& Y u# o9 T" A
void InterruptInit(void)4 X Z# `2 P/ d$ Y9 O- f
{
7 |% L7 g' _9 A" N5 m // 初始化 ARM 中断控制器
( q& c1 V. J; {% X5 }0 y IntAINTCInit();
7 `- N" ^: V9 g. r) o) f# \) a; }. p) z/ x! K& t6 j' R/ ?! ^# Q) @1 t
// 使能 IRQ(CPSR)8 M' [, I# g3 v0 B" j
IntMasterIRQEnable();
. e7 E8 ^- e. D' d1 Z# j3 f$ b& A; v! _. o$ k
// 使能中断(AINTC GER)3 Z( @2 B6 x: A+ |
IntGlobalEnable();
% J7 z/ M5 r& s# g7 @. H$ _7 k( q
// 使能中断(AINTC HIER)
" K- \0 D4 m# |- M' ` IntIRQEnable();+ J; o( `/ ~3 E" P$ U Y' S
}+ K- T& N2 t$ V
! H9 O' v: c$ P1 M T x* b
/****************************************************************************/3 @+ d$ n. A2 p- R+ f# n s
/* */
: k2 w2 K2 u: g& ^0 C5 y" e/* UART 初始化 */
' s2 F Q' t0 ]: j7 X9 a/ S. m/* */
, B+ y9 c- e4 [- M: l/****************************************************************************/. O3 m- w+ J! H1 M8 S
void UARTInit(void)7 s9 }: M; P, Q5 r2 F! `
{( Q7 v/ N1 r$ A, I5 k
// 配置 UART2 参数
* D' ]% Z0 u1 c/ ^6 ?4 N2 M // 波特率 115200 数据位 8 停止位 1 无校验位6 U' H! ~* y: A8 C1 F
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,* d g/ @7 \4 b' z7 r" ~' y
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 u! B2 c$ K$ A2 W4 B // 使能 UART2
+ }& n7 O/ m \2 j UARTEnable(SOC_UART_2_REGS);6 b( \$ I: u3 Q
, q* B+ Q. D* v9 z // 使能接收 / 发送 FIFO
! K7 {# G! [0 ?+ g UARTFIFOEnable(SOC_UART_2_REGS);
, C9 ?5 N1 K, x. v1 k2 w. C0 L+ u1 m6 [4 P4 e4 C3 B) K
// 设置 FIFO 级别& Y& H8 q# O0 n- ]/ Z
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);2 h* y" m9 Z p4 K. ~% K
}
3 y2 b" i6 a5 l! P
6 m! H+ u& M% p! n! p5 ?/****************************************************************************/6 W( Z) v% @7 J9 W w5 |
/* */5 g. C K$ |$ A- m9 {
/* UART 中断初始化 */
: v. x, B, j y6 l, L/* */
. ~8 k# R4 ]* R+ i1 o. I/****************************************************************************/* [ _2 [% u6 E' @# ^
void UARTInterruptInit(void)
; y, X6 a2 k6 K6 H{
4 j8 C4 }+ s- n0 c. W: {1 @. F IntRegister(SYS_INT_UARTINT2, UARTIsr);
" S$ K8 P% r5 P. E IntChannelSet(SYS_INT_UARTINT2, 2);: k. Z l: }! i( M0 i$ X8 e
IntSystemEnable(SYS_INT_UARTINT2);
+ D! a+ V4 F7 I" R
6 p* U/ j6 D- ~! t4 ]$ ~9 u // 使能中断* i S4 p( D. G8 b, F& b
unsigned int intFlags = 0;2 @; k4 o5 x8 I7 j/ m
intFlags |= (UART_INT_LINE_STAT | \2 ~; m! x% i$ b
UART_INT_TX_EMPTY | \2 ?; \+ c/ x( Y3 Q2 T& f4 u5 o
UART_INT_RXDATA_CTI);/ a+ B. G6 x1 @# _' {
UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 ]6 |7 i- g$ ~}8 q' B n" C* `; L. K$ p! w
8 w; \; j8 r+ j9 J/****************************************************************************/
+ O+ i* x3 Q0 ~- K; k$ A1 Q/* */
+ \) x- l: T! r N+ Y: }7 P/* UART 中断服务函数 */
1 V! L- j( N; [( U9 n7 H/ x( x, z/* */
& l6 s/ h& E5 Z/****************************************************************************/
; N" l- o) i! ?$ u! Q; b7 Jvoid UARTIsr()
$ z$ l) ]0 ]* |, T F# D{
! q/ t0 g4 V/ s2 T/ \) F& y static unsigned int length = sizeof(txArray);
, R& S6 |9 x) O* K! w2 M. ^ static unsigned int count = 0;
9 q' F P& q" F" i, I8 x unsigned char rxData = 0;* O% m$ [$ ?: x# E3 p
unsigned int int_id = 0;
2 n" ^3 \! M3 r, \1 F, P( z8 x( L4 g- N( I$ o5 J3 U/ [
// 确定中断源" C* c7 y. X- O& b7 |3 Q# A
int_id = UARTIntStatus(SOC_UART_2_REGS);
* _& W$ f3 g0 @$ b" v" Y1 S, d% |
; L$ M [, K! u* U. Z // 清除 UART2 系统中断! q8 j5 {* S1 R9 t
IntSystemStatusClear(SYS_INT_UARTINT2);+ e5 i1 A- F% ?6 h0 T
/ u% U; ^ |; g9 w
// 发送中断
`; P, {, |9 j, `' A) X if(UART_INTID_TX_EMPTY == int_id)
7 i3 G' C; e2 @0 [" D {) J2 Z7 i4 ^1 E* \0 h
if(0 < length)- {! Y3 g7 X# G2 k
{
" g+ t1 U6 X' o+ x( D$ J( n9 [ // 写一个字节到 THR
% q+ N/ J# t: g9 i8 d) T UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" z+ K1 z2 G+ @: m e% f
length--;
8 @! w2 F7 M$ D# r6 {' Y' ~ count++;* H$ R1 x; a! K6 j' m! }% S( t" a
}& B- ]: U g! G, M, `
if(0 == length)
- g0 |( G* E+ Q X" V6 g( P9 }" _ {
$ f; p2 J5 \6 q: R* g" C# q/ u // 禁用发送中断
}- ]" B/ [/ Q3 L( r UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
7 h& f0 V/ a# M, g3 P# j5 C }
: f7 d5 x$ }$ z0 g) S4 R5 v }# e( W& f8 L& U1 ]
' p/ p4 W6 {! C% _ g! R
// 接收中断
& v" \# o u+ c% v if(UART_INTID_RX_DATA == int_id)
8 z: z' E( w& W {
) u+ n( u# U. ~' T% j rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS); v& x. ]6 W- g% ?9 }! a6 u! [
+ Y$ U ~: h9 Y) B, Z' W7 p* j UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. L& F2 X* A+ ?" O
}' c) x8 r8 N" a7 H! d9 K
1 T+ R0 K1 W, B7 ~& @
// 接收错误
, G" s, D R; r+ |. w4 n if(UART_INTID_RX_LINE_STAT == int_id)1 G" S) y a9 E; w% j
{ }; K2 o w$ p
while(UARTRxErrorGet(SOC_UART_2_REGS))
* L; c9 J% c" n' v a {
* o; z, q" m# @% K8 g // 从 RBR 读一个字节+ D$ w7 h9 P- g0 r6 b; f
UARTCharGetNonBlocking(SOC_UART_2_REGS);+ O3 P4 u# Z" a
}2 m; e, y4 J; p5 k8 t
}) S; T% f. D: L& |
* {6 V" J% \ R6 i7 m return;, z* T9 }5 M$ K1 s9 {
}
4 ?- M/ k+ v% R2 i |
|