|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。+ j3 ^) D0 r* U, s/ t
) [! `6 ]5 j/ ]#include "TL138.h" // 创龙 TL138 开发板相关声明
- y$ R: m- U; t) q& g' i$ Y6 w% i2 f6 U6 E6 k
#include "hw_types.h" // 宏命令
0 J6 {( d. M$ j+ m( s# V3 W#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器/ u/ P. D. F& ^: o
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
6 n5 P( s0 v9 x* r0 O' M2 x& c, {* E1 E3 d8 c
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
) b9 ]: o8 k. N: {#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 D' l$ i" H2 B! O# j4 U#include "uart.h" // 通用异步串口宏及设备抽象层函数声明1 ]1 Z7 m5 g9 {5 g2 W: ~% B
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义; B( g. F/ P! I2 y$ j6 `7 f
; `% H; @0 |6 E$ A A
/****************************************************************************/
- {# } Z0 F( B+ t/* */ `# u/ R3 \2 ~' Z& c
/* 宏定义 */
4 H& v" ` v' t) {1 M! x/* */' }9 R- c) S* W, y3 z
/****************************************************************************/
& ~; h* Q& U. a% w4 W( t! P// 时钟
% T9 o, |' T' o( ?2 b3 h#define SYSCLK_1_FREQ (456000000)* t& ]% \9 T7 G& U3 r& X
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)+ D& ?$ L7 X+ A
#define UART_2_FREQ (SYSCLK_2_FREQ)) T' R4 m; C ?) z& N. V( W1 w
$ N+ M9 U$ y6 L7 }1 l/****************************************************************************/% v8 S3 ?5 h2 C
/* */
: N3 Q! x( U& @1 `% w6 y. e6 _/* 全局变量 */
6 Z: {, N$ i& I/* */7 t' ^6 w4 _4 `, L# c. W
/****************************************************************************/
& u& ^: u, w0 r$ Q8 J6 Tchar txArray[] = "Tronlong UART2 Application......\n\r";
9 w* ^, R) Q/ I" F3 S" W0 |4 u( d9 d* V
/****************************************************************************/
( F7 @5 O) u: z2 d, d4 j# z) g/* */0 C5 E2 _5 F% K: W9 p1 Z
/* 函数声明 */: t# h1 t( ~0 ?3 g0 a- ^' }; M: l) c
/* */
. `+ L( W$ f0 v5 F% [7 t! G/****************************************************************************/
. Z4 L% L8 Y1 ~' Q% A* }* M' w// 外设使能配置( d0 R$ M2 \4 ]$ J& q5 U& J6 r
void PSCInit(void);
% m8 R' Z Z9 ~3 c: ^8 q0 i2 G3 k- v B
7 ~1 p) w7 `: J! J! ^// GPIO 管脚复用配置5 T% g. J: P. t5 T
void GPIOBankPinMuxSet();! s2 n# D1 ^' ]7 f: m0 e5 C* c; p1 v
5 w& |9 x$ V' j
// UART 初始化) c8 U" w1 g) u2 f8 ~$ m; N
void UARTInit(void);
( r- u' q6 I% m, ^% \// ARM 中断初始化2 P, S5 Z9 K- j) u+ A: E
void InterruptInit(void);: R5 J* A" B" {) b, _1 A
// UART 中断初始化
" e- ~$ ^3 Q( ^* R3 Avoid UARTInterruptInit();
2 S4 u1 A9 e. _# @& E0 J: v$ t// UART 中断服务函数
+ M8 @/ i% d3 O4 v4 p8 Y* ]3 Wvoid UARTIsr(void);( K* c. Q9 i; \- l
+ Y4 v: f! [+ N/ N( T9 Z8 m
/****************************************************************************/
, p0 X+ H. X$ a. w1 V) ^/* */
: {2 @& Z) y. h3 s/* 主函数 */$ r1 H! o- k T
/* */6 q- D3 I' [& X0 p" Z$ `
/****************************************************************************/1 T* u( m: \1 u7 K" J p9 R: |8 O
int main(void), q! c# ~5 C3 ?
{
* ~% _6 ^" G8 D+ X3 Z/ [ // 外设使能配置
) Z5 I+ V ` a | PSCInit();0 G9 e. U% G) A7 X
X# j x+ y+ V# |6 }( l$ S9 }
// GPIO 管脚复用配置
7 R u( o6 \1 H# D2 i$ Z GPIOBankPinMuxSet(); b+ C1 f9 ^! D- v4 m2 g0 z% _
9 G- x7 m" Q B! i' U // ARM 中断初始化# B7 M! M1 Y! ?1 P* Y3 F
InterruptInit();
' S: w- J. i+ o& e& r, i! H: E% D# R3 K: h& \
// UART 初始化
; S: H1 L% J% n' S UARTInit();' H2 k' \$ ^' w" i6 C4 }
; P9 }9 b! B' g8 Y4 ~9 N* s" o3 i
// UART 中断初始化8 D4 i+ f: a0 F& M
UARTInterruptInit();
~' y$ K6 t( E+ {" l! {' I4 D0 I
' `, x3 q E m# l // 主循环
% k3 n% O) V7 ^ for(;;)
3 M( d3 n8 c! Z8 w9 {$ w5 T; J {( g/ `( K) @: h. ~0 ~/ n
4 `6 K/ ?: u8 D; y }0 m' a$ E' E" s! `
}( V& e: l$ r/ e& s: [* n
, m+ M9 E: Z# i( l
/****************************************************************************/
! O. h4 g) g) k/ f/* */( q I8 \; l9 K* P7 o
/* PSC 初始化 */$ z- z$ |, v/ u3 ?0 y+ o
/* */
/ v" S$ n/ S, \+ N: y# \2 Y- Y/****************************************************************************/
- ^4 a2 ^7 T# f' P- i+ Avoid PSCInit(void)$ U: ^7 O9 u5 y. c
{* i. }' F$ Q$ g/ j
// 对相应外设模块的使能也可以在 BootLoader 中完成
2 [: L0 K/ I; I // 使能 UART2 模块# H) I; l0 l% a+ s6 [1 D
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);5 M5 ]9 X9 S ^. v
}
. N G, E) P- I. n' U2 Q0 C2 K! Z2 M: f
/****************************************************************************/
0 k4 ~! t, d% o: ^3 k/* */9 H) s q! I0 Z
/* GPIO 管脚复用配置 */; n/ Z8 t: P& _ |8 P/ _ h
/* */
* C5 [6 o; B8 }6 l/****************************************************************************/4 g0 ^7 T- Q/ u
void GPIOBankPinMuxSet(void)
6 ]( ?4 k6 n' E, A{6 c$ g6 a; q2 d! p1 T9 f; J. H. I
// UART2 禁用流控6 s7 D" r* n' E: W- x8 Q
UARTPinMuxSetup(2, FALSE);, V% I# v, m( V- M( K) E
}
6 d- N3 H( X7 i* `4 `
- a ]. ?! }5 p; W$ O- W/****************************************************************************/' {- C6 ^3 }& Q. C; w6 v( A! o
/* */+ I2 }* C1 i1 X- ~6 b
/* ARM 中断初始化 */- C" X" _9 i( p7 j' s/ z) ?1 l
/* */2 G# t+ Q V( Z& L9 t
/****************************************************************************/
/ b8 s/ L6 L& a" \+ t6 y& l: Uvoid InterruptInit(void)
5 g1 g6 \1 y/ [9 e+ C7 |+ {2 b{. j: f5 V1 l$ g' R* g& `
// 初始化 ARM 中断控制器
# W) M7 B$ g- F3 v. |" O. h6 B IntAINTCInit();$ a9 g' P5 G/ D( _/ h( P
3 F% h$ z1 ~9 ~. ]% S
// 使能 IRQ(CPSR)
" {$ I( s9 N; W1 X IntMasterIRQEnable();
3 P2 |3 \" x; Q; c' D$ t |$ |
3 _% P/ b; Z5 ^ // 使能中断(AINTC GER); z9 ?$ ^/ }$ z* }; l* J& y0 X
IntGlobalEnable();: Z8 E0 x* c4 r2 ]& W9 l% O3 X
6 g5 j3 B; {* ?; C$ q // 使能中断(AINTC HIER)$ \2 X8 x3 t- C
IntIRQEnable();& E; @+ A0 K4 f* g6 d
}
9 w0 R6 v$ W+ \: X% |# I' H& K, p% Z$ G+ C
/****************************************************************************/
5 T/ U& s- ?; U$ k/* */
% Y; n$ A% g( `- a/ _, H' s/* UART 初始化 */+ H+ W: @7 s! e4 D
/* */) p8 T9 c/ S( F- L
/****************************************************************************/) a3 v/ G0 ^( N0 J& f3 W$ W
void UARTInit(void)
6 A0 m! _; M4 i; H4 n J; Q{6 L+ Q/ S# P& S9 V# ^. g8 \8 z5 k
// 配置 UART2 参数
8 {8 c6 ?: R1 N) j // 波特率 115200 数据位 8 停止位 1 无校验位' w( l4 W( z* f7 _! b+ V
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) Q5 s( m, o% n/ }; ]5 @ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: e9 B' P& \4 [1 w+ r // 使能 UART2
c& K5 F; K% r UARTEnable(SOC_UART_2_REGS);/ u8 k2 Q/ V1 S+ l: f
8 a& h9 o( p T; L0 ?
// 使能接收 / 发送 FIFO
: f- b. L4 C. ?5 }' u/ s UARTFIFOEnable(SOC_UART_2_REGS);% m9 V$ A$ b& z7 h- ^* x6 I
4 Y; V: i4 L# W/ w // 设置 FIFO 级别
U5 B9 d; H( j3 _6 _ UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);% n; |+ ]: y( Q
}
, T6 ? ~* C& w5 F3 _3 s: W: v6 H7 b' Y/ W- s
/****************************************************************************/
, ?/ `, F1 ~: F% a7 d/* */# M# \! }! w# c3 N k) K% {
/* UART 中断初始化 */2 k7 O7 [2 h' S0 E9 U" m& Z" \- _
/* */
0 `4 l6 b9 o! E0 v/****************************************************************************/
" t" }$ y7 V. tvoid UARTInterruptInit(void)3 N8 ]+ W9 `# Z+ L- O2 G; b% O4 Q
{" l% x6 X' i1 H9 u4 c1 X
IntRegister(SYS_INT_UARTINT2, UARTIsr);1 L2 }5 K0 N9 Q
IntChannelSet(SYS_INT_UARTINT2, 2);4 o k; X# G. s
IntSystemEnable(SYS_INT_UARTINT2);
: F/ B# j' g( B* A8 z7 L% A( T' d, H. Z5 E1 B( t
// 使能中断8 d9 A. M$ M, j+ i
unsigned int intFlags = 0;
, N1 {' z$ o) l- _8 ?. K intFlags |= (UART_INT_LINE_STAT | \
9 d- G: ~9 y2 E+ [4 ], Q- U UART_INT_TX_EMPTY | \4 r7 {+ d9 ~/ v+ l+ J
UART_INT_RXDATA_CTI);: @* w& ], h w, S" E
UARTIntEnable(SOC_UART_2_REGS, intFlags);2 Q1 D8 p7 f, G% j, T& f) f
}. n4 A$ R# @ F3 s8 T5 E
/ V2 A6 p9 ~& U" r, D+ l7 m& S/****************************************************************************/: ^4 n" q0 x( O- S
/* */* K6 P$ q# U1 [) a
/* UART 中断服务函数 */9 t f6 t6 R+ T# {
/* */3 w# i) R1 Q1 n/ \
/****************************************************************************/
; [) a$ U2 ^8 zvoid UARTIsr()' E N8 \5 [8 f! F$ R
{
( f( C8 ?$ i |) m2 f static unsigned int length = sizeof(txArray);
- C6 d+ A5 Y# l static unsigned int count = 0;
3 O# C. m' x4 g+ p6 | unsigned char rxData = 0;, I+ u! ^$ ?8 U. b
unsigned int int_id = 0;
l& T: w) M7 h. V& ?, A
3 t. ~5 J {- P1 ?' F1 [" ^ // 确定中断源
; S. v" O, e, L int_id = UARTIntStatus(SOC_UART_2_REGS);
. f3 ]( w# x( f1 S% F' A9 t5 E5 ]: Q3 P( r) `2 W5 g) A" r4 A, G7 L
// 清除 UART2 系统中断
' o. S! u: ^7 i# b" n, ~) G IntSystemStatusClear(SYS_INT_UARTINT2);
" b O$ L$ l) ]9 }2 W/ a) X9 s$ F( _3 O/ Y( S/ m9 {1 P
// 发送中断. t. o5 E$ d# M3 N9 ?- _, S" U
if(UART_INTID_TX_EMPTY == int_id)
1 f* m' D% Q- y {
( w }4 R9 t; \6 C if(0 < length)0 f7 p% @' [* h0 e5 o- B
{
7 i* {& A7 z1 s( m // 写一个字节到 THR
) x7 H# ~# h# Q. F0 _7 C UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ }( Y& ?8 i0 [4 \! H, M length--;, A) N8 ]0 C s+ j- b9 K, r/ B
count++;- z) ~8 x6 S- w& J& A+ ~0 P! c
}7 H+ G: O9 J% u5 Z. c) \2 _! M' C
if(0 == length)
+ L- ?) E! f. T& D' f! u {% z' M* _* k0 d1 U
// 禁用发送中断
- X& m* z% V" t- ?3 J" E( a: V UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
- j( ~8 p. `* l& v5 a1 u }
( X8 ]. q, g4 I4 S O }
: s+ ~2 c0 b- N7 R. w6 \( o0 C2 ^8 j# r1 G! m+ I
// 接收中断
5 I9 P7 b* b9 z; G: f6 T# z+ L8 C if(UART_INTID_RX_DATA == int_id)/ `5 H3 P9 _/ `) l# R7 H; r
{# m+ F9 h; N4 S) U: g- B2 Z4 L
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);% E" |$ n o8 h5 a0 s( |
3 I, C" ^" r0 p% v: Y
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
' t* _2 n0 y& z2 G: d. g }9 [3 u6 E, M3 G9 [# \+ G L
3 q/ `0 |6 j5 e
// 接收错误
* l2 |7 S" D5 a# y if(UART_INTID_RX_LINE_STAT == int_id); T& x& L: p3 z) Y( a8 i+ I' g) f* V! P
{0 e2 n# Y4 I5 U( R/ f
while(UARTRxErrorGet(SOC_UART_2_REGS))
, `: H) m7 p* p, C+ l {
4 v' t9 p1 O+ j- I1 S // 从 RBR 读一个字节
' p& o7 n; X) @2 p7 ? UARTCharGetNonBlocking(SOC_UART_2_REGS);
0 E5 b$ {( M8 }) _, ^5 ^/ P, f }
1 H2 J+ _( y. W }. } p+ @ ]! e$ x- O
8 |; z+ h. ]3 ~+ V, v
return;$ {/ |+ n* s. { n0 W' L8 I
}
0 d5 s* B4 z2 R |
|