|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
$ h8 w8 t X6 O; Y( R& _. M, x
& f# z; ^0 R( g W5 F! G, u#include "TL138.h" // 创龙 TL138 开发板相关声明1 O' {( \# v+ ? P
8 e. D r" G' Y# n* M* I0 }#include "hw_types.h" // 宏命令2 t: h% F( O4 Q# v7 W' W: z4 R
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
: c4 X/ x" a U/ v. K/ r$ T#include "soc_OMAPL138.h" // OMAPL138 外设寄存器3 \0 J/ N7 Z5 T6 g5 c% f
$ w' I$ n. T) X3 b#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
- Z! V" q- B9 c0 f+ C7 R8 @#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
6 Q, |- w" I, K! X- L+ H#include "uart.h" // 通用异步串口宏及设备抽象层函数声明4 D: a3 \3 {: u' W6 @
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义+ @7 ~& K3 N# Z8 ~2 p
" G" ]" t; w" d
/****************************************************************************/4 T" K5 h( [6 [& n
/* */' w4 r5 l3 a) [9 u# ~
/* 宏定义 */
7 A1 s' g* b( D/ H* p! f! g/* */
% j1 b( R; Z3 a) G H/ X$ d/****************************************************************************/
, r* l9 W j r; F5 a2 X6 [// 时钟
+ c& |3 S* i% d- \0 V" @#define SYSCLK_1_FREQ (456000000)
5 ]- N: ]% b+ a. i& R#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
5 E/ O/ e f4 c ], z5 d#define UART_2_FREQ (SYSCLK_2_FREQ)! F8 v, J2 z$ Q8 e% O
$ z8 e+ N( i) x. Y
/****************************************************************************/
- i3 T# ~ G' m# M9 o2 v/* */9 a& L& w& w9 J; k/ [, U. _9 T
/* 全局变量 */ z+ a/ Z8 U3 z0 F0 D
/* */' p0 x z2 W# F: S7 s
/****************************************************************************/
4 [) f7 A; h8 |) [$ k- P5 ochar txArray[] = "Tronlong UART2 Application......\n\r";& A/ _( z# O, e _6 ^% y1 t5 E
4 a: p% S1 ~$ a5 f' Y
/****************************************************************************/; W8 ]3 b* N: t/ E# G( u
/* */2 n8 w3 C4 a$ ]
/* 函数声明 */
" b. S7 ?% e& p/ ]7 K/* */: ]( G% n* I$ k$ A# ?% t$ O# f( Q! n3 ^
/****************************************************************************/
8 t+ Y3 B9 r% Q, c8 d V$ k// 外设使能配置
( w( n# G2 c8 m# a' _2 J- q+ @& \7 N, ?void PSCInit(void);
( M5 H# r4 X/ ?' Y7 s! _, v9 Z) M( Q0 W6 F/ ~! @
// GPIO 管脚复用配置2 f2 q. P- I3 g5 t `% B
void GPIOBankPinMuxSet();
& h% J4 w6 K8 O* E
$ D& ]) V: p8 W5 z1 p: ?* o// UART 初始化# {+ i. R- A% u. Z+ G$ x
void UARTInit(void);
0 s' V! L2 n' q3 f- C$ F; G// ARM 中断初始化/ x6 R; T# h6 k4 u( z0 K3 ~: L
void InterruptInit(void);
# F( I2 l" ~. D. l: u" X% \& G// UART 中断初始化* A \! k7 p# D+ {4 Q) U
void UARTInterruptInit(); s" U% S, y' K- T# F9 f" y
// UART 中断服务函数
8 z# U# V) ]& b, b) ]void UARTIsr(void);
( F+ b8 r2 G i0 N) |3 K, Y9 [4 H' J
/****************************************************************************/; G* I+ a" t/ X) K2 c( S
/* */& `: U! m& x! U/ I
/* 主函数 */2 r ~3 P5 ~4 N( D8 u3 r- f
/* */
- p# j( O) ~8 y( U' h% a; u8 Q/****************************************************************************/8 f7 E/ b! ~, ]2 t/ c6 S" Q3 X2 m
int main(void), f4 V, Y/ f7 f$ J! Z
{
2 z9 t: y5 j% j+ i Q. c# I: y // 外设使能配置
# j$ D$ ]# _3 b! w* n& D PSCInit();
9 p( q' O" I" `! Y0 z ( b1 h# ?/ U9 w
// GPIO 管脚复用配置
( [" h+ E1 \$ y C) w6 A, V2 }) u4 N GPIOBankPinMuxSet();
0 h3 U( L+ |6 i c+ S% ~
# e( |& ~+ ~9 J0 O // ARM 中断初始化7 r2 Y6 s4 e4 i: B, _
InterruptInit();; k* ], @% I$ V: t8 B" X
; _ a+ M b& `0 y g // UART 初始化
. l1 n, n$ B: S9 A# e6 U0 g UARTInit();
/ e' ]$ Y: u* Y3 k. p0 }, l+ i* `$ d. t0 C- d+ L
// UART 中断初始化2 L( E7 d% ^) d$ g! P- L
UARTInterruptInit();
; D# {4 c+ H) m8 r0 y+ W
( i( x; B/ u* S7 k$ b // 主循环" Y6 W5 t" E% G. ?% s1 H$ a
for(;;)
% c0 m5 _* k. v& [& O0 \ {% X7 q1 t/ n0 N. M0 m R$ P8 N
+ S5 u! \. f: Q& [ }! z& p2 V, w, {4 g
}& h* U# }& V# e1 A/ v& c
2 B$ D3 D/ b$ G9 z7 M: U n \
/****************************************************************************/
$ s5 T, U0 \6 Y) |/* */
) m2 j7 f2 V1 ?8 m9 I/* PSC 初始化 */
* B% e8 S% R' w6 ~/* */% s# g. a6 j+ Y1 m1 P5 D( ^
/****************************************************************************/. n- c* |' R! I% m% c/ `" ]
void PSCInit(void)
$ C, B7 B# V8 @% F$ E2 h) g! l/ ^{
" k3 v1 Y- A, Q" i: s& x5 k& I // 对相应外设模块的使能也可以在 BootLoader 中完成/ {3 Y" Z: X( E
// 使能 UART2 模块$ m$ T( F# V% n# l9 m4 q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);7 x$ [" S( `6 z$ i
}+ ^. ^) A* x5 j# j( ^+ [
8 G" V) ?0 @* K% ^# z
/****************************************************************************/2 j0 X- b- ]1 q9 \
/* */ c8 y2 `( G; Z7 x$ G
/* GPIO 管脚复用配置 */
+ e0 _# S3 y8 c/* */1 K3 H/ o6 b9 q6 F) ?8 M( G
/****************************************************************************/- H8 l+ i. ~% c$ l; t6 I1 m
void GPIOBankPinMuxSet(void)
1 Q7 f5 c' U/ @' w6 w8 R{, L$ ~" k7 ?8 k
// UART2 禁用流控( u2 [, D0 ^6 q( t$ B% K0 d
UARTPinMuxSetup(2, FALSE);
- U& A2 r M Y- @$ E0 d}. E5 {( M6 }. v+ s s( f
" n }8 W8 Q; b/****************************************************************************/
* N; R' H9 b+ k p/* */+ C" Z5 K$ K- `! r/ w
/* ARM 中断初始化 */
; W9 A. p5 x4 o, Q' |! {/* */
! \' d& j3 W. q) B' @6 B/****************************************************************************/
$ E7 X2 w! d# K x, o" L* evoid InterruptInit(void)
2 `- A2 G. \" L! E" Q( @{4 B: e. M9 _' d }' R4 [
// 初始化 ARM 中断控制器
1 N+ a2 V7 F3 J1 Q5 T IntAINTCInit();- u6 t- r; `$ j% ^5 Y% h( U, `1 T
" | }; U3 ]* p% h: B: B) ^2 \ // 使能 IRQ(CPSR)
/ W5 C1 @% c5 q1 t8 I IntMasterIRQEnable();: w8 C& s3 D; {! N+ C$ L
1 B. @* q8 ?$ g1 E& Y, e
// 使能中断(AINTC GER)
% d; t8 W: t; p8 V IntGlobalEnable();6 S3 ]% v* }7 W/ Y+ X
?7 a- Z; o, e' v9 @1 j* z
// 使能中断(AINTC HIER)- ]0 _/ b1 L1 E, p
IntIRQEnable();
6 R3 f/ e4 ~8 b0 _4 W5 g& S}
$ |2 u1 _6 i! R3 P ^4 N
2 f4 x3 |7 Y3 E7 M b/****************************************************************************/5 ~7 P5 Z/ b2 o
/* */: L6 P+ |7 x% X/ p7 f3 h
/* UART 初始化 */ Q% e7 j; P* P( ^
/* */
& Q% W+ G- q6 _# r* P/****************************************************************************/, O$ Z# \" K9 `# U/ Y9 u0 O& R
void UARTInit(void)
4 x8 y, ~. Z# Y. |{
9 g) } d- s3 ~* i- s$ w8 J // 配置 UART2 参数
2 ?* o+ ?2 U0 ^8 S+ O // 波特率 115200 数据位 8 停止位 1 无校验位
% K/ f) V6 J* A UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,7 h' L6 T+ {8 |0 G3 b/ S& t
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ d% y& w1 e; }* F2 Q/ K5 K
// 使能 UART2
7 P. y# }" A# J UARTEnable(SOC_UART_2_REGS);
' C# `! o4 Y# b# p" A9 b
2 Z5 O, U6 I* ^6 f+ U4 u- D2 l // 使能接收 / 发送 FIFO
/ \. [) Z; A" x s* G9 Q" q UARTFIFOEnable(SOC_UART_2_REGS);% |! Z @% V' L$ [
4 g' Q. O6 g$ e9 V! i( G8 `! ^ // 设置 FIFO 级别( t/ X. F2 C9 M# Y. f* I
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
* c+ Y8 ~7 l @* x! ^5 Z% H8 A, H) [}5 E+ W3 W) H: d9 W
1 a/ N# {5 G, q; v y/****************************************************************************/
+ Y ]# {+ q; I' x( \3 z/* */
" e3 g, L" G7 w. A1 C/* UART 中断初始化 */
, ~9 `& r) v2 K; }4 Z' h/* */
( U$ l, W7 c6 Q3 \/****************************************************************************/
+ p8 p* ~ S; w; m( w. N& }6 jvoid UARTInterruptInit(void)- e6 L" {2 k* o! ^+ V; M
{0 }" N6 Z1 ^5 ^* `5 [7 d0 |
IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 ?6 E: T. @7 ^; l; n9 a IntChannelSet(SYS_INT_UARTINT2, 2);. D0 Z/ Q! B9 A# h2 w9 K' D2 u
IntSystemEnable(SYS_INT_UARTINT2);
0 v* X2 T! G2 W2 d, p4 Y) a: z
5 F% T- A! K! v" j9 D // 使能中断
5 D; V9 A( r/ h7 K6 n unsigned int intFlags = 0;; l6 L& ^- T& ^# F
intFlags |= (UART_INT_LINE_STAT | \3 Z: H& f4 a2 ~
UART_INT_TX_EMPTY | \
$ x9 o* [+ M7 b) \ UART_INT_RXDATA_CTI);( m$ V2 f u* r/ ~: M" G: Z& W
UARTIntEnable(SOC_UART_2_REGS, intFlags);5 D7 Q/ N: F. Y/ ]( l2 a
}
9 J7 k9 q1 G4 G: i# ^
" R. M" }% x: ^- S/****************************************************************************/
. m" m4 w3 }/ Z; M l/* */* v5 G! _% X& J$ g/ b! K
/* UART 中断服务函数 */
) ]- J2 y9 ~2 m7 O/* */- J, N3 \. v3 H9 I6 R
/****************************************************************************/6 D( E9 l4 h/ G) R, t: E
void UARTIsr()
$ M: \) a, w, I- S/ {5 b{
2 q& M/ p2 ]* T: k! t: k9 n static unsigned int length = sizeof(txArray);
+ m! F# `4 ~7 c: o7 ?# p8 A, ? static unsigned int count = 0;
" E( }( l l8 ~) c unsigned char rxData = 0;& _( y' L u- [3 {* S# ~& ^
unsigned int int_id = 0;
& T4 k( L A# n3 S% }1 o9 K& V* }' w2 v, [' ]3 b; f
// 确定中断源' f7 D, J0 q6 z
int_id = UARTIntStatus(SOC_UART_2_REGS);
, N* D. g1 W$ A( c3 f9 v
- Y- s# C3 y6 u d+ P // 清除 UART2 系统中断, [2 \! N6 }! t1 V. q1 R0 b
IntSystemStatusClear(SYS_INT_UARTINT2);- i0 `7 @- u( A' s! ]9 k
4 F( f d8 O6 q // 发送中断 g& w2 \/ a5 @( D$ ~4 }
if(UART_INTID_TX_EMPTY == int_id), m1 d+ |) z$ _& g2 G
{
( w! N& n: _* r# f1 f# G9 }( ?5 n if(0 < length)# c/ w0 w7 l1 _4 U/ M6 x
{5 ^0 l9 f/ I4 M7 U( o- s
// 写一个字节到 THR
5 C0 c9 U* C' u$ I, z UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
7 B% v6 ^3 a' ?0 n6 U length--;. |* g; A3 g$ W: u- S
count++;
, E$ c. C* x+ U7 ~( h6 ` }! N: q& p: b" d' Z) }. ?. S
if(0 == length)0 c2 Q: A0 t0 O+ \) w
{$ Q: M* N N9 k9 e8 c4 h
// 禁用发送中断% f+ Z: N( {9 D X X# U4 B
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
; |) Y: S: T6 _5 j/ l# m( x) N$ t- q }
7 S# k1 f0 V4 k }9 @8 }: X8 p6 C) `$ K- Z
8 E/ a2 u7 c. I% a6 i+ `1 B
// 接收中断6 F" q7 O/ c( Y0 d& J4 J
if(UART_INTID_RX_DATA == int_id). j: c" d! r; s( n6 H g% R) q
{
9 D7 v! j3 X4 }4 _ rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
. h, {" X* D2 Y& i# J: C- o" [4 s' l) ~- R- l6 z* i" a! ?
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);' ~8 Q4 a2 k Z% G2 o
}
' G: Z& X& G% ^' z% y2 W
" r% y" n- m U e // 接收错误# s3 ^9 R3 t! v9 A j4 O7 ^
if(UART_INTID_RX_LINE_STAT == int_id)
+ A. `, M* ~/ s) ]/ V! D% u5 l# N {) g" Z0 w! b1 x
while(UARTRxErrorGet(SOC_UART_2_REGS))
2 y+ s- a; \1 X( E) r M6 ] {
/ o" t: j! _) W8 a // 从 RBR 读一个字节5 I# f l* W9 _) H$ ?7 l
UARTCharGetNonBlocking(SOC_UART_2_REGS);. `1 S* w5 D$ ?2 F! I8 [
}
$ y% A3 O4 M6 W' q+ `9 g4 k# Q }
4 T3 [1 z3 X' ]. z' F% c% E& z 7 X+ U- M: b' b' J
return;0 B2 b9 N/ _; C2 @* e: ?$ O
}; X& h* E# z* C3 a# k* M
|
|