|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。3 B/ f2 M" s% u3 e
; a+ E4 i- s( L/ S2 d3 X; P. D
#include "TL138.h" // 创龙 TL138 开发板相关声明
2 y+ ^, V$ U4 {4 @
# y; k- F0 B9 I5 b; | _1 O( a#include "hw_types.h" // 宏命令
. R' k9 \; q3 z; y+ m- ?#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器" g+ G7 q% x& ]6 _
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
: m, w% A4 v0 x0 h% q' t# t) K) r# X# e) n* K1 E8 I
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
7 F' M5 V5 W( W+ M& F# }, m- d#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
' ]; U2 v; }6 t% @2 P% m#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
% K8 l" X9 r6 q$ u# K. ~$ M: O#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* ?" [/ `+ g* D N* {
% o1 Q l2 @( c( B. h/****************************************************************************/8 X/ F9 a2 P# d/ i6 j* H) p
/* */
- D& |' i g9 @* i0 y/* 宏定义 */1 r& |7 T' h' ?6 T
/* */7 o! [- c( l8 z9 x
/****************************************************************************/; l2 t% l. Z$ H( d
// 时钟
$ @3 Z, Z3 i' s8 Z#define SYSCLK_1_FREQ (456000000)
) F, u6 y! I7 V2 \#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2); l# g0 I+ r# x4 H3 X
#define UART_2_FREQ (SYSCLK_2_FREQ)
& i$ [" k. h: b+ r' f& B* S# _' R2 N6 C5 ^. E" ~2 {9 Q9 V3 M+ N
/****************************************************************************/
6 L3 G# T& A' R% G' g/* */
; k: ]; Y) L! K/* 全局变量 */- N) |- f1 C7 P% E b
/* */# T, S3 P+ ^2 z( ~' D& o
/****************************************************************************/
1 N. a9 q) a' @# ]/ ~8 [/ s; g7 D& Jchar txArray[] = "Tronlong UART2 Application......\n\r";
4 @: | ~; r: i6 Q% W$ q) w- O* P5 h5 w7 u" K7 D" t0 y" b; q
/****************************************************************************/
1 T0 a* R; P8 b3 m' v/* */
1 l3 {) h$ s( r; ?; T: I/* 函数声明 */
2 h+ R- j5 |5 q5 j1 H/* */
) r2 Q- n5 e3 G. i* U/****************************************************************************/1 U4 f5 I! }$ j0 w! `" ?: ^, [
// 外设使能配置
8 P1 @5 \* W/ bvoid PSCInit(void);5 _1 X+ M! l b! o/ i
; G! w% m7 c( n$ }8 h o' {: ^
// GPIO 管脚复用配置; @# F. n& V: w9 E. k) ~6 L
void GPIOBankPinMuxSet();- b+ e; F5 q/ U9 }$ b6 }
0 k" H9 z) o1 i. Y; a; A
// UART 初始化
" K" A Z+ K, u! v6 ~) kvoid UARTInit(void);
c, Q5 n) j# |2 V; H. y: T$ w5 P3 C// ARM 中断初始化6 U; Q9 ]! q. Y( _( H# E* m
void InterruptInit(void);
& C9 k- G. D' a// UART 中断初始化/ W8 q6 O9 W2 p
void UARTInterruptInit();4 A* P# W4 K. N: ?: N
// UART 中断服务函数
+ U5 x6 U4 `; w- vvoid UARTIsr(void);
2 B; `- j0 h( i" s* v& D/ a9 s c1 C4 j* X! q3 \
/****************************************************************************/
) T6 d4 E# K+ X; k0 L# H/* */
6 O6 ~3 d& d. r y* V7 Q" k/* 主函数 */
) l5 s# r; T4 u( C! ?+ I/* */# ?4 y7 _$ c) Q0 `; C
/****************************************************************************/
$ M# ] ?# Y) w5 h6 Y3 Eint main(void)) v1 D4 {- M. q5 W- `
{
, N; z: J1 {8 q // 外设使能配置! g9 I; W8 Q) V4 J9 @7 |* {" s
PSCInit();/ z6 }) i* J& g) C) U% m6 D5 {
5 X" Z& {& p$ a7 K/ h
// GPIO 管脚复用配置/ a3 i; H+ K0 J
GPIOBankPinMuxSet();: ]- D" b1 u8 a
) I0 d& w6 h; d" ~! S9 U // ARM 中断初始化, M$ V- I4 ~+ F( u6 m- L/ @
InterruptInit(); V4 d; i o* [( V
& N: Z& M2 X4 P0 ]
// UART 初始化
$ L2 g$ Y& O& `+ ] UARTInit();* Z0 n( n/ B- [8 I% O% p+ o
7 W- C- S1 q& [+ {* |2 j // UART 中断初始化
9 C2 A) q6 |: s+ P" u/ h UARTInterruptInit();2 g4 V$ S8 j H5 Z' ~, F! o! r! W
! g5 y* }2 }7 h' A, G1 I // 主循环
# v/ j+ z' M9 P5 t& e ] for(;;)- d& p) ~8 Z) b9 Z4 k! Y& }2 \
{8 m! F: p$ M! y; m& C4 _& z
k1 A8 c3 M$ [$ D }
, k0 C. U3 A' z; h! Z9 |* B5 U% s}
8 \, Z3 h$ l+ t" W+ r1 \" i4 ` r1 V( u
/****************************************************************************/
& s4 F; f7 m+ L* B. [ O, p/* */5 ~' A" I0 _& w( v/ ^5 r0 _
/* PSC 初始化 */
r- y2 w1 F) W- l N/* */
% D5 P9 ~) F* F+ d/ x3 M1 B9 c/****************************************************************************/) G0 @( G, d9 ~, ]8 g
void PSCInit(void)
4 W3 p5 Z3 e1 H0 x9 j4 `2 f) g{
+ V9 [ W- N1 h2 \ // 对相应外设模块的使能也可以在 BootLoader 中完成' [/ ^) P1 m5 {9 Z) f" {1 Z$ |
// 使能 UART2 模块5 m8 j9 C) U$ j$ ?/ e/ R0 q' l
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
7 t) G; a1 `. X! F}
4 z; e- N1 ~1 ^0 d3 o6 }9 T9 j$ p, j& |6 K6 ?
/****************************************************************************/
+ e0 t1 L- Q, d1 ^; L% R/* */4 J6 h, x5 P0 X2 N
/* GPIO 管脚复用配置 */
: h# q9 j# D) h) Y e- P0 ^/ V$ O/* */
' i/ x2 _! w, t9 r' ~1 e" P; m/****************************************************************************/
2 V! T) F( w0 J6 D3 l! J: U; Nvoid GPIOBankPinMuxSet(void)6 \$ z; u( _* Z1 N
{7 `8 k/ H/ i8 z0 X) z
// UART2 禁用流控: W1 ?; N3 O& B# {% p1 A# [0 E
UARTPinMuxSetup(2, FALSE);# T; k( | J5 Q) `& D: u
}
3 \2 \. v, c) O. j; Z B, u) T$ q' ^& ]# P: R& D: g( X% G1 N+ O7 A
/****************************************************************************/
2 T# D9 w: ~. J% A% r5 y1 O/* */
, y, `0 T: V: y6 g. c/* ARM 中断初始化 */6 f0 y/ m, L2 {$ t7 T
/* */% W) x/ v _, `3 ?/ I
/****************************************************************************/
6 f1 V. G* ^8 ?8 Pvoid InterruptInit(void)
4 h' I4 v2 ?( @( I9 M* @{( T K+ K" |0 I, t( a, v
// 初始化 ARM 中断控制器2 M8 ^' i' d5 p% }
IntAINTCInit();
5 o v: S# h) M: q/ R# |& j7 Z
6 X! }- b x& g- N9 \: l! n // 使能 IRQ(CPSR)% L7 s4 g$ S- b7 _0 Z
IntMasterIRQEnable();
' q3 m4 q7 t$ n+ \' E& a) B! A. z. U* `/ M5 T
// 使能中断(AINTC GER)
G- \( h, ]. Z4 Z IntGlobalEnable();
8 c Q) R; { s: |" _0 R# \$ d
1 z* w4 ]; ?+ X4 P9 t& l // 使能中断(AINTC HIER)
' h6 m" R2 Y; @/ K. e IntIRQEnable();" o1 m. F d$ ]1 E% F( ~
}
, N( J' i; @$ j9 p% j' W6 y# T T: W5 ?9 q, U" G
/****************************************************************************/
# Q" o: e4 l, E1 c3 J5 u* x' S& e/* */
- ?# u4 _$ T: x: Q e/ | l/ O/* UART 初始化 */
e6 j g& G8 |+ u# c& R/* */
0 h. A% D% i/ {2 |6 ~2 T/****************************************************************************/0 U' M2 N$ N$ ?) D: n, X
void UARTInit(void)
; P7 G) k3 K( \' Q{1 R% |% ^1 u8 l3 g' Q
// 配置 UART2 参数8 \/ k5 A, T Z7 g2 C6 @
// 波特率 115200 数据位 8 停止位 1 无校验位
; s/ M' o- b% [. i7 I8 g UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
" o: m0 ~/ H' g3 q% o UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);9 }0 n. g$ a- E# u+ h! p- h
// 使能 UART2
# f5 v. a, `" R* p4 V UARTEnable(SOC_UART_2_REGS);+ G$ l( i' l) }" r, f4 b2 p
' O( @+ C& K; B0 L( F' v* c
// 使能接收 / 发送 FIFO! I2 N, k0 E7 h. a
UARTFIFOEnable(SOC_UART_2_REGS);
( L% O2 `# h* Z: j: g
5 W% Y& W4 l2 S( E6 v3 v8 k) E6 Q // 设置 FIFO 级别
1 M4 b- P4 }' x5 j* [ UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 `. m( O1 P/ i8 y4 Y0 ]+ a} T. A( I+ C3 R7 l
& A' R" |/ c) s. p& b
/****************************************************************************/" q1 Z/ Q0 v, K
/* */( T5 `" F$ M! g1 a, I6 D' `' ?
/* UART 中断初始化 *// b; x5 {) s4 R- P$ [& |. ` G8 q
/* */
/ U) C( K% S* x- r3 O/****************************************************************************// I! F3 a: i! z* ~
void UARTInterruptInit(void), \' O% [( e" U' c9 a9 o, M' ]
{
, f2 M4 b6 Q" E/ ]7 N0 O# M, `- ~ IntRegister(SYS_INT_UARTINT2, UARTIsr);3 c; K) G y$ p
IntChannelSet(SYS_INT_UARTINT2, 2);
$ X: E" {( u8 S6 P1 L IntSystemEnable(SYS_INT_UARTINT2);( ?2 ^) e# l7 N# F' V% s) D. q
) u/ h4 o/ e& e4 p- B7 c // 使能中断
0 {6 Y- A& J" h" Y: e0 _ unsigned int intFlags = 0;9 Z: m$ @8 t* A9 x) \
intFlags |= (UART_INT_LINE_STAT | \
5 {* K3 d; F- V* G! x, ~' P UART_INT_TX_EMPTY | \
* e; h# q2 ~; l; C2 c: y4 D UART_INT_RXDATA_CTI);: A7 B _. o( p. B1 p6 O
UARTIntEnable(SOC_UART_2_REGS, intFlags);+ c1 b/ i" I- w" \' s9 c+ V
}
* j/ e+ f9 E: f9 o
' o/ ?0 N A- h; Y5 J$ F8 n/****************************************************************************/) }6 `5 @! H' F1 @; t
/* */6 e7 {: K; ~. v- b! q
/* UART 中断服务函数 */% H" X2 {% r! b" [9 z) Q% n
/* */# d" i f: w; v0 E/ c/ n: l
/****************************************************************************/- l0 g& c' i, \ x4 q, O. s
void UARTIsr()
1 R% r5 s6 f' W ^{2 b/ X3 u( }# x, S# o; S6 Y2 |
static unsigned int length = sizeof(txArray);* L- |# t* A& }& O" c
static unsigned int count = 0;
9 c4 d3 W! F2 ^ unsigned char rxData = 0;
% }, w! T' l3 ?% N+ N3 a4 g unsigned int int_id = 0;
+ i) F7 p! S, |1 H5 G* j- O \9 i3 m8 \
// 确定中断源) M8 i; k1 ?* z% M
int_id = UARTIntStatus(SOC_UART_2_REGS);
% @( v; K4 X' m# V2 W. }* M, K, k
( E; ]2 J: s. ~3 L8 i. U // 清除 UART2 系统中断
7 [! w _/ [' O1 ~% @% ]0 a IntSystemStatusClear(SYS_INT_UARTINT2);8 M2 N9 b- e2 J) H- W$ `2 X7 y
% h4 Z5 x2 j' _! \
// 发送中断 I! D6 j% W6 i) r {
if(UART_INTID_TX_EMPTY == int_id)
5 A$ \6 x2 ]. L6 D; R: f {
# G, B- Z2 ?7 _8 |$ Z3 o2 ^ if(0 < length)" f3 p m4 J" I, Q* T
{+ V7 `5 z' [; ?( C
// 写一个字节到 THR
6 g( K' L. z5 \ UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: [' ~3 E! `) n4 Z6 L! I
length--;
% i; J- j1 k: S# c, s count++;1 \. i. F3 [+ n+ J5 ]9 \9 j& T" b
}% Y+ U: p6 t) p, c3 X Z
if(0 == length)
4 i" C, ?7 K y; i {
; M% ]+ {6 j6 T // 禁用发送中断
& `; g8 E, Z' Y) D" s UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);. o- R' f, K) \; T+ f
}
! k9 L( r7 S, b! _9 w }
5 b2 J( m) D- T. \# g+ n' B& r8 K! }/ k* p3 G
// 接收中断5 A" G# B, ~4 _! B/ y1 v$ r- q
if(UART_INTID_RX_DATA == int_id)& W7 x) g. o! ?$ R
{8 q' t0 B( B# w) e; E
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ @: J; @: ^$ P) d: |. @
3 [, _4 V/ t+ ?8 ^6 J UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
! u( }) w7 ^* S0 |# C$ L. ^' T) c }8 M' C0 r' n$ C$ j% p
4 l- O' a& {# G
// 接收错误( j! }) L8 e0 ?8 c# m$ P" Y
if(UART_INTID_RX_LINE_STAT == int_id)) N8 ^9 g3 S2 L. x1 `- l
{
9 y; e3 k# U- e& e6 q9 T while(UARTRxErrorGet(SOC_UART_2_REGS))
. c1 e0 p+ p S' J" h9 @& N {3 x- z" ]3 J0 [
// 从 RBR 读一个字节
) q! t/ J! E& W UARTCharGetNonBlocking(SOC_UART_2_REGS);9 W. ~) a2 {9 i
}4 j6 b$ `! U6 S1 N
}3 d. B! _5 f. J$ _: U
* K# d v; h0 g& d7 \: ] return;
+ Z! \) s. P2 I& W6 X}
( ?/ g% Q5 U" i }9 C) V |
|