|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。9 I' Y% @1 X! S: H R% W
$ f+ F7 J6 y( ^5 w#include "TL138.h" // 创龙 TL138 开发板相关声明, C3 E" i* d2 i
" B6 u/ `5 j! s+ r# q6 M#include "hw_types.h" // 宏命令# o& A9 R* b- s+ m: A+ N I' g# v
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器4 ^# |1 {4 h' F; \0 d3 n6 D
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器0 E& Z+ `# |, E/ S7 F; G
, t" Y; N; n! L& K1 D3 s& _5 [5 f
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
3 F" Q- h) o4 }" R Q#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
& E6 N8 l5 e3 `# y+ P2 J$ w#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
/ |7 p) N% v: P. _$ x7 Y, m e#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
# x; t. m, g2 @$ ^2 ^) S5 n: U3 _% t% M$ g! [
/****************************************************************************/1 L( y' u1 `: p1 y* d3 ^3 J
/* */
+ w8 Y" @! s( v( u6 `/* 宏定义 */& u! f2 B1 U% ^* Z, z+ q$ {
/* */+ H# p4 H' U2 P- R8 f
/****************************************************************************/1 `; E$ Q2 m7 m! x A4 j1 [ w) \
// 时钟
7 F4 D, m1 Y3 j" Y4 t/ P#define SYSCLK_1_FREQ (456000000)1 c) I1 e" }* s
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2). v8 J7 a: |3 \" D/ x, ^
#define UART_2_FREQ (SYSCLK_2_FREQ). L! V5 o6 s: S) ]8 I
# _1 L4 L' }: e6 ^+ e3 E/****************************************************************************/; n6 ]" K3 O, {
/* */+ E m+ B8 m4 w: x; Y: C- g
/* 全局变量 */
9 V: {" z7 s ?+ ?2 v8 @+ A: z/* */
) U b) K9 ^6 |& y3 G% @2 W/****************************************************************************/
2 q7 ?: a T0 w" X- ~/ Dchar txArray[] = "Tronlong UART2 Application......\n\r";9 k% w' |8 x: l: U: P$ n3 m
( B: g: l6 D0 T. _" L/****************************************************************************/( R# A( U. R; a6 i
/* */
8 P4 @6 t0 s9 p2 ?% D4 k4 c% n/* 函数声明 */) m4 j4 U1 e1 Q6 \3 d3 l
/* */; y5 K0 |. a4 u8 c7 H9 p$ X( n
/****************************************************************************/
6 B; U; w# G' X/ a( g// 外设使能配置
* Y/ V, T) W; fvoid PSCInit(void);6 |) L# t, q* M: z
5 j. o+ d) E) H8 u# v) e( K
// GPIO 管脚复用配置% m& i' h# C' j+ @8 Q
void GPIOBankPinMuxSet();
6 F: ^: Z) T7 o- Z1 J% W& m U% o& D+ T7 }8 f
// UART 初始化
* k- y8 G3 O" u7 vvoid UARTInit(void);
: x2 S# ~4 I5 Z5 @// ARM 中断初始化
, Q, a: y& G) a: W! m6 [: C; Nvoid InterruptInit(void); J6 Q( b! Q( h% `
// UART 中断初始化
( A! S+ B0 p7 O+ ivoid UARTInterruptInit();
$ O. f4 l, L8 I5 n4 r$ C// UART 中断服务函数 Z. N! e! D- z, R. X' p
void UARTIsr(void);
, F3 Z2 a9 V. h, D- I9 d' J- S& e2 A! V; g) {
/****************************************************************************/3 [' V7 _3 q! D3 v+ m
/* */& c7 [6 D% Y; c: k
/* 主函数 */# c9 e) f6 S* z% J6 I! k
/* */9 k7 }" {8 ]( y- X4 ~3 j7 ?
/****************************************************************************/
5 h6 i$ M$ Q! S7 ]. N/ ^" i5 @int main(void) N$ X$ i& ]5 ?! y) b$ V# Q
{' a, x$ [1 m# F1 l/ ~1 p! F2 Q
// 外设使能配置
: a Y A' A3 ~5 D$ P PSCInit();7 u5 P: H) b- ^4 X, w* F: `! |1 z
& V4 W! Z1 u5 g
// GPIO 管脚复用配置
- K' |+ P: w% R8 \, K4 Y. i GPIOBankPinMuxSet();
U) }) Z# {& u1 @! p( C3 g( F9 c. y+ \
// ARM 中断初始化
$ S, S$ v! ~4 @3 C InterruptInit();: i7 D: |9 z7 F: A0 H& c
$ ] `' p; \0 a! N2 u) r) N4 W4 K
// UART 初始化
+ U) C) p$ \! c" x6 R7 C$ ? UARTInit();
- p) \" v8 U4 B9 f' M- i4 H2 V0 q6 ]; g8 x
// UART 中断初始化
5 s3 v E& o% D8 K6 U UARTInterruptInit();
$ p3 \* p& Q y; ^% Q* {4 b; S" }' t4 I% b
// 主循环
& }8 \: D, B. n! w% t for(;;)
* X1 [! I# G6 @2 o7 j {( @5 f8 B3 y- p% i" l
$ {* e9 I3 | ]" I
}
7 s9 F; E: z. F/ w) h}
' y6 H) V% G6 v6 l- E& M o1 P* q$ X% F# e$ k
/****************************************************************************/
- w3 J* U+ ?4 }- v2 M/* */
1 O) t+ r) U+ @( j& }0 R+ }/* PSC 初始化 */* g: @! W; b. {" {+ p8 U
/* */
. Y% K& e- F; q* o# |/****************************************************************************/
% G# t m# l1 k7 Yvoid PSCInit(void). B( {; ~" C( M
{. ? P, D! w% [, [) @ @$ o! y0 f
// 对相应外设模块的使能也可以在 BootLoader 中完成+ q0 d* b# M8 V) r. x/ M" ]* z
// 使能 UART2 模块
4 _+ \; t6 m7 P+ |3 b6 [1 Q PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 [3 b$ N; \ l7 V
}+ w. `6 n0 ~1 z- S. j2 k/ m
9 A. q+ V, Q9 b1 m1 F \! A( s/****************************************************************************/$ _/ A: F2 p9 Z3 l
/* */: ^5 P/ ?' c; \2 N6 n9 d
/* GPIO 管脚复用配置 */( ?6 g' l3 t" r: h6 x, h
/* */, ~# I. w1 ~$ S$ l. Z/ Y) R- p. E+ T
/****************************************************************************/
9 C4 Q- p6 \5 b2 uvoid GPIOBankPinMuxSet(void)
6 e0 ^: ]% C7 E- A{3 d1 @: `# h; j: k0 O, [
// UART2 禁用流控
+ f9 r# \$ n; c! Y9 i. d UARTPinMuxSetup(2, FALSE);2 A; ] @! e2 T
}+ E" Y9 w0 k9 r3 e& O9 p
% p' h7 h' ]0 y, \; @
/****************************************************************************/
, C% n L9 y/ Q/* */
9 N' r. F6 a1 E, u& y/* ARM 中断初始化 */ }, X; U2 n, R& `- |% M
/* */
2 t/ v5 [. n2 y/ q4 [9 N1 s/****************************************************************************/6 I) m% S1 [ Z# U
void InterruptInit(void). e8 s7 V9 ?5 x
{
# s% Q, P5 o; N" b$ q // 初始化 ARM 中断控制器
/ ?3 b/ e6 K4 r/ U8 ] IntAINTCInit();; A& H: ^+ w1 |8 R/ S) Z
4 x& L& C/ x Z" h, u: w3 \( @, j
// 使能 IRQ(CPSR)
0 K% ~3 e3 m$ O) }. u$ ?' Q- Q IntMasterIRQEnable();1 b' D: N; H, [8 B* ^! P. X" Q
8 d! z( |3 E4 y) R3 {+ @ // 使能中断(AINTC GER)
, K5 h) v/ A# A0 U: @ IntGlobalEnable();5 y0 x8 i7 L* x$ F
0 ?: S2 e8 g# C9 C/ W+ L# ~3 K4 e
// 使能中断(AINTC HIER)
' S M' a+ V8 X7 I7 Q9 }6 w IntIRQEnable();
' d) q, Z7 X' }/ b1 I}
4 |, `% s+ u2 w( a3 W. G1 ^" I9 S4 j
/****************************************************************************/
0 q9 J L! d, B$ H) P0 q! J7 i! q/* */! L+ I. Y( _' [0 S n& `
/* UART 初始化 */
% \2 i4 I9 v% v$ [. w- z" w! a/* */
+ t" o) d; _% w% y& z/****************************************************************************/) w* ^) h2 a [9 X5 u& r. S% L
void UARTInit(void)
/ `1 F0 Y k% A0 G{
0 w* B# b* f2 H2 K3 w) X+ A // 配置 UART2 参数) L6 a6 n: I' O3 A% E* ]
// 波特率 115200 数据位 8 停止位 1 无校验位* _5 \- L# ^$ J* E+ T
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
" [. A* e% H' a0 ^" w. X6 q J UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. X) W1 P8 U6 |1 e2 N) d0 A
// 使能 UART26 D) ^7 A0 z% i5 D7 Q& V, a3 K4 y) U
UARTEnable(SOC_UART_2_REGS);
6 l( { G+ p, y! F, N" ^
- g) c2 E! [/ z2 T7 [! } // 使能接收 / 发送 FIFO
j1 v) r' H" h- K UARTFIFOEnable(SOC_UART_2_REGS);
0 a% b( ]9 O$ v! O2 G8 F( j8 l d- Q; p" k+ q6 ]. t
// 设置 FIFO 级别3 ]9 c8 A$ k; W
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, P" D, c0 X$ ], }}
' ^5 k' G$ F& I/ K
6 U/ C0 U3 o8 D: W/****************************************************************************/
% g' W! y" S$ E3 f/* */
H! } e$ m' n0 [0 T/* UART 中断初始化 */
* o! b, k" V- F% ]6 S7 {/* */% B8 o9 w o; F
/****************************************************************************/
% G5 o' l: d! x( Qvoid UARTInterruptInit(void)2 `+ F3 J+ a$ m! C" s) q+ t2 U
{
: g* Q. c5 r+ U+ Q/ C IntRegister(SYS_INT_UARTINT2, UARTIsr);! X$ x' d+ K' K' `' L: c
IntChannelSet(SYS_INT_UARTINT2, 2);% ~. L7 q& m$ v- r; @ W
IntSystemEnable(SYS_INT_UARTINT2);8 T# e. G' A% G0 u! b
& R4 h9 V( z$ ]- Q D U1 }
// 使能中断
& y2 [7 o+ j$ j* W. `9 k unsigned int intFlags = 0;
. l* k/ H2 D2 p' V intFlags |= (UART_INT_LINE_STAT | \
8 U8 w: V3 Z+ E* n' F; V# o UART_INT_TX_EMPTY | \
7 t' Y4 `6 D% {. |0 R. |% E6 L UART_INT_RXDATA_CTI);
; Z' T+ {% ?$ z7 ~* O6 R UARTIntEnable(SOC_UART_2_REGS, intFlags);2 t: E! J% p: }6 v
}
/ n, s1 O, R: o8 G* b, C* k$ \. ]6 p* _: J( x
/****************************************************************************/
! K9 D h0 `( N/* */
; u% h) @2 m0 i) @/* UART 中断服务函数 */! t4 u. A9 H5 G0 `
/* */
$ t l% r" ^* j, b/****************************************************************************/
7 K+ Y/ ]) n+ e/ Y* H0 Gvoid UARTIsr()1 [# S' a r* i0 j
{7 k4 n' r) j0 l. l
static unsigned int length = sizeof(txArray);
& W1 @) k [( I static unsigned int count = 0;
1 P: C$ W7 P2 l unsigned char rxData = 0;
& F4 A2 `3 S* ~3 B) \1 b j% G* R unsigned int int_id = 0;' e. r6 I5 \3 s4 R/ X5 V
# `4 |! N) b# V* U9 q( i // 确定中断源6 O5 }; t+ l+ k) C1 ?
int_id = UARTIntStatus(SOC_UART_2_REGS);
9 f L- v. B- a0 \2 ~! h/ u9 n5 h; A( R5 c5 ~# t/ i6 Q
// 清除 UART2 系统中断3 @. d( @0 i% m2 W
IntSystemStatusClear(SYS_INT_UARTINT2);
- I* r% Q7 l1 R$ W6 d& ^' O( G
" j8 d6 J6 r" l& u7 ~3 ^. h) j/ M // 发送中断
% K& K+ }) T6 x! f n6 p if(UART_INTID_TX_EMPTY == int_id)
0 M6 I& Q% }0 D! T2 ` {
% w0 l5 S' k: D" [ if(0 < length), Z. C) y2 @& W% ^' A* g* Q
{4 I/ e7 |, N1 g4 {$ `
// 写一个字节到 THR) ^ l4 X. F* Z. l/ g& {5 E0 x2 f
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 | b+ N2 X+ X% n" K
length--;
+ b6 V) V- B! b count++;% ~$ I. J- U: z5 Z" w' m
}
' E2 o) E1 k) e if(0 == length)
8 H) b8 u" \. a) {+ Y {, A4 B0 s' Y5 r" z8 m* O2 r
// 禁用发送中断
5 ?/ I3 G3 m3 l& z6 H3 p T UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);/ y; x C; v/ ]7 Y* L5 a5 A2 l- y" t
}
1 C* J, @' G# L9 A! f1 A/ j8 c% u }, c8 @, I" ?( I; _6 B; f
! W& q" i9 W7 `) t0 i4 S8 U8 @3 S
// 接收中断$ | b! I7 V% Z6 u2 u4 A: E' v
if(UART_INTID_RX_DATA == int_id)
: v O4 Z& O4 d M7 W5 p6 C' p0 P {
4 K) o( d" r4 `& M rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
& A) Y# {: V: l7 S1 s/ [# z. ~; D. z V" T* t
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);" d" j$ s1 R$ M# |$ u2 B$ L4 y! r, R9 S
}
^0 ]% l, p$ \! n
) J/ K2 D4 N( _" e- B, ]" H' N) p- U // 接收错误
( @. \. ? q/ x n( N d2 n if(UART_INTID_RX_LINE_STAT == int_id)6 C# y$ Z8 e& D" f: G
{
( X- [/ d% Q+ C L( W+ Z while(UARTRxErrorGet(SOC_UART_2_REGS))- b3 [! Q/ ~, u1 q& C6 \# k
{6 q. s9 J6 Y% }9 q
// 从 RBR 读一个字节
1 I+ w& }+ d2 ]6 x UARTCharGetNonBlocking(SOC_UART_2_REGS);
- C1 X5 `, D% P0 v9 Z }
1 S! W( y! H0 b# d" T# } }& s. g2 U5 N% ^8 n. {
4 |! W* o' b7 Q% |" `7 j
return;
1 y. s5 R1 b5 g- W0 W: P}
; Y( P4 P; e6 T4 m1 O3 J |
|