|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 m; i1 | P( K ^- Q
- [" \7 q8 t3 E' m" q5 w) \#include "TL138.h" // 创龙 TL138 开发板相关声明
: y, q4 x ?% r
4 v0 v/ q; {6 H& a- P% X1 y3 G! j#include "hw_types.h" // 宏命令! W6 w! ^% Y. \& ^9 _) C
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器- t, M$ K, _2 i0 }8 l+ v
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器7 c' o; ?, N8 C. d% A) _
/ K# @3 Y4 R& |8 x# M$ e: w2 K1 l# ?#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明0 L. S0 x/ J" p/ ~+ K5 h* D' d
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
B" o1 m8 q, r' M' w! x#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
. R# H9 O, C/ V% T. d2 G2 A#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
7 B h1 g* f* u2 T
0 N* c5 h* Z* N: H! ]3 A/****************************************************************************/8 ^( X: n6 {1 |9 _: H+ \" n
/* */
& [" ^9 O% X4 S) R' h; h/* 宏定义 */
: f; I# H( k2 G1 L+ z/* */
' x4 f$ U( ~' M) K q/****************************************************************************/
* b3 ]- {2 r: a& G- v- M// 时钟 l; f; c: }! ?- `0 ]
#define SYSCLK_1_FREQ (456000000)6 H) X; G* ]- i: k
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
1 k) Z+ F% a& A+ p/ g$ s$ k5 d- a#define UART_2_FREQ (SYSCLK_2_FREQ)1 h! c6 ~1 E7 b# d8 y. D: U
/ \! z H; n; I. c. n4 M" d/****************************************************************************/
# V" N8 m# ~# y5 M/* */
3 S) b' e5 s( O+ T$ t8 M/* 全局变量 */
' G# W" t/ m$ c0 e, J/* */
9 b7 ?9 r0 V) |" V% ?( |9 o/****************************************************************************/
* V" V5 _! [ rchar txArray[] = "Tronlong UART2 Application......\n\r";
8 o- I" a4 V8 x- M( i( O. } U, t; y- f7 j0 v+ N; _
/****************************************************************************/
7 p( l2 M( Z7 U( m8 l/* */7 r) Q8 l3 s" c$ K# {5 v; v4 _) ]3 w
/* 函数声明 */3 g& ?( p9 o+ U
/* */
0 H' r; h# O% X- G) d9 c6 q/****************************************************************************/
2 }, @2 w9 \$ m// 外设使能配置# S' n U$ T- M i3 g, w: U5 s
void PSCInit(void);+ h6 M8 Y8 K+ D$ A, m
8 x: G9 E+ x- A2 t* [9 z// GPIO 管脚复用配置
7 G7 t6 S7 u$ _3 jvoid GPIOBankPinMuxSet();4 F! ~7 [9 Q9 D( T5 s, y9 D) D1 w
/ M; J0 k* V& ?9 C f8 d// UART 初始化
' Q/ ^& ~1 W" b2 W* Gvoid UARTInit(void);
q9 Y- o+ @2 `) Q6 x- u4 G5 N// ARM 中断初始化/ ^2 i f, `, p" F$ t, S
void InterruptInit(void);
; X7 i3 h& v* b! I4 o+ I// UART 中断初始化
8 a3 z. A: T& svoid UARTInterruptInit();
: C$ K4 N& C" |$ y+ M// UART 中断服务函数
5 o" i' Z* i+ gvoid UARTIsr(void);
& Q! `6 _: K; d3 U3 N; w3 E( o+ G( N. U. P! p' |0 S
/****************************************************************************/
' {$ s& e9 y4 t1 C3 q/* */
- k, y' P" G" h+ ?& k0 n0 X; D/* 主函数 */' Y1 H- L" w) F l+ s% A) ~( Z8 h/ F
/* */
" o2 t N; ^ G: J% Z/****************************************************************************/
5 x$ `! b1 n6 f! S/ |* c8 H; ]9 Jint main(void); n4 @9 ]9 h! p# O' u" }# `& H
{
3 I! A+ H% t$ B" M u [" O // 外设使能配置/ @! Q" V2 ]0 ?. k- K; J& w
PSCInit();+ |/ A' Z' @1 E* c
' f( q: l$ W% p: Z7 H: r
// GPIO 管脚复用配置' Y" x* W. F. `1 G4 G
GPIOBankPinMuxSet();
. S, }! l7 I# X2 _( n. t+ ]6 V* v' H4 \( _& H; j6 F( R, q
// ARM 中断初始化
8 h# @* V4 `' X { InterruptInit();
' `& S8 X ^. ~- S6 Y: |; b% l) G7 s6 s6 z
// UART 初始化
+ e; C2 O/ M( c- P: j7 X UARTInit();% N, o9 b: \6 ?" R" Q. |
/ H5 O$ |% w7 [3 v/ d
// UART 中断初始化' m6 G1 n6 ]+ d4 i8 Y9 @
UARTInterruptInit();" U0 y; P! l# ~* F7 `! C* M
* t" H7 ]* h' H: z$ f // 主循环
: q& X1 L6 y _ P3 K for(;;)9 U5 j8 y6 N b
{
5 _9 ]+ q3 }) q6 V9 F* A" l9 o. l5 \. t" I+ ~: n
}$ }! {$ _9 K2 E
}# Q5 K' m" r, T9 |
) a. f7 `& T3 f/ j1 o8 `/****************************************************************************/$ I( P' r' m: N" j
/* */7 E# m: S$ }- k# {' F# A0 W4 \ X
/* PSC 初始化 */
9 v' H' y# M# N7 B! H3 f7 h/* */1 j5 D9 U! L* l) G* k* @
/****************************************************************************/9 U$ `9 w/ I- G R4 B, Z* d
void PSCInit(void)
& x- s! l! |( m5 U' a& q. Z+ F T{
# c+ t+ q7 _) B& n+ p3 h' @ // 对相应外设模块的使能也可以在 BootLoader 中完成: G: _7 |/ E6 G
// 使能 UART2 模块9 j9 a4 t& R% T' `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
# {, A3 F7 A4 Y, r+ g}
* V+ Y7 ~1 Y$ D1 Y( s! V% X: |" y9 ?( Y- H5 c% H
/****************************************************************************/
: U' ^+ ^; ]; @. [8 o/* */
}) A" `6 w3 @, Y: y/* GPIO 管脚复用配置 */
S* i1 A; {$ }' G$ k4 {/* */0 g! [, P. f5 ?
/****************************************************************************/
3 b. ^! n+ X% n2 ?. yvoid GPIOBankPinMuxSet(void)8 K8 f7 x+ C7 W
{, k) M% ?1 n; I9 |- t$ G2 P. F
// UART2 禁用流控& T+ f# E1 V: g3 x6 O6 @
UARTPinMuxSetup(2, FALSE);
5 Y0 o% H+ y& K, V# N, ?: }. h: `}4 B- e/ A6 e& N) l A: |
' ^- K" {# a5 Y8 K) `) q
/****************************************************************************/, s% i. l/ j0 Z5 N& G( R3 Y
/* */
. ]. i+ @6 x2 T+ W' R/* ARM 中断初始化 */
" [1 w7 s f5 B. F9 W! ]" E, u5 T" [/* */) C2 n& e4 _- N# G% H% i( |
/****************************************************************************/
, l8 E3 z0 e3 b; {void InterruptInit(void)4 Z9 X% }, H( |# g3 g
{# u6 d, |/ r M4 ]( K8 P/ B
// 初始化 ARM 中断控制器
6 Y% e m' Y0 G/ I5 q7 }6 C* X IntAINTCInit();7 J) z- o) X, \2 B3 |
( v( s: o* X" T( B& J( |
// 使能 IRQ(CPSR)" g. u: D6 D( K5 h3 U2 V5 }- I6 |
IntMasterIRQEnable();
. K0 R8 }& Y. F6 s) U/ h
, |; ], }+ N& R9 r0 U. y // 使能中断(AINTC GER)
% _4 K' P& J0 m) d# {! B- h+ G IntGlobalEnable();3 r a4 X) {+ ~, A- r
% |# e7 t( u, A2 O // 使能中断(AINTC HIER)# [4 w* x# D( ^( A- Q
IntIRQEnable();9 ]4 N* M/ I* S2 B
}2 L9 I4 N4 ]# V( `1 ~
9 ]9 k5 E" d( i+ B! i, P
/****************************************************************************/$ E. Y/ |/ V) F2 o) @
/* */; W0 \1 Z7 k6 t6 G# l, o2 b
/* UART 初始化 */+ y5 F9 ~5 I* W8 p2 G; L" N& I
/* */
/ n* Y! [3 P, q$ I) X3 H7 i/****************************************************************************/# q) E, _$ _% ]& }$ k) C
void UARTInit(void)9 R& V* K4 u) @
{$ b2 j: H7 B: u3 n1 `# s
// 配置 UART2 参数
, B$ ~; W* b' t) T4 l4 ? // 波特率 115200 数据位 8 停止位 1 无校验位* Q% D% t7 P0 C2 }
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,3 f3 i# i/ X5 y; j6 n
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
0 _ I0 D9 c1 t* b4 e // 使能 UART2. ]- [3 x% j1 l ]# p
UARTEnable(SOC_UART_2_REGS);0 D1 |" l2 H. W1 e* z
, K( k, y9 ]+ q
// 使能接收 / 发送 FIFO
% {( b. M0 O' r9 X UARTFIFOEnable(SOC_UART_2_REGS);# D0 t4 c% A$ c; {" g+ X" P! t/ r
8 X' i: M9 S# P8 Y9 |
// 设置 FIFO 级别
7 `/ Q, C7 M' C" j% w; Y; K4 o# L UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
c& b* Y! ~. V+ d0 [$ f, \}
. C1 Z0 m! z9 I8 \6 `: X( R7 J8 [4 N3 A) V0 i
/****************************************************************************/; L a2 }1 M- m; U
/* */
" w6 r4 t% I* w* I, u0 Y0 `/* UART 中断初始化 */
2 z- A+ T! q |1 L2 L/* */
9 `0 _# K* D J0 d$ b% _3 e0 B. g/****************************************************************************/
; q( E7 j) l% ]' G5 O9 ivoid UARTInterruptInit(void)' |) F% j7 f: `4 {1 z+ q, A% x3 u! _
{
8 w4 H* l/ t3 [* p, I IntRegister(SYS_INT_UARTINT2, UARTIsr);% N, y N$ [3 @! _* g1 G. u3 H7 x B
IntChannelSet(SYS_INT_UARTINT2, 2);- ]6 ` ^3 O3 ~8 \5 c' N4 `# A4 \ x
IntSystemEnable(SYS_INT_UARTINT2);" p( a) q8 f: r, h' |
8 G0 ?3 \1 Y! J // 使能中断
+ @* A& e) b* i3 R1 N4 O unsigned int intFlags = 0;% N, [" x+ e- m3 M' `
intFlags |= (UART_INT_LINE_STAT | \& N# `/ \# c% L4 I; P
UART_INT_TX_EMPTY | \
, t3 U* K5 ~( d/ |+ P UART_INT_RXDATA_CTI);
* C. F+ s% s5 f" q UARTIntEnable(SOC_UART_2_REGS, intFlags); c. B/ {- B/ k2 ~, B
}
! e1 v7 s8 m- [( U9 p6 e& k! E6 a1 x0 U) z* u2 c; g
/****************************************************************************/
4 f& @3 D; ~* W, K0 i/* */
0 F/ X' V3 S4 ^, \/ k/* UART 中断服务函数 */
4 \# T0 C' U( q1 S; N' ~! `5 B/* */
( `% Z: u4 q$ u! j) D( C/****************************************************************************/
) m2 p$ [1 Q/ A5 B' K9 `void UARTIsr()
+ ^6 m% y; ]0 f{# p8 y; Z8 }3 a
static unsigned int length = sizeof(txArray);
/ n3 K' @' C; w6 K6 t6 u static unsigned int count = 0;; }4 ?. Y( x, l1 r1 Z( K
unsigned char rxData = 0;
4 y2 w. Z4 U# t unsigned int int_id = 0;0 V6 { `# {- W( h9 O ^! H- k
/ g: H* k' u7 w2 l // 确定中断源
/ l+ S4 m' b9 v2 Z, w+ k int_id = UARTIntStatus(SOC_UART_2_REGS);
5 l+ O, ]9 @& W" w* ~+ w$ N0 E8 F: J5 w. N8 _, a) f5 i9 M+ x% [
// 清除 UART2 系统中断1 }5 s: E) X5 d v9 R
IntSystemStatusClear(SYS_INT_UARTINT2);6 U7 h: Q) O. E6 r
) m, I5 \# R8 z) P0 s$ N
// 发送中断6 C2 L, u7 ^- \7 \- `9 ~
if(UART_INTID_TX_EMPTY == int_id)
$ n9 j8 T' @2 u b" B {
- o( T% ^7 d/ H2 f# L/ n if(0 < length)
" q9 T/ E! x5 g" o; _ {7 @" h3 e6 V$ m+ E
// 写一个字节到 THR# @5 |) |7 n; o$ r4 x7 a) @
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 H/ x/ K; Q- L { i
length--;' t# S) h6 b+ c9 W6 t
count++;
9 g! C" P3 _8 Y% V }
% n( s( X+ X- h3 E2 D if(0 == length)
! T g6 ?5 T+ |) @3 i {- E1 J0 M; @6 x4 q* g6 \! s
// 禁用发送中断
" a& Z( x, Z. Q1 d7 q4 S) a UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' \) L8 [8 R3 K' T0 F. b( a }
( R b% D& f/ n% V6 r0 I }+ K9 @% u+ ^7 I+ e
- r6 M/ E5 e- o8 K, Y7 A1 D& S) x
// 接收中断
7 d- J5 m9 }* ~2 `- \4 X2 [ if(UART_INTID_RX_DATA == int_id)
1 x. y: H* q- |* m- X$ i {" w" S/ L& m3 H/ |
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
Y, X! b: H, c" R1 c* F" k/ A" W8 ^( C+ r) d# F( k7 j. r! U
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
: y# w" \6 K* i9 | }5 K' W E; U& H9 f
8 d% q( U, W" [! z0 Q, s
// 接收错误
; Z+ ]0 |, }4 \# V8 R2 x if(UART_INTID_RX_LINE_STAT == int_id)
2 d8 C6 f3 G( c/ U" P8 p {
8 h% ~2 c Q1 V$ j while(UARTRxErrorGet(SOC_UART_2_REGS))
$ d1 n2 N4 M( R* ^7 ~1 k* ?. r, t8 [ {
3 u+ A, @; u3 B" C9 h( u0 l2 D // 从 RBR 读一个字节9 a/ P5 a$ w9 m" i' s
UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 a) r5 \0 r4 [9 b/ `8 K3 N7 l }6 k* y, @9 y# M* S m# M
}
! p2 v9 {5 s' J& ~) D) A% V1 D3 Y 3 e' g y# L% R& i
return;$ ~9 k& a; V9 H- Z/ @% ]( q: l$ P
}
; D6 Z8 ~# G* E8 |. O F |
|