|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
( y( j* w7 v0 L6 P0 O4 i: `: P3 X; v: ]0 g' ]- n
#include "TL138.h" // 创龙 TL138 开发板相关声明
( V. a: \% o% E0 B- X
9 m* n2 N z* d {% J5 ~" J#include "hw_types.h" // 宏命令; J( ~) R: I- {1 w
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器# f" u& l7 V# l% Z# Y
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
. `1 c4 p( d/ U1 T. O6 Z/ g f) Y6 f# r$ I" F- k! H$ L1 Q! l) Z
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
5 h- d X! x9 ^#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
% t! l% g$ k& p5 k#include "uart.h" // 通用异步串口宏及设备抽象层函数声明) y* r2 D! q6 B. r! t2 f9 {! v& l
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 D p9 H/ |% r' F4 \7 }0 [) N/ \
/****************************************************************************/1 E: o* T; }: g& k( ?
/* */
6 ^# `, [9 M1 [! _9 C5 Q/* 宏定义 */1 K0 u5 F5 y0 r% H& x
/* */
4 j+ t1 u h: i/ W3 m8 Y/****************************************************************************/
2 p# k' U& F& n$ O/ t- K// 时钟
' N" f8 v$ o+ o#define SYSCLK_1_FREQ (456000000)
1 p# t2 C, }. s; F5 ~#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
. e& x4 _! I2 ~4 s" c- h* o#define UART_2_FREQ (SYSCLK_2_FREQ)/ H# @3 b* d* k# H
2 \5 z, }7 h/ O& u6 m3 a8 R6 C3 k/****************************************************************************/
) Q, M" T. Y/ S! `( @: X( Y/* */3 ~/ p: W' N- F. n7 |, Z
/* 全局变量 */
1 e2 t. i. S2 c# X/* */
1 s: ]. |# n' m/ D$ r/****************************************************************************/0 P$ w M5 `- l! \. H
char txArray[] = "Tronlong UART2 Application......\n\r";
; m& O+ n6 e. }: S! N' e6 v% ?& v' U5 }/ t' j# a
/****************************************************************************/
( n6 h- U' p0 d# d( k/* */* x+ r2 B5 R* |- o" W. s
/* 函数声明 */, A. d$ T, c) ~) r& ]0 j* u
/* */
) b @2 p7 A/ L% F) w/****************************************************************************/0 c H7 L8 F4 C7 p+ M
// 外设使能配置" x1 }8 j2 W+ i1 R7 @
void PSCInit(void);+ z/ ]: \" n9 U7 \
p' v' J6 P5 `8 }# T/ e7 q7 Q// GPIO 管脚复用配置
3 u) A# l/ G* S9 M, O9 Q0 ?void GPIOBankPinMuxSet();
9 u/ ^7 p. p" M3 Q% _; x1 r
! Y( {7 O: Z+ W3 I// UART 初始化0 _! \) f b- Y$ c [
void UARTInit(void);
9 z8 E/ w; A& s& r2 Q; N8 U// ARM 中断初始化
$ u4 Z% a3 ^( v7 U6 @* Zvoid InterruptInit(void);/ ^; G6 I& T/ a! v: n
// UART 中断初始化: U9 y: d2 l$ y! t/ t% x
void UARTInterruptInit();
% ?6 r4 K/ V+ g0 T: v# T5 K// UART 中断服务函数/ V2 M0 M0 F9 ^) o
void UARTIsr(void);
& `, i0 g- `7 E1 }6 T% q0 z
( w0 V I" y3 Y) ?& {/****************************************************************************/& c& v% O. f3 o+ `5 e( ], y
/* */
6 }0 ]. D5 i1 s! Z1 K2 }( n/* 主函数 */
4 o. t$ ]% M. I0 t) D9 ]/* */0 D+ Y) |/ W4 g2 b2 A; [
/****************************************************************************/
' x3 I- g- o9 M2 D8 Bint main(void)& f+ s/ C# a% O/ z& o9 o
{
' P) o& A3 ]4 V // 外设使能配置
- n/ V: |6 y9 C @ PSCInit();( d# b- j/ W# ~
5 U$ z" \8 y J! o
// GPIO 管脚复用配置
( H4 m7 [5 E" C2 X+ m GPIOBankPinMuxSet();
1 s" R. d5 E5 _% ^* v2 z
% `- h/ y8 m! X4 t6 I# D // ARM 中断初始化
" P4 q1 a6 u! I8 ]- N, T3 l InterruptInit();
& D+ }; {3 w. W+ z! C( D9 {# P* |! W
// UART 初始化
) C+ {% E ~- N/ w/ Z% A UARTInit();, p& _+ X+ }8 c* O$ N1 c* F1 ]$ s
6 N1 |1 G! |5 \0 ~9 g s. Q
// UART 中断初始化1 M# u" d8 E4 ^& I8 K
UARTInterruptInit();+ [4 o D0 A$ g
7 x, J6 d# e, z
// 主循环. O! X4 D/ z! O+ w3 M
for(;;)
1 ] K7 I2 ~ Z7 o/ u5 _ {
6 s0 V8 k0 u0 r8 S0 N/ n1 m4 B1 o; V. o3 m
}
1 D. n5 [/ j) r' p' ~}
, w X: V. s- S6 [
# M( S9 T6 J( q/ ^/****************************************************************************/# m" c7 `" e+ _% ~, ]/ u- _& r
/* */
3 L2 B/ w1 C) v% L1 H0 V/* PSC 初始化 */
8 I. ?: O% u1 w6 g) g) ]6 M8 ]/* */4 x, ]* c& Z5 S7 c& W0 Y4 w* s& F
/****************************************************************************/
( b- A9 c4 Z% Avoid PSCInit(void)9 i! z' Z+ r/ L/ H" g1 N/ ^1 I
{! W/ K; H8 _. D% @9 g- Z. s
// 对相应外设模块的使能也可以在 BootLoader 中完成* ?, I: I. k X; q
// 使能 UART2 模块
1 w [/ u' u1 Y8 ~ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, s1 E3 x& U! z6 ?7 A}, Z5 h4 `2 A: X! I$ A
* y9 ~7 g" ~& @; T/****************************************************************************/
- |4 g& Q v( P/* */" W( g0 `( J& p3 i( V
/* GPIO 管脚复用配置 */
- w) Z1 @4 M, J+ R- E/* */
# a7 M" i/ g' q3 Y' a/****************************************************************************/
! \9 L( w! ]! x- w3 lvoid GPIOBankPinMuxSet(void)
: W- O* b1 j, s{7 k- Q: m% o, @3 z; Y5 g( G- U
// UART2 禁用流控
6 f: T, h6 j) h( W% m UARTPinMuxSetup(2, FALSE);7 _5 }" o& I" J4 w8 ~
}
# s: ]- V5 p" v) r _: q* O1 w* L# P
/****************************************************************************/
. z4 f Y }& G/* */
! ]5 L v0 L, e1 ?/* ARM 中断初始化 */
0 B; n: F, g- j$ R/* */; i. R* f9 w7 y0 X) s2 N
/****************************************************************************/% z+ f s1 Y% I8 a# Z& C
void InterruptInit(void)4 m: ^" v9 O; V b* P( x
{
. j7 p% N4 F9 T' K6 f // 初始化 ARM 中断控制器5 T8 Z% m) G; o( O a
IntAINTCInit(); e0 G3 L3 }# Z" |* d
, D( E4 D% H% m A // 使能 IRQ(CPSR)0 n- J+ b8 ~; g% A+ K5 N+ F$ n
IntMasterIRQEnable();4 i7 u+ B5 {/ c. T6 K* W# e
! n6 R1 E" O p // 使能中断(AINTC GER)' E2 H9 Z8 b8 I$ m7 J8 N
IntGlobalEnable();" x2 }% _) w h- u3 U0 h: c5 M
3 r0 _3 a; G" w2 Z
// 使能中断(AINTC HIER)& n% S' F0 m; p4 s: h& i( c6 U
IntIRQEnable();- E' p: J; ^9 } y. v X+ M
}; b" l1 ~( c c/ x
1 d! J$ V% B r7 r/****************************************************************************/2 Q% _$ L( x' x( d; H
/* */
6 O* F* D9 Y3 n$ N- A; I3 W) Q/* UART 初始化 */- R+ ~! X1 D/ I8 h2 L5 i
/* */& |. ?/ N o; k
/****************************************************************************/; Q; y1 s0 O) G( k
void UARTInit(void)/ K) J' l7 s& I& ?0 m0 ]
{
3 q' w; b4 ]5 ^7 o$ ?; g // 配置 UART2 参数/ n6 L) i/ F8 x, g: r
// 波特率 115200 数据位 8 停止位 1 无校验位
1 d; B5 V2 e& z* o& F' E UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( |/ r$ k. J8 Q7 M/ {2 P UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ g, e6 l7 |; X6 |4 D. f2 K ^
// 使能 UART2
: m4 g: k' k5 I( u, | UARTEnable(SOC_UART_2_REGS);
. Z, n% S+ t: q0 M/ @7 Y8 v1 o1 L# K( K
// 使能接收 / 发送 FIFO6 H/ [) @% g$ g1 A) {
UARTFIFOEnable(SOC_UART_2_REGS);
5 c. C6 z, A6 I+ I+ h
3 @2 s) O$ S) u // 设置 FIFO 级别
' S: W4 g. m1 A" f# N" w2 f UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
' j+ B& S: p V% w/ z) Q}
, e% n/ }0 R3 C0 V$ Y0 o
- h; a; h/ @" J) `! J# h* ?/****************************************************************************/
; Y9 h7 a A- \/* */. y1 N+ p4 L* y) f
/* UART 中断初始化 */8 ?3 y) Z% ?/ \: [, ] Q1 B1 v
/* */
. l) j, D0 T" S1 T/ I7 w& F/****************************************************************************/
+ ^ T; b1 D5 E# D, y9 X( C' `void UARTInterruptInit(void)
/ S9 ~7 G8 k+ B x7 V# U ?; T" Z{
, U! B- ~2 L" K7 l! u" E8 b IntRegister(SYS_INT_UARTINT2, UARTIsr);- w* ? [/ t9 J/ ?
IntChannelSet(SYS_INT_UARTINT2, 2);
5 J5 B! v2 c, p" \# ?: I% \( z IntSystemEnable(SYS_INT_UARTINT2);
* v3 O7 C* b5 c0 R/ f3 J2 A
; A0 r+ R0 D: O( r5 \6 N6 T // 使能中断
8 J* T+ H. U4 l6 f" H& `) ` unsigned int intFlags = 0;3 ^! E3 r9 f- m
intFlags |= (UART_INT_LINE_STAT | \
0 q! B1 F: G } a- n4 W# x UART_INT_TX_EMPTY | \0 ^6 ]1 k" L' k' i; y) g# F! \
UART_INT_RXDATA_CTI);$ Y0 G+ L% u& s- r% N% T
UARTIntEnable(SOC_UART_2_REGS, intFlags);: N( G. J" X& E5 t B( Q
}
+ C2 ~& N0 V0 @: v; X( H4 I( A% M+ y$ B. c2 i7 {
/****************************************************************************/7 y! |' ^; U& U8 ~
/* */1 |3 P- E5 `) c: b# D
/* UART 中断服务函数 */: Q8 n- X" |+ r2 J. m
/* */3 W. M \# O3 R( k" Q
/****************************************************************************/
; Q K) E- N6 Q( W7 Dvoid UARTIsr()
" X' w' |7 @5 X: D; ?{: J- X8 k: O3 I- a( j9 ?6 [$ a) V
static unsigned int length = sizeof(txArray);
4 L# o% O4 w& q9 b% z0 U static unsigned int count = 0;
: g6 |8 U& }* O; m" Q unsigned char rxData = 0;
. K5 V# ~7 h3 }/ m unsigned int int_id = 0;
' ^, y1 S- m+ I ^0 b* K9 Y' t; U
// 确定中断源
9 m; m: k7 G8 p5 Z/ T) g( t. U0 e: m. n int_id = UARTIntStatus(SOC_UART_2_REGS);) k3 f$ U" h6 U" R! z
% j8 y i, k: z! M/ t; d // 清除 UART2 系统中断1 L7 x; z( n9 f+ M, T5 J, {! r
IntSystemStatusClear(SYS_INT_UARTINT2);' @ k) d5 c" r; N+ X! K1 W8 x! [
( Q: Y' n: A9 p
// 发送中断
@9 e9 q' Q8 A; Z5 ~ if(UART_INTID_TX_EMPTY == int_id)
* q( T1 `. j b$ }! u7 U# t' V {
8 |$ n+ p) ]8 K; ^! N1 B7 ^ if(0 < length)2 g0 D) k/ B( H1 {- X
{
: {. \- k5 t2 C" x // 写一个字节到 THR
$ A* [* [/ t6 D UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 F, _2 X! ] {1 _) f
length--;$ a- j1 I( r+ w
count++;
* N, `' Q/ Y. A$ Y$ {7 E& D }
8 i; J5 d. ~+ w; ?. k8 n9 p if(0 == length)
/ G" O4 ]9 l$ T$ Q7 X {! J X: X0 @ r! O H
// 禁用发送中断
3 s S* D& S& Q: ^& l& o1 | UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* r5 p1 |4 e- {5 y* q* N2 [
}! q* k) k; N/ l6 I7 E
}
1 z7 a% @/ U* Z- n* w; c! r- b0 N4 X/ I* P- p; _, t
// 接收中断
1 H& J- }: p. R0 p if(UART_INTID_RX_DATA == int_id)
" W# w4 @1 N6 g2 T: m O2 F, l {1 g& H1 n0 h2 K" J) r8 `
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);; q& b4 R7 H! h2 C
- N* ~1 \" i& {- I+ H* A UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
" ?9 {0 A4 T( _! }5 y }
' U; n0 e0 B6 Q" A$ g; ?/ k4 q2 A7 Z" x- {5 l
// 接收错误
! Y: `# g. J& Y; _* V4 }) w if(UART_INTID_RX_LINE_STAT == int_id)
* ]9 r0 |. P/ J) B- ]8 t' z {) O; z" Z) Z' b$ t# v/ R
while(UARTRxErrorGet(SOC_UART_2_REGS))7 z4 p, \% e S% W; @/ i
{7 p! p: m. U6 c$ [! n+ F
// 从 RBR 读一个字节5 l2 M% U& d2 S( X
UARTCharGetNonBlocking(SOC_UART_2_REGS);& ~$ H1 Y+ ]2 }0 A8 Y( O! S. }
}
e8 N6 a. F0 Y1 A7 o- f3 ?. r }2 T, H9 ~& @/ x4 c) T$ r* j
2 M( O. K7 v9 Y$ T return;
2 u- l# ]" Z5 z8 m$ [}
; g4 P# h7 u2 C% l2 ~8 g |
|