|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
; S& U5 B. b/ ], q A9 K( p0 ]
' H) y& O) W6 f5 b# A$ t- }#include "TL138.h" // 创龙 TL138 开发板相关声明+ X4 t) [* m8 D
5 w2 g, p4 ?2 N# }0 t- C& y9 b#include "hw_types.h" // 宏命令
. J) w9 o5 ~& x a#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器2 Y' k0 i" W, e- E1 D( c; S
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器, c0 e; w: i1 r6 I T
; I- `5 u5 @' j/ |$ n
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
2 H" e3 q( w6 I, l& o4 c: c P" G) F#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
+ I4 w. s6 _+ I+ o, F8 l8 g! N( {#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
8 S4 ]" W- P1 M: z. s8 I( W$ Y. _! P8 y#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
# r5 j/ w, d/ e% s: X* b5 t% ?
, D$ p, A8 d. _* `3 o; J) C+ H$ d/****************************************************************************/, ^8 I5 o% I; u+ S6 k. y
/* */4 Z" h' E. \) n, s
/* 宏定义 */
/ c" ?! `9 y7 a' g& o/* */8 G1 F4 E, U0 G$ y
/****************************************************************************/2 s; F6 Q% C% }" ]6 b: t2 v+ Y/ V
// 时钟
0 T- _# N; M! T#define SYSCLK_1_FREQ (456000000)
5 ~/ j; @) q9 \3 A#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)& i) ~8 [8 U; N4 R+ L! k/ L
#define UART_2_FREQ (SYSCLK_2_FREQ)0 e, X9 B! G4 l* ^
4 V2 e2 h* ?! c9 ~" I! F/****************************************************************************/
& [# x* |0 b$ F9 d* t0 q: S/* */- U% N! e* N8 {# ^! W+ c: a$ ~5 \
/* 全局变量 */
6 T7 K& V# x" L0 m8 W/* */' b& x! B8 p, ~0 t1 o p
/****************************************************************************/
N5 O! }3 }5 q- \- U/ Schar txArray[] = "Tronlong UART2 Application......\n\r";4 N; P6 r5 |8 \2 Z% I/ S% m
5 a- t+ \6 t w: Y! i9 n
/****************************************************************************/: p3 |/ Y D8 Q( v
/* */7 [$ c* ~) M* A* Z7 P
/* 函数声明 */2 p' x3 Y. m* L% H; h: @; ^% Z
/* */ m: I/ S |6 W6 ~- Q6 T( e: n* S* _
/****************************************************************************/# u( `/ p0 Z5 r1 ^: [
// 外设使能配置8 e0 ]' j7 G& |" B$ r; {0 T
void PSCInit(void);0 \) x% Z! u: n
, P# l+ a" S& a7 N" e) X8 S' ~: V
// GPIO 管脚复用配置
, K$ ^- {3 a2 [2 p Zvoid GPIOBankPinMuxSet();
3 [3 Y+ D/ a- V: E/ a
% b+ \ t) w( x8 d// UART 初始化# `# l* }" q7 _+ D( g
void UARTInit(void);! R, e! g/ B2 }! t; ~" V
// ARM 中断初始化
+ c2 q# s3 c( i" x# evoid InterruptInit(void);5 A2 P; t; H/ `! s0 \6 B
// UART 中断初始化3 t2 P7 c8 j. f& g. `* @
void UARTInterruptInit();$ `$ M9 H5 k; h4 n) g1 w, i
// UART 中断服务函数
6 t6 f* j% }! w: y4 I( B: T! }" @void UARTIsr(void);% Z: |9 q% ~# [3 ^0 m8 P
0 N9 a i& t! { v9 V+ V1 }/****************************************************************************/: d' C' z- e/ e, p/ [: y/ G
/* */* c0 s% z) q B7 d' l0 F8 g
/* 主函数 */5 i1 f x" ^ k# S1 U
/* */
% }3 p1 W; i1 ?+ r) N! o/****************************************************************************/
! _- Z6 R0 ^! B ^( g* U9 o* W1 S, yint main(void)
+ a/ U1 _) Z9 H5 {6 P( h: V" J{+ T( V) J! F5 H) U+ Z8 h* ^/ [ g
// 外设使能配置
5 W* y- m, l1 n8 ^; L7 R" K PSCInit();
1 D& b& J% O& ^- l/ [% S 5 i& @4 A) A* ]( \* Q& r
// GPIO 管脚复用配置 u+ w& `" U2 ^9 } R
GPIOBankPinMuxSet();, x& L' b+ O, z2 y: K: y
+ M2 I! ^5 w$ f \
// ARM 中断初始化
6 t( U4 `" u7 I/ K InterruptInit();
w0 v4 W2 M8 D' e8 T" M! m* x# O/ {% S
6 B. M; m- M) }3 R2 x Z6 h$ x K // UART 初始化
# J) l) y ], G3 o1 k5 s* B3 ? UARTInit();. a) U% p' \5 i, K9 T
3 t& @2 J5 z$ j3 }2 [# K, } // UART 中断初始化9 l. n* J, Z( {4 A; J
UARTInterruptInit();3 a# X9 b0 [9 e; D+ W
2 J* \: ^8 }) n
// 主循环7 b3 |2 b3 {/ D }& E
for(;;)& r, }9 Z1 H% {4 n* I
{0 w: }/ L( d" o/ V- Q& i5 z
{" g3 O k4 C6 M% V/ J: ?7 I# Z }& l: v+ P" d. x# [4 a# y
}
2 d$ G; t* r) v: P0 j* ~' ~
& ]. F0 V; k a- a# q/****************************************************************************/
# H. t- k% X) X/* */
+ b @% ~4 {7 F# x/* PSC 初始化 */3 M8 ?" a9 k! `! N: ]; D" x. P& C
/* */
5 ~/ Y+ V9 P3 Q( I. b9 ]/****************************************************************************/
v& `) {" }5 z0 L. gvoid PSCInit(void)
: @( Y( i. U+ Z. z4 j" k{ c) ]) e8 B- d- f) M4 ?: z
// 对相应外设模块的使能也可以在 BootLoader 中完成1 ~% ~; m3 z- X+ o3 {9 d
// 使能 UART2 模块
: N0 G# e/ ~! _0 J8 v PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
! L0 o0 _$ I D# L$ p# Y6 j% m ~2 x}) p; P" z: g( c; [3 Z
/ b5 C" r% n5 X! `0 ~/****************************************************************************/
4 U4 q( B0 H) N9 f: F" ^/* */- z' e- [: i% _' l V) t
/* GPIO 管脚复用配置 */
# Q6 s: t. Z) U- N5 X/* */3 Q; f5 }3 T+ Z. ~' y) W- }9 P5 p; e
/****************************************************************************/+ ~, R: v, _( l5 V
void GPIOBankPinMuxSet(void)
" w; Y* s- J- ^9 Y4 R- M{* ?4 D. S5 C% y
// UART2 禁用流控
2 y% ^+ ^ U% R% p# d UARTPinMuxSetup(2, FALSE);1 P* r: `) t$ P+ P% C7 H
} A* j5 g9 x9 ]& V
* ]) b! V: i0 y$ ^% O8 a/****************************************************************************/% e5 d! e2 i5 L Z9 _+ T! V
/* */
8 k) ~5 B! C$ R( z* a- ?& u/* ARM 中断初始化 */
# f" n" ^% A2 Z6 f4 U/* */+ Q) S4 P0 X) i4 H
/****************************************************************************/
! G6 Z _; K, Gvoid InterruptInit(void); e; X3 L. `; L3 U8 D
{5 ?( p$ M% N! ?4 e/ W4 r8 N2 S+ @7 F( ~
// 初始化 ARM 中断控制器4 V& r+ V+ F) u$ b9 D4 Y
IntAINTCInit();6 F/ M$ n% q. m
5 n. Y, o' N- G) N& l' d3 Q$ q6 h
// 使能 IRQ(CPSR)
0 h; o# U; p% ?* c1 F& `, A' G IntMasterIRQEnable();
4 k- l: N9 ?! ~7 f: T. Z, V B$ D& y) ~6 @: U' k% I2 o, n
// 使能中断(AINTC GER)$ x/ B: K* L* S0 K) p& N
IntGlobalEnable();
5 [ l3 u; S: N
5 N2 x. k0 M& r# R // 使能中断(AINTC HIER)1 ^5 I# a6 ]- \5 B4 N t( @
IntIRQEnable();0 D$ u, m L- M
}% ]4 v/ U6 n7 E
) M7 l: w$ q# ^/ o
/****************************************************************************/; Q! k& W. B H. z& V: p9 X' T4 {
/* */
8 l3 P# p: l6 e& d& p/* UART 初始化 */
0 f3 Z# Q' N0 E/* */1 ?& o- z! E1 E4 ~
/****************************************************************************/
* t5 ^9 w% g% bvoid UARTInit(void)
" q7 H- i/ F8 d1 s3 Z{* G% ~1 G1 ?" s! f G
// 配置 UART2 参数
' N. D. Y6 `; }7 S& U }$ M' C0 K // 波特率 115200 数据位 8 停止位 1 无校验位
9 A3 y/ b9 l( K% j9 C: c UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,% n: e: L- \4 x0 h
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);, w3 h7 Z# O6 [% x! \& D# F& m. j
// 使能 UART2; K0 b6 N) X( C. t" s O, I$ W
UARTEnable(SOC_UART_2_REGS);
/ d8 G; d3 U& S0 W# C6 D- n
3 S2 Z* `5 D+ L$ k // 使能接收 / 发送 FIFO
& e( b p$ I u4 ?, z UARTFIFOEnable(SOC_UART_2_REGS);
7 o$ [) v! F J/ D& u6 z* V! V0 j
9 M. o- X0 |+ d$ ?! j // 设置 FIFO 级别1 o* V6 V5 |; ^( R
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
* r! A `: T' v9 L}
) V1 |" G* A7 d! g4 C8 p0 i6 W+ ^) n# j% P* T# K
/****************************************************************************/+ O- X( F2 b1 [. G) {" T: A" y' S
/* */
+ u9 |/ m0 l- z- o6 F. j+ n8 u! U/* UART 中断初始化 */
: P, D+ Y4 _4 ^0 ?/* */
+ d% h3 K, \ Z9 d1 G" y; z/ G/ B/****************************************************************************/& @( d: t3 w C) j. y2 n6 Y7 F
void UARTInterruptInit(void): @5 j; z$ r M; j2 L
{
, s, s4 Y" k: c" S- j- r& X IntRegister(SYS_INT_UARTINT2, UARTIsr);2 H& R5 d% n; K0 c( W8 q2 G
IntChannelSet(SYS_INT_UARTINT2, 2);8 X* O ~& G: v: ?
IntSystemEnable(SYS_INT_UARTINT2);
1 \% v Q+ R# \3 m3 H( p" B' N8 l. M+ q0 T. M, s4 `
// 使能中断4 P5 K! V. i+ i0 B3 l8 [/ e
unsigned int intFlags = 0;1 b* J6 b6 s/ P
intFlags |= (UART_INT_LINE_STAT | \ h# c0 B7 i1 W a
UART_INT_TX_EMPTY | \
/ W! ] h/ @! I% D7 k UART_INT_RXDATA_CTI);
+ t9 Y+ g5 h3 M UARTIntEnable(SOC_UART_2_REGS, intFlags);8 v- n3 [. J. Q2 y
}
! E F- F9 ^. _/ K; Q0 Q" s E4 C5 l! g0 \# b$ [
/****************************************************************************/+ Z( x R& Z6 }, ?% D/ t* c- w
/* */8 a0 S7 U. ? Z4 H( E1 I2 m
/* UART 中断服务函数 */6 I% Z. [0 X! t& a4 \
/* */8 y! @! N4 S. v3 Q8 E1 l7 @: ~
/****************************************************************************/
$ Y$ m& l( g$ O# }void UARTIsr()9 [% `( D: b: W' h! C3 ~
{6 x) B B; B, m
static unsigned int length = sizeof(txArray);" v C: R4 c1 x* T" C; v7 @
static unsigned int count = 0;
% z( o, {" o9 r9 r: ]' E Z unsigned char rxData = 0;
1 A7 B4 e. U# }# X/ o unsigned int int_id = 0;2 K5 b0 V2 N& }
' |" ^1 O' q3 x$ V0 v; o6 F! f // 确定中断源* P5 k2 a8 u0 l
int_id = UARTIntStatus(SOC_UART_2_REGS);$ u- X9 B5 N9 H) f, d- [; X
4 m, N7 L4 V, M // 清除 UART2 系统中断
7 ^% _- V0 K9 W. H. K& o3 I IntSystemStatusClear(SYS_INT_UARTINT2);
1 g4 c" V. i$ [
( N# B9 ]2 u/ T( T: i5 H // 发送中断* z" ? Q/ E& A( E p: D
if(UART_INTID_TX_EMPTY == int_id), G/ O$ K5 K, l0 `4 C6 R
{
7 [8 b1 I' y" v6 j; R* K if(0 < length)
_6 D4 J; V3 c0 o {
5 x( |, e; D9 ~& F/ `3 v2 q" S // 写一个字节到 THR
) X4 |) I: ?7 B# d* c' R UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 }) c& v' b) o9 Z
length--;/ Q u; {( q" K" w1 z/ }, V
count++; K4 v' d m+ Y$ D/ d4 x( n5 A" `
}
: u% g* l& Z' i! H if(0 == length)
- r$ V" \1 y. V* ] {4 I( f A, }5 O' ~/ d: B
// 禁用发送中断2 \8 Y/ |# J9 k
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
o% l) ^. z( i% {/ b7 ], _ }- l, z* U! H' Y6 V, q' b- B
}* k" k+ o! ]' N) K% ^7 c# D
& B" `& |- m6 h // 接收中断, W+ e% }* Q; W% a; z
if(UART_INTID_RX_DATA == int_id)
* n/ ]* N6 w/ d7 Q {
* \, i$ h, P# }+ D. U$ f$ i2 j7 C rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! d/ @4 R. f$ _0 {. M" P. t
; n2 F. R/ w/ C+ s) `0 `" A# {5 U UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 k5 q3 S- r$ u9 K6 ? z: { }0 G- \6 W+ [' v; c6 F3 ?
; T' ~" n. f1 M // 接收错误' i1 C* N8 [$ y9 _1 `( h
if(UART_INTID_RX_LINE_STAT == int_id)
/ b0 w* W; n$ L; L& }8 J) ^ {
5 D2 {! a" c+ q while(UARTRxErrorGet(SOC_UART_2_REGS))
' u0 J+ ?8 ~. X) q7 X7 K( a {
+ j4 d( l' F O( ?1 q% B // 从 RBR 读一个字节" D4 p* A$ H* m, L; f$ a
UARTCharGetNonBlocking(SOC_UART_2_REGS);8 `3 [1 U: w. Y& {1 \" h
}) } a8 }5 z2 I' C6 B; \
}, w! o$ k- F* U# T* g3 h
- v4 I' G8 `) b, r) ~ U
return;
, t" f# y1 `" g- U* t; X# ]. h}) {6 B' s' o5 X$ d" c; x3 R$ S
|
|