|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
* f% }; h7 L9 `4 D! f; Q6 b3 X4 G- }* `5 v* [; n" [
#include "TL138.h" // 创龙 TL138 开发板相关声明* c3 k2 \, Z7 p6 f! I7 g" C- m
% e) T* O+ ?2 p0 Q- U#include "hw_types.h" // 宏命令9 t h3 M: [. F( D
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
1 A: ]% P7 s0 ? L9 W#include "soc_OMAPL138.h" // OMAPL138 外设寄存器) j! i% U7 L$ v/ e4 W! U
5 ^! I6 O2 A* g: h( T, J#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明2 R2 y- ^- t* v: {+ D8 O
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明2 @9 l, e6 V9 [5 \" Q* R. f1 I2 U
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明$ S% _) ]+ f% v2 V, }4 T
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义$ g9 i" k' L& Y J3 D
% @+ E3 Y( ]! S# E) j/****************************************************************************/
' c/ q' T' B W4 h& W& K/* */
' ~) O' s0 d; E/ w$ z/* 宏定义 */% L6 O7 c, Z2 _* W! \0 g7 P
/* */. R$ B, \, B" h, b
/****************************************************************************/
1 ^7 K" U! @1 X0 Z0 I' t// 时钟
- s. L" y5 S2 z& [( r% c6 F#define SYSCLK_1_FREQ (456000000)1 S2 v" [3 Y' `
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
1 A! a! I4 ]" d/ h4 i#define UART_2_FREQ (SYSCLK_2_FREQ)
& C( C* u: z' o; \
& Y* k+ o" _$ H! ]5 M( b" d) S/****************************************************************************/' `( s& o4 w, ?( I: C
/* */5 ~! G: G6 @4 r# {" W) p1 E
/* 全局变量 */
( {, x. a+ d0 g+ u0 }/* */5 H, F4 s* f, j& s! h& x
/****************************************************************************/2 K* G" y3 n' q6 M4 y6 \# G
char txArray[] = "Tronlong UART2 Application......\n\r";
, {- t, d+ a" Z! c8 R; G
( b; x5 c( N- V6 M, L' x/****************************************************************************/
+ L: Y i" ]1 |4 ^# l/* */1 W7 c& V. R6 b- M! O: d0 E4 a& a
/* 函数声明 */% ]- O S0 C" E8 `
/* */
2 }, ]( t% \) X. @! Y" n/****************************************************************************/5 {6 z5 D" P5 D( _0 ~# X
// 外设使能配置$ m& U- _/ S! g, L
void PSCInit(void);
' E& X' }' H; C
6 e2 ?. _+ @, ]# K// GPIO 管脚复用配置% L# d) D/ f. L
void GPIOBankPinMuxSet();
' h+ h; j. V% s
2 w0 Z( y% T3 H! [8 V3 S// UART 初始化/ T) `$ g% T; z1 S! F: s
void UARTInit(void);: n4 z! U( s' Q' z/ i9 d- M
// ARM 中断初始化
0 {0 @' Y3 K, z4 J* Cvoid InterruptInit(void);& h/ p" U: v- T( j% v* }! R1 K
// UART 中断初始化: p$ K! q/ I' Z* D2 |4 q
void UARTInterruptInit();. w. y& h/ q# j2 ]8 _
// UART 中断服务函数* m+ U' s1 N, Y" a" U. h. w5 c
void UARTIsr(void);" h: s/ @& W. r( d/ i D0 K
' z6 C- _) e; [1 {
/****************************************************************************/; U$ ~5 K7 a* y d8 ] S. H
/* */
4 v5 d8 V* j7 V3 b& L+ G/* 主函数 */- B6 u% }7 u" ~8 D1 m
/* */6 `- K( ^( Y* Y' `
/****************************************************************************/
& c9 X, i6 _3 s' tint main(void)# }/ G2 X) F' M0 g& \, d
{' R2 o4 v1 L/ p9 k$ G. d( U
// 外设使能配置1 J" x9 p1 H1 i: W, [! ?
PSCInit();3 W5 H4 e! R6 D0 u! L
7 F) \5 w6 L7 T& R
// GPIO 管脚复用配置& [+ Y4 i( U$ W" l0 Y, L
GPIOBankPinMuxSet();& L9 p* q& {- {
4 {9 z2 O( k1 e/ N- D // ARM 中断初始化% r" @: ?6 e7 @/ U5 q# n X, E/ _5 o
InterruptInit();4 j7 T5 \- K8 B# Q4 A
8 z& Q8 G9 V' \9 l4 E // UART 初始化. a: G: F, e9 y/ l* ~! T
UARTInit();
E1 N1 X& [" t% f) Y& \+ ?& p2 Q# ~; i
// UART 中断初始化: S- G! I5 ~. s- A
UARTInterruptInit();5 a- }. b( L/ u" ^' l1 Y
+ s5 p9 a( w& J- s
// 主循环3 H' q& p: i! d
for(;;)
; P; ^9 z% k3 V) a {8 q. O- q: B( m. j$ u
~6 w+ ], k6 _3 p7 ^
}4 C" n# n! \% G
}
) {) d- z; d( i4 l6 |6 }
$ G( l. W3 Y7 P6 B3 R9 L2 B/****************************************************************************/
. G( f# i# T; m& P/* */& [" e) e q( m. s5 D
/* PSC 初始化 */0 U ?# e5 R/ k
/* */; J+ k" B( |5 Y) A& x* T; G" `
/****************************************************************************/7 G+ I8 g4 z% w; W5 W: v8 s
void PSCInit(void)) p# ]. w! }. }- K: f; D
{* q. |9 y4 {7 B& ~5 J
// 对相应外设模块的使能也可以在 BootLoader 中完成
9 W/ {8 N: d& `7 t( }4 ^6 m% @) U+ P8 Y // 使能 UART2 模块; @& `/ z+ x: n( X# b M
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
6 o3 j% Z6 Q, \ R. {- |% P2 h}" A6 a) j K' L9 w/ m9 b7 Z
3 A c2 |. ]4 D
/****************************************************************************/4 H9 D: P \( T! }! h4 w
/* */1 x. j# ~3 A7 w: o% s
/* GPIO 管脚复用配置 */
& @$ w! n2 Q% ?/ K5 \, P/* */9 d; x* R4 T/ Y* p; c
/****************************************************************************/0 k- P2 h" M; ~5 O
void GPIOBankPinMuxSet(void)
J7 x7 G4 J9 _, ~7 w+ I; a# U4 y{/ X6 E' R! v$ X* A, S( O+ B
// UART2 禁用流控
* f. C& g8 {* m6 W UARTPinMuxSetup(2, FALSE);7 b' Q2 a; H' @/ ~9 G9 i4 S
}
- n+ x5 v1 z' w2 R7 ~
& ^4 p5 ~4 @2 i, E/****************************************************************************/
. h# |6 c4 o! b' y- b6 v, Q* U4 E- ?/* */
+ B. R7 G) @4 ]3 V/* ARM 中断初始化 */ u- C% I! B J* E/ ^5 f8 \ C
/* */$ l" q) D' ~. @' \* H& f
/****************************************************************************/6 p! M1 n: ?6 d9 d: e
void InterruptInit(void)/ X$ U5 Q x# n9 q& m4 p4 j
{
4 J* ]2 ?9 M7 c0 S // 初始化 ARM 中断控制器
! _" l3 d: G7 d3 |7 p Y( m8 N) n IntAINTCInit();
4 v) u4 n4 D* x# Q
1 a6 B P. ^5 P+ k, A* I$ v // 使能 IRQ(CPSR)
7 w9 X# G" p( \7 I& D IntMasterIRQEnable();
3 u9 O9 J3 |+ C! g2 h$ K
1 p! G& C) O! F/ P' @1 N6 U // 使能中断(AINTC GER)2 a/ u: ]9 d$ ^+ Y
IntGlobalEnable();0 l! U$ b& p: u4 _$ |
0 L' p6 q/ W6 k3 w* |) N6 v: }4 w
// 使能中断(AINTC HIER)
: l; n4 p7 h. x9 T: W1 P# D1 V IntIRQEnable();. ?: r- }0 {9 d+ v/ P1 v2 Z8 V
}& k1 p L9 Z, N
# Z6 G u6 c) L! c& Q8 G3 I/****************************************************************************/
( m5 L9 q/ T( T3 R8 u. x/* */
: J8 r* S' _7 Z/* UART 初始化 */
$ q X4 y( k# X. a+ ?8 }/* */# O& ^% v* r) B9 n
/****************************************************************************/5 w5 T. O# \5 H6 I1 L
void UARTInit(void)2 _* _5 ]& [) W; w- [: [
{2 x$ ?9 b0 {: E" g& Z$ E5 R
// 配置 UART2 参数0 H" k# V$ G, B5 T+ |# t
// 波特率 115200 数据位 8 停止位 1 无校验位
# {+ q7 A/ E$ J! B( W" M) {- A! n UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 h% I3 V; e2 \9 {; E! a& y4 B& _# J UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 k0 w: H' q1 V- ] a
// 使能 UART26 x1 [5 I3 l8 J/ a- J- A6 p
UARTEnable(SOC_UART_2_REGS);6 D- K$ O+ j4 ]9 n3 l; ^5 ~% I
' y, N! i1 N6 t, n( f5 V1 @ V // 使能接收 / 发送 FIFO, c( ]$ C6 P8 i2 H- k2 K J
UARTFIFOEnable(SOC_UART_2_REGS);
$ R4 w0 V X: X. g0 L1 J' s( a9 s5 S; e$ ?8 e% {( O1 ?
// 设置 FIFO 级别- P9 E4 _* @$ y9 `3 y3 y
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);/ G: }! x0 D; M0 X& Y
}* L# U% l& `$ H9 P2 x t& Y
& q8 h. J6 e9 J3 ]7 Z
/****************************************************************************/$ C7 c8 L, f' R4 I' _! L
/* */) C3 ^8 K/ n$ y6 ~( _$ Q7 m
/* UART 中断初始化 */: M1 n; r q% i& F. D
/* */
7 d4 E$ A; {: K/****************************************************************************/
4 s* `) y6 b! N. T* Rvoid UARTInterruptInit(void)
5 j; K9 m! X. P7 r- \9 s! }' E$ U{' k8 h8 F& n9 p' m& b7 C# l0 `3 r
IntRegister(SYS_INT_UARTINT2, UARTIsr);$ y8 n1 ^* Y0 p+ n( o9 K) `5 o; }! w
IntChannelSet(SYS_INT_UARTINT2, 2);$ g# m4 L- M- N
IntSystemEnable(SYS_INT_UARTINT2);
% K( a# q" l' h2 z, c. b+ h( {; D, {. V1 n
// 使能中断3 H, t7 H4 e0 W" S. w" M
unsigned int intFlags = 0;- i* ?) \8 L6 w5 l6 }* Q |; `
intFlags |= (UART_INT_LINE_STAT | \+ P7 @! i9 P& }. { E: E1 s
UART_INT_TX_EMPTY | \ {1 ]3 m" r8 \/ A, Z0 X1 K! E( a" Q" f
UART_INT_RXDATA_CTI);) X" b* Q7 c- u7 B5 U6 [4 a
UARTIntEnable(SOC_UART_2_REGS, intFlags);
& q3 B. p: J0 T! o- ?" n/ `}
& d6 z: h% `0 H; L5 V" u: B2 P) Q8 Q
/****************************************************************************/2 M9 h% l9 n6 F8 y6 K% X
/* */
) A3 {. ?& ?) i- M$ ~' r/* UART 中断服务函数 */
; z1 Y4 d- \# m2 n/* */8 r: P* y9 p) }' x' ^# y. s9 N
/****************************************************************************/
X. n( P ]* ?3 evoid UARTIsr()
; ]8 q* {# Y' V+ Z{0 D' j, h$ o; R( A" | ]* H+ l
static unsigned int length = sizeof(txArray);
t7 {* v( j- s3 h) C( m) r static unsigned int count = 0;
$ Q) f' u o: K; ]9 V+ N) G5 | unsigned char rxData = 0;- ` \: s+ U+ w! K; l5 D' A
unsigned int int_id = 0;! W( O9 }! I3 ~ o" G
5 V E. R5 L3 y- ?
// 确定中断源6 G+ q1 [1 n8 o% ~" P% z
int_id = UARTIntStatus(SOC_UART_2_REGS);& f) n/ Z D$ L l
. D! I$ q5 T8 a# z& f, R
// 清除 UART2 系统中断
+ _$ j: K: M ]4 B+ ]# S IntSystemStatusClear(SYS_INT_UARTINT2);
' f* O0 N4 }/ K1 \- Z
% [0 y2 [ J! G6 r3 n // 发送中断3 H. X3 {7 A7 N0 A% q
if(UART_INTID_TX_EMPTY == int_id)% l7 D/ _) ]( }, O7 r3 a3 k
{8 o! @" a' m" b3 T4 t1 Q
if(0 < length)5 `3 `, ~2 \" n4 N$ v2 _. v
{0 K1 R& t" b' W w
// 写一个字节到 THR
0 `9 D* k) N9 A$ ^- @% R UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
+ u3 ]1 P) ?3 B8 ]+ A$ \8 _ length--;7 u- }6 Y1 F4 N! O: K R
count++;
- M/ X; H' z. \ }, f$ R" V" N, Z* b" e# d, y, g
if(0 == length)
% ^9 K. {; _% H- h. _ Q9 g7 t {
5 j5 b2 @- ?, A/ i/ r( a, `+ i/ o3 s* h // 禁用发送中断* f+ T) R% J4 \8 g$ ~/ g+ S1 q
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
8 M4 l _* f. `1 X: n }
/ e: {! p/ K5 P }+ E& u7 n4 o) X9 y0 i# k! z
% B9 E9 p9 w1 v- z: d1 o' [
// 接收中断+ \8 J+ F* j6 X$ m5 B7 N6 w' e
if(UART_INTID_RX_DATA == int_id)
( g7 y6 l! k* b {6 j2 |5 h$ U+ T4 ]! U. z! D
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 I$ ^3 m8 k4 I2 ?- B7 B- _5 L8 t: l9 D/ `
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
* @ F/ N+ z7 c7 W }
* e# |+ p- g0 O$ Q; i$ J$ j+ j5 w
$ G7 l& p( k- K4 X0 { // 接收错误
- I; A' ]' E: f, J' v. \ if(UART_INTID_RX_LINE_STAT == int_id); y5 f- q- q" j8 Z* N+ g" }
{
' V. d7 V: \+ m9 K7 F D while(UARTRxErrorGet(SOC_UART_2_REGS))2 k1 d" x& {2 O l' v1 m& ?
{
8 g Z9 P- s. _" y% d // 从 RBR 读一个字节
6 H9 J& G% G5 i4 h UARTCharGetNonBlocking(SOC_UART_2_REGS);, h5 t# \6 @. E; x: K( x; N4 Y8 u
}( P- V$ R/ z" f/ ]8 g2 n: m% }
}8 J/ }$ }4 Q( ]( |0 c
8 R! O$ m C h5 M( f+ L$ h8 J return;
% Z, c M5 `& z}3 {2 q5 ^0 ^) I8 ^ c. i, D# v
|
|