|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
' j1 c# K5 Q, d o9 l- d) q$ z
4 r% I& v2 y8 I& |5 G#include "TL138.h" // 创龙 TL138 开发板相关声明
: u0 t4 z9 ]3 N4 h1 b3 [3 y4 i4 t) ^$ i# L6 g4 w9 f- y1 t, ~! p
#include "hw_types.h" // 宏命令
7 _: K% _0 |" M. A$ O/ G/ j3 m#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
5 Z( J) O2 E/ Q# Q9 \" P: Y#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
, ?" b' r- [" E7 v R1 B4 Z7 s \: l ~: K6 M* h5 R1 g' r* Y1 w) q% \# f
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明& a; t0 y% ] N, U' b
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明2 M" P# t/ J+ C) c1 @, A) @4 j
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明. Y) B# e6 r5 o3 [0 C& K7 Y
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ ]4 _) i E$ C( j/ |. A, Q) M
' }$ p* Z& h, h E/****************************************************************************/
( @$ e3 l4 b$ B ~/* */
2 F; y* m! U. q# u/* 宏定义 */
6 q1 j9 ]/ s8 E. S0 E; n+ ~/* */+ X+ `. q( L1 v0 D; a+ l( W3 b% a
/****************************************************************************/
4 c- V6 f2 I3 Q% s// 时钟5 t E |% Y" ]8 D4 ]2 ]
#define SYSCLK_1_FREQ (456000000)
& h" z$ ^1 ^" h) l# z#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
8 b. t( V+ R- V% r2 J, \0 ?#define UART_2_FREQ (SYSCLK_2_FREQ)2 k8 T0 V6 |. U/ @/ W
# G" o3 q, j( g5 V
/****************************************************************************/% ?: K6 d0 d( }! m2 ^# p) V
/* */4 [8 v' u/ L0 u0 b5 k0 F* ?
/* 全局变量 */% \6 c! h J0 T; U. k+ O# z3 @
/* */# e( T( f u( |" K
/****************************************************************************/
8 O, m9 v& U7 q/ T9 m+ u& Schar txArray[] = "Tronlong UART2 Application......\n\r";" e' r% L2 u. F
# v7 W1 `! x3 R# S" }5 u9 i# p' c
/****************************************************************************/9 }3 \- u" ~4 i" F
/* */6 |/ c- u" s1 s$ C( u% @. L9 f
/* 函数声明 */
" g8 Y+ a" k! G5 D/* */
, e8 Z, n; Q3 h" c( h7 b/****************************************************************************/+ S% k; S, H+ F8 v2 G
// 外设使能配置
- S* W5 s- l5 C7 [void PSCInit(void);
. S- J% g5 {1 K( c! `! i( I" p/ I8 F- s
// GPIO 管脚复用配置
& c! [ F* u1 ]2 m! S* dvoid GPIOBankPinMuxSet();* e: q( \8 ^, c7 _
) E$ L7 N/ Z6 {! |$ ^
// UART 初始化1 u( l& Y6 g! R, f; x, C
void UARTInit(void);
. D, H/ \, F2 c" E% T8 x2 |4 g U// ARM 中断初始化5 k& c/ [' v2 V7 u: J4 n, I+ r
void InterruptInit(void);
/ Z3 `% b! U2 J, Q. T// UART 中断初始化
" n" B9 R) b& ivoid UARTInterruptInit(); a6 V% N# Z) Q+ h) J
// UART 中断服务函数/ x; l( ]; ^! T+ @& p
void UARTIsr(void);
2 d1 l' A2 A0 n* I* X' e; F, w3 A6 q) k) a& r4 D# ^$ i
/****************************************************************************// m% K r; b A; ?! X
/* */" s3 L e" u) J3 e; q0 Z, x
/* 主函数 */& v6 T- o- t9 T/ d* ~9 g, z
/* */; [9 C; V! [' K& T
/****************************************************************************/+ I+ b! G7 E! q
int main(void)
+ t$ C) G% [& T. G3 {. A{0 q' J) k& z- L$ `* n/ M% l' |1 m
// 外设使能配置% O% Y( O& M6 N& c, G# e' F* ]
PSCInit();6 f! a2 e; H% P
+ j8 y7 g T$ K0 `( y // GPIO 管脚复用配置
1 y! V5 X% r/ a2 y1 \, k GPIOBankPinMuxSet();/ C* n! x1 f1 U5 X0 W0 b! @3 Y8 h
" r2 u( t7 g) j/ c6 D1 j% U! X // ARM 中断初始化
7 p0 E9 @4 \2 K4 @8 ]# W R InterruptInit();7 o. F5 q9 N( t5 E
; G2 R2 s# u9 [
// UART 初始化
- q/ o5 @4 J$ e7 E UARTInit();
6 m4 e' |' P: m
5 U: s, }6 O! j; N! i6 q0 g: N // UART 中断初始化
$ f( p6 W. j4 s6 S0 s UARTInterruptInit();
6 G! {6 {% ~8 \, t! [7 O, ]
2 P+ n) ?8 C3 {+ T f" u# f // 主循环8 l( @- X$ w6 v& |
for(;;)+ G7 i- { n: P8 r; B* ~- t
{
9 r1 H% w7 j5 j" u# W2 Q( f8 M
8 _9 F! v# Y5 G" b0 J }# M/ l# \0 N- Q- O( E$ }
}
U% ~# d7 [2 m- H4 c$ x, Q, g% T3 B$ g1 s @# {( d
/****************************************************************************/
- ]2 Z$ `/ ? B) K9 E/* */
5 `' U; S4 G; x0 a* ]! \2 _. c/* PSC 初始化 */
3 a, X2 J V4 j. I$ k/* */( x# n3 |+ I$ [/ F4 Y2 p l9 u
/****************************************************************************/
- T+ f' {3 e& C" X% ^5 G% N/ wvoid PSCInit(void), c5 r3 k1 @ ~- ~: c
{" V n& ]$ ]& E+ ?- B! C Z/ D
// 对相应外设模块的使能也可以在 BootLoader 中完成% Q% @ X. y: @: x9 G; f
// 使能 UART2 模块
! J, E2 E+ k0 [/ M/ w PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);$ G% x7 i8 w5 `& [! n0 R, b- \
}
, W2 N; V: @( V4 m# K0 {
+ M. I8 f$ {; m5 [( t/****************************************************************************/
' { q: N C# T/* */
& N% [, ~, n6 c, ~- S/* GPIO 管脚复用配置 */7 `: n: A8 ]- C) Y
/* */
5 `# ^5 B& {6 M! p; Z/****************************************************************************/& s9 o' f: r. _8 F% [
void GPIOBankPinMuxSet(void), C8 A/ V+ z/ m& d/ s; s4 B
{
% e& J% x& f K x) n4 ~; T // UART2 禁用流控
# t% c! b( J1 q3 t3 u! y8 F UARTPinMuxSetup(2, FALSE);2 ^% n/ O4 {. s5 Q- q: J7 b" c, l
}
2 H6 D8 B1 o/ j. N. }
( u4 h) P# Z/ N3 S/****************************************************************************/4 J( D7 P4 V5 r& }/ K1 D4 s- c2 M3 X
/* */6 j" I2 \% i* f( l8 v6 T
/* ARM 中断初始化 */
Y3 a# R! p5 F% Z$ u- [3 u/* */
3 F# U3 p, i! _1 z( ^1 D/****************************************************************************/- e5 b1 N9 P( L, Z) X
void InterruptInit(void)) Y' h/ S; G! B# P2 C/ S
{0 h! z6 q. W6 I1 M: M1 H
// 初始化 ARM 中断控制器
3 y' |# ]' \3 c/ U IntAINTCInit();
W5 M4 | n( L* ^+ H, W) v& V
: R1 J6 E. I) i! }# }* ~% _ // 使能 IRQ(CPSR)
# @: N5 _$ m1 Q" Q$ N. G4 }& _ IntMasterIRQEnable();
& m" k0 S V9 |! s& i2 w4 B: H8 [; X0 w4 f* \" v- P0 j! B1 ?- N
// 使能中断(AINTC GER)
' \7 U; Z* H% {1 \ IntGlobalEnable();
6 Y7 f$ @ `/ _4 h
; {: ?" p* Y; K0 ] // 使能中断(AINTC HIER)( Y: S t* l; x# w
IntIRQEnable();
6 a+ X, M7 m; e8 u9 T- f5 g. p6 ?}
9 H3 j) n# N) D
8 H# I( }9 O9 ]6 n% j/****************************************************************************/
' ]! r) ?3 r- ]' ]6 t' n/* */ |" ?4 j1 R' q5 t1 s0 V
/* UART 初始化 */
6 |2 e0 I# ~" y3 s# ?( D7 J* _0 l/* */6 w8 Q; q1 q% D, r4 B. O7 g
/****************************************************************************/
4 H5 I, y$ J# z6 V: ^# U8 L/ G. vvoid UARTInit(void)3 d, {( S# ?% F9 ~0 r' q) o& i! C
{
0 p4 {1 V" f6 I9 \9 ?7 l7 y. c5 _3 | // 配置 UART2 参数
' Y9 Z% S0 O2 k, U* J4 S // 波特率 115200 数据位 8 停止位 1 无校验位8 n9 m# {# ^2 a3 O% S
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,. d3 s9 M% g: R! }- `' ?8 c2 S6 i
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- m% r7 D# |- o. c5 B7 L: s
// 使能 UART2+ A% |; `; t# C3 \- K9 f/ n; [
UARTEnable(SOC_UART_2_REGS);
. G D0 c" z; Z" f' p N6 R2 T; B1 Q" f6 ^
// 使能接收 / 发送 FIFO
/ d. g! i ?) k7 f! u UARTFIFOEnable(SOC_UART_2_REGS);
6 E. H( @& a4 n/ H3 J/ h" E4 v, _7 }+ w T1 g3 c, d( u/ d
// 设置 FIFO 级别9 ^: F0 t% z: k9 J
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
+ I2 u8 C& I2 n5 y}
* _+ B. M j, s" `
$ i- m; _( `1 L" |5 D/****************************************************************************/7 _$ E. Y# X5 H m, o9 d- o
/* */- ?) E" s3 o! G2 Z
/* UART 中断初始化 */
0 m0 E; V8 _4 `& E B; f. n8 W' E/* */
( x6 U: b& V9 n. ]! E3 E7 M/****************************************************************************/% t& z, m! {5 a8 u* Y: E* \
void UARTInterruptInit(void)" w# {6 G4 O' Z
{3 v$ m( `% ^: n6 g h
IntRegister(SYS_INT_UARTINT2, UARTIsr);
. U# k. Z' A# z) H8 k+ g IntChannelSet(SYS_INT_UARTINT2, 2);2 O( Q( ^ L$ e- Q9 H' J- m+ T
IntSystemEnable(SYS_INT_UARTINT2);
1 V0 ]( E8 f2 ?1 y4 `6 A) p* G& c2 g# H9 o8 p& N$ M6 L# m. h
// 使能中断1 U* Y9 ]0 R3 X' [3 G: R) O) R
unsigned int intFlags = 0;
0 S w0 _& x3 O' ? intFlags |= (UART_INT_LINE_STAT | \+ N& e$ R% I Q8 m
UART_INT_TX_EMPTY | \
9 N; C* R" u5 ` UART_INT_RXDATA_CTI);% m3 N4 m4 H- B- S
UARTIntEnable(SOC_UART_2_REGS, intFlags);1 o. E* H7 v, v+ X0 v+ x4 b
}
! x2 w3 ?/ F6 u- ?$ [: Q+ V$ M% }
/****************************************************************************/9 d4 h/ f9 a2 x/ _% }
/* */
' ]4 ^7 |+ x1 h k- [3 P" @, R/* UART 中断服务函数 */6 K- ]& _# _( g; i! e, W: W
/* */
* @! k; ^. n9 \! _; h/****************************************************************************/& B: A. \- l6 v7 S3 w0 H
void UARTIsr()
2 `1 N: L' j' @* _0 |* [{
4 k# H/ h+ o0 i1 x1 y/ C static unsigned int length = sizeof(txArray);2 H M. J6 p4 z5 y- s6 g
static unsigned int count = 0;4 q* n. q2 ~, d0 |, x% J
unsigned char rxData = 0;$ L. e! D$ O1 s! b" ?' Y7 P4 L8 h
unsigned int int_id = 0;
1 d% {+ _8 G3 i+ F
6 f2 H9 g( G5 H- r Y. j // 确定中断源2 s, _; O# C5 r
int_id = UARTIntStatus(SOC_UART_2_REGS);
! z3 d* O& P5 G$ s! g1 ^
; O) a% Y7 q( G ?. G0 R: U // 清除 UART2 系统中断. K5 Y; I! j5 b% h' E* t; M
IntSystemStatusClear(SYS_INT_UARTINT2);, l8 n$ Q, v g# G- c- |$ [9 \
4 F% [1 I6 G( X% o$ P2 Y5 P
// 发送中断
' m3 w( Y7 c! d if(UART_INTID_TX_EMPTY == int_id)
1 o+ m' w$ Q9 Y5 a1 A {2 q% r% Z1 a2 F2 R( L
if(0 < length)
7 v5 H, Y: N2 I7 J$ m2 ~7 E- q {- V6 U. q x# S% y N
// 写一个字节到 THR
% V1 V* a4 M, O UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ C: P0 c( n( F: y% j# J. E/ V length--;) p% r! `$ M# w
count++;# m ~, n# f: B( ^ H0 v5 }* Y
}6 H6 O3 Y6 c2 m; N+ U3 C: {1 N
if(0 == length)
: r' ?; u8 j1 y {( p# m+ N& ]- p9 v0 f! H, b: l" P$ J
// 禁用发送中断, G0 U" \/ F; ~, c
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 ?3 S: e2 P/ q; \! V
}( V- w; D9 B C* M( B
}6 o7 l4 B) O* T5 @
' p5 |+ E& J: v
// 接收中断8 w/ m4 g$ G) U) C9 @+ D
if(UART_INTID_RX_DATA == int_id)7 T+ y) `# k. ?- k5 o
{
1 S* `/ P0 ~# H* Q! R7 t# k rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 W% j) s) p5 H: ~) N. K: X; F9 p" D; [/ J4 r2 _4 i
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 W/ ?& b+ ^ [( q1 b7 x5 ]4 r
} V% `& ^2 D0 o7 P3 P1 }6 J
% Z0 ~! @1 K4 a% C! P0 R // 接收错误2 F$ ]9 E5 Z- Q: H$ n1 P4 @" S
if(UART_INTID_RX_LINE_STAT == int_id)
* N' K1 j: C" R; x, H+ N4 H( T: W {# K/ d, Q! `* D' e! \/ N
while(UARTRxErrorGet(SOC_UART_2_REGS))
3 d% d% t9 y0 W9 Y* d {
* _; f; P' v+ V, G8 \) e/ k; g1 M! J // 从 RBR 读一个字节8 }$ Y4 T0 l2 P8 w
UARTCharGetNonBlocking(SOC_UART_2_REGS);( l+ R. x1 S) U3 x4 [
}
2 h6 W6 F$ N+ }, s( k }9 p: I& z1 E- y4 h* ]
: S) D" C! v6 Q |- M+ i
return;" _- [1 @; a5 x0 K; H
}
U2 |7 G+ W4 T5 H8 s9 j6 j |
|