|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
. {" |- O5 C2 Q0 S
( ~6 T/ ]! I. A4 G. Y* ?#include "TL138.h" // 创龙 TL138 开发板相关声明; j: P% U. K' [ k
, E- R* a8 L, ^" u, D- F1 @#include "hw_types.h" // 宏命令
* E' z% `( r4 j+ x# M+ I" j4 g#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
. n4 L* V1 A+ `' k$ k4 c#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
! q j. Z& R9 Z/ i0 d( R- B& Q% o" ?0 C' B: N5 c, S
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明' t9 E% N5 M( l: E' k: k- z
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明$ ?# \7 I9 r9 G3 N/ i y5 w
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明; R' K* f; b; N/ z L" }" @
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义5 ?8 n) c* r, W5 j% Z- c9 f
\% Z1 @9 ?; P/****************************************************************************/) Y8 e: C7 S5 B, F" W/ R
/* */
/ F ?" K( [ U" u8 U# J6 w/* 宏定义 */0 I6 B5 f5 H O* D" h
/* */
$ Y/ T' r: J5 {9 v+ d9 F/****************************************************************************/. z& B' k! e9 b
// 时钟
# \: M) N/ h) Z. W- c#define SYSCLK_1_FREQ (456000000)$ f+ w9 c4 R! C E7 ?
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
' b9 |5 q- d. A; ?% t#define UART_2_FREQ (SYSCLK_2_FREQ)
! T: C9 U. Y" G7 S; }* q3 [- m- h( m3 W
/****************************************************************************/' c+ V" {/ s/ n1 x* h8 U d
/* */% A, J. ~: G! p. i
/* 全局变量 */
j2 H9 A! T- d I9 n+ {/* */- n9 ]/ J) j8 b% h4 S! a" \: e# Q
/****************************************************************************/
) @% I; V. f8 H8 lchar txArray[] = "Tronlong UART2 Application......\n\r"; d+ h. w3 f! f. V+ H. p4 O3 [3 j
3 A% F5 a7 {5 w- c/****************************************************************************/
; P5 y2 C9 Q4 u, |/* */
. s/ |3 z+ J5 \/* 函数声明 */$ ^& ]& n# S! {) M2 X5 K+ E0 g
/* */
( T) U2 p: l* ]: S9 t/****************************************************************************/" b, }4 C1 F8 _* b _# K6 e
// 外设使能配置0 g4 I: O8 F* `( q/ u- m3 s( [8 |
void PSCInit(void);4 Y& F# g2 x) R& l3 d
- J9 k* J; t5 W# ~5 M/ g! ]* X
// GPIO 管脚复用配置" Q! e* d# p! m+ \
void GPIOBankPinMuxSet();
" K* U* N" s5 l! [0 P& W3 m9 e& T7 }5 e' R9 |2 m
// UART 初始化$ F' \* d" S" ]% H+ b3 s
void UARTInit(void);
% y' s! X5 v+ T3 c& Z" Z// ARM 中断初始化
4 e- p1 h6 _8 ]6 Gvoid InterruptInit(void);
4 X" s3 w) |. o8 @. {9 E U// UART 中断初始化
0 J' [2 q Y+ ~: s6 u5 b+ b: Kvoid UARTInterruptInit();
/ W6 P6 k& d6 x( N7 d// UART 中断服务函数
. o& _! ]( t" J. Evoid UARTIsr(void);
- d6 \; b' u8 o/ U6 q# P( {, l) ]) C8 _6 l0 ~4 c7 {
/****************************************************************************/
. f& u# l8 j z) M3 |4 D+ f* K/* */) k% E# U" s9 M1 y& M
/* 主函数 */4 r6 y. F8 R/ i: I5 L+ j4 ~
/* */
+ i' Q# d, P; x, L6 M* t/****************************************************************************/! t) r- c ]+ _4 l
int main(void)
. [' _! T7 K- j{
8 q$ J7 R! H4 W2 n7 M" d; b, x // 外设使能配置: N8 @6 h6 ~! r; N; i2 N" j( U
PSCInit();8 n. ^: U' a* q2 ?# r, P$ R
. I3 I0 n3 n3 V) Z$ G9 z" v) d
// GPIO 管脚复用配置5 v0 O2 f$ o8 T2 m6 z' y
GPIOBankPinMuxSet();
4 G4 y' f% }; \3 g; N( Y" k; ]: Y
]( Y0 C; M0 `1 l0 ^' g9 u // ARM 中断初始化) m' F3 L8 C2 i7 O* c$ v% Y
InterruptInit();9 U. ^3 j* {0 R9 D
0 s' { B% M) n, [8 D! V6 M; S // UART 初始化
: A, G( s4 }1 k- f$ N% O- g UARTInit();4 Q4 i$ v! [. _+ Y
+ j% g; |3 H# Y q
// UART 中断初始化( H0 O& M, \/ _+ Y3 c! \8 j2 i5 n8 N
UARTInterruptInit();, I1 t8 E+ j4 Q {; K
) h e. V4 m+ m // 主循环- y0 J# b, I G
for(;;)6 y# `$ B! e2 n# P! V8 L! ~
{
. a$ k0 T+ F+ ]- J" B% n+ y0 w/ W1 O! W/ \4 k6 N
}" t( w9 c7 I& `: A
}% Q8 i" Z( X3 N" E2 m
5 @% ^& J$ X2 j) U; e5 F1 s/ I
/****************************************************************************/! w: f+ Z& O! x" h4 y. E
/* */. W, e+ P0 c: \; q8 a* m
/* PSC 初始化 */3 q7 e( {; h7 p K3 B
/* */
4 m/ Z$ e; a$ f7 r. S/****************************************************************************/
* M( d1 e! ~' Hvoid PSCInit(void)
3 X7 ^# E$ f. X8 P7 z0 n{! d) X; ]9 l+ G: ] y! _3 h9 G
// 对相应外设模块的使能也可以在 BootLoader 中完成
( p( @2 ^( _! W // 使能 UART2 模块/ s: ]' o2 d) Z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
0 r1 j9 A5 b- j}
1 H0 P- Q. M3 E X X- g3 x) s; H1 w
# f# N9 i0 D3 i- v1 o- E/****************************************************************************/
- Q7 q, u% Q* {& s( k, L+ V, Q/* */& `% w4 X. l1 q9 d: l! @
/* GPIO 管脚复用配置 */
; e2 q& l- \* w2 W0 l& U; ^/* */
+ j" C" e' T) v: y( @/****************************************************************************/' v0 |9 G" z- B, {: j# I
void GPIOBankPinMuxSet(void)/ \; U# t- g' }
{
5 d' |6 r& m) r; c // UART2 禁用流控
/ L; u8 l% p1 b1 E UARTPinMuxSetup(2, FALSE);
8 U, x3 G7 I( |! c3 E7 ^4 W}/ X {$ @7 O/ ?! w- @9 A+ L1 q
& a) v* T& ]0 |$ }8 x. E. w/****************************************************************************/
) ]9 O- P) L/ u9 a/* */( q. W# K: p' t/ E% \9 Q* X
/* ARM 中断初始化 */) |( U/ ^* T/ ^+ K* c' ?# _" O
/* */* t: T: E+ T: u
/****************************************************************************/3 \8 I. d4 k3 C& K: d
void InterruptInit(void)
+ N# N1 \4 N& }9 v' _8 _: u{
/ V, R% M" q+ V$ t: \% m // 初始化 ARM 中断控制器
/ S! Y0 ~1 `7 u9 n IntAINTCInit();. ~. \. W6 y, s, S/ _) X
( V& Y1 C* _% D8 L // 使能 IRQ(CPSR)# m+ Q# }% A# m! O' e9 L) }
IntMasterIRQEnable();
' `& t6 y J0 q0 T
8 H$ T; _4 ]/ u1 b/ Z& Z // 使能中断(AINTC GER)
5 X" V/ e. t! D" {/ D IntGlobalEnable();5 j J0 B& c& Z5 _5 X1 @
6 {: u7 t9 l& R
// 使能中断(AINTC HIER)# j' |) B9 ~6 L
IntIRQEnable();
- G/ i/ @; w T9 _ t# \}
" x/ N$ }8 z, Y9 d: Q! @& D" |( d: @, e# }; f7 U- J
/****************************************************************************/
6 [' M/ \+ C% R/* */8 p; {& |* W' @9 y. m
/* UART 初始化 */
9 Y7 e Z8 ~0 E; C0 B/ x/* */* B6 e# w$ F3 N5 ^$ \0 t( [% m1 N
/****************************************************************************/* V( s0 h8 p6 |0 b' u
void UARTInit(void)
: e' b$ e$ U6 p% @8 b0 p{
2 p( ^) N2 B& h( t! v' L( A // 配置 UART2 参数
7 G' E4 }) {5 p3 k6 m9 E // 波特率 115200 数据位 8 停止位 1 无校验位. S5 v4 ]* U$ ^
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,1 i3 k/ x! G. Y: U( e! x
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" R! O0 I6 |& D' ~
// 使能 UART2" v; u' A4 {* @/ d, _ `
UARTEnable(SOC_UART_2_REGS);; y: E$ L. ?* Q
0 D/ d7 Z: V5 j( ~ // 使能接收 / 发送 FIFO
: A. r2 ]( n+ ~6 g; | UARTFIFOEnable(SOC_UART_2_REGS);
T; J( r. a6 W: _
/ \- H% w9 B8 N( [9 g // 设置 FIFO 级别
6 ?9 b T3 ]6 e5 K, z) f# u UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);7 a/ U& H! A) @+ Z% d
}2 n$ m4 y4 e3 s" l; Z) J: h7 ^1 h
7 J, [4 p8 B' a. F; d' `
/****************************************************************************/
/ }6 Z; |5 N( p7 n a# |4 I/* */2 Q r. v2 N A9 }+ l" t
/* UART 中断初始化 */; e9 d3 y( ^6 v( }! r, L
/* */
$ [# J: O: c+ W: B7 P* Q/****************************************************************************/
2 H2 }, J/ j" i- ]void UARTInterruptInit(void)( c9 ~4 W6 X) ^3 m
{: u0 {5 U! }8 J2 A' s& Y
IntRegister(SYS_INT_UARTINT2, UARTIsr);) ~% g" R8 H4 q! q) j0 M
IntChannelSet(SYS_INT_UARTINT2, 2);
* ]: R1 w% k! }& u P5 c3 g IntSystemEnable(SYS_INT_UARTINT2);
8 C% v4 b9 ~/ y- H1 C+ `& y5 E" z2 U. i% p" I$ J- f
// 使能中断& i8 s- I( r0 ^+ ^$ W
unsigned int intFlags = 0;
{) o& b; C+ y, ~ intFlags |= (UART_INT_LINE_STAT | \
9 q. S, J" x/ u! T+ Z! M2 { UART_INT_TX_EMPTY | \
5 {0 v: {& p" d! Z) M UART_INT_RXDATA_CTI);1 @. H, `6 D" A: A
UARTIntEnable(SOC_UART_2_REGS, intFlags);
& X4 S/ l$ b1 F, B6 C# v7 V}
6 I9 A( \" H+ Y J: o# W; S' N' F7 p0 h
/****************************************************************************/
# t0 q8 c1 G& D% ]4 X. e+ n5 r/* */
9 ~' n0 K b5 {5 [2 j* \6 S/* UART 中断服务函数 */
1 o; H8 N9 t/ D* j/* */! a1 u/ `& k8 k
/****************************************************************************/2 ]+ B) I2 i. h% @) q! N. t6 u
void UARTIsr()
& c" Z7 O+ C2 [1 g! S3 S3 S4 w{9 p: D2 u; V! v/ s* S
static unsigned int length = sizeof(txArray);
+ V* N* O0 L$ K8 h static unsigned int count = 0;
6 z8 f' {1 ?" o0 L- g: I2 W! s: }6 J, n unsigned char rxData = 0;' E6 k) M0 g* u
unsigned int int_id = 0;. E/ E# Z* b9 j5 ^, ~" `+ O9 b
; c# i% k# P4 l$ F* ?) p
// 确定中断源7 H7 K" S% J! I) K1 G
int_id = UARTIntStatus(SOC_UART_2_REGS);
( d4 a8 h" i% @, v3 E, @" D
* ^# K F* x& I8 N- l // 清除 UART2 系统中断' x u$ ^5 I+ O8 f1 X% M) C! R9 D
IntSystemStatusClear(SYS_INT_UARTINT2);
0 J4 ?/ g0 w$ U7 @ t% ]2 R
% v1 y- G2 v& r# m3 \. }/ G* V // 发送中断) l9 Q& a# W' g' {
if(UART_INTID_TX_EMPTY == int_id), n' }5 q+ @ N) h
{9 m& R! w9 N4 ^) h2 @/ ^
if(0 < length)
' M5 c' F. s7 F5 b {
" z8 r3 |4 N' X/ ?3 \ // 写一个字节到 THR3 L$ _$ p/ u8 w
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 V3 f' Y A7 W4 @
length--;5 l G. A2 d: G+ O n
count++;
0 K5 w3 P! z9 j( V/ u }# H$ C/ m1 K. |7 N! I
if(0 == length)
+ _/ e( }! I- u! l3 O* b9 ~ {5 V: G' K& A; ]) @: l1 p
// 禁用发送中断8 b# [+ `1 T& `; B6 g& l
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& ?8 Q7 b: i. Z# ~$ L }: G% f D4 f7 L- s' b
}
3 x8 M* H, i! g4 p, A5 L2 {& G' h; w# U7 C2 F, w
// 接收中断
/ `: w. r3 {( D# p8 W8 f9 [ if(UART_INTID_RX_DATA == int_id), l; Z( o6 a0 O/ u3 r" A
{4 E8 [6 T3 j( P% W' d1 [* \) b; l. `
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);% A& q# e- ^* o
* ^& e2 b% `" W: ^) U UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
; ]4 e' Q' L5 C- N7 O" A }( U$ u" W! A( H* H
7 m l2 I2 @$ P" N // 接收错误 T' z0 E i \. x
if(UART_INTID_RX_LINE_STAT == int_id)9 { g( s4 v8 @
{
/ r7 Z# @! W: S! N/ O: u while(UARTRxErrorGet(SOC_UART_2_REGS)). E' C! M+ V* ~& O/ _$ i& H6 V. S- i. Z
{
4 O% ^ K" \- m9 N0 m* o, e/ { // 从 RBR 读一个字节
) X O: f( M3 G3 G1 E% [& F; E) W& O UARTCharGetNonBlocking(SOC_UART_2_REGS);6 C+ u( a8 F& K' D) W! [. _
}' O4 @# @( @1 O% R; R0 A6 V
}
3 y7 [+ z$ q, w F7 |/ m # G( |5 s; \( V' @* {. A
return;
* ^! M! [. a5 [5 `& F}
) i( M2 K8 h; Z; N) o |
|