|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
1 ^' t( v! Q3 [& M, f8 w& e- j" q2 G8 ~: c' t7 ~
#include "TL138.h" // 创龙 TL138 开发板相关声明# Z; T$ _. @# c8 r$ J$ J
" e$ S1 z) t4 j7 Q#include "hw_types.h" // 宏命令* T9 C Q; p7 V
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
5 u6 [, s4 t6 x9 o+ T4 I$ w' M#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
* b) N) o" ~" ?$ ?; D" ~0 p: {2 I. U- a: n2 ^3 ?
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明, c/ K8 d' c! e8 B- M. ^: I
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明& p/ m9 t. ?( f' A' g# ~- R% s
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明( @; g& d4 e8 c8 H3 G+ X6 T
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 S {% k! u% N& m0 h5 s) a( M# m& N* l$ [% Q' C R" Z6 H% o
/****************************************************************************/
( p8 ^) Y5 b4 X; K& s% e( A4 ^/* */
+ E& j5 P1 I5 i3 x e/* 宏定义 */
8 M) b V* V: r: V/* */
" @ j9 {9 U) i7 g9 `/****************************************************************************/
+ h, z9 t8 u0 k4 U$ I. J// 时钟
9 e/ R/ |9 m% U) b#define SYSCLK_1_FREQ (456000000)
; F9 ^$ e" @, f8 `# Z9 {#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)" G" {+ V+ I# }0 Y7 l+ v
#define UART_2_FREQ (SYSCLK_2_FREQ) U1 n# s* Y, H' d3 e
- G3 G. I4 }/ a0 S/****************************************************************************/- m$ `& ^3 F5 k# A1 B
/* */( s4 |' ~2 e0 v; C! E" d0 b# i
/* 全局变量 */# w1 Z7 ?8 u8 Q0 M+ N% ?
/* */
' U) j3 o2 \ m/****************************************************************************/2 R) O: R0 Y2 M% Z: q, Y" h3 K4 _
char txArray[] = "Tronlong UART2 Application......\n\r";
" `3 v% @3 f* z, T8 L6 a3 F' f# f) U2 V0 r
/****************************************************************************/" R1 L) J; e; ^. B m6 r. }! P
/* */. L8 L1 [+ M$ ~7 z: Y+ n8 s& \
/* 函数声明 */
: l2 M0 s1 C6 G @2 j8 I/* */ t1 X( t& D- |$ ]
/****************************************************************************/) J; v o2 { ]' I9 n
// 外设使能配置
4 R& o+ {3 |/ _2 z" y$ M4 rvoid PSCInit(void);0 v% G' R, {2 V# t/ G3 L
$ U4 F' W: r' _2 m
// GPIO 管脚复用配置; k& o9 ~! z) ~2 }0 o1 P7 l
void GPIOBankPinMuxSet();
% z" h3 `. ]. _5 C' D. F r, E& H: Y( y8 a. f \
// UART 初始化
8 |* j* y9 k. O6 z. gvoid UARTInit(void);
. c+ [7 P) m! T3 H& l, \, v5 f// ARM 中断初始化! M5 |; x/ L7 v1 j' B* \. P
void InterruptInit(void);
2 y: t* @2 D1 ~2 C2 w# v7 F// UART 中断初始化. q8 |, g' g/ _2 Y# m! K
void UARTInterruptInit();
4 d0 N! Q, H4 c' R3 f& Q9 M// UART 中断服务函数# K" b1 e o9 h
void UARTIsr(void);
6 p! [ \ Z' O: s" L$ R( ~8 B, D6 S, h x; t
/****************************************************************************/
( W. B3 H+ N- k: }* K3 z/* */
. `" a/ R, J& W X0 O; l& X/* 主函数 */3 w, n0 ]$ Q3 ~" J- A0 u
/* */
k, B! x: E6 ?# I/****************************************************************************/7 C S! S" k3 k8 o7 s/ i
int main(void): }+ \# M' u6 A, Y+ F
{
) T3 }( s) K5 Q9 s8 H! V% Q // 外设使能配置) }' K' f' B$ F& {( V
PSCInit();
- l7 f% \( y C" e& Y3 u
7 ]/ g( }1 A4 W w // GPIO 管脚复用配置
! `0 ^5 q) P. @5 \% g- t% X4 {9 k GPIOBankPinMuxSet();7 u, w6 G1 _: b) L, D1 G7 K3 a! K) N6 K
" o# P& m- P$ E1 I1 \! q
// ARM 中断初始化
" a1 |' M z* M7 E1 J- Y InterruptInit();
% n# {- O& X6 e5 E7 D ^0 u3 Y, P3 U! J$ x; ?1 F! h' o
// UART 初始化
' r2 Y% f/ K' A& z" h UARTInit(); `( K! L, P. }' b$ c' ]+ l
; x( D' _ j5 w% W @4 y8 r
// UART 中断初始化
" f1 d& g" h) c7 I UARTInterruptInit();$ w7 w" k s- A, N1 U7 L% S. o
" y$ N' j6 ]. r4 K% r5 c, L; } // 主循环6 m# M0 x6 B- |; F5 p) I
for(;;)
z3 f$ c4 f+ \( }+ k {
7 T, @8 C1 d! d- \$ ~. v: V
: q- c ^: S/ A9 p }
+ D1 N% V8 |2 h$ x+ M}3 [7 `& t7 }' m9 {% P% i
2 f% _: M- R, Z" I
/****************************************************************************/6 f! Y/ m: u4 a- ~3 H1 V
/* */
2 j7 p. y R: x) m/* PSC 初始化 */
/ j! f+ \' B; i3 n% E3 o/* */
* t& L6 Q0 Q7 @+ _2 F4 B/****************************************************************************/. B* Q2 R# u& K" j$ J
void PSCInit(void)
- ?, n8 g: m3 a9 I8 M A! k{$ [* J+ H+ Y& ]2 o) e L+ F
// 对相应外设模块的使能也可以在 BootLoader 中完成" u3 P0 j% n5 }& d6 T) l
// 使能 UART2 模块
4 `: Q7 `/ v( c7 w. w8 T0 X$ w$ @ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);4 ^9 Y* ?5 d1 b2 h1 O0 Y
}% R' ` e0 t1 b
+ v& Z, U- i" m5 t. n9 b
/****************************************************************************/
/ t- _+ z% ?8 @2 N3 t6 N/* */9 K% l6 q) D! Y+ P5 {
/* GPIO 管脚复用配置 */
9 X1 i: Q+ j5 L/* */7 N( t3 K1 a3 Q$ `
/****************************************************************************/
' e6 Y) E d$ H6 p: j/ h2 rvoid GPIOBankPinMuxSet(void)
8 J, U& ]1 R% G# v9 d* o( s{
3 w3 G9 z& V Z' T1 T7 n // UART2 禁用流控& j- c# Z+ ?' D- V8 A- z
UARTPinMuxSetup(2, FALSE);
4 S H: I& R% i! @ r4 V}
1 A" ^$ i, l6 @- `/ ]# R4 K/ J O$ }
/****************************************************************************/
! g2 t% x! ^0 _; U/* */
8 j6 p; H$ B3 i, `; y. p/* ARM 中断初始化 */. I( c* M5 s+ f# Z. N' a7 y7 f
/* */: t$ d. _+ O" L* R( |! U6 s* C+ S' W' M
/****************************************************************************/6 A$ M) C8 E8 ?0 G" ?- H# X
void InterruptInit(void); s% Z/ ~8 G' D
{( Z% m4 v; q# ]' C; N ?6 Z4 g3 D
// 初始化 ARM 中断控制器& X) }1 U- T9 ^2 O) i" h; a
IntAINTCInit();
" ?$ v% @! m* e5 _3 B2 T& M4 ]8 v0 i6 c' B% z0 Z2 D6 b3 T
// 使能 IRQ(CPSR) R# u: N! F, d& q L
IntMasterIRQEnable();
' a1 T' D8 I0 e. f5 T5 b
% [2 V5 {* C+ \% P7 R // 使能中断(AINTC GER)' `8 N/ d2 e: ~% ~
IntGlobalEnable();6 q3 B5 U" L8 S) I5 B6 M
/ Z+ F: O! W* {, z8 i
// 使能中断(AINTC HIER)
& @, ?- c: p/ J+ F2 P+ a; {' L7 e" B: a IntIRQEnable();% m- j! I0 ~1 t( m4 n7 l' Z! }
}
* N. d! O# C5 Y6 [, c/ l! c
" a' S1 D9 ]& Y. H5 j1 }/****************************************************************************// K- _/ }8 v' O
/* */, f6 u# D& e) k: v6 r3 j! |
/* UART 初始化 */& x5 C. r _% A# r6 Q9 }
/* */
' P; P: g7 i3 k% r+ M7 h6 \/****************************************************************************/3 }9 G9 l+ O" A9 o3 Y( W
void UARTInit(void)$ t8 O2 b% ^# S9 P- l% B
{+ j* a; T0 x- N8 C7 v* U( f
// 配置 UART2 参数
4 k) m# k7 \ M1 @5 | // 波特率 115200 数据位 8 停止位 1 无校验位
9 N2 l2 [( @/ c. v: c UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,2 W- Z; d- v: H! K3 v. }+ [' b4 K
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ M! Y. j' J, b" E. w
// 使能 UART2, ` j6 c. |/ H6 f6 f" d6 P9 W
UARTEnable(SOC_UART_2_REGS);
, Y# U2 V, c `# H8 f
5 L) y" P- l& c$ Y$ H% B // 使能接收 / 发送 FIFO
( w: Q+ Z$ L* @6 J- v6 e) ~1 v UARTFIFOEnable(SOC_UART_2_REGS);
6 L* @8 e, K1 y0 N7 R
) y# y( c) Y7 b- D // 设置 FIFO 级别7 G9 B* l8 `% c1 h
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
; B5 p7 f5 H7 |" B8 v9 P# x! |) m}
$ P5 P6 |' @2 F
7 U& j+ ]6 `: ]8 z) t/****************************************************************************/
- G3 e3 k* P9 L! j+ Z5 D! g/* */
9 R, T: r9 L6 }0 b& B7 G/* UART 中断初始化 *// F, N7 r" ^7 @ y3 Y# Q
/* */) o0 T1 W0 |7 k! U5 `- ~* F
/****************************************************************************/
$ V& m* ]. m6 A7 Evoid UARTInterruptInit(void)
# D' e( q" o5 Y) g/ W5 o, t+ F{$ M9 }, w- Y1 p
IntRegister(SYS_INT_UARTINT2, UARTIsr);
8 m/ ~( y1 e5 M* `- @+ P5 U IntChannelSet(SYS_INT_UARTINT2, 2);
! n2 F6 b+ Z2 c& T% g" b: q IntSystemEnable(SYS_INT_UARTINT2);4 M/ F0 f& T! g. {/ s
6 P" e$ T: S3 ?) s
// 使能中断
& v3 x" K ?3 t6 Q. V( w4 S unsigned int intFlags = 0;& J( s4 b; f e' ~$ Y, F- f% ~
intFlags |= (UART_INT_LINE_STAT | \
+ F2 m4 ]" _: u/ K; R0 { UART_INT_TX_EMPTY | \# i4 k% W; Y1 {; S: o/ M( |9 N
UART_INT_RXDATA_CTI);) A1 C P: ]" \, o% R
UARTIntEnable(SOC_UART_2_REGS, intFlags);" m4 R% P; ]* J& G( }0 M
}
' W& Q6 T) L I% y9 ~5 {, L5 a7 u* J7 h) o
/****************************************************************************/
& j l6 I: S1 y) L' u1 Q/* */; @* j- q1 c1 W; c
/* UART 中断服务函数 */' m# Y" }1 k/ E3 t6 U
/* */7 U5 h2 t9 n, k* T9 S/ c! U
/****************************************************************************/
2 k( _7 U. ]5 W7 z+ }+ O- ?. Hvoid UARTIsr()
& ~- J9 D% S: t4 k{) z3 [ W! X+ w
static unsigned int length = sizeof(txArray);
# v) U& k1 x% @' U; e& a static unsigned int count = 0;
& V# \; i$ s9 P, J0 |9 D$ G unsigned char rxData = 0;
% h$ h& h' `( y* K; g! o# C4 K unsigned int int_id = 0;% _0 l/ s/ p: y0 |( Q
' U& q3 ]8 g) M! J9 z2 d% _9 ?! u: c // 确定中断源. I3 R" L' |; T
int_id = UARTIntStatus(SOC_UART_2_REGS);- M r2 r, {0 ]$ t
- p+ u7 {% r) |6 z% a
// 清除 UART2 系统中断
& `; I" V) O" g Y1 B; J- ^' m IntSystemStatusClear(SYS_INT_UARTINT2);
& B* I/ f8 S2 m/ d2 u' R) N6 ?2 s* u8 u3 [
// 发送中断5 e3 s2 V) T M, f) S/ U0 e
if(UART_INTID_TX_EMPTY == int_id) p, J( s. Y3 Q6 |
{
. |9 Z4 E8 E$ p9 \# O$ r if(0 < length)' { u3 i8 f& a$ N5 R4 k0 S" g
{
. I6 q; [- K9 s5 v1 B // 写一个字节到 THR2 B6 m; `0 v7 d
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);7 ?( [4 D. \( {- Q% F$ o
length--;' t% W1 O) C+ ~2 l) z/ k( @& }% L1 t) \/ g
count++;! j; w/ j5 n' ^. y' X
}% X3 j" z- L1 X
if(0 == length)& [5 s8 l9 @4 O$ p
{$ m& H. W9 s, q/ x( M2 V
// 禁用发送中断; L, i9 z. P7 ~+ Z3 r5 r
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
( V& y9 H) m- T( ^9 v }0 {% i+ S: G; \, r8 e
}
$ I- x" J3 j! a. Y8 c4 s; T8 M- U7 r, \8 d6 {$ O
// 接收中断* l. F4 j0 R0 s. ^- h
if(UART_INTID_RX_DATA == int_id)
' q1 ^' j0 L/ Y5 g: Z3 r {: F, |* a9 y0 z$ J7 g' V+ H
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);) j/ x7 T3 R$ E' C
2 @: K. r, }' {) v3 n5 q; M UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 M1 ]! L3 ~, P3 C, X }
; j, n: t. n9 P: o# d& z6 e3 E4 l I. }2 I I% o) G
// 接收错误
8 i+ _6 x; V7 J7 N5 ]6 F if(UART_INTID_RX_LINE_STAT == int_id)6 Z' N; z ?! l h
{$ Z% |9 o E0 j0 u
while(UARTRxErrorGet(SOC_UART_2_REGS))
1 }! @& y' r* R! X# D8 A/ Q {- W3 P* d- C- o, M0 M7 U
// 从 RBR 读一个字节
. M2 |: ^: A5 G! Y! f UARTCharGetNonBlocking(SOC_UART_2_REGS);
- y. N5 E# Z' Z" c7 B% H0 q E% g }
, G8 y3 ^* D. T4 X$ T- U0 } }* [0 w# E2 O8 I- A2 ^' \6 c
9 K# k" G4 ~& u& o return;
3 g8 a# m j2 G# H! x4 M}! c" ^0 H' Z6 j& [4 W
|
|