|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。( P3 K2 [0 b: ?% i- V9 B
# }) G- U) N' D' k, k; V#include "TL138.h" // 创龙 TL138 开发板相关声明" S1 Z$ w4 R0 P$ ^2 o* f, o; N
& |9 ~0 Z. M+ e#include "hw_types.h" // 宏命令
4 |- j1 N2 z% K6 b1 r" y#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器5 V. m) ]3 e. r6 }, Q
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器9 Y. p: A6 P; k3 I4 ~: M, L
& l! @& a, D2 r1 M$ Z) j#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
+ o- _' ~' ^* ?#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明2 a$ ^4 l; R6 Q
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明) w1 b& Q6 N- |6 U
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
! { r" t# N9 u( T. {& l
2 \8 Q5 `. a! b. P/****************************************************************************/( x( y& S& J0 q0 u* N/ }
/* */
$ v( C1 q/ M/ g$ z4 D8 n/* 宏定义 */5 Z' G8 Y. E7 R. ?# V/ q& \4 C
/* */
* K+ i& T4 m6 _6 P6 d5 Y: ?/****************************************************************************/! F7 r& N7 O& l& g
// 时钟
6 |7 _- s4 e% @8 y& U2 R#define SYSCLK_1_FREQ (456000000)
; b' C) G1 q; f/ J; w" `#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)9 a6 n i& K& ?* w! Q
#define UART_2_FREQ (SYSCLK_2_FREQ)
& P: n3 N* p1 d1 q7 T% k) v- Y
/ G& |- P# \7 x/****************************************************************************/
' K0 ^3 l3 z0 m1 \: }* o, M/* */( t8 a" N- G1 K, f
/* 全局变量 */
& K5 v U$ G4 M+ N/* */& D, @/ B: ?0 C+ Z
/****************************************************************************/
3 C0 ?& p* G4 P Y" ychar txArray[] = "Tronlong UART2 Application......\n\r";
) ^; a J. S0 D! P# j
5 N& E6 L: j1 r( y7 c* [/****************************************************************************/3 j( I, }2 }3 w' p1 {2 X) |7 t
/* */
2 {# G4 v. D" e. i/* 函数声明 */
% j( W: I$ n8 p0 r! c/* */
: U5 H' q! u' i3 f$ t4 T" y/****************************************************************************/& A( y4 Q J* F
// 外设使能配置. D* l Q2 C$ w( d8 L* }% e* R- i) r
void PSCInit(void);, p$ ^ s6 y4 q/ Q0 @; _) x
0 d' i" Q5 {8 w" o9 p// GPIO 管脚复用配置
/ _1 G8 l1 q5 G( B4 Q( Y: t1 jvoid GPIOBankPinMuxSet();
$ x/ h# G9 T; a2 n1 K: `- M
; b" ?% [" t$ b- ~// UART 初始化! R7 v) T2 T- C! V
void UARTInit(void);
7 J- F6 T3 J' W+ R' Z1 h% G// ARM 中断初始化
" d- j5 j. W* Z2 I- O4 Nvoid InterruptInit(void);
3 `$ n+ b1 Q& f+ Z% ]/ x// UART 中断初始化
! X$ B3 Q6 J3 K" z5 }void UARTInterruptInit();$ k) J G8 x5 C0 c, j
// UART 中断服务函数
% C2 c M" h' C, x3 T* mvoid UARTIsr(void);* P" y! V" S3 \( M+ Z4 |
' C0 ~- l0 d+ h3 I/****************************************************************************/
9 y, P; J i0 ?% e/* */( m$ \1 @, o7 @) {$ q! S, |& t) {
/* 主函数 */
' M3 L& K2 B0 O1 Y$ @' h/* */+ T7 Z3 |7 H! G( F: p
/****************************************************************************/
3 x# a( }. Y3 q# V( uint main(void)8 {0 h+ ?; X: T1 t5 a5 _ r
{
' V3 @6 u' ?, |( t // 外设使能配置8 G( Q' A6 I1 o; N- S) l& @. {' I
PSCInit();% X0 I% U+ B0 h* m6 k+ j
! f) p* B+ L0 ] |2 s" N
// GPIO 管脚复用配置
9 M3 Z5 d) f. a& k/ P& t GPIOBankPinMuxSet();
% |, a# j' a v2 H. j* Y6 w5 }! b& w% o! M" v* b6 e
// ARM 中断初始化
: H( x9 ]8 i; {6 t! ]1 ` InterruptInit(); R( k7 c, M" ^8 _
) X+ h9 q1 |, J. l% _
// UART 初始化% b" N* {# z0 h6 \! L
UARTInit();
5 @0 w* S3 O7 @2 P0 f; n, \2 M0 h) @: \$ Q
// UART 中断初始化
- ]* f, n3 b: A: j" n1 [* U UARTInterruptInit();
5 ]9 }% B+ V" q3 q' K) q9 ^" g. t# y% h# A" B: o9 H8 ~
// 主循环! h' n% M6 i9 Y; o- g( z
for(;;)' }% P+ O8 F. n+ C3 A& }0 t
{
. [% ^" l5 J1 L( u9 p0 a# h( f: ?9 `/ g+ {3 `5 m+ I
} r% e# B1 }5 b
}
/ b9 I4 K4 h) E9 ~2 N$ e5 `6 h- Y) N$ |* v7 M# ^. }$ }
/****************************************************************************/" u! ^$ Q) m3 ~4 h* j
/* */) Z: h0 b) m+ N q/ e/ U/ J
/* PSC 初始化 */- |0 i7 B7 M3 T' @! p+ B9 T
/* */. D/ I0 f! h3 a) H8 Q6 p
/****************************************************************************/' J/ v: y' ]6 m
void PSCInit(void)" g4 d- M5 W: c5 B6 t
{ N4 J$ f I, q* e" I
// 对相应外设模块的使能也可以在 BootLoader 中完成
, y9 n& `; S: e% F# Q9 o // 使能 UART2 模块
! I# [% ~8 c6 P$ G9 q3 v) Q/ w PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
% J8 I7 A) V2 Z# E8 w) p}: s$ ^: S3 j( h2 G! I
1 z, O2 w+ t) S2 {
/****************************************************************************/
- F9 D( G- @' j- C3 }/* */
% X7 |; u+ B7 Z. V3 c/* GPIO 管脚复用配置 */
4 U6 d# T$ I3 N, H$ `. @/* */7 Q6 I' C& N* R8 [# I+ w$ @
/****************************************************************************/8 B/ U5 {5 R, Z, `7 z
void GPIOBankPinMuxSet(void)
! N' t. g# B9 d, q$ G3 P; A+ R' R{
: t4 x* z+ Z+ w0 `" D* e/ t; ]6 d# S // UART2 禁用流控
( V8 \7 ~ M- F UARTPinMuxSetup(2, FALSE); t4 N6 q/ a3 V# P
}: { a' G9 ^; ?' x
- l4 Z; R# b2 G3 L& U/****************************************************************************/# K3 }( D8 ]4 q9 L
/* */
m$ _; h4 R! k! W; Z8 r/ m4 X/* ARM 中断初始化 */' Z' h# l* h8 r! ?: v
/* */
. E1 Y5 C& Z5 _; h9 N1 m& }2 ?/****************************************************************************/
6 V5 m* d" T. F; b: Cvoid InterruptInit(void)0 t3 L# f# v- F. P, B
{
+ I, |& u! f d; N, Y // 初始化 ARM 中断控制器/ k7 f# }6 J1 u2 x+ h0 _0 R
IntAINTCInit();
8 s% W" I4 C& r: Q; b; c6 I
7 {8 i$ _% A! N( e# |8 G! e8 N* P // 使能 IRQ(CPSR)$ B% n. j; E- z1 Y' c% h
IntMasterIRQEnable();
; X- c5 X. A ]* d J1 H8 K/ F* j+ P) N( r$ N. I/ N1 E
// 使能中断(AINTC GER)
% L. h7 S; L7 i C. [* f' V IntGlobalEnable();) Q( M- \2 D* S2 F- u/ z
4 z" W/ W$ H1 o, H8 |
// 使能中断(AINTC HIER)
3 G ?8 i. p$ l) y h7 {; L IntIRQEnable();
3 a+ B0 Z4 X9 p! Q0 x! k9 N}
* W( N9 ^7 N. o+ p7 \; V- f. P! R: P* Z
/****************************************************************************/
0 J) r* ]1 X3 ~4 I: L/* */
{# }3 W6 ~. ]* [0 L8 y' Q. P/* UART 初始化 */* M9 F1 J+ o! c9 O- k- }" k9 O
/* */
; L9 ]. d* V9 H0 K$ m/****************************************************************************/. ~, h# h0 L; o4 U) Q% h8 _, V
void UARTInit(void)
7 T* ^6 t4 z3 E6 W: w* ^0 `{8 G$ s8 W) p& g0 _
// 配置 UART2 参数( [9 n( V6 i# C) t& ^7 H
// 波特率 115200 数据位 8 停止位 1 无校验位
5 `$ Q; N1 g8 o {& M; ? UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,( |0 ]. b6 P0 P0 v' k x% R G
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 A+ J/ x4 D, Y) q! S$ K0 ~) I // 使能 UART2( }) p- @2 h; n* ~
UARTEnable(SOC_UART_2_REGS);" r8 h3 j/ [: k& s7 _
; \2 A M- o0 h) V. F6 K% v // 使能接收 / 发送 FIFO8 f& H+ \) C4 ^! b1 m7 N. k
UARTFIFOEnable(SOC_UART_2_REGS);
+ y1 E: C' R* z. U( a I, Z+ A. _; i, h- u
// 设置 FIFO 级别
/ _1 }, s/ U3 d+ h e( n UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 H4 r& b% q7 n- P& i: d" Z}
' R6 V- o$ t# i( j) k2 f) b
' ^" q$ T& I& `/****************************************************************************/
% j& U, N" s# U/* */
, J5 ~8 b4 f" ?2 f: n/* UART 中断初始化 */
' }. Q' z) } e! h/* */
, f3 C* T; |( J/****************************************************************************/
8 M4 B& X" a/ u6 {0 Zvoid UARTInterruptInit(void)
/ s3 [: o+ w, ]2 ~8 r0 d{
# p' L$ p: h% K: Q) r8 x% D& t3 I IntRegister(SYS_INT_UARTINT2, UARTIsr);
e* _/ g5 ]2 s3 \$ q2 C IntChannelSet(SYS_INT_UARTINT2, 2);) K, q; ]$ W1 Z) Y5 q3 T
IntSystemEnable(SYS_INT_UARTINT2); f+ F* ~) G d
$ i: C, `4 W/ c7 F
// 使能中断6 m0 V3 A6 X% s, X1 n1 T# ]; z# U% ^, _
unsigned int intFlags = 0;
, s4 J$ M. n' Z( m intFlags |= (UART_INT_LINE_STAT | \
9 I- m/ q' Y8 t3 @+ g& y UART_INT_TX_EMPTY | \+ g4 R/ f; S7 `& {
UART_INT_RXDATA_CTI);
j+ c" y# w; U% @ UARTIntEnable(SOC_UART_2_REGS, intFlags);/ d8 E( V6 S, F
}
7 a' L/ D% y* k. ]/ e
7 ~. w! @& L6 z8 C# u: i/ O+ i/****************************************************************************/, s: V/ T" R v% c9 h, ^/ A! d
/* */
1 i* r9 k w# \/* UART 中断服务函数 */) Q! I- O' ~. q: b4 z9 I0 ~* N* t5 n
/* */' n9 V4 Z+ a% n) k& W3 f" y
/****************************************************************************/
5 r; x7 Q: ]9 U0 Gvoid UARTIsr() e8 _, t! M6 n6 ^0 H
{
3 n5 q" c" E1 ^1 U t3 L static unsigned int length = sizeof(txArray);6 J G6 B0 w/ ^+ s5 C$ K
static unsigned int count = 0;& i1 Y0 h; v# K# W6 G8 S
unsigned char rxData = 0;! Z9 j1 }9 h; V- q5 J. H$ a" B) a
unsigned int int_id = 0;
B8 s) }. m* U1 r2 D5 {) ? U+ _& c8 ?$ K! k" y, u, G
// 确定中断源$ h8 ^) L1 ^2 Y9 [
int_id = UARTIntStatus(SOC_UART_2_REGS);
; ?: f) K5 P2 Z: l- M: p) ]$ B* T/ u9 \6 L! m k1 E
// 清除 UART2 系统中断
: r8 L$ t9 a3 `! T0 ?/ j2 ^ Q- m t IntSystemStatusClear(SYS_INT_UARTINT2);# _6 t/ B6 h. u ^6 \& b: e
3 r* E/ G5 n8 @+ s* h! W* {8 z // 发送中断
5 [3 F+ p/ a* L; J5 ?. K# P if(UART_INTID_TX_EMPTY == int_id)
h! h( B; m3 j) i0 {6 |4 |9 ? {3 P) C. L: m/ q, f8 z2 f O# _' [
if(0 < length)# i. K J; ~1 \( D# w1 n
{3 |2 ~ L6 u _0 S: u& t
// 写一个字节到 THR
, b) m: E4 U0 h UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
# X/ P* r. M5 `+ E8 W5 U% U# h length--;% q% M6 U U9 k7 M& G
count++;4 x) R+ e1 K% N7 R( V
}% H# O: O" \% N/ M# T1 Z* s/ P, l
if(0 == length)
0 L/ ?1 v! ^- d% { {
9 j+ Y5 t8 i( h // 禁用发送中断7 _6 p8 \; r4 T% O
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
7 V, m+ {5 ?! q+ x4 }6 G }3 @8 K7 t0 l, U# i
}0 ]5 [5 ]5 T/ I* y* ~% h3 O
# O0 A: {- K# l7 h; n+ ^' }
// 接收中断2 H% C5 E+ f8 S7 V; w$ Q
if(UART_INTID_RX_DATA == int_id)1 H7 D" O) x& w; t, w0 H$ y
{; J* L' d5 g6 |' P8 f
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);& Q4 \6 m8 I& s; |
! _8 _! B6 ?2 w) ` UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);9 P; D/ Y3 B! _! N: \' e0 P; H
}% L3 l1 Z# b) t
h F! j) W+ Y! u: E% C
// 接收错误
2 D. q6 m T3 z, f- B9 k, f if(UART_INTID_RX_LINE_STAT == int_id)2 i' t2 m1 ] c( N6 Z1 N% Z% o0 m S
{
3 ^% F9 a' ^( U4 U+ R while(UARTRxErrorGet(SOC_UART_2_REGS))
+ N8 {" v7 c& Z. n; Z. A3 \8 l {0 A" L* }8 o. R% f. U R
// 从 RBR 读一个字节7 G7 @# W3 ]* w8 {: Q+ H
UARTCharGetNonBlocking(SOC_UART_2_REGS);
% R0 g; H8 [6 X6 w/ H, v) |6 j }; G( k( W4 k/ u% d2 R; Y' u
}! i+ c, A# P9 Q- p
6 _" g. h/ @/ O6 n3 s( M7 @
return;- \" z8 R: `* D5 M; _
}' R) h" E" a! o8 s1 J' F. Z
|
|