|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
' I1 E3 i5 g# I6 g% L7 P/ d) V; ?/ M$ C
#include "TL138.h" // 创龙 TL138 开发板相关声明
, h3 h) x& d4 U8 C; s- q" H) F2 W1 x' ?
#include "hw_types.h" // 宏命令
: m- p) t% A1 A5 a) _: Z#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器6 J. P5 k% n3 D) X/ |
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器! o8 A# n: q( j" U1 J
, W2 ~# t+ ]- S9 E#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
$ N2 U5 t d4 D# j K# y, V#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明- S" D4 D5 ~$ `3 ?, u$ R
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
6 K I/ K1 ?9 o3 \9 w2 K# L( d#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 e7 E( k& f1 Q+ {( k
# v% v# d# @* g6 w e/ Q$ D) P1 K/****************************************************************************/5 n4 T# d0 w6 K' ]5 r8 S+ |
/* */
. M" k" u. O, x1 Z% w v" b% o3 e/* 宏定义 */
: Z. q( R: Q$ z- u* u$ P. B6 ]/* */
" H" _5 X4 k/ H% {* A; x1 m; c/****************************************************************************/4 s) l$ N$ U2 o+ _3 t
// 时钟 ]; R1 F, P' m( C6 n6 _! c; Z
#define SYSCLK_1_FREQ (456000000)% _5 E, N( h: J; U% b
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)( q( M* u4 S5 Y* ^
#define UART_2_FREQ (SYSCLK_2_FREQ)
4 k) q! U+ a$ Z" [
. o. M' }. V. P. n: x: f# c7 L/****************************************************************************/
, K2 E( [2 l: y1 h& g, y/* */
/ ]. J3 e! p* ^8 z3 i/* 全局变量 */2 a9 _4 \2 D' x0 y
/* */8 g3 A i, P' N6 q9 J
/****************************************************************************/* _9 W: F/ f1 w% g
char txArray[] = "Tronlong UART2 Application......\n\r";
* p6 B7 ^& z/ s) j5 O' H' b2 u
/ j( _, o+ H2 }7 A/****************************************************************************/
/ {) P+ q2 Y+ z7 ^/ }3 X/* */: P3 m) s# _+ U9 z! \3 l v( N6 j
/* 函数声明 */
' P1 l/ W& [, z8 N/* */) H* a; v4 S0 }$ H* P
/****************************************************************************/
& ? n! p9 |' o7 t H1 d// 外设使能配置) N% O/ O( f% h/ A: [* `
void PSCInit(void);5 I5 I4 O' j; w! L/ M
0 X6 y/ m/ Y; U& w% k/ _ u
// GPIO 管脚复用配置
9 ^3 h; m. w9 |3 s* p2 wvoid GPIOBankPinMuxSet();
; ^( r* {) z5 {/ e* H. R. K+ z5 H& e" f6 }
// UART 初始化
# V7 f. K: Q' U6 P. ]' mvoid UARTInit(void);
- n; B, [" q4 S. S8 e6 b- [// ARM 中断初始化
6 }7 P# n/ `. s0 P: P2 Fvoid InterruptInit(void);
% c6 }* u7 V4 [7 |9 s// UART 中断初始化
% z! `- z& b% G7 a) X% v% `: Uvoid UARTInterruptInit();0 W" x! H( @$ i' n& L Z
// UART 中断服务函数7 R ]; l1 I3 o, q$ }: Y
void UARTIsr(void);
* I8 A V; \; j4 l
3 ^( T& Q, W! m) f) H4 g0 u4 V3 F/****************************************************************************/
' _7 W" K. j; U$ b, k! u/* */7 @& @& l# _) i5 C) a
/* 主函数 */
$ Y3 o$ m/ v2 [" Z( y/* */6 A4 |+ M- a# N* k
/****************************************************************************/
) u! J/ J, p) k6 N& f. Eint main(void)' U, @5 A0 p* I- l6 ^! l/ Z
{
/ @7 }; i, w! w: a8 u, o# c // 外设使能配置; ?( V( B+ k! R8 g7 P9 m
PSCInit();
" a" W0 q. [) ~. j: ?
" f# v( r4 |- U! s // GPIO 管脚复用配置
9 v- b8 H/ \/ v$ c/ u% V GPIOBankPinMuxSet();* @( M# m( a6 C, U% s, E
% b; A& u9 Q/ t // ARM 中断初始化
9 J0 d( F$ Y" y( q3 t InterruptInit();
$ f3 U( n3 B2 s2 x# g2 A1 e) s) ]
( X+ M/ }7 D5 p- I1 `. Q$ R6 D0 y // UART 初始化$ L2 R* I- e3 S; o# F3 n& n/ b
UARTInit();, M4 ^( r' F6 r& }
% T: ^% k) ?- P, E) _
// UART 中断初始化* T& t3 @. F: J4 Y9 b
UARTInterruptInit();& Y: f/ ~+ c# U; }* [) K9 l1 N
% A% p. \2 f N J0 Y4 G: w
// 主循环
4 |3 T0 ^1 ]* k: T3 y0 p for(;;)4 s1 d- M1 ~ m) K
{
0 I! ]; x5 h5 @* H( Q1 y
8 F% N* y" G$ R/ G) U1 K6 }& s }+ O/ b) k- E) X7 z* ?
}( F2 K# Z; U A) u; u7 }% V7 ?' T
- d- Q$ N: \6 @2 s6 e0 Z/****************************************************************************/0 `+ | Q0 R1 d3 b9 ~* t
/* */
2 B4 T9 x( b% K) U- i/* PSC 初始化 */
( e: S% e5 U/ G( N! r1 `" O/* */# j) T7 |- q: I. B. r4 _& L
/****************************************************************************/5 X( j5 k5 \9 |# n5 h4 f
void PSCInit(void)0 o, P) n- A+ Q$ \7 d& o
{* k I1 Z! x; A
// 对相应外设模块的使能也可以在 BootLoader 中完成
% v) r/ o5 G. ] // 使能 UART2 模块
/ ~( R: o6 z4 {0 [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);) a* U; r) a0 W2 ~* R2 X5 [
}! Z3 o* n) i. b3 k: }
! l1 ^; k( i9 [+ \/ g. y
/****************************************************************************/5 D7 X2 ?. [ D7 B3 q
/* */# v8 }/ T7 M" U! T
/* GPIO 管脚复用配置 */
+ } L5 w2 }4 W& M2 R+ t+ a/* */ c9 F9 l, z3 E# P$ e
/****************************************************************************/$ ?2 W4 ~ g t7 M2 u: p" P, n4 m
void GPIOBankPinMuxSet(void)3 k' u; A; _6 X, t. G c+ ]( I
{6 v7 @! N$ E$ H/ T1 Q& ^3 z3 ?
// UART2 禁用流控
3 |% d+ F8 d, t/ E; V, m UARTPinMuxSetup(2, FALSE);) L5 W4 L% W8 m+ O
}* p# D, U* I; Q: V0 A; Q2 P9 p
; t- n1 X* D( M8 [/****************************************************************************/
9 D4 E4 ~) ]4 m- ^, O, ]" p/* */
. u. b+ m3 L# }$ l! R/* ARM 中断初始化 */' f: O \: ?# i# \' ]' b/ M
/* */7 R$ K8 v% c1 f0 ~, B5 e
/****************************************************************************/# j+ _1 b$ [+ p( i
void InterruptInit(void)' f& M+ u, u4 n8 G. [ q
{
9 D" H9 u( S# f // 初始化 ARM 中断控制器
& \+ @$ t; [ n# Y. ? n8 |; z* x IntAINTCInit(); Y& F; N; |( G2 T r6 C$ L
5 M$ P: [9 d) a6 L) b // 使能 IRQ(CPSR)
9 c4 @7 j% o2 P- R! {- V IntMasterIRQEnable();
/ L9 i# }' }+ t, l a8 Z, }) q$ L, n: Y4 P3 q. z, y
// 使能中断(AINTC GER)
3 b) C j$ h4 z IntGlobalEnable();6 H, C& k/ e$ W m
: O: o" m+ n/ y' L5 c, J! z
// 使能中断(AINTC HIER)
+ s* D& N8 n1 U' M% D IntIRQEnable();
; I# J/ V3 D1 u+ l3 H' E- q}
: b3 e# K R) D! v2 s' [1 [1 ~% R1 V! m( T
/****************************************************************************/, E+ J$ i5 a6 S5 a
/* */
1 \7 |* O7 X: a, I/* UART 初始化 */+ J% Q) V/ ]; \" Y& Y! C& s
/* */9 T# u. |" J7 W# S: Q8 @! j
/****************************************************************************/
7 \. I Z) M/ M) ?8 a2 m0 T0 n, @, A% kvoid UARTInit(void)4 d$ p5 l: L+ m! b- K* q+ O
{
( B1 i' W* ^7 _ A: F" ]* ] // 配置 UART2 参数
& X a0 |% d a8 i2 h" d // 波特率 115200 数据位 8 停止位 1 无校验位
. l3 z% @5 X% B' e1 b8 m. `: U/ x UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# p& m( q: @% p) Y1 F+ R9 G" c. ^4 p
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 H; d1 p/ m0 S/ i // 使能 UART21 `, S8 r5 Q' t2 @4 s8 j' ]2 e
UARTEnable(SOC_UART_2_REGS);
$ G' N! {' T9 _) X4 F
; i7 G; j. x1 w3 u* w( m // 使能接收 / 发送 FIFO, A) |, H, D+ d
UARTFIFOEnable(SOC_UART_2_REGS);7 V! Z0 E& o5 `9 B3 O
, Z6 Y9 @ ~7 h // 设置 FIFO 级别
5 t5 S8 ]# w8 j N. F/ W UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);3 p% Y2 K/ [8 z, l- a$ z
}
# }# t r* n- z, o: u3 F4 z0 Z0 {) D" z: y; K [8 X# m
/****************************************************************************/
. b, `9 A* o/ B3 ]$ A$ \' B% @. N8 X/* */+ V) | `; Y. Y# g h8 R/ @) j
/* UART 中断初始化 */
( ~3 t+ ~* f; P' @* G, ]/* */: y: t. D9 F e" A
/****************************************************************************/
# C/ o& i* ?; m5 c$ uvoid UARTInterruptInit(void)+ c0 |3 k2 d" Q* e) v* g* @6 I7 o
{
" @; J7 V! j4 [, f( t9 p IntRegister(SYS_INT_UARTINT2, UARTIsr);
" H. P; k- M. H8 W IntChannelSet(SYS_INT_UARTINT2, 2);/ ^* Z M+ {. r, Z1 J) D9 ~
IntSystemEnable(SYS_INT_UARTINT2);
1 j, X, S* A/ w9 C0 K3 G6 J4 v. C$ N, {2 E- o7 d
// 使能中断5 f- o% O* c+ ?' f/ `+ o, K
unsigned int intFlags = 0;$ y, ^1 {3 u2 n4 ?4 N5 ^
intFlags |= (UART_INT_LINE_STAT | \/ ?. j4 K9 x5 y) E3 L c
UART_INT_TX_EMPTY | \3 r' K9 y/ J$ R
UART_INT_RXDATA_CTI); j m/ J: b5 n% o" s O
UARTIntEnable(SOC_UART_2_REGS, intFlags);
2 X+ m. x5 ?0 u}
9 I) h3 b3 p. E9 l4 v' O- W: i2 D. Z+ i+ q: }: _1 {
/****************************************************************************/5 s0 Y E/ S) T
/* */0 d, q9 k( z. M0 p/ S+ |! F2 Z
/* UART 中断服务函数 */
5 F4 \4 k# h3 J' X% ]1 }9 N/* */
3 u1 h! H" \. P2 D+ X! ^3 |/****************************************************************************/4 R( |. R1 N; O( B6 I
void UARTIsr()1 a: x4 ?' f; y
{
% P& q9 M; N/ Q, n6 M' {3 i* M" V, T/ } static unsigned int length = sizeof(txArray);
1 ~0 V+ w. P7 R) Y static unsigned int count = 0;# a* P* D1 ?& t4 q; t1 n4 {3 y
unsigned char rxData = 0;
" p& x( _( e3 d unsigned int int_id = 0;
I4 {+ o9 Z( v7 q- r
, P: r `* b- w5 F // 确定中断源
! n( Z, F* h& r8 @ int_id = UARTIntStatus(SOC_UART_2_REGS);
8 v; ^2 o9 g9 E5 A
! k2 _" R, J& A // 清除 UART2 系统中断/ |4 Q. W: a- {9 g5 E
IntSystemStatusClear(SYS_INT_UARTINT2);
7 u" q2 m* \9 ~8 T: L& C5 R7 N% s8 ^2 i/ T
// 发送中断
# U* N5 E7 K8 J if(UART_INTID_TX_EMPTY == int_id)
) q+ B4 h e% i- f- B {8 T M+ W/ S% {- h: {
if(0 < length)
# u: ]: y2 \% k, T( ^( w/ W {
$ I" G8 [# Q1 a8 ~. t( Y // 写一个字节到 THR
' u" I' ]2 [1 R& j UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
) B6 p W" @) j5 F% H length--;
! e* W3 O; v/ N; E count++;
- y8 u3 F ?0 K3 S+ I }5 E' x4 ?; i% W* J
if(0 == length)
$ `$ w: P* L" G) D3 j7 q, \ {
, h* [. S0 x5 q2 t! O" d // 禁用发送中断
# h, s+ P! \3 W2 B UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' k; W, N( y4 ]9 ]2 ] }
% y! T4 g9 Z: a2 D: o }
- A H( T7 e, F1 [
+ x7 z \# {! y4 @+ g // 接收中断) h2 e) W4 h* c' V, g8 J$ Y
if(UART_INTID_RX_DATA == int_id)
% R4 t3 Y5 x9 g9 v& Q {4 f# B$ G ^% \
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 a8 e' i8 f9 C4 x! w
3 W; }9 D" o& u) X UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) H% K9 H2 a; j1 C% ]" k }7 w# j# q5 E. [: ^% K& ^
2 f* I, J3 i0 G7 j( A6 M // 接收错误
* f# }7 Y, Z9 M7 L% B! m if(UART_INTID_RX_LINE_STAT == int_id)9 m. v9 r% u4 l" j2 D
{$ T5 U2 {7 b1 Y' X: G
while(UARTRxErrorGet(SOC_UART_2_REGS))
5 f8 v7 r/ R9 k1 v9 z; L {
! D( ]! v8 q3 @& f4 v3 O // 从 RBR 读一个字节$ v+ J! P5 ]+ b2 W
UARTCharGetNonBlocking(SOC_UART_2_REGS);
! Q7 H# i8 F! o1 E }
- }4 o! b6 {% d9 s; | }
, n0 ^2 _( o ] @3 C& R + o9 ]- n0 K0 X7 i& S/ e
return;
4 J* h3 Q& F: h' ~/ t) \% g, T, P, s}
8 p; D2 Y! o- U( F5 Q( j) C |
|