|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
, U8 o. @1 i. p9 B- j: X" _" d) t9 f; A! |5 N9 k" U2 e! k
#include "TL138.h" // 创龙 TL138 开发板相关声明
/ F% Y" @ S8 G7 a& y" X" \5 [/ o" \3 Z/ n+ F
#include "hw_types.h" // 宏命令
1 e4 [, F1 M4 C; q/ a: ?0 k#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器) ~$ i3 D# h2 F9 Q4 M0 j2 e/ o
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器6 a' C/ X* c) r1 M% z! P8 ]1 l0 V$ T
2 j, H2 v" y& A# N- d
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
" O" i2 ~1 v/ s4 P% _9 _; B3 g#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明) p, @" L- R9 V, t! G( D, o% @
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明/ F) B, `1 q0 A
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- T0 k, y$ ^& O% @! e1 {1 B) L* _' O* U; S( v* h
/****************************************************************************/
+ [4 v, O. E0 w6 }! z# W9 }* R/ s/* */
# w3 J" g" w4 S% U/* 宏定义 */8 a* V2 S$ n" R; A a! _; d
/* */
0 q1 d9 O! F9 ~; ]) q/****************************************************************************/% ^. b$ _6 Z s& x
// 时钟
; W9 }9 C/ y5 Q# n7 a#define SYSCLK_1_FREQ (456000000)( F3 N* m1 t. x3 T1 X
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
/ @5 V$ |2 [6 J( D: J#define UART_2_FREQ (SYSCLK_2_FREQ): {0 y" t" i2 m4 o; H& E
2 E. x( R A( x/****************************************************************************/' i8 b: D$ n+ I, A6 V
/* */& I' n; I* F$ a3 G7 ~% a3 N
/* 全局变量 */
8 ?3 p5 l# T8 U2 _" a/* */- j( x) ?5 a Z& V( b
/****************************************************************************/
5 |4 _3 T. U. t. M9 U/ Tchar txArray[] = "Tronlong UART2 Application......\n\r";
' ~% t7 T# A, z# P8 x$ m- m8 @+ I! ^! y! e* n
/****************************************************************************/5 W; q! a1 F3 r
/* */
, K! q# L( I) Y4 o/ E/* 函数声明 */* m+ V- c; o1 d) A7 K# L
/* */# l/ k2 W1 ^! a& p
/****************************************************************************/
& d/ u; y* \) }+ R' b3 t// 外设使能配置8 R9 t: [3 [4 t- w* W! S
void PSCInit(void);
8 l3 o2 Z* r* r' b9 ?6 X @
/ E- Z& H$ [$ }) l6 |// GPIO 管脚复用配置
* I7 a) `5 B. n% H- t$ O5 Ovoid GPIOBankPinMuxSet();1 }+ `% ~, `( c; ^1 Y0 \' V4 g. W
( j: I0 I7 `2 W. e' N) n3 u// UART 初始化! ?3 s% i9 I2 f( B$ S/ _
void UARTInit(void);% z d4 l$ O. e2 u" x' z
// ARM 中断初始化1 ~9 V$ }8 e5 N& K$ x
void InterruptInit(void);
8 E/ \" J2 ~0 l: w4 p// UART 中断初始化7 P/ k+ Q5 w: r; ^9 J. ^0 y5 B% l
void UARTInterruptInit();, y- t5 }3 F/ m, ~
// UART 中断服务函数6 G( k* S, g$ b) p! X" v
void UARTIsr(void);- K) y A+ p# m+ f7 @
1 _) j% @1 \4 x# M s6 U& N' x; Y0 K/****************************************************************************/ [+ M- |' g! m4 V( q- y2 a
/* */
) C2 Q( _- I" c1 s2 R; [/* 主函数 */
! r% W5 d0 K6 |- v/* */
6 r* I3 Y: E3 w9 E4 F* t. N/****************************************************************************/
$ ?1 }- p+ w0 X: k# u% Tint main(void)
: f1 E% F# c" e' Y V{
) R: h" G$ `' U; M/ a" E // 外设使能配置2 |+ C' o9 B( ]" l |0 S
PSCInit();5 r. F7 T5 o6 B$ ]& X7 t
! i. x4 T/ f$ @
// GPIO 管脚复用配置$ @8 K0 F) ~6 G
GPIOBankPinMuxSet();) g3 P4 Y: a' R4 y" l
1 g+ M8 q' O" H- B$ A8 v$ c+ c // ARM 中断初始化. `* C# T6 S7 Q" j6 w1 q
InterruptInit();$ ` t) w$ `; m, O9 \7 \; r
, q, Z X: n( `4 |- `; H: T: f% { // UART 初始化
4 s& M* V; v) O/ R9 V5 W- a6 X$ U' X UARTInit();( R8 o; F2 |' l6 H9 o0 J
, ]3 V8 t( W3 m) p- \ // UART 中断初始化
& @% O- R% C4 H& t* u$ o; U UARTInterruptInit();- A' @7 F! ^ i; q% n9 V
( k4 H, Y: A2 A4 N) H- d; i- z // 主循环
) S$ j$ a: p- C+ p for(;;)
( h: ^7 m: n- y& b2 N8 y+ }% q {
: T+ }5 Q( W4 I* T, {8 T" N( }
. h1 X+ W, L' N }
1 G1 _" |. i6 F}6 n R3 a; F$ n+ \; p2 Y
# B5 w3 b9 S7 p" l/ n+ g8 H/****************************************************************************/9 B6 y d( A3 `4 ~3 k6 I1 {
/* */3 W) b ?8 y7 c' q
/* PSC 初始化 */* v6 E! l9 F4 ?) Q; t9 u2 a
/* */, Z3 w: I( d+ V; Z
/****************************************************************************/" K& i8 e/ S7 V. q
void PSCInit(void)
v' L6 W6 R- k" H{
a X! D8 o9 V // 对相应外设模块的使能也可以在 BootLoader 中完成
4 f: l4 i$ c7 Z: i% q* u( b // 使能 UART2 模块
7 \8 `4 {! Z9 `6 S2 C- @ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( m$ s, W2 o/ G6 V
}- x8 s8 I5 H# b
8 K- i( P$ ~ D: O" |9 _' |) c/****************************************************************************/
5 D1 L5 \' p* a5 W- c! X/* */
/ x6 e! |0 g9 v: c4 Z- {7 l! ^/* GPIO 管脚复用配置 */
0 l: K1 j; K/ `9 u/* */
/ I7 o; i2 l' ]1 O9 T/****************************************************************************/
5 p0 O1 t1 l" p! f5 M# Evoid GPIOBankPinMuxSet(void)" w, O9 p" {% k, A) ]' S+ d3 z
{
5 a+ s. [* E8 e' A // UART2 禁用流控
/ m* [* P9 o! m UARTPinMuxSetup(2, FALSE);" O/ s/ L$ v* v8 \' u4 g4 M* G( U4 y5 C
}. |4 }' z8 n2 F" K' U6 g/ V
) D+ ?( D q) h
/****************************************************************************/
& N8 y$ c3 o Q; I* \, m" Q: _/* */3 Z" p p5 D4 g7 M }
/* ARM 中断初始化 */
) h# A3 V5 \7 F' r+ ]/* */7 d/ Y* m. l* l2 H8 P
/****************************************************************************/
4 ]" ^2 [) b# P5 s0 Hvoid InterruptInit(void)
. H; c9 Q u6 @{. {" Y4 b5 d) i4 t+ t
// 初始化 ARM 中断控制器
# d; |; |# \+ s5 T. b IntAINTCInit();
/ Q* y6 u8 z1 H1 P N1 w, U
+ w9 t5 i, F! d& F // 使能 IRQ(CPSR), g1 L" I( p7 ]' J
IntMasterIRQEnable();4 X6 `0 `4 _. D9 `' G& j) b' s2 g
' D0 h4 O& } e, i1 D1 w // 使能中断(AINTC GER)
) e/ h) m- ]' m1 Y) U! P IntGlobalEnable();1 ?* D, t, G T! I; y
- y/ h8 j+ J7 s8 u% Z' n& s9 P l* d
// 使能中断(AINTC HIER)
7 A3 t2 \& d1 N" Y* t+ ?' f IntIRQEnable();' K' W) t% [" i! H" m
}$ W* \) ~, { `6 G. i: Q
9 z# W1 Q$ I5 A& t4 a/****************************************************************************/
& q/ x# {6 x" g% d9 S/* */
3 J# ?5 }2 `, U( G7 `3 S9 ~, i/* UART 初始化 */8 f- s* g P/ B# M) h. ^' f& L1 i
/* */
9 Z" c+ d& o7 G/ s: \5 N: A/****************************************************************************/
' C$ i1 Z m1 w$ e8 a7 ?void UARTInit(void)" V6 X9 L: M; l9 |
{
$ w+ G, I9 J9 ]& ` P) ^9 d7 W( z: V- t // 配置 UART2 参数( Y9 w& t+ S) K# |: v, @2 Y1 h$ M
// 波特率 115200 数据位 8 停止位 1 无校验位' B4 z4 U+ K) _8 S* V
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,; k6 R; O9 X! u# q \
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
\& ]( @* d. H) U% g' Z // 使能 UART2
0 p e3 V- L4 Y- W- ]' U UARTEnable(SOC_UART_2_REGS);
M5 Q2 n6 H, c+ _
( T* l+ ~* \. K! y/ g; H# ? // 使能接收 / 发送 FIFO; H3 O' I4 @+ a3 z* p
UARTFIFOEnable(SOC_UART_2_REGS);
* ?3 `" ^7 s% G( ?& e/ Q; g9 A. ~8 w
$ H3 {0 F. ?$ |4 k/ S // 设置 FIFO 级别6 }# u5 Q" J" f
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);1 f; t# M' L$ k2 ~- _$ y0 I
}0 _7 I. c8 d2 S9 v6 k2 w
4 J/ Q/ G) a, L0 S8 J1 X4 [' a! S/****************************************************************************/
6 s1 P$ [4 |* x& L/ t. K' a/* */
- j* {) |2 p; `5 @5 {" U6 r/* UART 中断初始化 */) Z, s7 ~& P$ M& J( j$ C9 r+ A
/* */2 H; I5 B' G. s; B
/****************************************************************************/6 U3 f1 |8 l2 v7 W" Q
void UARTInterruptInit(void)% b" i* w8 Z' ~/ \) _/ ?
{
9 V( U( G2 I( N, J$ g+ Q& o& P IntRegister(SYS_INT_UARTINT2, UARTIsr);2 o1 J$ T; F" T5 m6 h0 J
IntChannelSet(SYS_INT_UARTINT2, 2);2 L f7 A [8 `' _4 G) V
IntSystemEnable(SYS_INT_UARTINT2);
* P0 b. w% t3 ~+ D: z0 K& R5 X: z c/ g4 @+ V" L
// 使能中断
3 ^* d/ }* j& T/ U: {+ H3 b unsigned int intFlags = 0;& {9 R9 U" s* ?
intFlags |= (UART_INT_LINE_STAT | \9 I' r) K: Y& o) S3 k# b
UART_INT_TX_EMPTY | \8 ^1 h" G9 }. @' L
UART_INT_RXDATA_CTI);
( P& i }. f8 m) A+ @ UARTIntEnable(SOC_UART_2_REGS, intFlags);: b& R5 w2 \+ ]* T0 o0 ?9 ^
}
- M8 {1 W! O1 O6 g( h- n3 S' @' X3 N& q, f9 z/ v
/****************************************************************************/
" G8 f& |5 e+ Q# |/* */
8 u( z& n! y" X# X/ J4 M/* UART 中断服务函数 */% t- A" y0 g( }% |: D+ U
/* */
4 v( q3 Z" K1 f% C1 o5 o/****************************************************************************/. r( Y( J$ X! z% k( v) w
void UARTIsr()
& Z! D; e3 j! I4 y: T( G8 I+ O{& ~2 t# A4 s8 [% G% h
static unsigned int length = sizeof(txArray);
" c5 k4 b5 w7 d- u static unsigned int count = 0;
# F6 B q. D+ I5 B- t! K. M unsigned char rxData = 0;
& {: u" x+ o- q2 Z unsigned int int_id = 0;/ z( r- s- j4 h3 h& w* M
2 r+ _1 K3 i; M // 确定中断源, t* M8 K+ {/ F7 N. p
int_id = UARTIntStatus(SOC_UART_2_REGS);
% x, x6 e- |( |+ B$ ~. P3 i* H; Z. d0 z0 D
// 清除 UART2 系统中断 I0 {+ E1 Z L/ d! o: B# m4 u
IntSystemStatusClear(SYS_INT_UARTINT2);& [) _) Z$ |: ^ ?8 _& ?& p5 C
! X9 r' }. S& T: s. T# F2 v
// 发送中断, W' u" v, _$ a3 d4 u
if(UART_INTID_TX_EMPTY == int_id)
, e" d" b) }4 M# w* |. D {
, I5 | E N6 {9 s' D if(0 < length)+ M+ P t* A2 N! Q; l7 Z; U5 I4 G/ l
{
/ P6 E/ j& o) _8 h% z( I // 写一个字节到 THR1 v0 O+ x9 f4 q+ N o3 W( n, M
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" ~$ w" k0 Y: J4 d" V4 a/ }
length--;
! g6 A- Z- v9 O1 T0 |) e0 ^ count++;
6 ~1 ^) `- r4 T! z6 R }) O5 y% }$ \/ z l& }
if(0 == length)- Q, H4 R" r# g& U C# D2 \" t
{' A: N; K) M2 e/ N7 R$ Y- |2 S
// 禁用发送中断" V5 l, U; |1 ]" \" i8 h
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ ?0 |3 ]* l: x7 C3 L
}
- l& \$ }- x7 V9 _1 t }
4 N; O6 j, j" o0 W# j7 Q) D, z& |$ i9 _6 a3 h
// 接收中断
$ L$ [/ o9 d6 P! T8 F if(UART_INTID_RX_DATA == int_id)9 v9 B D0 j! Z7 N7 q" {) d, a
{, @. {" F( e+ h3 ?& s0 _" ^6 D
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);0 R6 s! N2 Q0 P% \+ T9 P% v) F/ y1 |
( S9 c: Q1 X6 I/ p9 y
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);0 q/ h0 L0 S+ h9 ]9 D
}; |: b5 z' @$ e8 h6 C2 H* }
, ~+ _! ~ E) \1 K! {6 Z1 A5 v$ w
// 接收错误' _5 v/ r+ Z, z, n5 K
if(UART_INTID_RX_LINE_STAT == int_id)$ q6 I6 B4 m9 I, N+ S( |# Q
{
' { N, Q4 N: l" A& Q, Z while(UARTRxErrorGet(SOC_UART_2_REGS))
0 {; q, g+ a0 g {
6 T3 G2 E8 i0 d // 从 RBR 读一个字节
$ F" K' u- b# Y4 G UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 Z/ S/ M% V; b5 c9 ?) m }
9 q+ L* A5 f$ ^' ~; ~4 [ }
% d& O& O& J/ p* [5 t. b7 C
4 u$ q! L! l+ L2 | return;
9 Q. ~, L k% q* y* \. }4 W}
1 b7 U' k/ U; H2 \/ r |
|