|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
) r6 w* z* K! p/ [( l! `. b% F
: Y! X" {9 H3 F% w0 e* R V#include "TL138.h" // 创龙 TL138 开发板相关声明
5 Z( h b: d9 i9 z( G) E$ T
4 G6 c" C, M) t3 ~% Y- U#include "hw_types.h" // 宏命令2 V0 P! r! b8 K
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器* V1 B4 _' A ]3 q
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
3 x. h( v4 k* n$ N2 ]( |5 w4 R& E8 j1 Z! v/ |- h! ?
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明) C+ j9 [, b/ x! G5 q) D
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
, R4 T# U! a. X) \9 T/ G: K) A/ Y#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
! T* Y4 w8 v" w; D/ I' Y#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义; S( s _/ H+ k2 m/ X
2 A6 X7 V5 \; l7 [8 ^# e3 f: h% d/****************************************************************************/
. d2 E. i- S% O+ U* X# Y/* */- I# U4 L1 L! l" s
/* 宏定义 */8 m7 _7 y5 Q4 T: E: _
/* */1 \5 Q% F9 T& n
/****************************************************************************/
1 A0 [% V9 Z B& `, `$ M! J# Z( O// 时钟
! h# V5 t. j/ H+ i5 `& b#define SYSCLK_1_FREQ (456000000)
, b/ B- H1 u6 ~5 n7 \% [#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)9 _! K' o$ V0 W2 Q
#define UART_2_FREQ (SYSCLK_2_FREQ)7 ~* W5 g9 s! U0 I6 p! s% e
/ ^7 s. G5 {% c' O/****************************************************************************/! W4 N; U" D9 Z- Z1 T
/* */
# O4 z& E D, U% H8 c/* 全局变量 */
, v* q+ `" a% H, U! \8 k/* */; y4 } I& ?4 X* M9 i
/****************************************************************************/' g$ v: v- L1 R9 [1 `8 C) H3 Y& k5 w
char txArray[] = "Tronlong UART2 Application......\n\r";" f2 e" k+ f. J+ B
" |! E$ E+ Z1 E4 s
/****************************************************************************/
, T7 @# G' ^0 S, H/* */
1 t- s6 o- B# Y/* 函数声明 */# n; |& m. F6 j+ h! v/ E
/* */! i* \! L" Y! C" n1 a4 o: K
/****************************************************************************/
1 q9 h$ R) P/ D7 g. g// 外设使能配置) f# i' o- W1 b0 R
void PSCInit(void);
& w- h- U" o- [" f/ s
- e1 t: _/ C; {0 r/ t// GPIO 管脚复用配置. u% j% ~4 S$ j4 v6 T
void GPIOBankPinMuxSet();8 K, Z0 e# R# l: M+ ~
. W3 T' K$ G2 y1 J! y- z3 j& D9 B// UART 初始化# s4 F! h& _ y/ c' f( ] P
void UARTInit(void);% t2 U' H8 ~5 n/ ? e* t: s
// ARM 中断初始化
# }+ [. D: I- }8 b( d4 Cvoid InterruptInit(void);: x, ]+ D% @' l8 K; V1 R6 {, | x
// UART 中断初始化
8 U% a R6 V# n6 z' Evoid UARTInterruptInit();1 ^& d e4 G3 s
// UART 中断服务函数
+ {) d# i5 K6 N2 c7 C* Gvoid UARTIsr(void);
/ d9 G9 w& f3 V! d7 K; q/ k% _! c. N. W9 f' Z+ _
/****************************************************************************/
6 H" m9 v/ g F3 Y# I: e/* */" q9 Q1 {8 `0 U, n7 y7 Q
/* 主函数 *// z9 G* G3 {( P9 a$ d; ?( U y
/* */
' B: O% L; F4 |! J/****************************************************************************/
5 o* P' K( ]! e2 j9 O0 l3 S& L* Uint main(void)# t; z3 `/ J; |( {, A
{
4 M; N( t: [, f5 d" `) p& X6 G // 外设使能配置7 u F2 F5 F) f+ K
PSCInit();9 z, T/ V$ c- [' ~2 p
: ]/ d8 [9 L/ H# {2 n
// GPIO 管脚复用配置% N6 S+ s Q0 f [5 m1 U: m
GPIOBankPinMuxSet();# }! T( {5 H2 w" p: {: ]
+ }$ a4 ]$ j2 x- @ // ARM 中断初始化; e/ p: n% u% ~, D; Y" t( ^* l! z
InterruptInit();
# J1 p$ d* H3 f2 U3 u4 }4 F. ?- t3 C3 l3 d( y: D0 r" N
// UART 初始化+ [ J, ?- _/ F- D* A( s! }/ m
UARTInit();/ z+ a1 x. C$ j! T- i8 u' i3 T- {% B
; d9 k6 J; ]+ Q3 _, Q0 x2 h9 B! I
// UART 中断初始化
7 ?) i, f3 m9 n UARTInterruptInit();0 k$ [0 Z- f2 J& b9 E
8 z. z8 v+ J0 U! ?6 |) R. ]) A# k // 主循环3 b$ |; y5 b; ~6 r% n
for(;;)1 ` I% G" f+ U4 A1 B6 Y1 I
{
) W- a h$ L* G5 I- M: g9 ^; B% Z2 f \7 p
}
+ b. t6 ?1 N: K}/ i) q& K7 e9 T. }3 @) V& u9 y+ _
3 ^ P8 B* A+ A ` Q
/****************************************************************************/
& D6 G+ l4 T0 X& \5 a( A- J6 J/* */
, N2 c; N; C& T* D8 e- m/ N/* PSC 初始化 */
7 Z: P" V, x. E) b( ]3 {. }& _/* */
: F" q. Z# N& x& L8 c9 T2 k* T/****************************************************************************/
- }6 a! t: o$ j, cvoid PSCInit(void)
" e* o! o& r+ L M" A{
3 W9 v3 l' e+ |; H+ U // 对相应外设模块的使能也可以在 BootLoader 中完成
, Q4 s8 B. M& W; b3 j- ]9 o // 使能 UART2 模块
- G- Q% m; E* h+ p6 C3 l; z* f PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, y" `8 c1 l9 B F$ Z}
+ v. j9 l8 Z" m! L: Y
) ^0 s* m8 `! L; Z2 b& i/****************************************************************************/: \$ ~4 `: s. c" B
/* */
_9 K Y4 k9 W) Q4 E/* GPIO 管脚复用配置 */% }1 q- O% U3 |) @9 X
/* */: [% |. w3 H6 K0 |$ W& ]( e9 b
/****************************************************************************/
! g% u+ j4 W8 n& M9 V- j4 ^+ Zvoid GPIOBankPinMuxSet(void)3 t/ C2 l q0 A0 p
{9 p! d" B0 |- O7 R$ [" L+ {# u2 x
// UART2 禁用流控% o* C7 \4 k8 o! c7 w) v1 W( n
UARTPinMuxSetup(2, FALSE);! K, P! O- X' C2 b ?- a
}8 o7 b. c9 `& w# N% q
1 ]8 _) j: t; j/****************************************************************************/- q; u* a; R! N
/* */
* u9 p; _ ^/ i( u. M% n/* ARM 中断初始化 */
0 T D9 w+ e6 m0 m4 l/* */% P0 V6 v' Z1 x
/****************************************************************************/! U6 z6 u7 G" `4 I K. {0 z. p* c/ b
void InterruptInit(void)7 H2 U9 `3 [; h$ Y0 y6 X& C
{; g" F& S' ^8 e9 W
// 初始化 ARM 中断控制器* y, X! q1 @" X( [$ k4 n
IntAINTCInit();5 z0 q6 b+ Q2 L& M
& P3 b+ Q' G- F
// 使能 IRQ(CPSR)' |# u1 N" Z9 X9 {& @; c, [4 u
IntMasterIRQEnable();; `8 H% a. [% d" _5 U
: w; d* ^2 z, U# J
// 使能中断(AINTC GER)0 y F' c1 m( m- A7 p
IntGlobalEnable();' U: X! P6 |3 R, i1 [/ R
7 w. W( {' }( U8 ?4 f1 f8 j
// 使能中断(AINTC HIER)
5 m0 h$ j4 a, v: Y* \ IntIRQEnable();
: l6 p7 w. ~# ^) O- K}
* G( B4 w- [$ s+ v) H( W2 F/ a5 _) q
/****************************************************************************/
- ~* x4 |. q& J2 r5 ?& Y( d: t/* */
, H2 u( e7 ^* R3 b/* UART 初始化 */ i, W4 G0 s% u! N0 Y
/* */
s% d+ [: }' J4 i/****************************************************************************/0 j+ R6 L/ Q& Q7 [$ H: l1 D. O
void UARTInit(void)( v8 j+ `; }, X- K5 s. y
{
# l/ A" x* a' o5 a% M4 H( A // 配置 UART2 参数
$ p! ]/ O- s: R% ]) C // 波特率 115200 数据位 8 停止位 1 无校验位3 |5 f# K# m4 R: C+ n# V
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 \3 G$ f0 g f. Z$ z, `" D UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);8 V* M+ ?5 x* ~8 t
// 使能 UART2- X; T* _) l; ^: m2 ^) t
UARTEnable(SOC_UART_2_REGS);
4 [. {; U8 K$ H5 s7 I
% ^; _3 @% I5 w' A. M! q // 使能接收 / 发送 FIFO
5 l* ?! T4 ?5 w& T UARTFIFOEnable(SOC_UART_2_REGS);4 N. l8 [* _8 X* c' s% N7 {
% o# B) H0 X$ u6 i
// 设置 FIFO 级别$ B! Q& @ N2 I/ S
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 x( q& C q: y# R- s# D, H. S}
; G9 U/ y* m" Z5 M$ w! u
8 a' a' [2 M/ K* o t( U0 P. G+ n+ a/****************************************************************************/
$ {/ e0 @2 F1 ^) p0 s/* */. I) `6 l4 l: J
/* UART 中断初始化 */ P" |- ~7 u a( o. ^
/* */
( H; B3 ~7 J. I6 {/****************************************************************************/
, r( J3 y$ R5 y2 B# h6 Avoid UARTInterruptInit(void)
# q5 m' w* T# S9 u{: u# e: y; |2 ]% Q1 L. S8 {: ]
IntRegister(SYS_INT_UARTINT2, UARTIsr);% Z% @3 v# s) Q& r$ x: Y
IntChannelSet(SYS_INT_UARTINT2, 2);
, Y3 y0 V U, z: P1 m) Z IntSystemEnable(SYS_INT_UARTINT2);
\1 i0 M# }' w$ w: M" B2 J+ e0 {& w3 W8 V$ ^
// 使能中断7 r0 X0 L3 h/ l5 s
unsigned int intFlags = 0;! {! Y% B' h [& ]
intFlags |= (UART_INT_LINE_STAT | \ ]' D: ~; _; L; ?! \. N1 R7 `6 t% o
UART_INT_TX_EMPTY | \4 Q) P# Y" |; _0 u8 H; D+ u
UART_INT_RXDATA_CTI);
; y2 M8 d5 b# Y# [4 i5 A8 n" B" B) W) C UARTIntEnable(SOC_UART_2_REGS, intFlags);
- A) A- r4 N, H1 N7 h}
$ y; _% b: y) D" c2 v5 W& M! Y" z
$ @" x+ Q4 ^& V7 g7 G1 v, v/****************************************************************************/0 ] m9 A/ f! b6 l7 `
/* */
- W2 } U) W8 X& X a/* UART 中断服务函数 */
5 c9 B3 K& E& G/* */+ K, f5 J6 w6 I- c" a
/****************************************************************************/
! U% s. ?6 h, o4 ^: I. T2 T& {6 v: mvoid UARTIsr()2 S$ Y0 g8 Z+ q6 ?1 [% B
{
; J M% y4 o+ J. V; l+ b static unsigned int length = sizeof(txArray);( l% X9 k2 c" ?" f* q
static unsigned int count = 0;
6 K: z- V: l5 u$ e' I" r unsigned char rxData = 0;
: s/ f0 w- [3 L6 L! L unsigned int int_id = 0;
. Z( G% G( y( }" {. _8 b( G
1 x/ W( C3 B) L' n1 }* e5 q E; ` // 确定中断源0 H' u& L# u7 Q) q2 g2 s
int_id = UARTIntStatus(SOC_UART_2_REGS);
! y6 i. G* L! x4 Y% C/ m6 F7 J4 v2 x9 A+ z; K
// 清除 UART2 系统中断6 V4 X% v- E6 o7 B4 |& W! L
IntSystemStatusClear(SYS_INT_UARTINT2);
. e, {9 c4 E) r# b$ z8 _+ C: @, {% q4 K: g! h6 B
// 发送中断
$ w8 u3 b0 x: f- U: F if(UART_INTID_TX_EMPTY == int_id)* Q2 P7 l5 f" q
{
$ T. ^; Z+ c0 D) [! a4 o- m if(0 < length)
& \4 j9 s i( }! j' G0 Y# I9 {0 U d {
; ~# \& C- Y( g6 K/ d% _' ^7 p6 \ // 写一个字节到 THR
3 ^( C; X8 z1 Q UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 M {8 {5 Q- W length--;
! x# O9 ^7 X4 t9 t& b* [ count++;) j3 {6 r* w# }9 S- B2 d# v. f
}% e3 f5 ^# h/ H6 f! ]# Z
if(0 == length)9 c8 p0 X }5 |2 L2 O( x8 B: k' Z
{
* R# s$ \8 d; @+ c k3 |; T7 U // 禁用发送中断- ]0 Z' K+ { C$ B- @
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
8 V' t$ m( E$ Q }! G4 Q+ L8 B4 _! R3 t7 _
}6 h. Q% @, ^- P* H) I9 s6 c
) m# a, m ^. E2 q- x+ V; q1 } // 接收中断
# T9 G2 b4 x) i/ [4 _3 D% c if(UART_INTID_RX_DATA == int_id)
: Y& ^: F4 g6 f' R: Q- c {
2 c5 s$ U8 }) e. F6 G& ? rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ B$ x& g/ H! h5 B6 J) n* s
2 c1 {0 K6 {) y! F, q/ v ]. L; G2 `
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# E! r0 d: o) G+ D/ f3 i }6 b5 O$ `7 | E5 j# _' J4 O9 F
$ @/ b, W. S5 }) `3 {. |% s // 接收错误- c* D9 c# g1 R
if(UART_INTID_RX_LINE_STAT == int_id)
! P3 ]! \8 b1 x, ~8 C {
( d, F/ \% p; p) M+ s6 J' f+ ^% P while(UARTRxErrorGet(SOC_UART_2_REGS))- P) N0 _7 I7 }8 l/ L# F. N7 Y7 ~, }
{
1 o) }9 F! Z9 u5 W$ b7 M" o // 从 RBR 读一个字节
, T9 `. F2 }7 |: w# u& H UARTCharGetNonBlocking(SOC_UART_2_REGS); C+ o' E1 B) Z
}" ]3 Y0 @ R) J; k( }' Y3 X1 ?
}: k: K: f0 \6 ~; h5 m8 j) [' B s
; y8 w0 R% B9 C! \6 j return;
# A! M; }. `0 _}
5 Y/ C9 Z& W8 D# G+ H |
|