|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ x5 _ ^0 \4 N: s. t5 j, ~* y! C6 [
$ q$ l/ s6 G1 J+ F#include "TL138.h" // 创龙 TL138 开发板相关声明
8 F' [& n' J3 z2 f) y, z% g. ?9 b* l. j5 u/ Q `; Y+ a6 c8 X1 N
#include "hw_types.h" // 宏命令8 e, T( {$ l; I y i
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器2 F: P" l; `; j8 x! R9 j
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
& K1 q$ z3 \' h/ V) v: j* Q
1 f: _! _. l: B- X2 p#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明 m6 Y2 r ~6 Y3 R3 S
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
2 q# n, Q$ G4 L, q1 f#include "uart.h" // 通用异步串口宏及设备抽象层函数声明4 _9 }" Z* b9 z x( R9 `$ A
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义1 y, e6 A- N$ e% |4 [
/ D% c: M# V- Z: W2 c! D9 o b/****************************************************************************/* n( v) ]0 F8 O4 ^# r* ?$ u# Z" G
/* */ s. H/ [, H, K3 t w. x5 F
/* 宏定义 */' g3 L2 q. l9 d& r
/* */
: E' N# x$ P8 }3 w6 r/****************************************************************************/# h* }" S1 }& R
// 时钟
1 F0 A, p9 ?6 B5 V' q4 V#define SYSCLK_1_FREQ (456000000)/ w" i8 i) p' g, @6 V0 Q* R% S$ B- `4 q
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2): j, `' p( s6 Z3 B2 m+ t/ @1 _
#define UART_2_FREQ (SYSCLK_2_FREQ)
0 D" W3 T7 x9 O$ X1 G- r7 J' T% b9 v
/****************************************************************************/
3 ~1 D9 x0 R' U0 k9 m3 [/* */5 L( y7 G+ ]6 G8 g
/* 全局变量 */
: p/ a, e8 v5 O) a/ ?- V1 b/* */
; w6 ] C4 }& i1 Q! X$ l* @/****************************************************************************/
6 F* g9 H D' Z( B- ]' uchar txArray[] = "Tronlong UART2 Application......\n\r";0 I# B* Z1 ]4 d8 D1 c
# ~# e+ p/ }, l$ E/ ?* ^- w. o
/****************************************************************************/
7 m+ U, u0 e; g( T7 W/* */+ p, m5 m. u- f' H0 T
/* 函数声明 */
: |5 m' R6 F* c9 y/* */
+ q9 D6 F# ]" E- L6 N: i3 o0 T% c/****************************************************************************/- l9 [- c+ O. \( t+ V( |
// 外设使能配置
O1 G R7 }! L+ S j2 Y+ Fvoid PSCInit(void);
7 z A2 b w* N2 \ N5 D3 z+ b5 P2 {8 M5 n2 T; l
// GPIO 管脚复用配置
+ j* ~2 z/ \# b9 }0 k+ |void GPIOBankPinMuxSet();
( U7 |" D4 e! N6 x2 l
- v! y/ @" R2 t. ~: z; z// UART 初始化. Y- T, h0 \, M
void UARTInit(void);
8 D( `7 Q. n0 G& x// ARM 中断初始化& r0 Q' {/ L* m$ {) l1 p" p5 _ D
void InterruptInit(void);
! @6 U& y2 }7 E9 Q1 b// UART 中断初始化
& Y9 i: S! P; dvoid UARTInterruptInit();8 i4 w: S$ N9 g) ^( n3 T
// UART 中断服务函数
7 I9 c4 B2 {/ p& Pvoid UARTIsr(void);
7 O0 P+ G4 d- b5 ~: R( u# Z3 K4 l3 L8 M# B! i9 ~
/****************************************************************************/. S8 t, ~- C- }2 A. t; d
/* */
% R1 F( j. o4 @( U/* 主函数 */8 H8 S9 z" {- }! p- o4 I
/* */& o. g F- G% V1 B5 o& S: b ~
/****************************************************************************/ s) U A: r3 j2 E
int main(void)
/ r' s! N2 N) ]+ h{. B& J" W0 r, K" _) S" ^$ k& M
// 外设使能配置
. v* k/ P7 h! s f K PSCInit();% d7 T8 i* W# `/ N2 `) R" ]" n+ G
$ u7 F1 M ^* { // GPIO 管脚复用配置
( C( g& w3 g5 j) ] C6 d6 n GPIOBankPinMuxSet();
" L/ Q: P3 Q% v* [4 B: C; [' m! d3 N" v* o3 E9 i8 g4 ]
// ARM 中断初始化
8 c! u# H; M' y h L* b InterruptInit();
" |8 T; m0 l- @4 M6 e" P X# b ~' x! e( X* _! F4 k
// UART 初始化
) V6 G( h/ m$ i: A/ N4 v6 Z* U- ~ UARTInit();
" J: }0 t0 N- P4 P5 p+ l: a- ]$ H) F. Z$ @- U# o
// UART 中断初始化
. e5 I/ a! m9 l, z; O UARTInterruptInit();
p# h3 k2 d$ e- Y3 d
3 {5 {0 [ L& v# Q/ r1 k4 H // 主循环% J1 r. m, q- p. N2 }& ]& L
for(;;)
: _# m2 C# n6 b& d- s; m% V {
& @* b5 U) U1 o8 c% b; \4 t5 N" x9 ~) o6 b
}
# T* a, T! S7 I7 |. l) s( @}" o( a: c8 ]) Z0 L5 D* I! ^
" X$ T4 ]& ?$ f, S b8 [( F! w. y/****************************************************************************/" G+ t. g9 X' g6 k) e6 a, S$ b
/* */3 v' n0 |; f' S( ~6 ]+ l0 Z
/* PSC 初始化 */7 n/ Y% n8 u3 ~: [; [5 X
/* */* T+ N" @0 c/ y% K' f8 a& M+ \
/****************************************************************************/
" ^; ]0 J( b/ C& `7 ovoid PSCInit(void)
! T7 H- r5 k0 ^0 N' [8 j8 B{- H. g; g3 {- E9 h# k
// 对相应外设模块的使能也可以在 BootLoader 中完成6 x' f/ h2 ` F% [1 q, T
// 使能 UART2 模块) p8 w) [" f5 p }5 J B1 I$ f
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ M5 A% [( V- h5 e! F& X6 I5 B
}' r2 D+ T% W7 N7 D0 b
8 b0 p0 i; e. G& D* p7 V% k
/****************************************************************************/
) g: K3 m! M. O* ?! ^* c/* */
# {" m0 g0 D2 e/* GPIO 管脚复用配置 */
x$ M# `/ \: C% [/ u; Q6 A/* */% w5 L# V/ {/ m- n! a/ R6 s
/****************************************************************************/+ C5 A A' X- a- I" G
void GPIOBankPinMuxSet(void)+ m1 k0 }% o* }% |+ t& v
{2 d5 G; j: V' A5 M' z% X
// UART2 禁用流控
4 S/ p% l6 S3 I: T) N UARTPinMuxSetup(2, FALSE);
2 _6 M, @, h5 J7 t0 O$ x}
) \) a5 P7 [: J b+ r/ B* n) I
% X: z! g4 \% C% T& K* Z; m/****************************************************************************/' f, w. j! _/ H- i! E, s$ b5 `
/* */% b% Z9 Z. {4 d* x7 c
/* ARM 中断初始化 */5 M1 G" E* M8 V1 e9 L Q1 P3 g; k+ _
/* */
6 J8 [7 A1 Y$ T0 g/****************************************************************************/
: `% X, b4 l0 {void InterruptInit(void)
* i8 c( H# O- r' u{) I# J) ]( | p/ c$ x/ {" r
// 初始化 ARM 中断控制器
0 T4 p% N+ H/ |2 u! C! b IntAINTCInit();7 d" r/ Q* p7 G
* h* E7 c+ D; z) o // 使能 IRQ(CPSR)- h' Q3 `! H+ F' W" g) S: G
IntMasterIRQEnable();4 ~8 b" ]) O9 q; h
3 K# F4 R* l* [5 I3 ?* {' w) P // 使能中断(AINTC GER)
) i4 g: o l, D; \% o IntGlobalEnable();
1 h9 m! l/ E+ {0 v% Q9 l/ K7 E" L8 b/ Q8 l9 f6 B' a
// 使能中断(AINTC HIER)* ]' e* {$ e2 f. \- ] ]# C8 ]& q
IntIRQEnable();
. v ?& p& s7 a* j5 o1 K+ T}
* u$ `. r" H, `: R+ [- O o( G/ [( x; j. U, K! Q
/****************************************************************************/
( d. a- q8 {2 j$ d" g/* */5 ^; u$ H4 u. ]( B
/* UART 初始化 */. J. [4 t: J9 N7 E# r/ j
/* */+ f0 u; p' m5 e m
/****************************************************************************/5 L( z% w8 [/ v: X
void UARTInit(void)5 i6 I) V' X$ I" f
{: B2 k- s- t' x( b6 M# f6 S
// 配置 UART2 参数
* T1 c: d/ t& f // 波特率 115200 数据位 8 停止位 1 无校验位
9 D S+ N/ w( J UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
. m2 \1 [1 O- f; f' P3 t" {9 u UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- R. n% q$ Q9 U% F5 n // 使能 UART2- ?4 |& J- Z# q
UARTEnable(SOC_UART_2_REGS);
) W# B0 z! M* ^# \* B/ ~
) O+ Q7 o. n7 S( T // 使能接收 / 发送 FIFO
. F4 `- \# Y$ Z9 K3 V UARTFIFOEnable(SOC_UART_2_REGS);
+ }; `5 A6 |, k
$ H7 T" i+ L8 ^6 ~ // 设置 FIFO 级别
+ |. ? v" z4 l' N! J# ` UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);+ J% B4 w: a4 |& y5 H1 J
}$ c/ a3 a* k! |
7 c" ~, A4 ^1 v1 Q3 |: G. U) l; i/****************************************************************************/: x' j8 x1 X I& O( c1 @/ V
/* */5 r+ `$ O+ g% d: r7 o4 Q0 q3 {: h% T$ c
/* UART 中断初始化 */
' k: `0 | a h/* */
/ T5 @9 o+ @9 ~& O- d' w9 U/ o& ?/****************************************************************************/
: a4 q6 i) w# D7 v6 @) @% vvoid UARTInterruptInit(void)
6 z; S0 Y% B* Y0 p$ p& v& ?{" U: H/ R/ W0 O% v( V3 h
IntRegister(SYS_INT_UARTINT2, UARTIsr);
5 _& M8 M d: e6 Q IntChannelSet(SYS_INT_UARTINT2, 2);3 Y# w5 X4 R2 a' o7 A+ ^
IntSystemEnable(SYS_INT_UARTINT2);: {, F* R7 g# p1 [8 n2 z9 Y
7 w$ D) i# O4 v' g
// 使能中断' W% ]* D8 N1 j
unsigned int intFlags = 0;
* t( U) Y" O& O intFlags |= (UART_INT_LINE_STAT | \
7 O& s! e4 w |9 H+ D+ d3 U% l7 l UART_INT_TX_EMPTY | \! ^/ a5 v% y2 v6 \" y" L: r
UART_INT_RXDATA_CTI);) P5 s# b' o, `' ^4 t1 a9 I5 ^
UARTIntEnable(SOC_UART_2_REGS, intFlags);
, z5 T6 L9 X# g% H& I8 R}% r: Q) K. a' {+ F3 Q
( A# v, Q' C) Y3 D6 A/****************************************************************************/- ~/ D* ^/ W- a* f' a: D, _' a' {; M
/* */8 M- |+ F& C6 W& Z1 `, x" \9 Z1 N
/* UART 中断服务函数 */
: u2 \) X7 s1 k: L7 x# ]% _4 ~/* */
0 W$ b5 }6 g: s/****************************************************************************/3 g+ r }, K' T& C! @
void UARTIsr()- j, |( z; I9 a; Q
{
% `7 m; E/ G3 ^" S) q# }* X static unsigned int length = sizeof(txArray);
b7 ~! N7 ?/ q3 F static unsigned int count = 0;
" b3 G, D5 T( S unsigned char rxData = 0;# T# @9 a( |7 |+ A5 k
unsigned int int_id = 0;- o- x: V' V- o& O
( Y8 D. h0 V' c. E! C J // 确定中断源1 @6 T+ z+ S4 M2 U% Q
int_id = UARTIntStatus(SOC_UART_2_REGS);( k" B% W' i K9 F+ Q9 l6 U
' N( x$ h" z9 }- |
// 清除 UART2 系统中断
9 y$ L3 T9 h0 w5 W6 N1 A2 N IntSystemStatusClear(SYS_INT_UARTINT2);
4 Y# P4 N) |4 ?1 p. Z. R% D! w, `: d
// 发送中断$ g: }7 G# W2 e) D9 h* O# y9 ^
if(UART_INTID_TX_EMPTY == int_id)1 U8 H! O5 s& S: v( z( @
{& H0 `9 z- h, Z' w
if(0 < length), H( z. \! i4 O, M
{% T+ ?" M, B8 x1 w- t$ h
// 写一个字节到 THR7 d3 b. @- ^5 ^9 a, `2 _; y
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 U4 U( J( I( u' \5 ~) C; {; @* n
length--; ~; v: m! Q* G* |
count++;5 I" M* D5 J/ ^: V/ W; K
}
1 g* T! j% n2 U1 s0 K3 k, I if(0 == length)) H2 p& k4 c' b U- u. ] Y1 v
{/ @: `( q* H$ e! z
// 禁用发送中断
# x' S3 {1 w# B$ a* E UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);( Q6 s2 x( g* k6 W7 N
}
^# v) ]9 g4 v- _" z1 Y- j7 B. r }
( q1 H8 D# U% _& D3 ^- m# a1 ?$ Z+ S/ e- J" z1 P/ O! @
// 接收中断% x5 S. w9 g8 M! N* ]
if(UART_INTID_RX_DATA == int_id)
' E O1 R' L4 d6 k {
9 U$ ?5 `5 _9 v8 o% t rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! K8 s: ^# q3 A* m" H. N8 G! W" S" r8 `; _# a8 t4 n
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ ^- A( p0 W ~6 ]6 K+ p5 q }1 T% M8 w3 u% | k
, I- b. z4 C' a/ W0 R+ J
// 接收错误- { Y k4 |& z
if(UART_INTID_RX_LINE_STAT == int_id)
+ v3 f2 T. i5 w8 ~% q, K {- c% w: w% m3 g7 K% G/ L
while(UARTRxErrorGet(SOC_UART_2_REGS))
0 z, e7 W: M0 ~& O7 c4 g {
+ L% U9 _* q0 Z% e // 从 RBR 读一个字节
2 I1 N: T" e! _/ I1 s1 J3 b UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 U! b& h4 h/ c5 @, n2 T }
8 r# L* u; Q' N0 u) f5 j6 I }9 Z, \7 m) M3 r" l* n& y* m- e
0 o" ^' }& }: i4 Q9 z6 s* Z# b return;
* {+ E/ L& X* B7 e}
" C- |: x" N7 g/ F/ i. f2 i. d |
|