|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。0 v0 J' X: y# ^6 |
; n `4 V7 |5 J6 m. [#include "TL138.h" // 创龙 TL138 开发板相关声明
5 `' f- [+ d0 C; D) R
- H' M! m0 C5 K#include "hw_types.h" // 宏命令
% p! Y! K6 X8 |#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器7 b4 u1 ?0 ?% O
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
" Y! t. @% q* V1 z. S1 X
: p' x6 O9 N- Q4 h7 {. L#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明) x' ^6 [5 `; N+ u; Y% ]- S- X* n
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明& m7 E' ]9 F7 {7 R" c5 ^
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
/ s" [$ ~5 K4 {#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
" X. S* V0 Y: t% S8 F2 f. Z9 Q( i" `& ]
/****************************************************************************/
0 S0 z# T. N% Q3 a# n/* */8 [. w% @8 s6 V( _
/* 宏定义 */
7 O* b1 m, M c! L/* */
. y1 h+ O! O. y1 S4 \/****************************************************************************/) H6 [# F/ C, p# j: F: o
// 时钟4 E5 I. O% Z; y
#define SYSCLK_1_FREQ (456000000). {0 \, |! B5 K& N" ?
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)7 W7 n" k7 v7 P% Z, Z6 ~2 x2 ^
#define UART_2_FREQ (SYSCLK_2_FREQ)% S9 v) a! M$ b9 d. Q: [
7 j/ }/ C3 J% }2 ?( u2 D0 [3 G* @% `
/****************************************************************************/
( |3 n6 d# F5 U# T- \1 R- @$ s4 M/* */
' s! a4 i% G: |+ _8 m( `% e/* 全局变量 */
( n1 E' g- B6 j7 b! R/* */
5 o2 S; I8 o0 m- I v9 O/****************************************************************************/) k/ X) `! a' ]% M
char txArray[] = "Tronlong UART2 Application......\n\r";
) ~$ J- A: G+ s" c- S% Q
5 f; j! E! ?$ N3 h5 r$ ?/****************************************************************************/+ X/ N) V% }" U% h
/* */7 Z+ ^' m2 Y3 P* p. z9 \
/* 函数声明 */6 C' M7 ?* X& X3 c! N4 U, ]; Z5 k
/* */' h% N* v1 i. B! H3 e2 g4 n
/****************************************************************************/
! @0 F ]) a! i5 ^// 外设使能配置! v: N5 W) U+ y7 U0 [7 F1 M* l
void PSCInit(void);9 W |' M! d+ T
2 h1 n8 g' d" w7 b, x
// GPIO 管脚复用配置
8 S3 y% U9 [, G$ O5 I7 w+ ?6 u$ zvoid GPIOBankPinMuxSet();
) S H" V' ^! z! g& r
5 ~$ e! m: Y1 x% }$ l/ C- |$ J, X// UART 初始化! o" X1 O; F7 _9 r0 q7 l3 v9 I
void UARTInit(void); ~( W: M: F3 U1 W; F# W- Y i9 [
// ARM 中断初始化: w0 W* j$ m1 F" x4 U0 M/ g4 S
void InterruptInit(void);
$ ^$ v, z8 o8 a// UART 中断初始化; O+ i% j Z ~
void UARTInterruptInit();
& {2 m- x# V: m. r0 x! N) U// UART 中断服务函数
# L$ ?: d! a( T u2 _2 S/ |void UARTIsr(void);
! z, M( q' U0 e, Y4 x2 i% E
5 c6 _& j, Y4 z O7 I8 d% w& A/****************************************************************************/+ }" G: j7 I' b4 Y# \
/* */
, k' ?4 T, |3 O7 V" b1 ?/* 主函数 */
" i* `* v D/ W7 ?& o+ |; K* E/* */% ?8 Y% j h9 b) a, a& m% w1 y
/****************************************************************************/" s, d; Z8 H- k3 n& i2 O
int main(void)
* l; Q* r1 n, H; q5 l{
0 u# ]2 z5 \: U0 V9 \+ ? // 外设使能配置
* ~$ ~6 E7 G! G5 W# L- e- v3 k PSCInit();( `% c O# `2 T
/ B) j/ [6 k$ _' E4 `5 X* ^ // GPIO 管脚复用配置
% i. L4 X- C* E v% j: ~: H9 v GPIOBankPinMuxSet();5 @. i1 v& Q; `6 f
1 a4 q: Q: q% i3 m // ARM 中断初始化0 g' c$ w& i0 u% }
InterruptInit();
0 z( J8 ?, I; E# B
E4 v. D+ T, |, S) o // UART 初始化
. [' f8 t% d' [: Q' W" n UARTInit();
# `: o6 G6 x/ L6 a4 j
_7 |7 C3 n) @$ t0 [ // UART 中断初始化
0 J5 B2 y6 U, S5 @ UARTInterruptInit();
9 r1 |# A. ?8 P' p2 P
. U$ ^2 K& Z3 \( S // 主循环) G0 ]! o4 M2 k* {, l" a
for(;;)6 f6 r+ Y$ h5 k/ ]" R' ~" |
{
* e* R& \% {$ S0 C2 d+ B/ l* x- C7 N5 r- @1 P5 k8 b/ |
}) Q- D* V0 W$ |% q/ a
}% z4 p+ C: ]4 E! y. ~( R! X
& i3 x# a5 I! m8 K, K; `5 t3 t- e/****************************************************************************/
9 }" H9 c& p5 r) W6 J# X/* */
4 e3 ~' r% [/ y, p7 O/* PSC 初始化 */
7 M' F9 B5 A: T' e$ J$ |0 M/* */$ M* {1 F3 M; r7 D; q- q0 N! ?
/****************************************************************************/
$ ~' R0 ^' `% p7 @. L. dvoid PSCInit(void)% K, e x# p7 a$ L- x; A$ Q
{! c8 y. I+ u3 p9 ~3 j: F
// 对相应外设模块的使能也可以在 BootLoader 中完成
* A# b1 p$ { J9 H // 使能 UART2 模块
0 `" [' v& d2 \: z! m7 m$ [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ i- d8 c4 }8 b}6 d. n3 o8 h' W/ j) F+ X; n+ }
9 S- K S7 F- t0 F! m/****************************************************************************/
8 A+ U2 b; K- }+ N4 l2 X/* */
) k" B$ j( l; p/* GPIO 管脚复用配置 */
% K7 V7 H/ C; k/ a, `3 w/* */, D- ^/ c p! n4 O7 R6 l9 f: s
/****************************************************************************/% r$ \* G( ?: D: P/ a
void GPIOBankPinMuxSet(void)' l: Y" e6 N) T( z6 \6 K) E, w; x
{9 [7 f0 d$ W1 Z/ T; L( z2 W0 y0 C
// UART2 禁用流控
: x ~' P& w! _! }7 U, y/ M UARTPinMuxSetup(2, FALSE);: O: `5 V }) P% {2 r: N4 _" s
}, p. ~: }& O' p+ M; a' O' W
$ I: A- D E2 x0 W. r# T# u
/****************************************************************************/
: l% P$ ~3 ~+ [2 Z/* */
4 X2 j, g8 q9 w n/* ARM 中断初始化 */
* H% U- @! f. H/* */ b2 Y3 I5 \! j% C: O
/****************************************************************************/- a5 c, ?$ g( U5 p; W! O2 o9 u
void InterruptInit(void)0 Q. L% C7 s/ A5 x( I( _' ?$ H
{
7 Q( u, f5 U( r- [ a; A; H // 初始化 ARM 中断控制器2 i2 z0 o- v# K% A
IntAINTCInit();: t% U; N9 L- z8 j
N4 o" o: K& W( |# t) R
// 使能 IRQ(CPSR)7 }. U9 y/ z) @1 ~' ~' S7 a
IntMasterIRQEnable();
4 U2 n& f" x+ I; E) K4 k. F5 M* a4 G( B
// 使能中断(AINTC GER)$ O9 F, i* _* K: d' b- _
IntGlobalEnable();
# z5 I2 l9 X7 U8 [3 l7 i
. m1 R' m0 s$ D4 F0 N- X8 B // 使能中断(AINTC HIER)
! W* @) j$ `4 o) b IntIRQEnable();
4 @- @! A% R5 E; N5 o# P}
7 X, `# @, u5 f6 b; X
& i! r* Z8 { r& K* \- e! }4 T- K6 }9 [/****************************************************************************/
$ I. [$ E+ _9 P( a1 y7 `6 s/* */
$ M7 [0 x& t9 b" F/* UART 初始化 */1 T4 s9 L% W& i; }' Q, C$ U
/* */7 a F R$ K$ ^' m) J# Y! y1 z
/****************************************************************************/4 z* G) Q, o% \0 b2 V3 V- W% L
void UARTInit(void)
4 p5 p$ b+ p% N0 \) A: L$ \- p{% `# i/ y; D1 Z0 H3 A1 _' J9 E* [
// 配置 UART2 参数
& ]" i0 k- G; Y/ q$ O1 `% T // 波特率 115200 数据位 8 停止位 1 无校验位
/ ~4 e: T) O9 v$ d% z UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
' b- S9 V' b n& l6 B6 ]2 R UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16); E | J/ \8 _# ^: t% a
// 使能 UART2( x" d' S6 o8 A
UARTEnable(SOC_UART_2_REGS);; w1 ^1 N! ^8 ~ p
% ]( b$ b4 |+ a
// 使能接收 / 发送 FIFO, x6 n% R% u: \5 H0 J
UARTFIFOEnable(SOC_UART_2_REGS);
5 f& o/ a1 m% S: i# ?6 d' i) k
0 d) {) A2 d# V, J! ?# q // 设置 FIFO 级别
# E# ?( k9 W' N. Y- {6 V: Z UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
9 v6 V5 ^0 r- K2 R4 j- P; J0 z}1 x/ m+ Y% f9 m# U7 p0 j/ I
6 o, B8 k+ \+ H# j: h
/****************************************************************************/
& y& P- S1 c5 K) }/* */
5 u. N5 c1 M1 y+ P* q6 a/* UART 中断初始化 */
J8 P9 _; c$ X! S4 c' C9 z% C( l/* */
. e/ a3 P. p' V- @/ E/****************************************************************************/! n- |% g" y v
void UARTInterruptInit(void)4 b9 [! M7 x' N( N
{
, U$ ^: w6 X. D! S8 f5 q IntRegister(SYS_INT_UARTINT2, UARTIsr);* {& a8 C$ Q) y( }( I* J: D0 f4 Z
IntChannelSet(SYS_INT_UARTINT2, 2);
" L3 r D$ Q# j$ G/ r6 Q; ^' H! C4 J IntSystemEnable(SYS_INT_UARTINT2);+ t4 H: ^$ `5 j0 j& Q& h/ J- f
6 C, Q9 w, H: Z, F( J // 使能中断
- z4 L' J1 @5 c unsigned int intFlags = 0;
- `2 h# _" W# a& n intFlags |= (UART_INT_LINE_STAT | \
9 k9 W: a3 M7 e; S/ W7 ^1 o UART_INT_TX_EMPTY | \! g& C; l* X2 \0 n% t6 r
UART_INT_RXDATA_CTI);
$ ~3 C0 G' F7 x- [% o/ ? UARTIntEnable(SOC_UART_2_REGS, intFlags);. c! z" K6 W- V2 K' F
}
& G. L$ X/ T; B% ^' U- \- ^' y' _0 m2 f! P3 O
/****************************************************************************/
0 f% U5 h% F0 C1 u6 W7 G/* */7 _* `, k2 X" ]% k; k) _4 ?. s2 e
/* UART 中断服务函数 */
% Y" P) ~8 |( y) j+ y- ?8 W, V/* */
/ k8 M" ^7 R, d/****************************************************************************/
( T7 D+ f a' \& T/ P! Wvoid UARTIsr() J5 U/ @: ]6 n" z
{
: C- _* g* H! p2 Z% a" p2 R I8 N# w static unsigned int length = sizeof(txArray);
- n) U2 [4 Q6 f" T& f static unsigned int count = 0;
, O+ q1 v' K% q$ x- ~+ S: T unsigned char rxData = 0;2 ^ C M; j" k! n- ^# p
unsigned int int_id = 0;3 |4 T/ X0 w& N; D3 y: b4 L% L
: O" p( H7 ]' B0 H+ v // 确定中断源
7 ]. P+ W1 K3 R* g int_id = UARTIntStatus(SOC_UART_2_REGS);
( o+ C1 Q& b( s* q' T
" i( E& I( F! s // 清除 UART2 系统中断
6 @' w M: f2 ^ IntSystemStatusClear(SYS_INT_UARTINT2);+ p$ \* E7 y1 a3 z* h
% l$ d6 }0 M8 g% u. R. F // 发送中断
& C; \% y" [- P1 z, V$ N p if(UART_INTID_TX_EMPTY == int_id)8 \0 ?: c s: ?5 T% K/ M
{3 m0 `( A/ j8 n7 R
if(0 < length)' M- Y7 I$ t; O
{
1 G. o( f( x t n1 `: E' t: q! ~ // 写一个字节到 THR- T" W. d, `0 K- s- k5 ^8 S5 C% u7 h
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- h. O( U. s4 K2 V; c
length--;9 |, l& I/ M$ r5 ?6 X) O# `/ C) F
count++;
3 `! ^# x" x& P& `4 G- r( W( } }4 l- J5 o1 D% I/ V! I
if(0 == length)
9 z% l6 a z0 l D7 T { Q: X; N# h( a- H1 F$ `
// 禁用发送中断( H- A1 K3 l2 W W) Z. b* @
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
/ j, f# M3 @8 [, S9 d }* Y& r! T( b9 Z a& z
}
/ S0 p- J1 z# ?8 {. J
# E! P& W1 F* M // 接收中断# `0 h* g, h/ v- K
if(UART_INTID_RX_DATA == int_id)
7 R' x0 P- A7 [1 o {
. j; S4 o. m% c/ ?6 q8 C rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 C8 D* B. W$ g+ U/ `; s3 z: y- d3 ^
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);3 c+ K8 f1 w$ X8 L& V+ r" V# x
}
0 W+ I& i6 b! r9 z7 d) r
2 E& n& b1 G: f* t, e // 接收错误
' C+ d$ [, A" R& S% y. W if(UART_INTID_RX_LINE_STAT == int_id)" ~) Z8 Q. T- a; X/ _2 K
{! `8 u6 b9 V8 F! N7 N
while(UARTRxErrorGet(SOC_UART_2_REGS))
: U" g( g1 l; u$ D( [ {( |( |" @/ ~2 [
// 从 RBR 读一个字节
) ^' @8 `9 {& ]/ S; A) W UARTCharGetNonBlocking(SOC_UART_2_REGS);
( Y7 Y/ c5 n7 |5 }% g7 L }/ }# N2 c: o& R2 v. N" s2 j3 q
}
' N6 J+ m& f, Z( W' e$ ~+ U! [ 7 }2 o- `8 d! ~ |- m" O7 ^/ L
return;
" Y5 l, w" R. C! V. }2 r8 w: N}9 j, {. X0 U9 W: E8 T
|
|