|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。/ t; ]- t2 E3 k4 g7 u
; N1 \+ ]2 E8 Y. |& w* z3 E0 B
#include "TL138.h" // 创龙 TL138 开发板相关声明% k! q: j% I) E" x
5 O2 e3 \$ s# R/ b) y#include "hw_types.h" // 宏命令
7 \4 I3 C5 k7 Q& E#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
! v+ Q& T* ~, t0 D' w8 d+ Z#include "soc_OMAPL138.h" // OMAPL138 外设寄存器, [3 U. ]9 B. ?2 C$ \: r
" ]/ V5 g5 j) I7 E$ f) ?' Q#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明1 A: R2 Z$ ?3 u
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明7 ^8 u' k) v0 s0 {7 ~$ M" W
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
1 z- {+ f& c' e7 I#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ h K+ e. u/ C
6 v) t7 {' X+ y) h/ _+ q/****************************************************************************/3 o! L1 h ~4 f# b4 T4 p
/* */
7 K& q. k4 K; r2 o. k# T6 i/* 宏定义 */" z% E( ?( ?& o8 A Z3 Z
/* *// u2 J9 h; J! H7 }
/****************************************************************************/
' @2 ~# y# a: v, P$ w0 C6 B// 时钟2 n. F2 k) |5 V% N
#define SYSCLK_1_FREQ (456000000)
& a. G/ N' ~- k' \( K$ b#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)* l) w4 ~+ X3 h: c1 H# o8 _# }4 y: ~
#define UART_2_FREQ (SYSCLK_2_FREQ)
* N9 \/ X: n5 f5 `3 P. a g3 Q' V+ w. C$ V( l
/****************************************************************************/, D3 Y) [) \. h' R) }2 b
/* */" Q W: D# S" |4 g/ h
/* 全局变量 */8 r Y2 u% o: R' K
/* */
( p1 M f" `: x9 P, M. o( B/****************************************************************************/% J$ a) L/ p [$ Y1 z6 v5 Z3 [
char txArray[] = "Tronlong UART2 Application......\n\r";
, i' t/ \1 ]1 h" t2 k% c6 f' r8 ]
/****************************************************************************/
$ C7 t. C' d k: N4 x1 }6 t7 k/* */
1 _/ X/ f" m1 Q+ W$ Z( x/* 函数声明 */7 ]/ Y4 v# Q3 x/ A$ S0 Z
/* */# b6 X3 k) U, {/ V8 Q+ g q* s
/****************************************************************************// `. p& J/ B3 h- r
// 外设使能配置2 ]% u$ j3 Y* [! ]7 @* ]! j
void PSCInit(void);0 W0 N; d2 w: r4 o% `, c6 _) G
8 T5 u# {) @$ O' Z& W3 }; F9 l// GPIO 管脚复用配置( R9 U. Y3 [( B
void GPIOBankPinMuxSet();
- o- v4 e$ c% d, @
7 _" N0 I: n/ c- t+ g1 a// UART 初始化4 ]# H( C& w' F$ |$ W A6 F3 D
void UARTInit(void);
# P4 ?" h1 I6 u// ARM 中断初始化: w6 f2 G; S* `0 y3 f; }
void InterruptInit(void);8 T% C7 N- q) \5 o7 B, C% |/ _
// UART 中断初始化
1 g$ O2 s0 b% j, g# Xvoid UARTInterruptInit();. x9 t# y% R1 B' t* @& w
// UART 中断服务函数) ]6 p" |' m1 R5 t I/ }( T) N
void UARTIsr(void);/ |0 c! g/ y$ L" ^ I
1 l- O1 o' s- Y3 H/ `/****************************************************************************/. i( x" c5 B, W! \! |
/* */
1 c! K; o* N* B( B1 G/* 主函数 */
( `% i$ z: @+ t: }8 n1 g/* */
) T8 c, N3 H1 T2 d q1 K/****************************************************************************/2 r1 r5 T$ ]. f+ H/ r, P, Z# v0 e+ B
int main(void)
5 a" E- \! }* N{
; W! w) n6 \$ q: o4 ?9 d, \ // 外设使能配置9 s8 O v3 i4 t( d0 J$ k
PSCInit(); K$ _3 b3 C% `; d
# m1 x: Z( `6 s // GPIO 管脚复用配置9 J. E* o7 N$ A) E+ f1 A+ [' {
GPIOBankPinMuxSet();1 C C' }8 g& L/ h7 q5 n
# H" Z3 e; `0 r3 d7 h# Z$ Y
// ARM 中断初始化4 [0 v& V8 G5 C0 k
InterruptInit();
+ |$ ]3 [5 H* g
4 h9 d" P$ i( E3 z // UART 初始化% X# h% ^* I% a& b
UARTInit();
, U6 M, d" @3 V/ m# ~6 M& @- Z1 q0 U; X$ B v7 ]7 M7 s3 q/ V
// UART 中断初始化
& c* T: j2 e1 N) _" I( V+ m UARTInterruptInit();, r7 Y& L5 K! Q- D
1 q; |% _* p( x( U' h* m: @7 X% | // 主循环
* s5 x; L) W( x4 l7 j& ^ for(;;)5 c$ K( F, t5 y( S2 z% B
{, o$ N3 i s/ A
* C" ~' Y7 w& } }) v" M4 U" N9 I, A4 ?" _- e
} V1 P+ l* p6 D4 ?! P
9 P$ p- L8 R. A) R
/****************************************************************************/: I B% K6 Z% I, @2 Z
/* */
6 _6 c- I$ n6 v$ v2 E9 `5 ]8 f, w/* PSC 初始化 */; ]0 ]9 D4 G3 d/ B
/* */* a2 ^% e6 H* b
/****************************************************************************// B# e$ Y) C2 h
void PSCInit(void)3 l7 k$ m# Q; ^! @" {. ?8 V
{' f! V, _3 v$ @' V" ]6 m
// 对相应外设模块的使能也可以在 BootLoader 中完成 S3 T0 u6 u6 x' E. ^
// 使能 UART2 模块
$ t; w8 }/ f% X* B7 \# N, d/ t. v PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; D8 U7 P# X1 a) }}1 R; @7 d) v! Z) P1 X0 T
: z- {. q) D+ Y4 W! i
/****************************************************************************/
' Q* a) G: w' g* v/* */2 e7 `" s+ b( l# {1 T' n2 e% X; c
/* GPIO 管脚复用配置 */
; [8 L$ G5 W( y1 T6 J* {4 \/* */% F2 }# {+ E8 f+ z5 q8 u
/****************************************************************************/
# E+ ?4 M3 ` {. |# x" r) avoid GPIOBankPinMuxSet(void)$ R- h7 Q2 V5 ?# {- w4 D( r
{
! ~5 o1 {$ ?7 o+ m* n // UART2 禁用流控+ s9 r# H! }2 S" p5 F* |& E
UARTPinMuxSetup(2, FALSE);6 Q3 }3 E& x; q
}( w2 m" W; k0 D3 i7 G" G
/ j1 Z3 S% g1 c. T
/****************************************************************************/
& }! l. R2 _/ C0 R7 C8 D3 @7 ?9 d/* */: A7 ~ ^: L* S {/ S
/* ARM 中断初始化 */2 ?2 }& j( f! M7 z" {5 I6 ~7 h% d
/* */$ Q/ f" V9 G: [) ` V
/****************************************************************************/
" ^* p7 F$ ~6 W( U ]1 H `void InterruptInit(void)
3 q+ m! g- \+ j4 H# y' W. B) E2 R% c{& K* e2 [/ O$ z4 N: ?6 Z
// 初始化 ARM 中断控制器$ C' r! |9 a0 L7 p( r+ q
IntAINTCInit();6 q# P* ?' M- ^% q! n; W ?) U
3 }! a8 Q$ Z9 X0 C" _/ _
// 使能 IRQ(CPSR)' \& @7 G' B1 s9 K0 }$ E
IntMasterIRQEnable();8 e, k8 a/ Q2 A. Z$ ]) j1 z0 X( h
" W: }2 n6 w9 B) B8 F$ Y; }$ G' p
// 使能中断(AINTC GER)) Y1 P8 i, ]# ~, s( @% [: N
IntGlobalEnable();, {, L$ }7 L: L2 l: R7 ^ a. A
# @2 m& Q( o7 `6 B5 I5 \
// 使能中断(AINTC HIER)
1 ]" i- c/ Z& h8 D* _/ D! ` IntIRQEnable();
8 B# U/ v' D7 E}/ K" y* B5 e. T9 k0 W7 H
. f5 Z9 h8 p& K7 A6 i G/****************************************************************************/8 F! @, O$ j* ^, M& Y9 j2 u
/* */
- p& R4 n& z# \; X/* UART 初始化 */
^2 i8 \% U% O- J) p8 ?: ?% s/* */
* u* T- y# Z9 j1 A! c/****************************************************************************/( r, \1 ^ z8 _* C M
void UARTInit(void)
. m; N5 W( M L{) e9 t- D& ~& V& C
// 配置 UART2 参数2 I3 |) [7 x$ L7 m
// 波特率 115200 数据位 8 停止位 1 无校验位
7 Q- Y( d% ^; I t* E. A+ O/ c UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,3 k8 c- K5 T! Z [1 S0 ?1 H! H' l
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
Y. [" M- e5 l0 Y // 使能 UART2
$ b; ~$ x% |4 |$ s6 x: J( a UARTEnable(SOC_UART_2_REGS);
- B! W9 h9 g9 Z5 R
G# D/ R( W1 }0 L0 O // 使能接收 / 发送 FIFO
6 h6 y7 R( u8 _8 J- O6 k( |/ I UARTFIFOEnable(SOC_UART_2_REGS);# w- n" N; s% s& F
' O' e" P6 G4 A4 C2 Y6 q // 设置 FIFO 级别6 F& \, y P) M) g/ u# `( O
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 O: W, V6 N( V* D; E& E" }}! L' Q3 o& M+ S5 ~9 Q" _2 ]& Y* e
; \- R2 I9 o: V5 }0 M; Y* z9 ~9 Z% A
/****************************************************************************/
2 \" n4 |; V7 ^" B5 |6 Y$ A% \4 M/ [/* */6 w! o, `" U% Q8 x5 z
/* UART 中断初始化 */. R! h; \, {/ t: ^: j
/* */
& I. F5 I2 ~ a; N& F+ X3 H1 K/****************************************************************************/* p6 o( @7 h8 V. o
void UARTInterruptInit(void)
9 e6 E4 t$ e5 c8 k( A9 M{
0 b* {! }" h I9 S6 E7 T IntRegister(SYS_INT_UARTINT2, UARTIsr);; K9 G4 M3 O+ R o
IntChannelSet(SYS_INT_UARTINT2, 2);
" A' _5 n" M# D+ v' t; v( K IntSystemEnable(SYS_INT_UARTINT2);
* Q, Z+ t2 w1 C/ Z9 P
" P4 {! e2 x9 D+ b4 b' p4 t% I // 使能中断5 j; Z3 O% E# A- P& U4 r
unsigned int intFlags = 0;, ~# R* e6 a6 L' @+ X$ e Y3 v
intFlags |= (UART_INT_LINE_STAT | \
/ o6 Y T' N% v: i% n; i UART_INT_TX_EMPTY | \ V: I$ n) g7 _" ?7 ~ A
UART_INT_RXDATA_CTI);
. r+ p/ ^) k- \! P, L! U) w UARTIntEnable(SOC_UART_2_REGS, intFlags);
% G; J% v }4 X6 z$ d. z}
7 i! f L" b+ n: s* t4 C/ ~( j- V L2 m2 d0 R/ q* T+ `
/****************************************************************************/
- n4 w! x- q% A% ?- M5 T9 ?/* */
) x$ d. |2 I9 L/* UART 中断服务函数 */
' k3 S/ Z4 X9 G! e5 M0 ^/* */6 i6 L$ G" w# K, N
/****************************************************************************/3 G R$ U" s& P8 W! [6 Y R
void UARTIsr()
' H! R4 p5 C8 e{7 e6 ]. b1 _9 S \6 U0 N+ T2 B( c
static unsigned int length = sizeof(txArray);0 v9 L H7 ^4 P# z" H
static unsigned int count = 0;% g, ^4 U' i7 T _; C& F; U
unsigned char rxData = 0;* a. O# S/ h1 R# j. h6 C3 k
unsigned int int_id = 0;
& O1 m1 i4 h. Z0 s0 h
z+ N, J+ H# j' e // 确定中断源" ?- o1 @: M0 Q. v
int_id = UARTIntStatus(SOC_UART_2_REGS);% w4 p; O5 f3 j& I W1 u D
, R0 k, @+ T1 R( F) f! L
// 清除 UART2 系统中断
1 `2 x+ [5 y$ J) m- l3 Z IntSystemStatusClear(SYS_INT_UARTINT2);
0 C$ W) e+ O0 C+ X8 Z. s; j9 Y. e* h
// 发送中断
6 M+ o) W1 \: A6 ^$ J7 V1 O% a if(UART_INTID_TX_EMPTY == int_id)0 h/ m2 z. c8 h z
{# h" q; f0 o. h/ Y( @4 W( P
if(0 < length)
# b' j. J2 Z- Y/ m {
' ~# b$ C0 ` E3 Y1 h! S // 写一个字节到 THR
+ \+ C* R! N- y. P4 j: C z$ H UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
' f* _/ R. p7 M! N+ W length--;
. a% C- I( C( Z* G3 s \" B+ t" j count++;% E" @% u# H! A5 v: Y
}, P8 i9 J- b, m0 x( k n& [0 n+ `
if(0 == length)
# m$ Q0 B) W, z. V0 o3 O. E# T8 W {
4 {: ], z7 C3 C! L // 禁用发送中断
- u B2 Q5 v* M9 F( l- j1 W2 c$ ] UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);& l( z! f+ w7 L
}
$ d: X; x* @$ [ }" t2 Q4 @* x; l( u, [
) W+ k0 f0 ]% h' `$ v) p; d/ I
// 接收中断: u' R9 ?! T$ H+ f+ v; F7 O _. J
if(UART_INTID_RX_DATA == int_id): |* t4 m5 d1 K3 I( h3 X1 p
{
& m8 P, I! }1 T0 a5 k8 V rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 M3 v: _6 x* `: x6 ^, S* U ?
) ?3 M5 V' ?9 A0 @ UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);3 N9 }4 K7 \. v k
}# ?2 P) Z0 Z) k
" V# y' K* b& U // 接收错误
8 ^; b% K6 V, }* V: c3 ? if(UART_INTID_RX_LINE_STAT == int_id)& _/ m% m0 B8 T' I7 x
{8 u$ _- K) ~& m. l! E9 H
while(UARTRxErrorGet(SOC_UART_2_REGS))
S9 J) V o% o& D1 m' v; K { C+ D) D* F9 w0 q. S
// 从 RBR 读一个字节5 v; w8 b; e. Q' N% n% o& L
UARTCharGetNonBlocking(SOC_UART_2_REGS);
, N6 T* \( q( ]3 x) m7 k- ` } Z* j+ @' i+ g4 Z& Y
} ^7 N6 @* @4 ]$ W- L3 O/ f9 \1 g/ ^
* C& Q$ _3 r# K$ J: I# D5 ]* C
return;0 L p6 p/ O# N; Y6 F' v* z
}
1 v( Z, g. o8 d0 J |
|