|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。# q: A0 S8 o" ~
[) i5 p. j; Y* s4 p7 f#include "TL138.h" // 创龙 TL138 开发板相关声明
( x! p0 I/ `, n* W! r# D+ n- I j0 Y- W9 J. r3 q8 z( X
#include "hw_types.h" // 宏命令7 S2 q! P) v6 q
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器. W$ n T& g) t$ k( Y
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
- E" w. w4 P3 |8 ~
3 f: G0 p$ W' s4 P1 w. i% u#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
# `: U+ ^9 L7 W, `9 B# x#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
2 }1 |5 |2 f# S% O; o+ Q#include "uart.h" // 通用异步串口宏及设备抽象层函数声明7 P; p! u5 c* _3 V+ K% g) B& j
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 D9 M+ A) c- x( \- B& `0 G5 j
. H( X. z* y: E/****************************************************************************/8 m( s% w5 u" T$ G9 j
/* */
- w2 n" n( T" q4 v/* 宏定义 */
* }1 w" N: c% y8 V; o/* */, e4 _. e8 e) Q% u' h% a! v+ C
/****************************************************************************/1 i3 T; y1 a: o: f& A
// 时钟- W+ m# z; k% F( o) @# j& k2 u! T
#define SYSCLK_1_FREQ (456000000)
( r# q. z7 F9 A. C: x#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)6 z8 X- E, k- M) a! P2 V% C
#define UART_2_FREQ (SYSCLK_2_FREQ): g: }* R& E) Z4 U2 s: j4 A% s
' B- N4 I; \; V. X* b5 G/****************************************************************************/
1 F z! a& T- C0 F5 Z/* */8 |, o2 B$ b6 C& L2 m
/* 全局变量 */
1 Z, O! C5 {3 f3 W/* *// ~/ s9 Q' Z# O6 x5 A) ]+ f
/****************************************************************************/
2 T. e0 [! |; \% Q0 uchar txArray[] = "Tronlong UART2 Application......\n\r";
7 i& V0 t2 v m7 J
4 v- _0 k% d$ O' O$ l; X" E/****************************************************************************/
) f3 A6 |$ ^* [4 x9 N. c$ j/* */5 X( f5 V q& ]$ [5 s, L3 F# k
/* 函数声明 */
9 K& v3 d' \! Q4 o3 E8 F/* */
4 Y7 q: j: u- L; p8 P/****************************************************************************/
. U) _ U6 J7 ^7 \// 外设使能配置
1 K7 g, N( v9 u$ E3 ]0 ivoid PSCInit(void);% D, m$ l: W; e3 ^! g3 K2 I( Y
( ^* N2 d! c" S/ q% A1 ]1 [// GPIO 管脚复用配置1 R8 X( F; e6 m
void GPIOBankPinMuxSet();5 Y3 {+ `7 _* G# L/ K0 {/ T
" k! r! s6 j4 `* y+ b$ J' ~7 G; p' M// UART 初始化
5 k+ O. A: d: z4 g. E, v$ rvoid UARTInit(void);
2 Y5 n8 D& C8 p// ARM 中断初始化
7 j2 `1 d( @& p. ^' _6 Lvoid InterruptInit(void);6 @ y/ g5 n: y9 z
// UART 中断初始化
- y0 L7 h5 y. Q' J/ Ivoid UARTInterruptInit();
, _1 m) ~5 P- R// UART 中断服务函数 p4 c6 X! Q( M
void UARTIsr(void);
& g7 y& @# s( M9 }4 ^. o4 \: A! \. ]# ]+ [ _2 \
/****************************************************************************/
1 t B- H/ j" W( c% Q/* */9 o( S5 h! R" |& b
/* 主函数 */
) P& o. f1 X( l3 H2 y/* */
' y+ [: c* N! w8 y8 r/****************************************************************************/2 H. C1 m5 i7 |5 l% G5 A
int main(void)
/ l; M7 D P2 B{3 z1 P) n v$ B
// 外设使能配置
3 _1 N2 c4 z- f! o3 F PSCInit();3 k0 K1 E% \. x4 o5 n
" `- d: q) s# O% p5 p! ]
// GPIO 管脚复用配置
1 s- s3 h+ q: a$ I5 ~# x GPIOBankPinMuxSet();" g) d- q9 b* O4 S( @/ }5 s8 r
0 F9 ?6 X9 G0 g3 w, ?, F0 H
// ARM 中断初始化7 d$ v3 M; f2 D- I8 p3 c
InterruptInit();
2 E6 M9 ^, [( c X. Q' [, q5 k5 W+ u- }% G2 q; v* I1 p
// UART 初始化
7 Z* r1 d G6 x. g4 q: [* R0 u UARTInit();
- I) H+ A) B: R" r7 _& _9 W0 T5 ~2 ]: H
// UART 中断初始化
+ Z) A9 @. u0 H. [$ Z UARTInterruptInit();
1 l' P0 }# ~3 _. L9 Q5 \5 n" `- m: F5 D
// 主循环
/ Y4 [3 T8 |+ g. C for(;;)
( T9 l1 n3 x" n/ [ {
7 u/ Z! E8 J. ?( C0 U8 C, o0 y' G w: X4 ~7 C# g
}* ]% X- V Z' T- D8 B
}" ]9 l4 {- ^& i; B& `( d
F2 d6 a* H1 g/ X* V# h2 \/****************************************************************************/, q! i( h2 L0 {2 g
/* */3 L3 v" f7 Y& \2 e
/* PSC 初始化 */
$ o6 `: |- r9 I, m c/ }( M q/* */
* g! N8 w! u. n2 D0 {5 \) f8 O1 v" f! R/****************************************************************************/& q' Z( h+ }: X4 b I
void PSCInit(void)
. O9 [& d" m% e1 D# ?) J6 W" @{
; |7 r5 ?" [: w+ {- y& r // 对相应外设模块的使能也可以在 BootLoader 中完成
% b7 O2 z% [: j4 \+ H" P // 使能 UART2 模块
# M( ^; |% s8 |3 _# l: K PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);) v1 X* c- p$ ~8 X
}9 m- H5 t7 r+ H2 d8 l1 f4 p
6 {; Q) Q* J( L" r3 b1 M
/****************************************************************************/- l- \! S6 m, K, }- ^+ t6 ^
/* */; V) Q T+ v3 b
/* GPIO 管脚复用配置 */2 ]2 g b) b c! C: H5 x- b& ]* a
/* */ v: J9 Y6 m, i+ B% O8 ?
/****************************************************************************/
" c2 j8 |9 h, K' M, d! @void GPIOBankPinMuxSet(void)3 j2 p( c3 D. z+ ~+ M
{
! ^) ] D R! f // UART2 禁用流控
8 f; _$ H/ \' G! d [/ |: b% n4 I# \ UARTPinMuxSetup(2, FALSE);' h9 J& j: e2 ~
}
% b4 b8 u9 i. m4 y+ A. [% Q6 N% i- f! @
/****************************************************************************/: `2 w$ G- q& v" A% Z3 D
/* */
3 Q! Z) J: ^' V+ y* @& \2 S2 u/* ARM 中断初始化 */# }# A7 v7 M+ X4 ~( j
/* */
! C" F% \7 T* l8 q) w# U/****************************************************************************/% ^) _2 S3 Y* j. a# f5 A& t3 J
void InterruptInit(void)
0 Y; ^- ]& g: p{! k7 P- h/ \% y7 r+ l
// 初始化 ARM 中断控制器+ k+ z+ G! l+ W: n- f# |
IntAINTCInit();
1 ~" X, w& u! E5 a" k0 V% C+ @- m' s: A; F+ z8 }
// 使能 IRQ(CPSR)
F+ f; w1 _3 D9 H0 g# ~ IntMasterIRQEnable();* h8 k4 X) o' K# p9 D' H
& e8 C) u" [0 N+ n // 使能中断(AINTC GER)
. Y2 P n% L; P0 D IntGlobalEnable();
8 O( j4 }! \( ^/ A; {
t w+ D' i# C // 使能中断(AINTC HIER)
) w, A7 R, @) i IntIRQEnable();
8 q S# N w Q! E# f0 ~5 h}1 a& V1 p% P) w; ^
* v1 S, i6 G6 `( N/****************************************************************************/
5 ~% z: f* E/ ~ X" ]/* */
- t" r2 [0 ]$ a W R/* UART 初始化 */
9 N! O. S% }% V' C- @/* */
' Q1 @# c! n2 N' @6 i/****************************************************************************/
+ H; ]2 N, b- Zvoid UARTInit(void)1 m6 }/ D+ ?. [* _/ Y
{1 ?# m, S$ d. m \- A
// 配置 UART2 参数
' n: c% F) {. L4 {8 \1 U // 波特率 115200 数据位 8 停止位 1 无校验位9 i6 J6 p6 x+ f
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
3 D d( s/ Y" n) ]: x9 K- R! I UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- l+ k4 m- i$ w3 `: F( T* r
// 使能 UART2
% w& N7 q. M2 C UARTEnable(SOC_UART_2_REGS);/ k% j' E7 z6 A+ R5 W! _/ Y& V
, i- V/ Z4 [: @5 |. @
// 使能接收 / 发送 FIFO
% S6 D9 {, E) D+ |( _5 ]% g! A! G UARTFIFOEnable(SOC_UART_2_REGS);8 @, L3 g9 Y8 i; C R$ R* {6 r
6 Y) Q1 A! }& G // 设置 FIFO 级别
8 r: R: E F- o/ d- ~/ e1 l UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
e* ?* t4 N* ]- |}$ z0 Z) |" [+ X+ j* o+ f/ G& L' u
8 F2 e* y5 C4 h+ m
/****************************************************************************// k2 |" v7 K. M: `; a( f: i
/* */
. A# H8 U- E* d/* UART 中断初始化 */
8 L: ?+ U/ a. z3 o5 w. F/* */
6 d3 _9 q9 j8 A9 Q/****************************************************************************/
$ q( q7 N3 A! B2 O# k1 T# jvoid UARTInterruptInit(void)
; z" S+ R7 |6 J3 ]7 Y. u: B{% S J- w4 A# l8 e {& K
IntRegister(SYS_INT_UARTINT2, UARTIsr);. }2 F" y- q6 [ ?. X" V
IntChannelSet(SYS_INT_UARTINT2, 2);0 R7 b$ s" T! f* r& f& }4 K
IntSystemEnable(SYS_INT_UARTINT2);9 s5 s% _2 T: e, u% X! W9 V1 q* n
; X8 ^$ U( v- S* q( A7 E: H% [ // 使能中断
( z% j8 _, Z* A5 ?/ D( T& Y unsigned int intFlags = 0;/ f; Z& T! t* p& T2 Z* A5 ?
intFlags |= (UART_INT_LINE_STAT | \" m" q' g' g& ^
UART_INT_TX_EMPTY | \1 e( G/ |; U$ P s; b, `
UART_INT_RXDATA_CTI);4 Z# a% n$ A6 F }% @
UARTIntEnable(SOC_UART_2_REGS, intFlags);2 e' Y& Q0 {4 T
}
% Q9 x& g G" o# N4 T: \7 ^; k- o2 P1 |- k, E5 }2 E' f
/****************************************************************************/
6 n# m4 |) f6 M7 ?9 M/* */( U G4 T4 B y0 e& n
/* UART 中断服务函数 */0 R$ G1 a6 U* Z3 j# u/ `$ ?* q8 p, z
/* */
$ l7 @0 A$ S7 n, }: F9 ?/****************************************************************************/
6 m3 H6 q( \1 i9 s$ Z- gvoid UARTIsr()6 ^- n4 l& B5 b/ Y
{5 T; e; d- D d" `6 V
static unsigned int length = sizeof(txArray);
7 y; X0 N: x1 {' O+ I$ u static unsigned int count = 0;+ W. R1 B6 a, G1 o r" _. `
unsigned char rxData = 0;
' t" u7 h& h. c! Z unsigned int int_id = 0;
, H# l; Q& p4 J) A
- D% v* d3 ^7 ?4 s7 N; Z7 h // 确定中断源
. h+ m8 E4 X) A8 h! D. { int_id = UARTIntStatus(SOC_UART_2_REGS);
' ^1 u' y& q; l1 Z. h$ X5 H5 K* z( t+ K
// 清除 UART2 系统中断
% b$ `" Z. Z1 H' Z6 d F- F IntSystemStatusClear(SYS_INT_UARTINT2);8 d9 j0 P g, n% ?$ s
6 r# _! }( O7 z // 发送中断. }2 p% J: [# e6 C
if(UART_INTID_TX_EMPTY == int_id)
4 H8 @, `8 n ^0 t4 R {3 N& C4 ~9 H' }* F; @ m0 v% e. N) I; j6 P
if(0 < length)8 ^8 |/ Y* l) a+ P' _- D3 @
{* W+ Z) K! I- i) B
// 写一个字节到 THR
# F, p# V# K3 m7 ~5 A: p UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 S& ]$ e* \+ V length--;. |4 q6 N: W3 S3 k
count++;
1 z) E* g0 { j1 m2 t0 p9 X# y }. z2 q; n ^, `& ~) p
if(0 == length)
, z# C; h2 z6 d/ m% N' ^, G/ N( w {! T, a" |7 \/ z: y/ H; r! K
// 禁用发送中断
" n) Y H* h' p& L8 t" c3 w UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
1 a% G; i- Y+ {8 Y* b* p$ K0 c }1 `8 q* @5 P3 Z/ Z- d" m% t+ v
}
6 ^! x! l% H$ d4 n5 F. @# H; @1 Z% [* v' H
// 接收中断
3 R, S2 O; i2 a% N; W7 f# O if(UART_INTID_RX_DATA == int_id)7 }4 s% T3 x4 H
{9 a u X v: c7 z2 Z# J
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
0 V n y* X9 x$ `1 X- X3 T& L' B6 v: h" J6 v& r, y( }
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);$ i, h: {, _9 F' Q/ f- H+ [
}; x0 m8 o) X% e2 T4 l
& i- _' E. n/ B4 u. J( ~8 v/ A // 接收错误
' H) g! Y3 H8 U8 V" v, e8 { if(UART_INTID_RX_LINE_STAT == int_id)0 N3 w: k! E' p4 X, P
{
% b. @) x' Z% h* h while(UARTRxErrorGet(SOC_UART_2_REGS))6 g9 i) f+ ~# l9 z
{8 w6 \% g z$ A* E" W# s2 |
// 从 RBR 读一个字节7 t- ~: f7 `( Q- E6 w2 x
UARTCharGetNonBlocking(SOC_UART_2_REGS);( e$ ~7 d0 \- @5 y; G
}% {7 N! W5 y& U! x( C
}2 }$ R4 i* }9 t5 \( x d6 X: Q3 a) v
" n4 ]7 V7 R! x8 D' K2 ~3 C return;
! c0 ^0 v+ N0 f7 W4 h}6 c% |( E8 g2 }2 ~
|
|