|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
4 T# S; r9 N4 P n% v l+ }1 v' a; X+ v/ D" n' A
#include "TL138.h" // 创龙 TL138 开发板相关声明
0 t ]) T2 b* z. y
# s9 D) M! ~7 A#include "hw_types.h" // 宏命令
7 B4 |7 g: R/ x#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器7 ^& s/ V0 q1 A6 `
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器4 K, O" r- f x$ Z
1 q7 h) f' b+ E) q
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
* m) V. r" w0 x8 ?( [#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
d' v! }' Y* s#include "uart.h" // 通用异步串口宏及设备抽象层函数声明2 U/ v0 [2 T6 }/ ^8 o
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义1 A+ H3 z$ D4 U
2 m5 d. v: V5 U0 L6 a1 o
/****************************************************************************/
# r' D! v. P' T, D0 y% x/* */
- A$ g; g# s0 X4 G6 k/* 宏定义 */
8 e" m6 z f, ^6 q j/* */
/ o. R* P- a! K- I/****************************************************************************/& j0 P* [) p* b/ x) F5 Y
// 时钟
. g$ j1 W* r7 A6 | I#define SYSCLK_1_FREQ (456000000)
( u5 t& y4 Q5 I6 m8 U( `#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
* E- X* u0 E$ o* z3 T#define UART_2_FREQ (SYSCLK_2_FREQ)1 t. e. V5 E: m& g8 t! J% B
: ~) e- j* n2 R/****************************************************************************/: }$ N( o( h/ x5 M6 Z/ P& M
/* */4 G# f2 K1 R# w" D/ ~# C
/* 全局变量 */
) C; E5 R0 g4 d! w/* */
6 f0 o% h' }1 \8 C4 Y) x/****************************************************************************/# l/ ~& J+ s+ u
char txArray[] = "Tronlong UART2 Application......\n\r";; }9 R8 T7 w: q% B$ A% s" `" m2 P
4 W# t( B: O% j+ x# n2 \7 u
/****************************************************************************/
, T9 \& Y$ b1 O& |/* */% T# U* a& c" \- M# A5 P- h
/* 函数声明 *// s) C8 v: x" q5 y t, e
/* */5 \$ ~- E# _! |) o0 t5 @* R
/****************************************************************************/
9 c1 Q& l* ? }5 G// 外设使能配置. W. i2 `% k- Y
void PSCInit(void);% _7 @ Z9 d: g% ~
% }' I( k# x. H: n& R* H$ ~3 t
// GPIO 管脚复用配置; v# f! c$ C/ d/ O& h
void GPIOBankPinMuxSet();
5 o9 ?3 G* G# D
; K+ H" E" ^0 ]* r9 X// UART 初始化
. N+ S! x, n L! H0 Ovoid UARTInit(void);: q, R2 T' i) h/ o6 D. n
// ARM 中断初始化3 s, I! a) K, S8 Y, E8 n
void InterruptInit(void);( B# x5 \6 w* Y/ c- Y h$ [
// UART 中断初始化( D! Z" U2 `' |1 T
void UARTInterruptInit();
' I' [' ~5 J! r// UART 中断服务函数
# T& O% j! g/ i, jvoid UARTIsr(void);
R1 T e( y3 _1 X( p2 z* ^0 _
m, [- H0 A0 b6 |/ f F% w" b/****************************************************************************/2 s3 [6 E4 A" M) B, A
/* */
0 W0 R, ^! I! |0 T5 Q/* 主函数 */* A, h$ Q: W* p( |; x
/* */
% ]6 `# J9 u( z. U/****************************************************************************/
/ p# l; x4 z0 p% |int main(void)
* {% d2 z" ]; x* p8 T) m* Y{, a' N4 t, h# j( p7 _9 r
// 外设使能配置- m, t* i Q. b/ i' G0 U
PSCInit();- w2 L8 S% J# Z: u: o: P
& ^6 A% N: }: U0 u
// GPIO 管脚复用配置
0 F# A0 U |& y/ v2 P% r3 I9 Y* r7 t GPIOBankPinMuxSet();9 i9 ?8 z3 f9 l
$ k, Y0 \; Z6 R4 `4 |' J) H
// ARM 中断初始化
- s4 n s2 R0 i' C InterruptInit();/ b5 x9 D. p8 F. U: ~) q* D
" u0 t" v) o3 x* p8 i // UART 初始化" g/ H: P2 y) W* H4 x
UARTInit();
% t9 d1 s. K# u- a: y* w
1 f- H0 z% Z; m8 D% y/ F- d0 q // UART 中断初始化
2 n/ Y1 v5 w d3 Q+ x1 j. D! t. N7 ~ K UARTInterruptInit();
4 U3 u- M+ o8 F1 D1 ?" S$ @# B3 L5 m) a2 ~- v( G5 u d
// 主循环
( Q' F& M p/ p; D) l; Z: |$ M8 [; o for(;;)
! v2 ? ?2 Y- m2 Q1 M {( _1 V+ t6 O8 t8 b+ B
) v, x) N( f9 }7 b& O }, k. U5 C* U% M3 \
}7 |/ S: b0 |& O# O( g) a
5 B: c; m* O& [$ x; C' I6 l7 i$ g/****************************************************************************/ A) a# p( p% W# O4 ^& x; n; {/ A- G
/* */# @! Q4 ~5 u2 w# |
/* PSC 初始化 */, b% S3 Z. ]- y) _7 Q$ p& b
/* */
5 `) s2 r- m# w/****************************************************************************/
1 w: U/ t5 a" m6 o. Tvoid PSCInit(void)
4 K* i3 c9 W/ D1 g8 M{( n4 {4 R; |: ~* Y" E4 a
// 对相应外设模块的使能也可以在 BootLoader 中完成/ v! a$ f. e! p, A% X
// 使能 UART2 模块
) _2 h1 a D3 f; p' k! g# k PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ }2 o! Q8 {( M; s, _2 F
}
& V, V/ D/ T1 t$ `* p* {- W! ]
! j+ C& S M2 x u/****************************************************************************/ o3 I& }+ Q( T% K* u$ \* |, @
/* */4 r6 P5 X) U. c; V% O6 m
/* GPIO 管脚复用配置 */
% T, Q, g* Y0 p2 A( F! l9 R1 i/* */) v9 ]' P- }, Z7 W; |) @8 |# z1 q
/****************************************************************************/$ ]8 r! d0 [; y& E2 B% E+ s, _
void GPIOBankPinMuxSet(void)" R5 Q- r+ j8 U6 a4 |0 z7 c
{
, x0 \, K9 X4 N8 l. r! j2 L* \ // UART2 禁用流控
+ k5 W& |6 Y) x) |0 b2 } UARTPinMuxSetup(2, FALSE);
# t3 e& P2 D. g}4 s8 I( |3 {1 h- N! v& ^
5 a4 u$ x. f0 ~1 _5 d% {# J
/****************************************************************************/
: `$ E3 `; O# u/ n/* */, Z! _! W& r( F9 n9 |
/* ARM 中断初始化 */
$ {5 M) }6 H: n+ C9 m/* */! ^9 M* h# i* R5 p+ V& @/ m/ D Z
/****************************************************************************/* X8 o3 r- W. X& D1 `
void InterruptInit(void)3 ]- O, s N+ P
{
7 U4 p) z3 c. K4 {" v# a6 j // 初始化 ARM 中断控制器: P F9 z, X" H2 q
IntAINTCInit();1 y8 c% t6 Z$ m$ ?' Q$ E; G5 [1 ?% e) D
, \1 v& J- {8 k% e8 Y# V, S: N
// 使能 IRQ(CPSR)
' B8 i, ?% u! s" h! W O IntMasterIRQEnable();. p; U7 C& k) q6 q
1 g) g2 h( z( {7 V2 M# \6 g
// 使能中断(AINTC GER); A) g4 D' ]$ Z) v8 _5 N4 t; m
IntGlobalEnable();
S/ }+ O q0 P. l4 l/ i
# W0 n L+ ~7 e. T# y9 a/ U$ y // 使能中断(AINTC HIER)& x2 D; G5 X( f. K7 o
IntIRQEnable();4 V0 y* F! e8 j( o- q/ [) L
}
9 F( ?$ y0 A+ F+ R* L$ ^" L7 g" N/ ^+ I' {% O# G2 d8 _
/****************************************************************************/, G; Z( F- I) j; U' a& p
/* */
5 c9 G& p& `! v+ Q g8 C0 r; q! z/* UART 初始化 */! o2 Z9 u p6 a+ [7 R
/* */3 G. t4 O$ Z5 E7 d1 j) E
/****************************************************************************/2 ^. v$ M; ~+ S& x( j. B N* p
void UARTInit(void)
$ s+ J" L9 S6 g3 i( J{7 h0 H% S# C4 l2 Y8 G) D
// 配置 UART2 参数* x" V& Y; c* W. ?% N" b
// 波特率 115200 数据位 8 停止位 1 无校验位
. |! v7 {8 w# L6 n) k2 k/ p/ { UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
! p7 }; i3 b, w5 P UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% B$ }' E! K7 W! x) P/ o // 使能 UART2+ w/ F' c3 W: H( B& \. t
UARTEnable(SOC_UART_2_REGS);: g" v, x4 ~0 d
- y, L+ c& W+ r9 y M" s$ S+ E5 \
// 使能接收 / 发送 FIFO
) N& G* e; b4 m0 R UARTFIFOEnable(SOC_UART_2_REGS);
1 V& V2 ~+ Y; _5 _* R/ i2 w4 w
! [# W2 u& \7 }1 q // 设置 FIFO 级别! J" g( s0 A' S3 V
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
q' S4 a- l1 E K, g: T! A6 O}
. r+ s: V. O; @5 P$ R$ ~ W* {; O9 r3 M" z( C% k
/****************************************************************************/2 y l0 c0 j+ e
/* */
* ?- B2 Y' f$ l5 H! t/* UART 中断初始化 */
, N0 ]# Y0 L3 E+ d4 J# X- E8 c$ L/* */6 m" w0 E+ c7 |3 C$ J$ ]1 f- J
/****************************************************************************/
: S" m' \- `; Zvoid UARTInterruptInit(void)" B8 k& e0 n) @1 G* w" F
{7 V( o$ d2 c' ?. _$ I% V2 K* j2 w
IntRegister(SYS_INT_UARTINT2, UARTIsr);
2 o4 K y/ C) ^8 C/ i# @" t IntChannelSet(SYS_INT_UARTINT2, 2);) I( U' U# G) N2 X0 t! C& V0 J f* y
IntSystemEnable(SYS_INT_UARTINT2);& v! [! t5 o$ ~& }2 w
! W8 g; `* i2 K" k, j8 E' e) u% x
// 使能中断
- z+ R u! h4 A0 P5 s/ Q+ n( Y unsigned int intFlags = 0;
' z2 U& E* [3 W) N: Z. S8 } intFlags |= (UART_INT_LINE_STAT | \0 F3 c, s5 e" _2 W' w7 h+ D2 ?
UART_INT_TX_EMPTY | \: ~- `1 ]5 ]: `2 i( u- u0 l
UART_INT_RXDATA_CTI); N2 J- {1 [0 Z& m0 v! H
UARTIntEnable(SOC_UART_2_REGS, intFlags);
8 [( {& n |% s. [/ [) f1 g}
8 j: G2 j, Y$ L# _, |+ O/ Z* b1 F0 e( S6 v+ \1 a
/****************************************************************************/* s' t9 a7 |0 ?% E( n% E
/* */5 Q% h5 F i: N+ Z7 h0 _; R" z
/* UART 中断服务函数 */ u7 L( s9 t s* K* m
/* */; ], g( a: b6 ?7 i: Z* W
/****************************************************************************/
2 L& v" @, V& e; c: N5 avoid UARTIsr()
) W$ D) H9 v" E) Y{
" s' y& U% ~5 S static unsigned int length = sizeof(txArray);- Q: _; N9 S; a# L5 K
static unsigned int count = 0;- g$ L3 p& o# L* e$ n: D
unsigned char rxData = 0; y' ], y, b b8 ~+ i
unsigned int int_id = 0;* }6 u" R7 |4 G O2 V1 E
3 b- m9 u. R2 U+ l( v! E( |* _2 y
// 确定中断源4 s0 ]2 O) U) h i- v [, l& [. b5 s
int_id = UARTIntStatus(SOC_UART_2_REGS);' b( ]; w6 n8 M( E
1 B I3 F2 _, _
// 清除 UART2 系统中断- U( L- \2 r9 g/ P9 { L$ s" d
IntSystemStatusClear(SYS_INT_UARTINT2);' S# L7 Q9 D t* d6 j7 L! ]) g- O
- S% k; n# \9 n4 t' |) u% f/ C8 Z: v
// 发送中断% u2 {# G9 r2 @7 B3 d* J
if(UART_INTID_TX_EMPTY == int_id)
: t) l; ?5 |! ?9 a# m$ O, W& @ {1 N* _& n3 J* M* {3 d ~
if(0 < length)
" o) I8 k) \! U$ ?/ P+ @% V {
1 \! A8 x% w. ?: r3 \, V( [ // 写一个字节到 THR
8 n7 N; S- X$ f9 W UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ {8 t8 l3 F! M6 t6 Y, B: W6 i
length--;
5 J$ b* `2 h. c; r g count++;4 D6 e" ?& J* O
}
# u6 \- c& n; a if(0 == length)# z- g0 g7 L: ^7 l. h D
{8 X! K! G0 E6 m, w2 M' s* {
// 禁用发送中断
* D( X7 k6 G/ v3 C' {& u* d" [; { UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);' d- r$ E1 h% }* w. L! H# z
}* X/ V: |0 y: n# h' t
}2 Q Q9 |7 M4 C$ D. w7 V* z( F. G
7 Q- F. `: G2 `6 b' z. q
// 接收中断. S0 y9 d/ F, ^( V2 m `6 t$ j
if(UART_INTID_RX_DATA == int_id)8 A3 @: E$ ]! L
{7 V3 H! F% X5 P5 v, ?
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 M' n9 S9 \$ O# J- m9 {/ l; ]- B& O2 b' M. ]( A; p% u7 @0 H. [
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ I! O% }$ _; u# s2 I! D }
6 n. y8 a: S3 b0 G8 e) j( ~ }; F4 o
// 接收错误 D7 J) z" z/ o6 O1 p4 R8 X
if(UART_INTID_RX_LINE_STAT == int_id): a( [4 D- {& R, [ ~
{1 a q6 W7 m4 H* D& Q
while(UARTRxErrorGet(SOC_UART_2_REGS))7 x6 a9 k! \- B s1 V
{
- ^7 M7 W- ~% y1 o2 t ?: ? // 从 RBR 读一个字节# f# G! V" R L9 g& l
UARTCharGetNonBlocking(SOC_UART_2_REGS);: w" }" w7 W% A8 m" l& B6 ]: z
}
8 ]/ `' ?# c' |3 G/ U) o: O4 U }0 o3 O2 N& @; e2 _2 [, e" D5 w) H+ P
! k1 N0 v0 c$ R3 p+ ] return;1 M3 j1 f* F/ \" B9 D
}
: y+ n v, c7 O# \+ [4 @, ]' {5 h) s |
|