|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 K) M9 H! D5 T1 C3 u* d2 \! e& W" K: N8 ~7 R# ]0 G. A
#include "TL138.h" // 创龙 TL138 开发板相关声明
8 N& O9 [1 s( `5 g, I) v2 e7 H- m* W2 R
#include "hw_types.h" // 宏命令
1 y. Q5 W6 m) g' G: [% F#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器: u, B' ~( B3 t6 e k7 x
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器4 ]& Z+ ]$ C" S1 h3 F: ?2 Y" P
# p% Z" w: K* [- s1 i. K: H" j#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明4 L. f' Q- `! _- J+ Q( C
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明& `$ V/ l% S& s. @3 b% J
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
* j) ]' S$ \: o* t#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
& ]+ Y# g& Y2 E8 ^* S3 d! i5 E$ i$ x8 B+ m6 Z. k
/****************************************************************************/$ m3 N1 P4 A7 m: R. s
/* */: c5 z0 j& W6 x0 |0 x+ w1 u
/* 宏定义 */
3 [" o% j9 T' e" c, \/* */
6 k) w8 U' P" J) ]/****************************************************************************/
4 B5 M" d, t' q2 H, ~% J* P// 时钟3 K2 _/ E/ |5 W; P
#define SYSCLK_1_FREQ (456000000)) V& C$ c. B& i3 y
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)* E8 }1 [( C1 F# i
#define UART_2_FREQ (SYSCLK_2_FREQ)
% R3 Q7 ?* ]' a4 V! p5 p* v8 c$ L" V8 |( c$ D7 `' O
/****************************************************************************/3 ]- h" N2 N/ l1 Z Y
/* */
% O. R- k3 v) u# C3 m l) }% q/* 全局变量 */8 J( y) g$ W8 c( ^6 J
/* */$ Z7 z/ x: ^9 J
/****************************************************************************/3 H/ l% B. u8 C3 }6 t$ z
char txArray[] = "Tronlong UART2 Application......\n\r";
/ _% j" B( N; F8 |% z
3 ~8 q( |0 n+ C7 K3 C; p/****************************************************************************/: p9 n9 O5 L+ E3 t% i5 [" y
/* */
4 N2 w# x# P; H" T, i1 J2 ]. w/* 函数声明 */7 {. M, s/ h( F# ^# G1 O: b, Q
/* */
+ v1 c& A* n2 [" n% g* T& m E+ k/****************************************************************************/
/ t! y( z& o# R. n: _ x6 t3 t. i// 外设使能配置
3 G- R5 i3 \0 uvoid PSCInit(void);
, t9 n9 P1 u" h4 D. n% \. d3 d& U
4 q& o! [$ X2 \6 V+ \) o1 t# h K// GPIO 管脚复用配置
: V1 v5 A7 e& N0 a& pvoid GPIOBankPinMuxSet();
* }" c1 ~- n8 M! p1 I- R
7 J% V5 p! Z( ^' U// UART 初始化0 @+ Q* d1 _8 [
void UARTInit(void);* q' G* j% F W7 h+ F9 o1 U' Z( K
// ARM 中断初始化
9 d1 b0 t4 I7 u" J+ [void InterruptInit(void);
3 w1 a2 X8 ]8 O2 S4 T9 }& c0 |// UART 中断初始化
' U$ H: x: j2 K6 @ O0 evoid UARTInterruptInit();
! M2 c7 s$ ?& G/ L; D// UART 中断服务函数
5 m5 U: b' ]. U& \0 z9 kvoid UARTIsr(void);0 F$ h0 z% W, I% v! I6 [0 p# s {. T
6 Q0 i5 n3 l" h4 x% v8 S) F
/****************************************************************************/. E/ e/ {" M5 @& v# j" q" K
/* */, {% g+ M' i* ?, s$ V, j
/* 主函数 */
+ ?9 y) A3 M" D: W0 t% {1 x/* */
6 A+ D7 _9 B2 d c$ c+ L/****************************************************************************/
2 C$ m7 ?" D5 o! Sint main(void)' C, |( u9 \2 r
{
. X7 t Z' W! U% n // 外设使能配置1 q! D9 o7 L9 @/ A( L0 `
PSCInit();
0 s- k+ F! ~4 J1 C q: _: m; ]1 z 3 @! o/ b2 j, g; q g3 ]
// GPIO 管脚复用配置7 K: d. D8 x& o7 N# A2 Z
GPIOBankPinMuxSet();
1 C" N/ @. J+ y+ o4 J; K' q9 K& r: m
// ARM 中断初始化6 O2 u9 p o9 y5 i3 d
InterruptInit();
4 |2 x! N. M. k
# y; n( E8 W1 a5 V4 e // UART 初始化0 e3 l% v2 e; Q' Q7 i+ G0 H
UARTInit();
1 C# S- [* \$ R3 U- G9 w* x5 Q5 _8 {* E0 ] @) O& h% d ?
// UART 中断初始化+ ~( D9 z; ?8 e4 c; S# q8 F
UARTInterruptInit();) f. X, T9 \, }. }# p2 G
3 O8 h2 H& c1 Z! O% r // 主循环
+ n! ^- K% {) r V7 C* o1 Q' C* G for(;;)
4 y& { e; b8 z6 v; G) p# b9 @ {
( W7 Z: b$ N7 f8 e5 j6 G
8 Z& \! s+ E0 s6 G) P0 Z! [: f" y }
, f5 m. t8 ?6 z. Y}
$ i6 X! V& g5 M2 v+ e8 i
; h9 J# z& c; V) l1 g W/****************************************************************************/
) v) d- x ]1 ~( ^$ E& X/* */
0 ]& l5 e" c& O( P" Q2 [- a+ \/* PSC 初始化 */
( [ S% Z, V# Y _/* */- ?3 a6 h2 \0 D# o- P$ _ l6 J
/****************************************************************************/
$ l: }; v8 ~5 X( C% o7 c5 evoid PSCInit(void)
! H3 E# ^, c% `; M6 @% @ `{
$ `( P$ y% K J8 o" t // 对相应外设模块的使能也可以在 BootLoader 中完成
3 k: v1 @& [# a: s/ P" ? W // 使能 UART2 模块
2 \5 Q9 k, N+ l PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; @+ x# r! a2 R5 C) b
}
1 i, W0 s# J* A) ?, R( M: K7 `7 U. U3 P# G
/****************************************************************************/4 K- V8 z L5 y& ~4 X2 ~7 _
/* */( W! r4 D8 [. f- T3 D) A
/* GPIO 管脚复用配置 */
4 x0 _' {9 k6 z! D, ~/* */8 c( T1 P" ~" p( }5 t
/****************************************************************************/
3 J& `# q0 E$ J7 H8 ~void GPIOBankPinMuxSet(void)! K9 u% ~- c: k: q& _% l
{1 B; P4 ]# k6 T( F) Y3 ~% N
// UART2 禁用流控! Q7 p# B @9 U+ G* ^% }
UARTPinMuxSetup(2, FALSE); T6 }: ?, D* S/ U
}1 l6 Y' Y* |8 T3 N
8 }/ [ ^7 s$ m8 D6 [8 m
/****************************************************************************/3 {& M2 d, S! z; j) i/ Q. f
/* */
8 t, _, e3 z% ^# z. X/* ARM 中断初始化 */- J( N5 b/ o; H1 N" S
/* */& c5 R4 ?" M* t
/****************************************************************************/
0 \( x: y$ O5 {. D5 hvoid InterruptInit(void)6 M$ p0 n# ?" a2 M
{
4 L% n, Y4 F8 G9 P // 初始化 ARM 中断控制器
$ j' X1 D, Y+ O- F1 e8 a IntAINTCInit();1 w- {, P# j! M2 }- t/ ~3 A
" b* Z8 A+ ], s6 Z( _
// 使能 IRQ(CPSR)$ ^9 H3 N. `5 Y7 h. x
IntMasterIRQEnable();% N0 f, W& D& h3 J, W/ Z
8 M' B3 U& U& p' n* O
// 使能中断(AINTC GER)
3 q5 p" G, O( v IntGlobalEnable();
1 |+ q+ I" @& k( f9 N0 j, Y# V
: ~- {; M% l) R) |% T2 v+ ] // 使能中断(AINTC HIER)
) d3 H% t, s* W+ Y0 \4 y# n IntIRQEnable();
7 N: `" M9 @% C1 `* ~}* h2 {' N' O2 I7 T* t
/ _/ A6 j& q& {! h# |0 N, E7 K
/****************************************************************************/
f2 a2 F2 s s/* */3 x9 i2 S: [3 }. D" w* z( K! {3 z: B
/* UART 初始化 */* h4 g7 M3 z1 i n
/* */# r' N6 g' t( [' }4 u( U
/****************************************************************************/" i$ I% Q& E) p( R3 w7 \$ w
void UARTInit(void)
5 D) D" D& v8 T. D p{; K p0 O) @/ w
// 配置 UART2 参数- H0 _0 h3 l; r7 |3 z
// 波特率 115200 数据位 8 停止位 1 无校验位
0 P' Q; [# j& Y1 K" h6 U0 ?6 E UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
: @3 Y f- z1 A. H/ P UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
, w- C# G2 A8 K( t // 使能 UART2
1 H! P, N3 \" Z. y7 G2 s/ X* A UARTEnable(SOC_UART_2_REGS);6 B0 M/ P% V; Q9 {; N
& n7 U( V1 p2 F
// 使能接收 / 发送 FIFO$ O# i/ l @2 v% @
UARTFIFOEnable(SOC_UART_2_REGS);0 K; e2 M0 ?0 ]8 Y
6 r. G8 I0 ?9 z1 _" j
// 设置 FIFO 级别: V8 w/ m! ~6 t" x
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);8 q% |5 o5 Q! R P
}% u2 H+ F! O7 m$ G0 X* c
- {( B4 @' L, T/ [+ u/****************************************************************************/) l9 ^0 l" }# F8 v0 }
/* */
. {$ d; s/ q' L: V2 O& z6 d# D/* UART 中断初始化 */ s/ n s& \( L |1 Y
/* */
( b) G4 {+ ]5 a0 h( U9 M; h/****************************************************************************/9 H. n" i/ V0 z0 h% R1 C- P
void UARTInterruptInit(void)
# W2 l& u* q4 |+ }- x{' o5 I+ \, k! Y8 x
IntRegister(SYS_INT_UARTINT2, UARTIsr);$ i6 x, j/ L% I0 ?1 Z3 `
IntChannelSet(SYS_INT_UARTINT2, 2);6 A+ w& v) E# E# O- T8 C, C( e$ y# `
IntSystemEnable(SYS_INT_UARTINT2);, {/ C$ q7 b3 |7 {
, Q% ]& o/ l: l0 t // 使能中断" J5 U( f4 _3 X5 G. O4 R5 m
unsigned int intFlags = 0;
7 q: M/ M* D4 v* u8 T& N) G# H- e3 ~- R intFlags |= (UART_INT_LINE_STAT | \
5 h n3 Q K2 \6 h UART_INT_TX_EMPTY | \3 I: L! @5 ` [6 r g8 M
UART_INT_RXDATA_CTI);: A6 _9 }( d* l$ @* w6 f$ {
UARTIntEnable(SOC_UART_2_REGS, intFlags);
6 @3 M& { {9 o) x. ^}6 }$ H; T! n. R& z
: n' z: u: K: {2 F' h/****************************************************************************/; m4 Y1 p* `+ I4 o. u5 s
/* */
. t: E' X! b$ I% S% J( N/* UART 中断服务函数 */
- A h3 Y- V$ {$ q: v$ g$ F$ m/* */
- Y" T, T' C' {0 u9 k5 }/****************************************************************************/
2 S6 \6 x- N0 E+ v9 u1 f8 }( }void UARTIsr()3 G. G9 c3 A4 _) m5 }& \2 h
{7 B/ P8 x9 o* `$ `: t/ C1 ?+ U
static unsigned int length = sizeof(txArray); S5 G8 @+ F9 P& L+ ]
static unsigned int count = 0;
! G: l4 P8 t4 r- D" t unsigned char rxData = 0;8 X2 h, M3 [7 }! l6 k
unsigned int int_id = 0;# ~1 Y- O9 W4 k* e3 h
% U1 S/ h+ W A) @! s; _0 s
// 确定中断源9 U9 t3 A- g9 _& G
int_id = UARTIntStatus(SOC_UART_2_REGS);
. i1 `8 T9 p- b. n, S4 o- i$ F; y& l6 H% ~- c% @* ~- C
// 清除 UART2 系统中断0 [' D w9 c8 G/ s2 a" m
IntSystemStatusClear(SYS_INT_UARTINT2);
H( Q o% E' o3 e/ L$ X
3 \6 W& A( n; p1 q& N+ b9 O" A: p // 发送中断' G% M8 ]2 R$ I: l6 S2 z9 F' L
if(UART_INTID_TX_EMPTY == int_id)
4 Z. d- z) k( \3 _- }0 a! b {, D" P. l: W1 ^- q
if(0 < length)
9 v( F5 B8 ~5 y' }+ ~6 ?4 B" J {; g5 l7 }! {! ]. L) j
// 写一个字节到 THR
' k. w3 O7 `+ B( j: g UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 w* S C9 W" Q. w0 E
length--;; @0 b0 ]$ a6 q9 X5 |% ~
count++;
; V0 l: d6 F; A1 ? }
- q$ u+ I& ?9 v' ~! ` if(0 == length)
) y5 J! J$ a1 L* y3 }- ~' b8 O' _9 E {
7 h0 u7 [ J( Q4 v7 r" Q. r // 禁用发送中断
: w, f$ k ~2 i2 {% Q% B7 g UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 d( S ^: P: z$ m2 O }& e* C0 Q: q) t& ~6 X ~
}: U: y# N1 P9 ]
7 C6 N9 B) u" G" X5 J3 O: D // 接收中断
5 H* @2 D1 \3 q6 N if(UART_INTID_RX_DATA == int_id)
: A- ?) c, S5 r5 i2 u; T {3 ?. P: c+ p1 W7 ?7 W4 `$ Z
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
O* M5 Z, U- p) a
1 R1 F: C, H; R/ P2 N UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ t4 i7 l& O" ^' n0 j3 } }4 `* |6 }: ~6 s I
& Y Q( [7 R& N2 s3 F
// 接收错误
" B1 [. G/ @4 [8 v4 i& T, M. D if(UART_INTID_RX_LINE_STAT == int_id)' S# \. b3 I7 i4 J& ^
{! F4 e( t' ^' ^2 D
while(UARTRxErrorGet(SOC_UART_2_REGS))- e: G5 S2 v/ }* c7 A
{
0 r0 b+ s( y- `. k // 从 RBR 读一个字节
1 w9 M1 G' x) a/ X2 f* }; N UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 W1 C6 a* f5 r( z* j }
, A. S8 r+ k* y( D+ @ }; A! G/ t8 C& W4 k+ u
7 O( M# D5 b4 g! @# H6 N; Q/ e" O2 h i return;
, h$ G( C' W& V& w' O}% `" t& {1 `+ h4 D
|
|