|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
( N1 S) e x1 k7 _; {9 Z% u
' j( o9 W! k% j#include "TL138.h" // 创龙 TL138 开发板相关声明" h. d# B) P" t
: R! h0 I: e8 P5 o0 O4 b6 I
#include "hw_types.h" // 宏命令
" S- b: S0 ^! I( S& U2 v/ N#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 R0 ]. D+ d0 g#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
, r. u6 ?9 d; q6 I. ?' V; X2 a5 }7 a r
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
+ C" H( r' n! }! U& t6 h#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明/ Z9 c( w8 E& v; w; D0 Q
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
5 J' q) A6 j8 \6 H0 d Q#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
. k) L! P" N: P/ F b
5 W' f4 Y' f. K7 v) b/****************************************************************************/
v5 d8 x; M; F/* */
& `9 `: A* L: k+ V( J7 R/* 宏定义 */. b. K/ }7 ?) M
/* */
3 u. v* [; i% d8 [9 Q. d E4 V/****************************************************************************/
/ X$ w6 f$ h+ `// 时钟7 n+ Z) W L q2 W+ e- d7 X' D
#define SYSCLK_1_FREQ (456000000)
* U. C2 q7 J" n( O4 r4 p: ]& W#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
8 L7 ]$ t+ `3 G% R+ I2 K6 @#define UART_2_FREQ (SYSCLK_2_FREQ)
8 i( n; P6 U; k1 r$ \' O, L* q! x0 @. g- _$ _
/****************************************************************************/
4 x# z; ~2 F+ _& x* s/ g/* */
& I( _) o0 C; E4 Z) C5 ?3 X: F/* 全局变量 */1 u% U3 z# t" t$ [7 Q0 z
/* */
, d7 G7 Y ]( H* @/****************************************************************************/
4 _* R3 z1 k5 b" ychar txArray[] = "Tronlong UART2 Application......\n\r";
1 a: g! _! T5 U9 W: u7 H
1 m6 W$ f! Q' I/****************************************************************************/
- j3 U* Y3 K9 [% o& Z/* */& c9 m! f5 o, [) z6 f
/* 函数声明 */
/ n% V( n; Q0 K5 j* q/* */
: ^% q/ @2 M" t& ~+ z/****************************************************************************/2 k6 M' v/ [4 G2 y+ i1 T. R
// 外设使能配置
: i6 v& O. l2 \2 |void PSCInit(void);
5 W* Y$ }" d. Q' W' ?4 ?9 i) N% V% k6 v ?/ l4 [/ G2 w2 `9 w" B
// GPIO 管脚复用配置* T! U8 \9 Z6 T( m
void GPIOBankPinMuxSet();
5 B6 Y n5 p {+ v, K& P, J$ m, C2 t2 _0 c# a7 ~
// UART 初始化
6 t, B" n( u- q4 j9 f1 h8 ]3 `2 x* Wvoid UARTInit(void);" e3 r5 [ ?7 f+ y6 i% ~% G( r
// ARM 中断初始化
0 Y: u* U' L5 |9 F1 w. Avoid InterruptInit(void);
- l7 }5 S' W# b: V. S! m' j// UART 中断初始化
; L: T/ g9 p3 d5 |: T, Kvoid UARTInterruptInit();' d+ l8 g% g5 r+ l) o' |
// UART 中断服务函数
4 s7 H; D) I! G4 ?& zvoid UARTIsr(void);
2 }1 w0 h ?4 e: v( U& U2 ^" f9 j4 C
7 Z" W) _, n7 L) a# m. @/****************************************************************************/
c4 Q3 \! c% J! E# R: U6 b! T/* */5 P! x+ W) m2 p/ r" r
/* 主函数 */6 Q' t1 e3 G8 q% d: `
/* */ a N" j9 }/ y+ `9 i2 \ D" Q, d
/****************************************************************************/+ _2 x: D' x& A1 a" o
int main(void)$ Y5 A: ^" A9 n0 Y
{3 m) q( P2 a5 v" O6 k
// 外设使能配置4 H1 }( n! d; t7 B% G- K6 E
PSCInit();# a: Y7 k# \: u9 p. K2 U# Z8 A$ x
) N) c/ l# O/ l' q // GPIO 管脚复用配置- w2 J7 Z5 W5 ^6 P: N6 T
GPIOBankPinMuxSet();# R* _& u3 A$ H) B0 M
# b. }1 I o$ I" Y& y# g: D // ARM 中断初始化# z1 i1 y/ {" N- l
InterruptInit();! Z/ B4 }- J# B$ m4 |# \$ N. ~4 V
M! x- k8 h' a9 \& w // UART 初始化
m9 m9 r4 C! T" N UARTInit();6 \# g z0 _8 |/ T
/ a9 L/ z0 M( c3 L o3 S0 `1 U: r
// UART 中断初始化
8 X4 F! O8 U) G% r$ v3 {/ a UARTInterruptInit();/ M R3 p" V6 T" h- {
% D; o( e/ ?: G
// 主循环3 e6 }/ i L5 o8 D
for(;;)
2 O: z3 s# Y, G* f$ l {
5 \; H1 A0 X0 ` m0 N5 P% K8 x9 w D+ L8 Y# U0 D) x
}& k" R8 N1 A7 o& V1 F K
}
5 R7 e0 G7 p& c: {& O6 X5 D* {8 v% S" j4 K$ P" o8 `# b. L" i
/****************************************************************************/
3 r6 S% j, G( H* g9 C/* */5 n7 }8 b5 r* c. R7 c9 V& b
/* PSC 初始化 */
2 [2 K& [7 X# q, p6 ~' g: |/* */
2 r7 U2 j7 i! e) B/****************************************************************************/; d* I L/ R5 t0 H9 N" P
void PSCInit(void)( v4 y( Y9 q- c' A2 O1 p
{# I( H) |" e9 B. N4 f
// 对相应外设模块的使能也可以在 BootLoader 中完成
; t! ]; o e0 `! d, X* X, A // 使能 UART2 模块
; P( _/ o9 B, \0 Z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);. A- H0 K: V# o* t( x+ j- y2 N
}- d0 i) X( H8 M1 u9 @5 b
4 m: @5 i$ ~/ |) \) x7 r2 P+ N
/****************************************************************************/
2 w3 a5 {( ^1 p' m% G& O" P/* */
3 |$ I0 r& g" A3 p0 G8 w' I/* GPIO 管脚复用配置 */
% o1 s' K" R Z3 Z/* */
4 u. h! ^& G! ~) O/ a4 J" g2 {7 g/****************************************************************************/- _0 k4 [" U) q5 v3 L @2 D
void GPIOBankPinMuxSet(void)
; t+ e- P+ ~4 V& x W, ~{6 I0 n3 I6 H, X- ?/ q0 W
// UART2 禁用流控
$ v$ ]+ ~( i! p/ c7 p UARTPinMuxSetup(2, FALSE);; A8 l5 h+ t* J2 b
}6 \9 o5 W; M) Q
! T- w5 A) Y- H
/****************************************************************************/8 ~! O3 D+ g4 ]) Q/ m/ G
/* */
% h9 P" @6 ^8 i/* ARM 中断初始化 */
. c: P' j) {* O2 Q% G/* */
! i ~* c { ]7 B) v7 g4 N/****************************************************************************/- _% Y# u! B2 E9 D# [$ U; E+ l- x
void InterruptInit(void)
, N3 n7 ~( j4 h" t0 Y/ i- |% _2 u" O% L" v{
9 L# j6 U+ b+ x& N6 p* w // 初始化 ARM 中断控制器0 b( i5 Y5 i7 i' K, a6 b
IntAINTCInit();
6 H% m! M* k y6 ?8 `$ Q1 I' ]0 V/ u2 |5 w( j) S3 D2 f3 `
// 使能 IRQ(CPSR)
) H6 \5 O/ s4 q. K# f% i IntMasterIRQEnable();
) ^* Z a7 y& a+ E6 \, n2 B* `7 ?4 ~
& j6 v+ Y! j, v7 M8 V // 使能中断(AINTC GER)! F. k+ g7 w8 h: I* I, l! h- w* ?
IntGlobalEnable();
! \" Q2 i" v2 B8 l; C) I* r8 S/ P- m+ v1 Y8 p: i
// 使能中断(AINTC HIER)
! N9 W' _" d) F( U; q IntIRQEnable();
% E- i6 @) P2 _7 Q}
7 O1 ]1 D$ \0 A. X; s8 `+ Q
: L3 J" C4 V1 R, d" y/****************************************************************************/
, u/ ^1 d* F1 a. o3 f& t9 j: s/* */
3 N; N' |- p0 Y9 n/* UART 初始化 */
% V+ O) n" A/ q0 `# V/ ?) I- y/ T8 @/* */
& \# X: K2 _: q) C/****************************************************************************/
) s# o' _: d9 }5 }: Cvoid UARTInit(void)
7 U7 f, J- D& j6 r9 x{
) t7 t) ~+ g. h2 P // 配置 UART2 参数
) c9 ?; V; c/ n# }$ i // 波特率 115200 数据位 8 停止位 1 无校验位8 y8 F, ? J. N& U1 E
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
$ W9 B# D/ x; p" D; J UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ F! T+ S" L1 Y; D9 \
// 使能 UART26 R2 M" g& z. K% s
UARTEnable(SOC_UART_2_REGS);1 j( d$ m0 |) T9 N+ I. i- |& T ?
/ Z7 D' W" Y+ B9 X2 p8 j // 使能接收 / 发送 FIFO) I" B" C% j5 E G+ \
UARTFIFOEnable(SOC_UART_2_REGS);5 |. e A6 C/ ^ m. ^: m3 U3 n/ P
) n4 l7 t3 Q8 N9 ]0 o3 h h // 设置 FIFO 级别2 t* @. W9 } c8 I
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);1 P5 e+ I: S$ \2 i8 K
}* C8 `4 {! G( ?
- c3 l; K f( y& z: M/****************************************************************************/
6 Z9 ^3 q" a* @2 {& j" Y/* */; ^1 _3 x4 X' \% z O0 n0 E% K# F' ~
/* UART 中断初始化 */
/ ` e# w% ^" ^+ P/* */
2 N' u5 I. G( M2 C7 V9 z* G/****************************************************************************/4 h' G' l' z" p0 m' l
void UARTInterruptInit(void)/ r# k% n" T) g9 T: D
{
" d# P1 ?" |% _. t+ ]( k7 X- s IntRegister(SYS_INT_UARTINT2, UARTIsr);4 c7 R2 f! K; N4 A8 H u" N9 R, ^
IntChannelSet(SYS_INT_UARTINT2, 2);! f. b1 @5 L2 ?* S( s1 m _
IntSystemEnable(SYS_INT_UARTINT2);
8 b" q/ E) M) Q$ h3 d+ b3 E/ z+ N6 G: U+ Q( T7 ]# F1 O
// 使能中断
1 x2 o7 v2 U$ Z/ j unsigned int intFlags = 0;6 T( b0 d$ O. q& S ? M! G2 h$ F
intFlags |= (UART_INT_LINE_STAT | \, \4 l, M% q9 v8 ?# {+ t4 h- q
UART_INT_TX_EMPTY | \
' x) L' g5 ~6 E* P" ?4 w UART_INT_RXDATA_CTI);
5 {+ y. s) q/ d" O" e7 Q [ UARTIntEnable(SOC_UART_2_REGS, intFlags);
7 p! B" ` R% T m4 i}7 M) B/ }( M7 \3 @
5 Y- U4 [4 k3 Q/****************************************************************************/
5 ]2 t! o8 N5 z/* */& ]1 _- `1 S$ B: z" w
/* UART 中断服务函数 */
& ]& F+ L1 s8 t7 ?/* */
' G5 Y* u% G [( ]. o/****************************************************************************/
2 n7 K+ d' Z6 ]void UARTIsr()$ x6 A- c/ e ^' k' ~; n f
{
% J# I) ?; I' v' B static unsigned int length = sizeof(txArray);
5 U; X1 E1 L: O/ {/ _# c static unsigned int count = 0;
) c* G5 {+ t1 u9 f- a7 R- Z unsigned char rxData = 0;
9 t% q5 _" Z7 Q. Y% u unsigned int int_id = 0;
6 @# k. [. |$ H
2 {4 E: h8 p# m% u0 J // 确定中断源
2 F: @. b% @# }/ b8 ~' q, J int_id = UARTIntStatus(SOC_UART_2_REGS);
1 h2 h' @9 U7 j1 [) c+ B. y: S1 x% I+ L) `9 C; G4 N; S* v
// 清除 UART2 系统中断+ a) j: m# {1 b# B& t4 ~5 z
IntSystemStatusClear(SYS_INT_UARTINT2);: Z' ?& ?# y, v5 i
' q5 T) q" ?0 O
// 发送中断
5 |" k B5 p9 v1 y6 d if(UART_INTID_TX_EMPTY == int_id), w/ ~: D# Y( I4 q
{0 v/ f2 j/ ~1 t: ^* S, `# K
if(0 < length)+ n0 S) G* K1 o3 i
{+ {" f" S2 b! x$ e5 z
// 写一个字节到 THR
4 b, y8 E2 ~8 Z( q UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! o& A; g: U, |8 R( [% q1 |; Y( [ length--;# }+ p5 w* J+ n1 q: b* |; \
count++;
9 M1 D2 w" p& N0 D. y }
4 I5 ^* V! @9 w5 [1 P7 P if(0 == length)
" @* o6 J. N+ W; U0 F# O5 K) v8 }8 H {
% a" y) d. g! d' U) P // 禁用发送中断3 A Z) l8 @4 \6 Q! b( }2 Y
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);: \; V' o( i- o9 F2 @ E
}
# H- ?: Y" N& \6 k }3 ]/ W! o# K: F4 q+ p; _
' x+ d% h0 T3 g+ i# Y
// 接收中断
1 _" J, v& Z" n4 M. h, U9 n2 H if(UART_INTID_RX_DATA == int_id)% l4 p( G( j5 }0 C8 |/ z) P
{
0 V3 Z5 N; g& n0 C' I rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);' y+ b5 F4 }4 F- _( C3 ^
7 p' ~1 X4 \* `* r" F1 p5 H" Z2 E
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 b( V3 u1 W7 Q }# t1 o8 b9 ]# ]" h9 f9 A5 ^
, t5 _ G* J) u: k5 ^
// 接收错误
$ Z9 D/ ~* Q: G( ^. b* Y4 e5 O if(UART_INTID_RX_LINE_STAT == int_id)% _7 I7 a3 x) ^; g( _ o8 i2 `
{
3 e7 F3 W2 b# G; J5 Z. ^ while(UARTRxErrorGet(SOC_UART_2_REGS))5 f1 M; h- u" O7 @. z, a1 B, B6 D0 ]
{7 x f' U3 _# m+ j* ]( L
// 从 RBR 读一个字节; ?$ p# ]2 V4 Q! C4 M4 P/ h/ t
UARTCharGetNonBlocking(SOC_UART_2_REGS);8 B2 ~( Z& x1 e1 E; A: z
}) a& M; _7 U0 d
} D0 ]: W- | o# Y0 |
9 T9 P* K+ L. V) S% _+ _/ W
return;
7 ]; U5 W5 O1 W7 P+ N0 b}
! l+ P5 ]: T. | |
|