|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。) e; q$ f( i( @/ I
) u: K8 t& @' X8 y/ n1 _+ {7 ?
#include "TL138.h" // 创龙 TL138 开发板相关声明
2 d) ~" C% t$ \3 t8 `4 x1 Y" G( U ]% r: T( Y
#include "hw_types.h" // 宏命令 P; V0 V! e% |; ^! U
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器& l0 j/ O t. `& U% S5 i1 P
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
7 R9 E% C6 ]9 @" @% ]' l0 X. y6 `$ m! K
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明* h, ], j0 t2 S/ `( C/ e
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
8 y( v: A0 f# F! {. b4 G4 ?" z#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
/ G$ a! n9 B3 }#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义" V: O" L9 k$ S; I: `8 W9 F2 ]9 k/ ~
$ p7 j5 f; D H* m/****************************************************************************/7 a- L( s! L8 `; `, J8 M
/* */( M% }% I, v2 B+ U% ?5 o6 u
/* 宏定义 */0 z G9 c5 t+ ^3 [( U- `4 _
/* */1 X. V! H" _8 b6 \) v: N
/****************************************************************************/1 V& x6 ]# _/ @, A# _; n9 R
// 时钟
, k- q5 G1 h# I0 S; t- Y- S. O: C#define SYSCLK_1_FREQ (456000000); M! q, Q1 a2 \ }
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)' I+ s0 v& d+ s0 T
#define UART_2_FREQ (SYSCLK_2_FREQ)/ K4 v" f6 J( n/ v( L& u
3 E, I6 g, g" Z2 U
/****************************************************************************/1 V) p1 E2 c( [5 E3 ]
/* */
/ K* H& T; \3 |/ l9 m/* 全局变量 */
5 f- @& i% r( ~& n( r/* */+ e( [1 A/ r( [6 _) V9 ^! s
/****************************************************************************/' Z6 X5 ~5 |1 t) I
char txArray[] = "Tronlong UART2 Application......\n\r";
5 W3 ]6 Y: Y0 a$ k" P7 v" E1 Y- s( |, d& d) \' X
/****************************************************************************/' ~$ X, k3 ]/ [
/* */
4 k) o: A$ T% j$ G; r/* 函数声明 */
/ y0 d7 ^9 `1 u* z/ |6 b+ { h/* */
; l3 f5 A6 h: [/****************************************************************************/9 |! P6 ^( y: e6 @
// 外设使能配置
" E$ }, I3 E0 o, z! wvoid PSCInit(void);
, u. H& x. e8 j5 H7 q J; b, ]( v5 i2 A- M* w
// GPIO 管脚复用配置
: w5 ^2 }3 _) e4 W9 K/ ?$ Lvoid GPIOBankPinMuxSet();' x: ?+ n) x' t' M9 l f% Z
, E9 X4 d" e6 S k2 r
// UART 初始化- A' ^. D x, h. x, E7 h' L
void UARTInit(void);
! |, b% L7 Q( o4 |6 e// ARM 中断初始化
" i; E% V( @& O( Nvoid InterruptInit(void);0 q) B$ E0 T( O5 I8 I% ]
// UART 中断初始化
& u/ b# X4 J8 \) C5 Kvoid UARTInterruptInit();
0 b7 M5 w2 Y+ |% |; d9 I) k// UART 中断服务函数
( X" |0 a) N! D- O' u& `0 svoid UARTIsr(void);( ~! ?; o2 c' g* \
( s: d! x- }6 K- X* F) l! Z
/****************************************************************************/' y3 J6 @- H5 w6 P2 H/ c+ u
/* */3 W4 x4 g+ Z; B6 X! M0 ^
/* 主函数 */5 m# d& }- \& }# G$ a
/* */
& J1 _! ], x" J. x# N- ^# A- R/****************************************************************************/
1 I+ G+ z+ f* s6 s( a$ hint main(void)
& M$ }' O4 A# @% _' V) i' ~{. U+ ]$ O6 w# V. x
// 外设使能配置
1 p8 M0 N7 R0 y PSCInit();
1 I5 E7 Q0 B0 Q0 N7 v3 N' o* y
9 M* b0 R1 m2 i. O% F // GPIO 管脚复用配置) j; O0 ~5 D6 j" `" ]7 G
GPIOBankPinMuxSet();
# ] u+ U) B z6 ^' c, k- z
9 U; U* J# w z8 \ // ARM 中断初始化
" Y/ E. U" R& ?( S" e InterruptInit();: k! F4 U+ f n% Q
! a) r' j' @7 r1 C9 |' M
// UART 初始化
: N( U! ]3 i8 m UARTInit();% `0 y- n A6 C$ [' @
1 E: K% R, C1 U# F2 a$ G7 Y) u7 @
// UART 中断初始化8 ?+ D& H# W# P$ ?- B" W* Q7 f
UARTInterruptInit();
% z2 R1 t) \0 T/ ] P: V, z1 e( ^* `9 }' L+ k2 y
// 主循环! s( r' A# F. b3 `. v5 [
for(;;)4 ~$ |; K! N9 m7 m
{0 U, F2 ~* t' H8 X
" U9 b" m# H! ]! |; p* I6 D }) C* Y: {; \0 i2 N
}" S% Y1 V+ S7 Y D& j" q
# O( w3 x1 S, ^- O
/****************************************************************************/# d4 T2 q' t F0 u1 \: o
/* */
?1 {' f7 L. n) ^/* PSC 初始化 */: e( R) c' b- B% c; z
/* */- r; R4 @) O4 K( j* {. Y% G6 ^
/****************************************************************************/
" ]' _# r$ L7 jvoid PSCInit(void)5 B% X7 @- \- z4 e3 _) P
{
5 E$ O9 J5 N4 [ // 对相应外设模块的使能也可以在 BootLoader 中完成2 M; l) L& N' }& d8 d
// 使能 UART2 模块' b" o, s. T' O% i0 k+ z9 W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
* @: J! h, w+ @ K. l}
) |; g0 H" _7 P( ?6 l' \7 @" \# |6 b7 H0 ~( }5 L
/****************************************************************************/
4 {: {2 h' @# q' K/* */
+ c: M6 H8 X3 t/* GPIO 管脚复用配置 */
1 |5 Y2 s( }% {/ q6 L" o/* */
; w. y( i& q1 L4 z/ d7 W/****************************************************************************/
+ u, h1 x( ?9 ?8 |6 x1 y- ^void GPIOBankPinMuxSet(void)
8 k1 o# K4 t8 l0 P8 J T( o Y{* U$ d3 U, H! o* z; G9 t( y) e3 C
// UART2 禁用流控
. F( J% m) d# C$ n ~ UARTPinMuxSetup(2, FALSE);
- ~- {# I4 j* I}* o, @& t; M" d4 Y f1 h# f
/ y* r. I, m& q! c. K% ~: P7 t/****************************************************************************/
9 |5 H: Y" f; ?4 o% r# z) R/* */
5 o; W0 W- _+ s/* ARM 中断初始化 */( y5 d5 V: p% ~& [1 y4 f
/* */
3 F( w5 J" ^/ E8 T6 ]) Z/****************************************************************************/) o0 s9 s; ]/ O% n; K9 p
void InterruptInit(void)
2 A! W$ W6 V2 z9 o$ Y{
6 P/ {1 D4 L c* p/ U. d* c; O // 初始化 ARM 中断控制器
0 {; W b# e7 J% J. d IntAINTCInit();
4 h) E' o9 }+ A- ~' o; v' a5 M% M8 L' x. a8 V. U: Q
// 使能 IRQ(CPSR)/ ~6 b/ G2 `! t" I
IntMasterIRQEnable();
; Q1 z- P: v5 r& v
, [% }* |. t @& h% \7 `. G // 使能中断(AINTC GER)5 f' T( p( A% B1 y: Y( e' R \+ A, D$ e
IntGlobalEnable();$ K) z8 t; U& v9 t E- X& ?
& E4 Y! d; j( K
// 使能中断(AINTC HIER)
' @' t: r- ~6 A4 ^& ?5 {) h: | IntIRQEnable();
: J7 p; ^8 C. ]0 G3 X, D6 l}# `- w7 K6 n7 U: F
) |' G, @3 F' L
/****************************************************************************/# p: _) Z; ~) Y+ V5 Y$ h
/* */8 s+ k8 i* Y% Q: W
/* UART 初始化 */1 V8 E3 O6 z3 \0 t; F2 X
/* */
4 d; H; M! V& v5 a& ^% K" b& X& _/****************************************************************************/. i# c' u. C1 W( p% L2 s
void UARTInit(void)
; N( m# f- m5 e2 H0 a% i{5 j2 a; S7 x5 `3 |2 |$ ]
// 配置 UART2 参数' j- k2 q" j4 {/ p5 u' }
// 波特率 115200 数据位 8 停止位 1 无校验位
* M+ v" t7 M8 v+ z: G& Z- { UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,, N7 L2 x" [& x( `( C# x
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 d% x# @ e. t$ p0 x
// 使能 UART2
& U7 V9 G8 n7 C6 y UARTEnable(SOC_UART_2_REGS); B8 x6 b+ F- L" J
$ A) d6 w# S4 ] g! r( P+ w
// 使能接收 / 发送 FIFO( b( l* s" Z, i( x. \) G, n
UARTFIFOEnable(SOC_UART_2_REGS);, V9 i* U/ J4 v
$ L d3 C- ?: h4 z7 A( d e // 设置 FIFO 级别
& Q4 y/ d+ q/ z; s4 x) A+ W7 ~ UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
9 w) c( A& D% a s) x$ t}3 J6 e+ b: G* ~; G3 m" W- A: w8 H
r' r8 D7 S3 L9 H" F+ v/****************************************************************************/
r8 l# |* w0 U# O/* */
: e z9 _0 b6 Z0 ^7 V8 g" N/* UART 中断初始化 */
7 s: i! T3 u L$ T* t, y9 m/* */2 x& y! z- U7 v) B! W- t4 v
/****************************************************************************/
; I3 l* _4 b& M: nvoid UARTInterruptInit(void)
6 c Y, x" l6 X) X1 j) D{2 r9 a8 \2 W1 x0 N% Z3 c+ r, R
IntRegister(SYS_INT_UARTINT2, UARTIsr);' _" d& o* r n% @1 y& {4 j$ w# `
IntChannelSet(SYS_INT_UARTINT2, 2);
5 r3 B1 I9 x" v) j IntSystemEnable(SYS_INT_UARTINT2);
5 o$ p# q9 x. l+ z: Y
" D3 `6 C4 _) L" k& i // 使能中断. A/ h% y0 R W* \. q t# F
unsigned int intFlags = 0;3 v) U+ T# i7 C, P. \! o- {
intFlags |= (UART_INT_LINE_STAT | \ L* P! d/ B K7 S
UART_INT_TX_EMPTY | \5 l1 R0 _5 V( s+ ~! H+ l
UART_INT_RXDATA_CTI);4 K/ N4 b \$ @1 u0 |+ s4 h+ R5 q) z
UARTIntEnable(SOC_UART_2_REGS, intFlags);5 H0 }7 {; A) u2 X O' R2 x5 ?7 X
}, S- P. {6 H1 L% _% M
/ e2 ~8 N+ ?& X
/****************************************************************************/
; P1 {. @) a0 h! U Z/ z/* */: l) \) D+ c4 a- Y
/* UART 中断服务函数 */$ ?5 q |7 T( g
/* */
$ \! Z6 w N$ w# A: i3 K, N! b/****************************************************************************/
$ W" P, g9 U4 v: @( X% ivoid UARTIsr()( B b& z6 {* [" Q9 P
{
7 R" ?8 [; C0 D, H0 E' Q" n6 y: i static unsigned int length = sizeof(txArray);
, D' Z. i7 ^2 Q! h; R) e5 A, J- A static unsigned int count = 0;3 A* k9 Q% y* R; c" q
unsigned char rxData = 0;6 i F% z- c- P1 J2 B- i8 T$ [
unsigned int int_id = 0;
5 m5 q& b% h+ H0 S9 P. o+ e5 G: I" T C. ?: s
// 确定中断源! v% C; s' L7 W9 i( x
int_id = UARTIntStatus(SOC_UART_2_REGS);3 ^' b3 q+ M$ Z5 V4 H
; b/ [ V6 c# h+ x; E // 清除 UART2 系统中断& P' S1 ? F1 q3 E. o' _/ W O* `5 x
IntSystemStatusClear(SYS_INT_UARTINT2);
3 h, q5 v) t4 I5 ? A' W& k# L
^: G3 v; G0 |. c, T // 发送中断6 d0 g' ]5 a2 T: v
if(UART_INTID_TX_EMPTY == int_id)
i- W5 w; G! P# _8 ~3 m# ? {
1 ] m* v9 E$ {, F4 E if(0 < length)
0 V( L3 B/ R7 f. `3 U {1 W7 _+ n1 _3 N) X1 o" i
// 写一个字节到 THR* x2 ^) J7 J2 C
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( W1 b9 |0 H5 B length--;- M- g( E$ v# @$ H8 p$ \* e
count++;0 y2 H; e( ^: B9 ?% u9 h
} [6 B- W2 u5 G. B' h
if(0 == length)5 J/ f9 A3 |. w5 m
{, u. q2 p S/ d9 Z0 y; n7 U
// 禁用发送中断
- a7 G& a t7 Q% c3 A UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
$ d' |8 i0 z, [0 p: G( q7 C }
/ d3 D$ e0 G- Z" B7 i& x$ {1 ~ }" J% y7 O& F6 } U9 G. Y
% V6 n8 u0 h- v8 n9 O // 接收中断1 e9 `, b& i p( f
if(UART_INTID_RX_DATA == int_id)
4 B# F, }# C, v {
9 _4 B2 F4 Q! o0 A( @- k rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" [5 c L# `7 K0 Y5 u& z* B2 s, w0 M; N* b+ U( [! Q- q+ p
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);3 z3 ]: Q( x$ X4 _3 v& A
}
V: G+ H6 e8 }+ c$ i/ O4 n; h8 W/ D8 v) n
// 接收错误
' S0 R/ j; n' S% v# H. m- j if(UART_INTID_RX_LINE_STAT == int_id)
& j; r$ J& q; k" c* b: G5 Z. [ {) U$ G7 Y) K+ _7 [2 v5 o
while(UARTRxErrorGet(SOC_UART_2_REGS))* X" G4 X; {" Q
{# z. S; u c: k# p8 p
// 从 RBR 读一个字节
' R/ @4 H4 N/ Q% w; ] UARTCharGetNonBlocking(SOC_UART_2_REGS);
& O9 M! q/ E7 v! b }
4 j) A) O; ?, ^! A4 h: { }/ P% H! k. U$ n8 e9 L
/ q" d& ~5 J5 j- A/ }7 B0 m
return;
; o! X6 z! z/ j2 c}9 u+ C$ V! V$ ~# C
|
|