|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
" _) ?1 `% H& S8 g( D6 E. ?$ E
# R5 t9 f0 \4 ] c#include "TL138.h" // 创龙 TL138 开发板相关声明4 L5 H2 ~/ d0 U% ]! h: V, P" C$ |- G0 G
4 x* Q0 A/ `, Z, ]$ N& w. o#include "hw_types.h" // 宏命令/ @/ G& ^9 Y1 O1 q
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
% y7 R9 r) `* C#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
9 p' T0 ?0 B- t8 b9 [3 b& E7 M# |( O, b1 c6 X9 k
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明' F6 y" o9 { X# ]
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明 V8 p$ v5 A3 t9 t: M9 A
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明( S% ]' s! S, Z! V- g
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
' y7 ]8 c, T- [) _4 c1 k* }& P w( |/ I1 A! W, t R
/****************************************************************************/; X$ ^2 e3 g* p8 I2 o+ ?3 P' I, S4 f
/* */8 P' k4 c6 A- O5 q7 t' v( f1 R5 w
/* 宏定义 */
8 d2 F% M( i: q$ t) V/* */
7 k4 |/ [/ f s" w/****************************************************************************// x @$ t- Q! V- U+ w" E/ ?
// 时钟1 W* m/ C6 B; h5 Z+ A0 S( j" N5 X
#define SYSCLK_1_FREQ (456000000) V3 g- I; Z5 |% x" K& b
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2): d, ^. @' F4 T# ^- I; O9 V; s
#define UART_2_FREQ (SYSCLK_2_FREQ)) o! l2 [1 z8 `9 X& m
" R4 }3 r; D w8 X7 @5 ~& \
/****************************************************************************/
8 ?( x `( @6 }- G* H: A/* */* p8 S4 _/ D% K0 z4 M
/* 全局变量 */
! h# O$ n( t6 n8 ]3 G8 m- J3 @/* */; N5 t! h% `- v# V9 \! q, V2 i
/****************************************************************************/0 }% j) z w4 q2 |# A: _
char txArray[] = "Tronlong UART2 Application......\n\r";
1 @+ R6 G$ O5 a7 e/ L: r" p( {: n, _% ?# } `/ e3 b1 `
/****************************************************************************/( q6 @5 H3 {/ B$ s, g5 h
/* */5 x( E/ b& J2 p) z0 e8 [% Q3 s; k
/* 函数声明 */4 T) h$ c2 X q- v
/* */
4 n- }" l+ R( M/ Y9 b/ i1 h; O$ c/****************************************************************************/
+ S r8 ^9 ]* U( Z: m// 外设使能配置- G2 T; ~! U6 j0 F
void PSCInit(void);
y3 {% m2 S. o- L/ ~% Y) q! x% e u3 I3 L* P$ o2 u
// GPIO 管脚复用配置1 K, U1 q9 C6 E1 S1 ^# h
void GPIOBankPinMuxSet();0 _% Q! z* p0 J/ c% W
$ I9 y6 D* ~& w3 o4 b' m// UART 初始化% l5 `6 X. K2 f/ |% _
void UARTInit(void);
r, K& g" ?+ g- J// ARM 中断初始化 {* v) P2 X- D4 s1 I
void InterruptInit(void);2 n2 t+ E u: J4 @+ [2 L( [
// UART 中断初始化. Q: `& l# e9 O- I9 u: v; h
void UARTInterruptInit();
& M8 m' |' m9 s: {! m// UART 中断服务函数; _1 R1 n; ?& ?% O
void UARTIsr(void);
, k% f& v# E$ k% m# Z! x7 t) q5 ~/ G! I& ^" |6 m
/****************************************************************************/
9 F. w$ T7 o }1 y/* */) A G5 O2 H5 h/ ], {! Z
/* 主函数 */
3 _$ L4 e! n) D3 G6 m! z) A! I/* */6 o: H9 a: F) V. j; _7 \3 B( s
/****************************************************************************/8 ^+ s! I. v* b2 G: C: h
int main(void)1 S# P( y, c; Y' C! @2 \
{ M/ k0 Q0 v6 O$ c. A }
// 外设使能配置
3 t' a& _% t: J# A- c/ |9 S6 p PSCInit();
' h: F6 b# `' a8 C1 F- `. K/ k 5 C$ U7 q: Q( | C# Z
// GPIO 管脚复用配置
9 m6 _( L' W$ L GPIOBankPinMuxSet();
& p; k4 K6 B3 F$ `$ X; G
4 F* U8 ?8 o: v9 q: E // ARM 中断初始化
! j8 ]8 {4 R% y2 P; I InterruptInit();5 s4 |0 B5 c/ p. V( @
$ _. F% r/ F' j) v // UART 初始化6 A- U, c* q1 C: z6 z4 [# h
UARTInit();6 V9 ]) L5 e s* ?- v* T
$ ?0 o$ t6 y' Z5 E7 S6 s // UART 中断初始化- C/ u6 U5 [- q% Y
UARTInterruptInit();* d) r; i+ h. d! M
0 ?5 i" F8 f+ V+ H# O3 e3 ?; m // 主循环# U. I% r; E- j$ W
for(;;)
0 ?, i6 s- v R4 ~* a {
4 M- H! q* g4 `, W( V* V7 [" Z$ x' Y. |
; }% D) |1 }, \/ j% t: e: ` }
0 A3 k/ G3 C' D+ N: `8 Q7 o0 W4 i& p3 S}
; i+ {2 n0 O) o6 y. |% T, D# i
. A" o7 t: b+ F6 I8 D% |4 w* ? x/****************************************************************************/" W' G! P% b0 F6 b. o5 J/ c
/* */
% S! n9 j, E6 x/* PSC 初始化 */( r4 b" J+ h0 k. _/ {
/* */! ^3 |! L4 i3 X# M/ E
/****************************************************************************/
% ^1 q1 d; M- \- @% M2 Ovoid PSCInit(void); w5 S5 A" |+ _+ ?
{
( v6 h# Q! N: T // 对相应外设模块的使能也可以在 BootLoader 中完成6 H7 ?; @5 s/ ?% F: e' D: }8 \3 p+ S
// 使能 UART2 模块
$ I0 ? a1 Q2 Z: K) ?: k PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
9 }$ Q8 k3 v* V}
4 f, C; _5 \; u% {9 X( |+ X) U* h: t( e% i8 s& w
/****************************************************************************/
1 Y" Z, F1 z6 E" T8 F/* */4 }) L$ `( E. f1 U R
/* GPIO 管脚复用配置 */0 I; c. |9 W' s& [
/* */7 |6 Y; u/ ]& x" I, ~
/****************************************************************************/
. N& M2 k+ W1 Y: m" mvoid GPIOBankPinMuxSet(void)
8 T) K0 S/ _$ x! b{
" f: h6 t- Q4 V8 ?6 m // UART2 禁用流控
. b/ F/ j5 o' ^/ U J UARTPinMuxSetup(2, FALSE);
, Y& a8 L8 `8 V+ a}+ v# {7 W, \6 U# t: h
! b9 M6 j9 g" _5 Z8 y: {/****************************************************************************/
$ l# {. E7 a! D7 C! o+ z9 |/* */6 z2 l( o# C4 V3 S' C/ f" d# [
/* ARM 中断初始化 */3 H) z! `/ B- o; v: R l' W
/* */2 Y! P, p, P9 ~: [- f% _. I1 P
/****************************************************************************/
6 o5 }; m) H+ Ivoid InterruptInit(void)
/ `: e2 A2 x3 c$ b2 Y5 H4 f( c{
{" r9 D6 N9 }' s8 r `, H M // 初始化 ARM 中断控制器& |1 L6 E) v' i% ]/ X) ]2 R
IntAINTCInit();& u0 C, w4 \, S1 w7 q
5 J2 l" B8 l' i* [9 S- s6 x
// 使能 IRQ(CPSR)
; F# P6 h% j a o1 W+ t3 F IntMasterIRQEnable();( n" w/ `- Y B7 k/ k# `
& {5 v0 Y/ u% Z" {) z- e
// 使能中断(AINTC GER)! ?7 I' z) H# \: A5 ]. U
IntGlobalEnable();
( y$ N1 L7 g) Y% a$ T. L7 l( p4 B: i/ _
) l) C7 a# s9 w( j // 使能中断(AINTC HIER)
1 Z% y! O) ^ H! \% W) d IntIRQEnable();* _% s# l0 c5 j: g2 h; P! e8 W$ R
}
% u. a7 y# D0 }! L' V- L
0 K6 z0 Z9 K! o$ F, v, {6 ]/****************************************************************************/
( W! r$ e6 X9 t. d& G/* */
1 W% }0 l! Z5 {: C4 G4 w0 u6 o/* UART 初始化 */ G4 U/ I# w, I: U$ {# Y; w
/* */
2 j; Q( H3 A" n9 _ ]4 B# r! j( b/****************************************************************************/
9 t1 e7 J; s5 B/ f0 u$ u9 Vvoid UARTInit(void)
. Q/ e9 Z3 p+ X{9 ?. R' f' O9 @' \3 ?& M
// 配置 UART2 参数4 ^& m; c7 j8 H+ O& n
// 波特率 115200 数据位 8 停止位 1 无校验位
% [ _4 w, b- X UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
; d- V! j; A6 e' I7 \# c UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- O( ~, i: _1 X; p1 C2 P
// 使能 UART2
. R$ ~& ^, G! @7 Z1 I* N* s UARTEnable(SOC_UART_2_REGS);
0 ^. T, c$ R5 S" C7 L9 e3 k9 E0 J
7 w& _4 l u. j$ ^* [, q# u; [- X. S [. M // 使能接收 / 发送 FIFO
0 P4 n; ?, Y, X3 p" e% U8 _ UARTFIFOEnable(SOC_UART_2_REGS);; ?/ X8 P- Z* Z4 ~: X
4 f: t, L$ Z$ d9 Q4 |- w7 f3 d- G2 r7 R // 设置 FIFO 级别
* G. n8 k: s3 L O UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
) b" f% ~5 o5 k- I' b( @) @+ p}
, Z2 u7 [, d; {- u" y3 {% z" B( i, V& [2 E$ K: L
/****************************************************************************/% g( x1 H- L% K
/* */+ ~$ P3 i& X( U& X/ r; S% c
/* UART 中断初始化 */) ^5 }0 H+ K# W- F( h# b4 q
/* */( ]3 K% i6 R! N$ d. z( E
/****************************************************************************/
; o% P/ }/ \ R& |/ Lvoid UARTInterruptInit(void)
4 c+ J7 Q* @4 x1 m: c{
4 {% a6 t4 t" K! Q0 {. D: B IntRegister(SYS_INT_UARTINT2, UARTIsr);
: g1 z$ \: h0 q" q5 ~ IntChannelSet(SYS_INT_UARTINT2, 2);4 p" K6 s, @# V* | y# Y
IntSystemEnable(SYS_INT_UARTINT2);1 e) t+ d4 }5 m
% U: L5 N, C. R+ b% J S ?
// 使能中断
8 ]: e: j1 I# u; t; _ unsigned int intFlags = 0;: I* V7 J# n2 m" L
intFlags |= (UART_INT_LINE_STAT | \
1 P3 j1 [# [3 x6 s3 s: ^) ` UART_INT_TX_EMPTY | \
" }0 Y1 h% m* k# ~ UART_INT_RXDATA_CTI);" N0 V+ U0 h0 u* G
UARTIntEnable(SOC_UART_2_REGS, intFlags);3 k5 |! A1 j* f4 \! h
}
$ ?! F) _6 E- S" k9 N
, L. V+ |2 O, }9 m/****************************************************************************/7 t$ I8 n. _% O2 H* i U
/* */
; W2 }% _# H J- [( ~/* UART 中断服务函数 */
6 R6 Y1 N3 f% k. C, s3 t/* */' j2 k' C i- {2 H9 l
/****************************************************************************/
" _: e/ \0 l4 y; e; ^, K5 O2 A# ]1 Fvoid UARTIsr()2 V) D, ^- K2 B: i: x0 ?- F0 U
{
! U6 x& y8 Q7 Z) T6 y* k static unsigned int length = sizeof(txArray);
, i7 C; P) z/ ]$ S( ~6 r, P. \ static unsigned int count = 0;
4 S. n; e2 j3 G& ] unsigned char rxData = 0;; b# [. o/ c3 P- d
unsigned int int_id = 0;
# | s: f/ K- A' g: I! Y' \2 V ?+ \# }" q8 i% h
// 确定中断源
1 c* l8 j) n/ |- M int_id = UARTIntStatus(SOC_UART_2_REGS);2 y J: ~+ y4 u! c# o
' v% |" Q, A% F" ^; s8 `1 J // 清除 UART2 系统中断 Q2 V2 j: ~) U2 x* y! o$ ^
IntSystemStatusClear(SYS_INT_UARTINT2);
+ N- U. G @7 ? O/ Z- K
h9 G* N* w8 P. i' V. I // 发送中断
" G- U. [5 y6 t( h9 l# D) Q if(UART_INTID_TX_EMPTY == int_id)% r) A" L% L' F& u1 M& d& h+ J
{
) J( ?# B7 G- I* g if(0 < length)
9 N/ M9 ?' O. f& n% D- U { C+ L: [8 R, M" Z' f% i7 }4 R7 A
// 写一个字节到 THR) z1 C- p$ T3 }' V
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 h7 W6 p2 U8 M& E2 d: r9 r5 P length--;7 O* V& O& S: L9 Q5 f
count++;
3 l) t5 d, ?1 r9 m" ]$ x }$ G5 v2 `! d4 I% H$ Y+ z
if(0 == length)
( l! H) l/ ?. S' c( H { O0 Z" w8 f& X) E% A& C( X) _
// 禁用发送中断
1 P8 l( O3 s- U. T3 l2 R% U5 d% | UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' W; w) h2 w8 U8 @ }
. ~5 p! K% w. `" f0 u# H& t }) b0 d$ m& {6 E2 [
' K6 s2 L$ g) |$ n& X$ |
// 接收中断
' R7 R" k" Z; B; k if(UART_INTID_RX_DATA == int_id)
+ h8 o6 b, D! R5 z2 @( L4 N& g {4 f* c: t; w0 F8 w5 @; N6 O& S
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);; G' ^ u- G2 P; U/ W# G
9 e* u3 S* K% y4 v UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
{" [/ ]/ J& ]- G }! P# d) d$ _# X7 G* j0 k4 n: f# a1 [
4 [# d6 O. p7 |9 V& R: Y
// 接收错误
^2 k! L3 m( k5 h) [! b8 | if(UART_INTID_RX_LINE_STAT == int_id)
9 q# [5 z6 A- r0 }4 L8 V! i$ q {
/ d s: N1 ?1 l" }9 d2 U2 [ while(UARTRxErrorGet(SOC_UART_2_REGS))
4 j1 n0 {7 p. y! W {
( w6 Z# P$ z L) S) D" B W // 从 RBR 读一个字节- U Q0 H3 y8 b3 |
UARTCharGetNonBlocking(SOC_UART_2_REGS);% ~% B4 L/ v, G0 a% w" O
}
* i( d# q- ^) e3 K# T }
2 n; E, Y$ N2 h* A# I8 }
8 Q( q( Z) v% ?" ]% W' y return;
) a/ K i3 H# N, g+ Q}$ ~$ p' b& y! b/ I6 O3 @# L% t! x
|
|