|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
1 ?( H8 d8 `7 q1 l; j* I, p# n' o) v \$ H/ R3 m
#include "TL138.h" // 创龙 TL138 开发板相关声明
! M7 F! w3 i9 ^/ \, N5 B2 J" |0 c; s: C A
#include "hw_types.h" // 宏命令7 _. N2 Y8 _! v! k" y* @
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
; Z8 T- H8 ], r9 d, [% }' n#include "soc_OMAPL138.h" // OMAPL138 外设寄存器" I+ o/ ~% k$ ~# D
; W" T1 K# A9 _! b$ x# B/ G#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
, H1 K& {% z* ?2 S4 x#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
- ^' M: o1 M5 r& t( d$ u8 X#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
3 `( a s, \$ e& r- X#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义) g+ M0 i1 F5 l# M- A% g1 a
8 V. R" a: O1 F/ |$ R$ e/****************************************************************************/
. z7 w& W( @' Z/* */
3 {+ L9 {3 v: B. d/* 宏定义 */
4 _5 ~$ b% q+ E7 U, A/ a/* */
- p8 x+ R/ I' a1 ^/****************************************************************************/% w2 b. @/ s1 d" Z
// 时钟9 n4 C( M8 I- s9 c
#define SYSCLK_1_FREQ (456000000)/ ]0 T# R, ~, u
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
" n4 ^; `+ F c8 f#define UART_2_FREQ (SYSCLK_2_FREQ)9 ^+ q1 C |" R- l7 a6 }9 @
- U' z, f$ [& X W# Z# `' t# ~
/****************************************************************************/
3 r8 l$ C- y! L$ ^+ A) ]: @& S/* */8 \+ e$ R8 k ~
/* 全局变量 */
9 Q* O2 h/ `, c5 [9 `7 }/* */
% V# W" R' Z; b/ Q2 L9 H7 w/****************************************************************************/
9 P! y2 T0 d7 ?, ychar txArray[] = "Tronlong UART2 Application......\n\r";" D3 T& W2 M. ~4 D) l1 C# W* k
1 x3 O6 I; D( V# f H: h4 D+ |
/****************************************************************************// C" D- a1 o# l8 A
/* */
4 b" `) `( d9 ?0 h$ N/* 函数声明 */* `+ \0 ^( ^% k
/* */
6 ~) B6 t! l3 F/****************************************************************************/" { }- T0 _9 N4 |
// 外设使能配置" [8 u# p! \5 k. D
void PSCInit(void);
0 E/ }5 R: ]3 t& V6 @$ s: J. j
8 H) z j( t1 ?, A; ?5 A// GPIO 管脚复用配置. ?& o. a0 F4 h( a9 [
void GPIOBankPinMuxSet();5 b0 C2 R5 k% ` n2 T3 U
* N* x% c j. S: `. r- Y* P
// UART 初始化
q* T( B B+ i0 @: v8 Mvoid UARTInit(void);
# R' I$ Y3 q( @+ c; T- w// ARM 中断初始化, ?" C. \. I! k3 L. p2 x
void InterruptInit(void);8 t$ K7 R* o. m/ _$ l: W" c
// UART 中断初始化
* o3 G5 I# f# ]; Y+ tvoid UARTInterruptInit();
; z5 w( l, E( N5 D// UART 中断服务函数
$ H4 l \& p. g$ Ivoid UARTIsr(void);
; M- B1 o, u$ _+ l+ \" y
! k6 w7 \' k4 w: `" r/****************************************************************************/
+ W( P" ^) K% p/* */
; t* |; U" m" ?/* 主函数 */
& H$ X& H$ y: N# N/* */. _9 e& [6 t# B$ u
/****************************************************************************/
! I- R2 d: k$ m0 J1 M* h* v& }# ~int main(void). |: r) \, t- Y3 T- N( I1 }
{
( ]) S+ Q, I- @$ L9 p; O& r // 外设使能配置
# e7 V9 p0 n7 t. A PSCInit();
! F v1 W, A/ T! e y n6 {1 x& H
. w3 E) v4 c0 |1 @# w1 K, Z9 K // GPIO 管脚复用配置
! V3 ^) a5 [) U% E7 V) `$ r GPIOBankPinMuxSet();/ r& _8 ~2 ?8 E
" j9 |4 ?6 J+ ~
// ARM 中断初始化$ l I" {4 e; Y0 A( A
InterruptInit();
2 S# I- o2 f; @, i7 Z
' C5 L0 J2 @5 |& u/ h // UART 初始化
* ]# ? u1 F- Z( p' \ UARTInit();
" L: C! ]2 n: p8 _1 H" r
5 g" M& s: j7 r+ `9 o+ y // UART 中断初始化; Q. m: L. H( g6 R ^: o- Y
UARTInterruptInit();* s8 L% U$ F! \9 m
[" f+ ^1 ]) @7 I' w. ~ // 主循环( f! ~8 A% |/ W7 e5 ^
for(;;)
Q+ G- x% x! P: k( L* R( A {' d/ E% I$ |& i+ l$ u+ y* p
! l* r7 Y: r6 Z. h$ o }
# W3 v- U. r3 r4 m* K! Q' m}
7 u! z6 t5 `4 \' k0 n1 G5 X0 h" ^; k5 j
/****************************************************************************/
! M! D) n) G8 Q! s5 i# ~/* */' l) q( |2 X6 x' i5 d* E
/* PSC 初始化 */& }# B$ t# _& |! ~/ H
/* */
_$ B3 g, Z3 L* E% n/****************************************************************************/# m) p* {2 G& [) d
void PSCInit(void)
; _- F4 M6 J2 V; D: Z- _/ X{
+ M2 \5 _6 b/ I7 f: j* [5 A // 对相应外设模块的使能也可以在 BootLoader 中完成8 R/ o) [) [" Y3 l
// 使能 UART2 模块! z6 ~; \4 x5 H; n. G+ u* W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" g' _/ _4 M* t, c}
4 ~7 J& G9 {4 U- s# n6 Y2 ]3 r" ~
5 `" J5 Y1 C5 _2 I/****************************************************************************/
7 V! H" V% n# ?9 p* E- H/* */
. K2 ?5 f1 m" \1 Y$ f4 j/* GPIO 管脚复用配置 */
0 p2 x0 V0 ^3 @9 ]- |/* */2 K' V+ N# k+ O7 |% ~) m
/****************************************************************************/ u+ O1 o3 ?0 g
void GPIOBankPinMuxSet(void)4 ]* x& C1 _( Q# i! S) J# |
{ Z5 i% e4 w" }: D1 X
// UART2 禁用流控/ [. p$ [1 Z/ h3 w" f3 l
UARTPinMuxSetup(2, FALSE);' a* j& h- c" O; F- m' M
}
( {9 N2 q" q% s* r% ~. z3 `
8 t: X/ G) G' s$ d9 F: |; C/****************************************************************************/
& V; L# d' w, |* ~( Z: O; a/* */
O1 p1 s/ s! q$ r3 `* X" Q/* ARM 中断初始化 */
# }0 R; i, \; E5 ?3 T, Y/* */0 d. V5 r- Z* j
/****************************************************************************/, K7 Y3 A* i9 N( @
void InterruptInit(void); t) _" D( A1 |8 x' X$ E
{
; O/ V+ q q) _. D, `- a // 初始化 ARM 中断控制器6 S; a: y% s9 S5 B7 W' y( a3 s
IntAINTCInit();
* {. B3 ]* U6 j x% H3 k9 K: Z# |) q# M+ o/ A
// 使能 IRQ(CPSR). D% C& D2 R4 R, R
IntMasterIRQEnable();1 N! d {% J' e% f- [, V2 B; o
# v: a$ J" Q, r/ F
// 使能中断(AINTC GER)3 s" G/ v5 l' Q) d
IntGlobalEnable();6 D) v" A- O4 g" i6 F/ e
, G- C: w6 I" \" X# P
// 使能中断(AINTC HIER)
8 I u1 |0 p+ j IntIRQEnable();' s' }! X8 M& m0 D
}( L& Y N7 _ w% f, M% T
' g& n' b- |2 ?6 G6 S/****************************************************************************/4 F. U5 Q' C f
/* */
6 o; `# P6 g0 {0 c! i5 d; q/ H/* UART 初始化 */
; K2 ]2 U& [& H6 E" \ M/* */
5 h7 k: s' r- ^' Y* n% o3 e! M/****************************************************************************/
* @) Z9 E) M: X8 z& c* xvoid UARTInit(void)
! N2 ]1 F$ J n( Y* Q6 P' }" ^ @{. H z3 E9 [: T5 u) V
// 配置 UART2 参数
: _7 Q1 t6 f$ |8 e8 m. l; l // 波特率 115200 数据位 8 停止位 1 无校验位
! |! P5 U/ w; q/ X+ Q* x4 |' C UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,7 M; b# c0 u* x7 p2 ~
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! `' y) d7 `# l/ i6 m
// 使能 UART2
! c0 C* c+ _6 }$ u UARTEnable(SOC_UART_2_REGS);
[. `3 q8 v3 z* A0 K; D
. Y! N' @/ }9 ?: n {, c // 使能接收 / 发送 FIFO k; v4 h" y: R" N
UARTFIFOEnable(SOC_UART_2_REGS);1 R5 X+ _8 C- i( q8 M
9 c$ x6 R4 ?6 T% i' {! \ // 设置 FIFO 级别2 r$ J% f1 R. _, T& Q
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
2 |. Z" L Z3 A- \+ _}
, W8 j3 C* w1 t8 q; y a
% ~& f+ |( y7 T8 b4 P1 U: g/****************************************************************************/
- Q- k7 O1 V; U2 L6 Q8 ]/* */
/ _/ X% f6 L* }7 D/* UART 中断初始化 */
' t8 B4 K# w0 c2 |1 x/* */) R: L% T6 a2 B3 `/ T" ^
/****************************************************************************/
7 s1 u6 s" c; z4 m. _ Avoid UARTInterruptInit(void)& [- u% p4 ]; B# V a3 |
{$ \8 }8 b: B: k0 s( |. ~# e
IntRegister(SYS_INT_UARTINT2, UARTIsr);
/ V% |( ~# \' W- z0 ?! Q% V IntChannelSet(SYS_INT_UARTINT2, 2);
7 R) e+ l, t7 r; I5 [) `9 l IntSystemEnable(SYS_INT_UARTINT2);
4 l2 L6 P, Z5 m4 r
) n) r! G' N5 d$ I& a/ C! N1 M, v( T // 使能中断% I' A! @" ]$ g' l y
unsigned int intFlags = 0;
3 J/ u {6 W' _' r. v/ U intFlags |= (UART_INT_LINE_STAT | \% P3 \' H9 m4 K D
UART_INT_TX_EMPTY | \+ |/ n: Q5 i4 w; E5 R
UART_INT_RXDATA_CTI);
a- N$ Q, n9 i# ~: I7 Q; M" g UARTIntEnable(SOC_UART_2_REGS, intFlags);$ L6 f) W9 q1 s6 x/ a. F
}
1 d1 t& a) @' c) o. A, s8 s& d# L/ S9 P% g3 Q6 U8 h8 Y
/****************************************************************************/
" O: w" @7 I/ M: i/* */
* d' E) T- x3 V6 u3 ? s1 w/* UART 中断服务函数 */( A- J H* J% y, Q; _) i% _
/* */
" y% u# l" P- ^7 m0 R) ]: q/ _/****************************************************************************/
: @! j `( q; X& U. |# ovoid UARTIsr()
; U, q& f. S8 ~* Z5 ~{- L. h" ~& i/ ^6 Q0 S
static unsigned int length = sizeof(txArray);
5 s$ d0 { a9 W7 D9 H static unsigned int count = 0;* ]; N8 @0 H" V3 @% L# ]
unsigned char rxData = 0;) C# u, e9 q% }5 g2 D
unsigned int int_id = 0;5 @. m& f3 I2 v
8 W# n8 Z6 n* R( ~
// 确定中断源
4 }8 ^- r5 Y$ Z int_id = UARTIntStatus(SOC_UART_2_REGS);9 q8 _7 G* E" y% O) `+ O- E! `6 T
4 Y; ]+ p' Z7 E" k3 B& z" G // 清除 UART2 系统中断
- s9 c2 o; [! d; v7 O IntSystemStatusClear(SYS_INT_UARTINT2);
$ r8 S* }) C* S F/ y. N) B+ D1 g. P( `4 \3 q6 ]! \/ L
// 发送中断3 F$ p1 m }; {" E7 P; i# t' J8 P
if(UART_INTID_TX_EMPTY == int_id). `; l( M9 g% Z) w j* a) N6 W
{
G2 o$ D' ]8 F7 | if(0 < length)
* H( [& w) j+ W0 V {
& C- ~6 T5 R# F // 写一个字节到 THR7 M: \3 M' d* g3 ^# }( p% G( q
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);# }" x6 [* A3 p& a5 m
length--;& X2 _- t6 G4 Z8 i8 o, u5 l/ h
count++;
5 O% w) K' }/ { }
- o& }7 K6 J+ N2 X if(0 == length)
" v P/ ]/ |* y- b {6 I" X- C3 M6 g' j3 Y. D. A
// 禁用发送中断4 g1 |7 n) g$ U* C9 ^
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* W. r4 ^, S2 N' u, q. F
}
) r' M7 i4 E/ u9 q }
% F# ]0 \; W6 j, S9 s/ r( _ V& ?8 o1 h" c
// 接收中断
: d4 \! @+ R5 \ if(UART_INTID_RX_DATA == int_id)
5 z& ?0 `1 T) t& K. x {! ~* T2 G# W& ]5 ?: j3 t: g O: K0 k
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 S* B) n* F% p4 C( f" W2 k7 N
9 Q7 u: d' e6 u9 j1 E: | UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ W- G% e$ j* u7 n& { }
2 U, i1 D! `+ v0 v
# ^$ x8 U' `+ ^ E% e, B; T // 接收错误
0 |) g3 B' L8 X6 A! n6 C if(UART_INTID_RX_LINE_STAT == int_id)
% x9 J# X! f! d2 Z {
C$ f, F$ e O: m. D while(UARTRxErrorGet(SOC_UART_2_REGS))# }& ^" G3 \$ C+ T$ H" q
{+ a3 m$ V8 {" N4 |7 T8 ~; `
// 从 RBR 读一个字节
9 r1 L. s0 j8 X% W3 o UARTCharGetNonBlocking(SOC_UART_2_REGS);# H5 r6 \: Y/ b0 L
}
* C2 u( B) ~; ~2 t7 { }& H1 L% t8 ?, x, o, Q1 R9 Z
. J! ~7 a- ?; z+ i return;! r1 l' ^% ~% ]
}2 E8 v& S( j: z2 R4 E7 d" Q' y4 J
|
|