|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
: T4 G8 q l& q6 x& U: t% r
5 W# o/ W: U$ [/ y" J6 }#include "TL138.h" // 创龙 TL138 开发板相关声明# T! J) p6 G+ A( Y n! _
( W. x/ }3 C, a2 H" @( } c" d7 _9 g#include "hw_types.h" // 宏命令2 |8 d B* S j
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器/ v( ]( I" q) @0 ^. T
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
( n B* i& b) O
' J& T7 j/ z; Q M#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
5 A" G' q$ A; y% m$ K& |& w# C# Q! q; w#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明$ q- m- F# [" Q( x& Q" A }8 T4 U$ f
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明$ B% ]/ w& D- K2 V+ W
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
7 ?& k S- ] c- ?4 A+ t2 N) T3 A ^$ l; {
/****************************************************************************/
3 l# i5 [; ?! [7 y4 v( d& a/ I: X/ A% ~/* */3 B3 v d: s' P' O- h
/* 宏定义 */$ d8 d+ \/ I4 I& X/ A
/* */
?( t e6 g5 J) d. ~; k% w/****************************************************************************/
5 }2 B1 X3 l0 c# b$ C: X4 ?// 时钟9 K( H0 T; H5 r6 U7 i5 m
#define SYSCLK_1_FREQ (456000000)
( M" [' w! C' }( O T#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)+ P8 p, |+ I1 T' ~" U$ L
#define UART_2_FREQ (SYSCLK_2_FREQ)
: E. I* N7 f: b* q6 Y+ \ d, ]$ O b; {8 v, ^+ y$ P
/****************************************************************************/
4 V* \/ ?; f- W) d4 P& U* a/* */5 O; P% b7 @; }+ ~$ W
/* 全局变量 */8 ]* K m" e( }0 K" W
/* */) ]) z/ c6 G1 x# }& P, Y
/****************************************************************************/9 z5 T( I4 [% x I! A1 K! R
char txArray[] = "Tronlong UART2 Application......\n\r";
+ }( h; Z9 P# O# d& a
. R8 N+ r: o2 D- X9 r) S( W/****************************************************************************/1 l8 p- S6 }: X0 M
/* */
4 ~4 z2 M$ Z `7 ]( T/* 函数声明 */. L! g3 B3 B9 e3 h
/* */: b2 B; s+ E, [
/****************************************************************************/
1 } n' I* w+ Q( b- ]+ t: @; g% j// 外设使能配置
& P) N- R4 w* x Jvoid PSCInit(void);4 C3 R- z4 w; v" `% G+ t
: r4 [% V" Z; B3 h2 h7 W, }' W// GPIO 管脚复用配置0 m( v3 d1 U6 w. X
void GPIOBankPinMuxSet();
: k8 ~7 R( V( r7 _. k( W+ Z* }/ \0 ?0 `
// UART 初始化. Y2 ?4 D7 Z! V
void UARTInit(void);
( Y* V' j: k, b* p! z$ S& ?' w y0 U# q// ARM 中断初始化
7 Q1 R% s2 E" I& |) v- [4 ovoid InterruptInit(void);6 Q, t2 M- i3 J+ g1 ~8 J
// UART 中断初始化8 ~; Y9 o8 a3 w
void UARTInterruptInit();
; D( U; E8 E* t: Z: \7 o' ?5 |// UART 中断服务函数
1 U+ ]* F/ H4 [! z3 z0 jvoid UARTIsr(void);0 e* y( J- W" w8 c4 x/ I
- S' {- i Y* T' J& N( j, E3 y" K/****************************************************************************/
4 k2 U/ L1 u) ]! G' G7 f z5 m/* */
# W5 Y8 ^" Q2 x1 k8 C) K/* 主函数 */
, u6 z) F9 n9 k8 e9 E9 E) j5 _7 h/ p/* */, |5 ^- d( w+ ?8 b0 d. X) @
/****************************************************************************/
& ^, P1 u$ ^& ]5 u4 r, Aint main(void)
}/ M# r6 H. L{
) a4 e4 H& z, d3 V // 外设使能配置1 o3 E% W7 C7 p. [
PSCInit();6 [+ \5 Y5 W! b" q9 x. Y! I9 K
, \3 S* M* F# u0 d: o // GPIO 管脚复用配置8 G' e. R- M7 \, J
GPIOBankPinMuxSet();
2 i7 ` ]6 [" E$ p/ g) N0 h
+ A; `; e* U/ K) |# E" l; C // ARM 中断初始化
8 V7 P2 y! c5 I2 z InterruptInit();
) n! U; B8 F: d( c9 [1 p/ e
' K& `1 o3 s! E5 X. M1 e // UART 初始化; V( O7 D9 c4 n3 ~3 ]. U
UARTInit();3 N% v4 R; T f- Y% ~: C
, e k. d% d1 N; Q/ T3 U // UART 中断初始化
& p1 x/ d% n8 c" b9 h7 ] UARTInterruptInit();
; w( R' X- W/ C \; p4 x* Y5 N7 C
, Y* a" G: x- ~! c/ J% Z7 {7 e // 主循环% u6 E; ]3 @8 m3 r: g
for(;;)1 X# [. K3 Z; {: {% }: `2 \
{& t8 ~$ G- r" L( R! p/ ]
& X. Q. a6 N+ T& `2 M
}7 g- y7 F1 @! Y" w
}
0 g. w o F( K9 @ o. l& H. H$ j x+ J
/****************************************************************************// X5 o5 R& ]- P* [0 z1 J0 S8 w
/* */
+ L" x! F! u1 L3 S4 ~/* PSC 初始化 */: C; Y. R" w1 G. k( P' T: l: y: i6 D
/* */
( J' C) Y9 a- L# L9 i+ g/****************************************************************************/% I6 P7 m. Q5 h* v7 C @
void PSCInit(void). K- K$ _& y8 X4 ~5 o, W+ ]% s8 o
{
0 e& ?7 L# v* z" O9 X0 L" D8 y* \ // 对相应外设模块的使能也可以在 BootLoader 中完成; l& m6 w% o2 }4 g
// 使能 UART2 模块
( W l: P+ B1 U- X% X @ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
# f: {; C. \ G2 [& R2 p}! m8 h% d% ~5 g4 _/ C( ?6 `. W
, {2 ?& b8 H/ s `9 J/****************************************************************************/
9 F& _5 {: h8 H; [) p: _5 ?5 E5 B/* */9 Q+ Z& j& ?8 R- q7 A) v% Y
/* GPIO 管脚复用配置 */. s3 r# r; Y/ d9 d9 f! F# `
/* */
' w% j3 d" K+ `( S* K/****************************************************************************/( \; v- V3 F$ A# p
void GPIOBankPinMuxSet(void)6 p4 N! O- c" \
{
% U; ?( X, {, O" x8 _+ X1 [ // UART2 禁用流控
6 C4 u* G' z. R! v% C: F1 m7 l- b UARTPinMuxSetup(2, FALSE);
" ?( |3 Y# e4 s7 K9 {: M) C}
% g: H5 O$ U4 N0 S; i
$ m1 \- k5 K# ?4 P/ E v( d/****************************************************************************/
; d9 E; G" |# A5 ?2 C/* */) u7 ?# ^! o6 Y" a2 O8 p
/* ARM 中断初始化 */
' ~0 z6 P, u @$ ^& o/* */
5 m: n0 K( B8 Z5 Y% r/ ^/****************************************************************************/
* S" P4 ^ o* dvoid InterruptInit(void)# b" u( s0 k+ c9 M
{
+ P1 v0 J$ ~# G // 初始化 ARM 中断控制器. u2 C+ r4 u3 R5 }- d
IntAINTCInit();# O' b3 E* P2 {
1 C' y8 ~3 _! M U8 T5 Q // 使能 IRQ(CPSR)
& ^0 ?, i1 l; c4 B" S0 F9 y/ Y. ~ IntMasterIRQEnable();
$ h9 ]7 Y' G5 `; P0 V( S( a
! i5 k8 |* ]4 v$ p9 r5 v( Z // 使能中断(AINTC GER)
) C& o) K# a4 n; n8 j9 h9 p/ H3 b IntGlobalEnable();
; K. ~' g( c% P! M p
5 M$ \9 P8 l5 V6 V) O0 Q+ Y: f // 使能中断(AINTC HIER)5 `" h5 t) @0 L7 _, p/ Y' W
IntIRQEnable();
0 F0 h" W4 \( ~2 g0 s& Y0 s& q}
3 a1 b/ _( q; T
, I% M& o& T7 d; `/****************************************************************************/
/ Z. F" u" W" F- s8 L; q1 R6 r$ x |/* */
, K& M0 \# q# P' o' ~$ P/* UART 初始化 */
& V2 o- U# S& G/* */
U0 E; l. U5 N# u! x& i/****************************************************************************/
: I/ D! [& m |! b9 V, A/ E% svoid UARTInit(void)
# l! A0 L7 w$ W+ K# _2 r& P. Q{# o: Z& Q/ e) b$ A
// 配置 UART2 参数$ }" s$ g( I! g# z7 g# I
// 波特率 115200 数据位 8 停止位 1 无校验位) B# n0 c; S" Y2 d% F) \
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
, G4 a! Q3 N. O$ o( S4 A/ u& l# u& r UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* l2 M1 o; [/ F3 U" H. W6 e9 m0 _! A // 使能 UART2" T/ l, X! P# d0 \* m. g
UARTEnable(SOC_UART_2_REGS);
; a6 I- j( [. @5 B0 F/ `% n5 y" k* M/ n1 H8 N; Z$ ~3 p
// 使能接收 / 发送 FIFO$ i ^# v, M5 K. P5 i C
UARTFIFOEnable(SOC_UART_2_REGS);
+ c' Z3 U- ~' K3 f
- b/ u) k* D2 p6 w; U2 { // 设置 FIFO 级别
0 u8 {( X: y$ p: P: E UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);3 t9 e/ x: ^! J: q: S
}
! W7 @" [- D( r
$ ^% }$ O% k5 J& u$ C" O1 f3 w, o/****************************************************************************/$ {8 t4 y) g) |6 V
/* */: j. _9 n* X6 @6 L; Q Y
/* UART 中断初始化 */; G1 I; x% }4 y4 }' F3 P
/* */ O* ?% R) Q. e2 e3 d
/****************************************************************************/% `+ {" Q R* j' |$ `! q* X* o! \% o
void UARTInterruptInit(void)
/ e/ }* _+ T- v{
& ]" Q+ n g8 K' A IntRegister(SYS_INT_UARTINT2, UARTIsr);
% B/ r0 ~* D/ {5 h0 j IntChannelSet(SYS_INT_UARTINT2, 2);9 m# l# z0 D3 b0 [" N" _# h6 j
IntSystemEnable(SYS_INT_UARTINT2);: Y! J5 b- p) P ~& ~: n. Z
' ]% B3 w2 O8 D# ^3 r& g
// 使能中断
6 q1 u8 I c* C( Z, \ unsigned int intFlags = 0;
: A4 L6 {8 M1 v# E. O* M intFlags |= (UART_INT_LINE_STAT | \4 ]8 |% `5 Q. n. J
UART_INT_TX_EMPTY | \
6 G5 ?+ C# d) N3 R/ ~ UART_INT_RXDATA_CTI);
# O! x/ _2 J% Q% h/ b UARTIntEnable(SOC_UART_2_REGS, intFlags);7 ?7 f. d7 Q: \
}0 A$ b) k* o+ d( O1 X
8 q$ F9 R7 U* v$ X/****************************************************************************/1 _& u7 K, i+ N2 x& B& N- u
/* */7 K) l, E$ `. \' q
/* UART 中断服务函数 */# l( o1 e9 Z3 J/ E3 g" s
/* */
b8 X l( p$ ?1 Q! v/****************************************************************************/% ~! X6 L% b! r
void UARTIsr()
, B- r& Y" Z- _# B{$ X3 J2 q& K- y- t
static unsigned int length = sizeof(txArray);
) F6 a* ^2 X: C, l# [* X8 x static unsigned int count = 0;+ {& ]6 `/ L$ d8 e
unsigned char rxData = 0; A4 d! P: A5 S: y5 f1 y
unsigned int int_id = 0;
) c8 D0 ^- f5 \+ T8 p9 S( H1 t4 k3 D C- ^6 \3 E
// 确定中断源
( ?0 w0 N6 k) k' d; y' [) x int_id = UARTIntStatus(SOC_UART_2_REGS);7 y8 C" A9 ^3 Z* d; c4 d9 @
2 m# c: m7 u) g; m+ v0 R2 c) h // 清除 UART2 系统中断2 W( l }9 u, g. b' L- W6 D- A
IntSystemStatusClear(SYS_INT_UARTINT2);
" w4 e! s& Q: ^* I, Y0 M. |2 F) `9 q; R
// 发送中断
5 I0 [( N5 x/ R; [ if(UART_INTID_TX_EMPTY == int_id)
/ D* ~) n) S+ h4 \ {7 f; K C2 m8 c8 M: X% U9 `
if(0 < length)
* }! x1 |* @+ g& x* v {
/ ?8 Q# ~1 j1 e: m // 写一个字节到 THR
. F, ?' V$ H7 D* t* ]+ @. i UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
d" T, f( K' H) U. q! A; H length--;% d; J* \2 K2 m3 f# Q$ K* x, T
count++;
% n r; h$ w1 {9 s$ v }2 w2 Q" k" h8 p Y7 g
if(0 == length)
0 r- k2 U' c! V& b5 i4 R9 z- j4 c {
# S5 v3 }0 w$ k1 F* d. }( r* L // 禁用发送中断$ o3 v q5 Z8 Y2 l# T
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& `4 M8 X$ s3 q7 K }7 g3 q( C" o& h# D
}# _' q3 h* s+ Q; T1 d- y6 l1 V8 _$ Q
8 P3 M& y; m4 F% o! o! \6 J // 接收中断
5 }$ m( \. H5 u# N/ j if(UART_INTID_RX_DATA == int_id)
' ^! f) e8 x2 q5 T* S4 i+ q {
+ Q; Q( w! z& X8 v rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( @2 w2 d: h+ J3 f( r+ @# h Q: w1 }/ f
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);& |4 Z9 }* [9 M0 u6 z
}8 i3 o- z" j3 k$ q- w2 ? ~5 v
5 _ c( g; [) t4 D
// 接收错误1 J5 D' I" N2 c9 {
if(UART_INTID_RX_LINE_STAT == int_id)' r# x# Y6 @ v& T) v
{- k) a% {7 \# m/ Z
while(UARTRxErrorGet(SOC_UART_2_REGS))
/ z6 F l5 j: I' X V! u( B1 V% w {
2 d, B& ~3 {3 n% r9 {) c) x9 r // 从 RBR 读一个字节1 U, t8 t# b( [; t
UARTCharGetNonBlocking(SOC_UART_2_REGS);2 b1 j& E5 C; j
}& w% u# Y: t! Q( ~3 e l" l/ ~, z) m g
}, w" X+ E4 _7 x6 V; n
0 D( I) ?$ p* u% G' r7 E+ ^
return;
: o4 u' r2 L, @) Y" t}
3 f I( }; e( ]4 {: L( U9 R |
|