|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ U. T) w' ~3 ?. D/ K8 ^5 m, B& x: ^* L3 Y, @
#include "TL138.h" // 创龙 TL138 开发板相关声明. S! B: O w3 Y- E Y5 |+ [
' X) t6 Z5 y6 C7 l# [0 i/ `
#include "hw_types.h" // 宏命令
% X' [: {6 D+ h6 M9 F#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器* T& t5 _4 \/ X4 p1 y
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
- x# k5 h3 u, T( |2 y( ^0 ~% \& A' t; D/ N; U9 ^
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明 v+ ^2 U) ^- W5 x8 H7 u v
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明* T, A8 l8 m4 O0 ?1 T9 W! K
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明" D4 X0 ~. l Y2 M l
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义7 C8 J+ }" {# {! R
. M& X; c) ?$ h8 U- _0 Z
/****************************************************************************/
( D; o( D/ l, r) ?9 _: [: m/* */
+ V7 u) Y9 J- ~/* 宏定义 */& l( D+ p+ F$ R+ _7 f3 v4 N# a9 ^
/* */
( p+ K3 b& ^) b' ]/****************************************************************************/
- v [# u" j8 w! d s5 d4 x// 时钟
( I ^% s% @* j6 U, N& `/ P#define SYSCLK_1_FREQ (456000000)9 p' ^7 P4 r! v+ X
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)# c; P+ K" ~0 }( V; d7 _% ?
#define UART_2_FREQ (SYSCLK_2_FREQ)
( e/ |% L/ P0 M/ t1 i) e/ b# C7 i" E
0 i) h- Z0 Q3 x) Y2 a/****************************************************************************/
+ Z9 z$ A \. w" P/* */0 B2 S2 i/ v3 Q+ o. |
/* 全局变量 */
' l9 A8 y& Y5 T" C: S/* */
( |% B0 I+ B4 L$ U( t5 D! \% ]/****************************************************************************/. N5 s: R' a/ p8 Q2 L
char txArray[] = "Tronlong UART2 Application......\n\r";9 N% _+ a" ~$ {/ Z k8 p
& t% @6 \9 t9 I( h9 l P/****************************************************************************/
+ V2 l' x7 [7 L4 i/* */
6 B# x: x) r8 E) j+ F- r0 ^, L2 s/* 函数声明 */
. D/ Y# w9 z& c/ W/* */. v3 o+ G: l' t( f( S+ k9 }
/****************************************************************************/
6 |) i5 y- }. |3 o6 ?# T// 外设使能配置" w! t; i% [3 c; ^( }
void PSCInit(void);
# f2 u/ P" S* f
% m, I, O' i# [' n// GPIO 管脚复用配置% @! ] f7 E4 N
void GPIOBankPinMuxSet();* i4 H% t# v6 O9 j6 G
6 w$ W8 ?+ Z' h0 I" ]* H& k// UART 初始化$ i. [0 H& i7 p/ ^, K
void UARTInit(void);6 U( F' T5 A4 F+ j( M: [2 X0 y& l
// ARM 中断初始化: [( I) b1 H. T! U h
void InterruptInit(void);, u, J( m$ Y# h* }6 b. _ J8 @
// UART 中断初始化# Q, e+ _5 R) d2 k
void UARTInterruptInit();8 I8 f9 g- r( t3 i' g
// UART 中断服务函数: B2 V6 g: B% w' Q. D/ l
void UARTIsr(void);) v6 F$ M1 ]( W2 y; m* Y, \
. C. S$ y' i4 b
/****************************************************************************/: N( S" d/ i7 _! L1 {; I
/* */2 A) n2 D4 N& a' B% m3 k4 Y: f3 m
/* 主函数 */* }; U+ x! L4 t3 V6 j, c4 j
/* */6 p8 w$ Y) U) W9 @" [
/****************************************************************************/$ }, G# |1 [6 `- t% |
int main(void) _, t- t# q' g0 \+ U ?
{! R$ q4 N4 |4 q; x+ L
// 外设使能配置
6 p5 f9 U& L1 ^4 u- @: ]6 E2 R: C6 ^5 q PSCInit(); |' E+ z* b) i# G
9 @! K3 C# u, w( A- Q // GPIO 管脚复用配置3 g7 w0 I& U- g% r4 E
GPIOBankPinMuxSet();) ~/ L7 I4 q( D1 `0 d3 k f
( \4 f& y4 h! i
// ARM 中断初始化
$ ]. e R7 d- \6 ]9 U% x7 E: P InterruptInit();
0 w9 O' m. T, M) N$ I7 F* W
$ s3 X/ N0 [+ P; g& @0 U6 W // UART 初始化
3 [* }; y0 H! p6 }# P6 ^ UARTInit();
/ ]0 A% k* X- D& }/ D2 _" Y& O: V; P; ]1 u$ _6 d
// UART 中断初始化2 z& u! O& B5 h
UARTInterruptInit();
" A' C, W# Y4 A$ x+ Z& L
! F5 ]- `+ Q' j; Q& T // 主循环" [, K/ Q5 S+ c* T; _
for(;;)0 e. w" A- ~, h! F5 `- {
{$ t, _7 G( P7 a9 g
% y* E( X3 G! S6 g5 Y8 d) g* A2 E
}
) K8 Z" E* v- A}$ E* [2 C: ~# S
S$ b) Q1 U. R( u
/****************************************************************************/: c# a3 H7 C/ z0 T) I$ W
/* */
, }8 s% Q2 @! Z7 F9 O# l* W/* PSC 初始化 */# q5 b6 U. K2 s
/* */( C; Q! R; q; o( Q) q
/****************************************************************************/- m1 K( h4 M+ D
void PSCInit(void)' `( |! |% @- s: E6 {+ R
{
- N4 `- Q6 R' k7 [& m // 对相应外设模块的使能也可以在 BootLoader 中完成' z. e' U; ^* `' _ L* k
// 使能 UART2 模块2 P' o" y, J% }1 k3 t
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ l, P$ ~1 O* `) w8 p# q) j
}, E1 b. o5 t$ V6 Z+ s+ M6 x: s' q
- A- {. R; t" R- I1 g, W
/****************************************************************************/
) [! [( `' U3 O# `* a; Z+ }/* */& \$ `/ C# r" L% U9 g
/* GPIO 管脚复用配置 */
6 `" o9 N6 k: C/* */
6 G2 G4 V% F# L1 \: H1 {# Z/****************************************************************************/
& E$ `4 {2 S& V# X' S, x2 fvoid GPIOBankPinMuxSet(void)4 R8 ?1 I% L. r2 B
{& ]+ f1 w) W4 T& Z- v% x
// UART2 禁用流控
1 D! h6 e( p0 F9 k$ U! }; P0 M UARTPinMuxSetup(2, FALSE);. w) i/ S2 X6 t1 E' _
}
: l7 J5 V$ D9 m* \% u: K/ a) D) R) r
/****************************************************************************/2 }( R5 C; o* e8 E5 F+ r# C }
/* */( l0 U& N3 Y4 c" y; V2 ~! [
/* ARM 中断初始化 */
- E0 |0 a0 n) {, D0 Z h3 V2 i/* */
5 B2 z! j" H/ `- i: I) i/****************************************************************************/
% \6 Q/ F# z/ w& ?7 P! ?, Bvoid InterruptInit(void)
8 L, \0 o8 ^- \, }( M3 K{. }. E! H _ n; E S+ V
// 初始化 ARM 中断控制器/ W! q) x3 V9 h- ~+ }$ e$ |# E2 ], ~5 e
IntAINTCInit();
* A8 I% Y0 ?, P5 j+ s) ?% w, i9 i+ B6 E9 j: c
// 使能 IRQ(CPSR)& e" R1 p* |5 M/ X6 D7 D9 h& v8 F
IntMasterIRQEnable();
' f, D" t. Z: |* \& S$ w2 s6 i( h4 j+ G
// 使能中断(AINTC GER)9 U3 E% @6 ?! Y6 d* w
IntGlobalEnable();
& n* y2 A+ R) A0 s" L8 C4 V4 \! y9 Y
// 使能中断(AINTC HIER)
b5 T& g# ^0 R: ~2 k; y IntIRQEnable();( p) v$ k* P" w/ I+ P* N) y
}
4 v4 n/ \: N5 o }# |. e2 }5 T# n( d& _4 }0 E$ g* T! |
/****************************************************************************/
3 a& J9 a+ Y8 u: |) _/* */
: B- k5 ]# ~$ m4 V/* UART 初始化 */
+ C, L8 m1 t" j! F" J' o+ j/* */
, _+ e* U( X4 }/****************************************************************************/
( v7 f2 `- w$ X; s" |void UARTInit(void); C3 x/ ~6 R2 C# F0 _! [8 I% [
{. u: a( q7 @% c9 G4 w
// 配置 UART2 参数% {+ H% Q- u% W4 W
// 波特率 115200 数据位 8 停止位 1 无校验位
3 m0 J6 s7 t# F4 k$ t# k# Y UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ n9 o! z- @5 J& U2 R- ^3 E. A UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);3 u' e( f3 C1 c s/ z; y& d6 [
// 使能 UART24 C& I7 r* I' p! z4 f q g1 A
UARTEnable(SOC_UART_2_REGS);4 s4 A7 n: r9 f, {6 q
0 [: K! G8 ]1 u/ i# _' Y3 P // 使能接收 / 发送 FIFO
. i5 ~; _+ y! h# O' S x) ]1 p! ]0 d UARTFIFOEnable(SOC_UART_2_REGS);
: j5 o8 o8 O9 y1 ?/ p' `& E+ y- [- ~* A9 x% b0 A2 z
// 设置 FIFO 级别
r$ z' _: q# @. Y) P UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
% ^ Y+ y; m. b0 b) @( K% y6 a- n}9 D( x3 c: Y5 |
9 \7 t1 G- x( D* u5 ^3 d/****************************************************************************/& R% ?4 _ x1 }
/* */
, i. D1 @3 O+ C3 }" R/ L* W' t/* UART 中断初始化 */
3 S4 C) q" x! ?1 |8 T/* */
. O# D5 j3 U$ m5 h/****************************************************************************/1 m- J& e( Y! q5 l# W
void UARTInterruptInit(void)- V% Z. h( T: R! |0 X/ {( O
{
3 \) L2 t% _" N! b: ? IntRegister(SYS_INT_UARTINT2, UARTIsr);
8 K% n3 N: k' V8 F2 M" v IntChannelSet(SYS_INT_UARTINT2, 2);
+ B$ b- K- M5 S+ }5 M. n IntSystemEnable(SYS_INT_UARTINT2);
. N5 f& [9 p; S4 R! l3 L6 w4 w4 Z2 X, {8 T
// 使能中断
/ ^4 ~ p4 U" ^9 {* F! ?# i# ~( ? unsigned int intFlags = 0;
0 O0 w9 I& G6 n, d intFlags |= (UART_INT_LINE_STAT | \2 c2 O% u# Y: T7 @8 G+ j
UART_INT_TX_EMPTY | \: U w3 J: O1 i" Z
UART_INT_RXDATA_CTI);
$ J( n2 [- V9 E0 f# s0 z; g$ u% p UARTIntEnable(SOC_UART_2_REGS, intFlags);
8 h' `6 x+ z* x}( u9 R2 \) w) \) K- S
# N8 x/ }- L' A( {/****************************************************************************/
; X$ }3 j! l! e& s1 a% t9 a/* */
( ?. f8 q2 o( Y/* UART 中断服务函数 */! n* v% ^- i/ [' M, U
/* */% W! U( D& e# y& E5 t0 x
/****************************************************************************/
+ i$ q- S+ t) a, A# l+ `: lvoid UARTIsr()
2 S# O9 T4 ]: O{
& r" h: Z5 [+ A0 R% F) x static unsigned int length = sizeof(txArray);
% ~& x J$ K* G static unsigned int count = 0;! h0 n1 S) ]- P% m0 D& x
unsigned char rxData = 0;
1 c* W8 B+ J. P C- b+ b" X unsigned int int_id = 0;
% l7 A% ]; H0 r, T$ l+ `5 c! K8 X4 K1 I- o( M7 P% U6 a% H/ ~
// 确定中断源- }2 Y! G4 l8 [) |) M. p
int_id = UARTIntStatus(SOC_UART_2_REGS);
, M& I& c+ r9 K1 ?* w/ j4 L% o+ u# o
2 R# ?8 S( n( e* y- L // 清除 UART2 系统中断1 s% t3 v; a, a. C
IntSystemStatusClear(SYS_INT_UARTINT2);) i! w% {1 @6 U/ Q" v
& J% G6 ]: j1 f3 J
// 发送中断 {' S# k- r# T2 K6 O
if(UART_INTID_TX_EMPTY == int_id)' s0 N$ H/ P3 r$ G" w
{% K* t3 _0 ^; Y: v, @
if(0 < length)
( ^, c1 g2 K5 |3 w1 e1 o7 G {
/ ]) }) O! C7 X4 c% B2 C // 写一个字节到 THR
; V9 A* _: k. C2 ^ UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
: t; r) f+ r1 F( d8 N E' p length--;; b% B2 ~: u% B7 v
count++;6 i3 v' N$ v4 U! C% l$ \* m
}
% L8 p& K9 P {2 T if(0 == length)
# t/ H0 F: `+ L {! K$ p2 }: v9 S8 \+ o5 E
// 禁用发送中断 m! j l+ r G& G' f9 N
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);( E; p7 t: k: h# Y) X+ S3 }2 C! r
}
5 _) Y4 h, j( _9 V8 \ }
% v2 v/ z. [" |- p2 t: m" n( z! L4 K1 G2 _
// 接收中断
( H" t2 o1 L7 `0 V if(UART_INTID_RX_DATA == int_id): v: }+ }0 H6 a# \* H- O8 y( d
{
6 V$ p3 V8 M- I3 _ rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS); l& \; G3 {9 P/ \+ ]+ P4 e
; v, T V" P7 H: B9 h4 d' K UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. d7 C' {" ?) K
}
2 K ~7 f( n/ {0 y$ P b+ a
8 `5 w( U% W( I // 接收错误* H* Q2 T1 ]6 m% _& ]
if(UART_INTID_RX_LINE_STAT == int_id)
+ `7 q5 O5 g' [) b3 f7 Y {4 m/ c; z& y7 ]
while(UARTRxErrorGet(SOC_UART_2_REGS))
! m: M) E& B9 c+ i {
- {. i5 _6 F. W7 Q$ Q // 从 RBR 读一个字节
) ^, G4 A6 E' d- o, V7 L9 }2 V UARTCharGetNonBlocking(SOC_UART_2_REGS);
( o; f2 C2 V" Z5 b" _' X }8 C1 `/ d2 R5 x6 x' Y
}- @: c" u: { t8 ]: I
2 I2 g( `: m& V0 P0 N1 _9 h
return;
4 _/ g$ }( C$ `+ w3 c1 _0 n}& K" v. J U, B) c* w% q% h* E
|
|