|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。1 G% V2 X) @/ Z+ U9 L( T' l
+ Z9 J, A4 F5 U0 S+ t#include "TL138.h" // 创龙 TL138 开发板相关声明
: K/ _/ \" Z; N3 Y& P1 O. W; \: g$ J
#include "hw_types.h" // 宏命令
+ X9 R6 I/ f- y- T#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
& n8 P! r' g2 k& x. ` \) s" z#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
$ y/ y* C# i8 l8 A8 l7 ]* u
- i9 i% i- _" s: {5 e4 \#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
% P% R1 U( ]6 h+ p4 W/ z+ ~) ?#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明. x: ]7 g* _" L- c, O
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
0 G9 z. [- [/ I% Z) B v#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; R, C6 n8 x) h0 z; z* h( G U! B) ], w0 M: h
/****************************************************************************/: W5 _, m' u6 w5 M* [
/* */+ D, x Z8 B- j$ S1 Y1 j3 T/ I; m' l+ t
/* 宏定义 */
$ q3 T- W( } v2 t/* */
! p3 q4 a- Z2 u; ^4 b: l/****************************************************************************/
# N3 s1 w0 ]/ [) b8 @// 时钟) ^9 L- h2 e7 t& m6 A/ J0 \
#define SYSCLK_1_FREQ (456000000)) w Z0 d! G3 C! |- B& S
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
" n3 Z g& {' l6 C$ J2 I#define UART_2_FREQ (SYSCLK_2_FREQ)! t) |" B7 y- z- L0 G
0 ]7 a& Y) T; k# ~& p/****************************************************************************/2 j. D+ J: n( G* f4 q" `
/* */# D m' O4 b$ ]: d
/* 全局变量 */
/ U* @, [$ x& [% V% U( @5 R) ^/* */
2 [+ C9 d& b+ S3 u$ ~* e/****************************************************************************/. Y5 g( G9 _' Z( i4 }
char txArray[] = "Tronlong UART2 Application......\n\r";
( o6 e# c" `3 l1 J6 A- X5 |- X: l* ?- R2 `5 }" ^4 F; K
/****************************************************************************/% J. B/ Q2 ]& \2 u* D" d
/* */0 l2 s) w+ w; p% _
/* 函数声明 */0 `; b1 u" ^) h+ J3 v7 ^7 |- A
/* */7 i T. s" R( i' N i: W
/****************************************************************************/1 J, B" g( L$ i& A" t9 b
// 外设使能配置
. D( Q, Y# Y+ C9 K" E# ]& mvoid PSCInit(void);9 p3 s% n4 n2 z* n0 ]9 W
* {5 E+ u' ~2 J# L! w6 H$ \
// GPIO 管脚复用配置8 b1 ~" H8 k% y8 T# [
void GPIOBankPinMuxSet();
( s; K! E5 P3 N& y( O+ D0 v0 l5 f9 h [+ G5 T5 P
// UART 初始化! e, Z8 b. h: ?4 w* L' P; {0 g
void UARTInit(void);1 y9 i- y* F6 P
// ARM 中断初始化# c& ]1 {1 y; L, n: ]+ X
void InterruptInit(void);
- g; @" B+ Z- D& C" X Q: D- c/ c// UART 中断初始化
9 P6 `" f4 L7 ]# |void UARTInterruptInit();
7 { K3 E. X4 a4 o9 F5 S, l( o$ f// UART 中断服务函数
w7 m, _, f* x9 G. ?: Z. Tvoid UARTIsr(void);
, G) ~& ?. f/ s) u
6 X! }5 x; s, l6 C0 H/ I5 C/****************************************************************************/) @3 j: b1 a4 ~/ W8 l7 i
/* */$ s/ A+ Z% d8 t
/* 主函数 */
; P' E2 p1 E5 W1 X9 s3 e6 E3 z/* */# S( [9 y/ z h, Z
/****************************************************************************/" Q% ^. h1 n. _1 ^8 f8 m
int main(void)8 b1 M( ~$ x3 {, A
{* a) q, o/ }) m; R8 s
// 外设使能配置" A2 Z% ?. b* y- k- O6 y; T0 B
PSCInit();
- j8 k# }- c9 U5 i6 Z6 K5 y" R
+ M. V4 M9 E, l // GPIO 管脚复用配置
' p7 k" E6 U7 p/ u& a6 q GPIOBankPinMuxSet();
0 A# {) H) r) l" }- l
+ I9 |' c* L( t) q. u // ARM 中断初始化" Y" ~% Y5 w- b+ p! Z6 ~6 ]
InterruptInit();
9 i1 o; b! ?, n& u8 B2 j. F4 ~" O" l3 `& d9 d9 j; J6 |/ d/ Y0 q
// UART 初始化
) r6 t9 i* {; [0 c* f9 [. W" X UARTInit();
) I& F* C" C4 s, B
5 k& j) a3 x4 C! R // UART 中断初始化
' [& x' X. y) o9 X R/ G/ m UARTInterruptInit();
; U/ l8 t" u5 M; y
9 O! Q0 ?% i; {. c3 b5 V/ e2 d- u // 主循环6 x$ i0 M" O3 J2 G: O8 K$ O
for(;;)- ^# e% k) V$ D% N5 g# ]
{
+ ]! Y, S; {0 Z4 o) e9 J+ l+ q2 X2 G. M1 T
}+ W: c" A- x3 @# b' f' L
}2 A+ g" i4 d4 s8 ?! P4 r2 k+ S2 I
: X8 ]& ]: I8 q; {5 Q# i5 w
/****************************************************************************// D8 l$ v/ a- f3 j; e
/* */
- E4 o/ T8 A/ T3 h# l( N" K, Z, b/* PSC 初始化 */
# \- E2 s" N3 ` f) W. A6 E, X/* */
5 H! A8 _. q5 ^4 a+ K- I/****************************************************************************/
/ a. ~2 V: E+ G. d6 w8 H4 `- V8 ~void PSCInit(void)
. Q7 w: k$ l/ L, N( |4 W{6 |) N. L% i. X
// 对相应外设模块的使能也可以在 BootLoader 中完成8 D% Z/ v1 [4 A% S8 E+ R
// 使能 UART2 模块! Q* h8 c# \% ?; R3 T! S: y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 V7 j- C6 B" ]! B Y: F3 z
}$ @) `7 @! Y6 Y4 e7 D
- U3 }( _! i+ i( Z
/****************************************************************************/
5 _4 u. j) r/ J* M, m/* */3 \: P8 L2 f6 q! L3 ^ `4 K, ]
/* GPIO 管脚复用配置 */
1 B4 k7 g3 [/ ~7 p9 P/* */
! D' F t4 W4 t$ }/****************************************************************************/* m! p# D% d' v
void GPIOBankPinMuxSet(void)" G3 v: U N3 ^6 M
{
8 C! o6 [8 M, ^9 y% W* X7 V // UART2 禁用流控' z. o+ D: @5 ?" h. L
UARTPinMuxSetup(2, FALSE);0 F$ F& X$ B1 B4 Z0 t
}
$ [$ ~2 H" n7 P) H8 P" ?' L8 c6 V1 ]3 _3 T: O3 r0 F
/****************************************************************************/1 R N$ F) L- M9 ^" ~1 |
/* */3 E( x/ n. C7 s v
/* ARM 中断初始化 */7 R3 ^, v1 ? ?+ ? N$ N
/* */- ~" E2 @. K7 t& I: O7 z1 B; Z1 \
/****************************************************************************/5 G- z2 J; j* j8 t1 P8 D* W" o3 V
void InterruptInit(void)$ n' ^( v5 v7 h( ~, q0 c2 R% S
{0 Y2 p* ^. o, f
// 初始化 ARM 中断控制器& e% d2 N. c6 A" r m) ?) F
IntAINTCInit();
$ F p O+ d2 l8 _( R
+ A/ a% V' J9 }; p/ D% x/ I1 G // 使能 IRQ(CPSR). r1 n; v7 D/ y2 I0 m$ s ]/ {
IntMasterIRQEnable();
7 J! y/ \1 Y( k# y# I( k9 u$ V* [. _: D3 Q9 ^
// 使能中断(AINTC GER)
9 a2 x3 g- a+ P: G* i1 e3 X IntGlobalEnable();- u4 d- P0 h; l8 j
. D( X; T% p" |; \
// 使能中断(AINTC HIER)
# _& F; f0 \, d* O( K: ^' Q IntIRQEnable();+ B$ `. G& L# i. u9 `" @' D$ [
}
: Q# s9 h j# t& x$ t; E8 N/ A9 T5 g
/****************************************************************************/
6 o* f+ O; X2 g6 W- R- U4 ?( h% L/* */
$ ~+ m: N0 m: Z/ |/ `4 L/* UART 初始化 */
: D P6 n7 R$ W" u; L; a/* */0 v2 s0 `8 ~9 G2 X9 O8 M3 ]" Y
/****************************************************************************/
/ ^" D0 \+ W8 {! Gvoid UARTInit(void), P6 [) a" e& v. _8 t8 z
{8 @1 n2 D+ d$ b _) T4 z
// 配置 UART2 参数$ {2 _# n8 N6 {9 e9 {# y
// 波特率 115200 数据位 8 停止位 1 无校验位8 O. V) b; E+ R. b$ R
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200," n: n5 d- C9 @9 a" @% U
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; ~7 _$ \' N* g0 i4 F // 使能 UART2
' L, Z$ o. h; a2 g8 c UARTEnable(SOC_UART_2_REGS);: h9 C9 D3 I t5 l
9 _& U. }( {, @
// 使能接收 / 发送 FIFO. l# w8 j |, c, Y
UARTFIFOEnable(SOC_UART_2_REGS);0 q9 t/ `/ A% P {5 b, W0 f6 w
: M7 Y' v& {0 F% N3 s // 设置 FIFO 级别% n* A0 M/ Y; H6 Y
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
& j) n3 q/ V. w& x6 o}
( T3 k9 v$ O( y9 [2 R
, D( E: T" z1 O# G+ x) s9 x/****************************************************************************/2 o8 a; I9 @) g. N
/* */
, r$ T' ^; k# M4 Z% @/* UART 中断初始化 */
6 k( ~- y1 g# B% C' ]/* */
/ z; {- X- b, H" L' U [& }/****************************************************************************/. B/ F0 n0 w* `' C0 H$ _' A+ [4 f
void UARTInterruptInit(void)
# I4 H+ D' h" b" b7 ?{
# ]) m1 L/ i( q7 i f5 q& w IntRegister(SYS_INT_UARTINT2, UARTIsr);
# m O9 l0 V9 F0 w6 b2 O- e% l IntChannelSet(SYS_INT_UARTINT2, 2);
8 |2 `+ M' j, ?7 v/ o5 P3 l5 e IntSystemEnable(SYS_INT_UARTINT2);
0 I, U$ W6 U" f. U& k1 s+ T/ y! O. ?1 R
9 }: L2 [1 D, K& B5 l. u ~$ f // 使能中断
2 t+ a/ A* H @* J$ { unsigned int intFlags = 0;
' ]1 u% ]+ h0 f5 ?( e intFlags |= (UART_INT_LINE_STAT | \! J1 l! V9 F# T( M( G
UART_INT_TX_EMPTY | \
. U8 h3 x/ H! ]+ t9 w UART_INT_RXDATA_CTI);: w0 V9 I8 m4 J
UARTIntEnable(SOC_UART_2_REGS, intFlags);
) W) y) j3 f5 \6 ` W}
. s& d. }8 I' \ N" w0 `! V# ]2 ~( Q
/****************************************************************************/
+ y: N) n5 E! Z, [/* */5 s8 M+ d. G& r. A0 O1 p
/* UART 中断服务函数 */) \$ a' W1 w" L
/* */
4 H# B2 C# o k/****************************************************************************/
) L! ~- C4 @- S* Rvoid UARTIsr()
: {/ f/ u- e" A* e( }: {- I{
1 c M' f3 t$ o( `0 z& s static unsigned int length = sizeof(txArray);
- G& h8 Y% l4 j; ]9 V static unsigned int count = 0;
! r9 d8 A5 U: K unsigned char rxData = 0;" Y1 D5 ~- I2 ?" l
unsigned int int_id = 0;1 k" i( l( c; p( U
# C; u$ G3 \) a1 K2 U9 @ // 确定中断源- N- ]( j, ]. U- [0 k
int_id = UARTIntStatus(SOC_UART_2_REGS);
- K4 a& n8 ` i$ a! [5 u
1 Q: N4 o8 [0 |; U // 清除 UART2 系统中断
8 x4 k# N1 [8 Z& ]. t! M3 d IntSystemStatusClear(SYS_INT_UARTINT2);
" C! X) ]. `. h8 ?& M% A% y+ I7 y
1 t0 A2 x! Z! ?) i# Y // 发送中断
0 A3 ], p. `! j: |% j8 P# | if(UART_INTID_TX_EMPTY == int_id)/ B& G$ M+ K, e* u
{# G% C( z8 V/ U+ Z7 b1 P! u
if(0 < length)) k V7 k. M& E, m9 ^( ^
{: ~% j$ G4 e& L8 {: l& j
// 写一个字节到 THR4 b* d3 C6 X% H. x- X$ E/ \( r8 K
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: O4 P6 z+ ?- U7 g
length--;
- t0 R1 {; i- {6 @ V8 N count++;
) f& F% r9 l/ R1 C/ N' q6 Q) D }
/ e$ K# v: C- y9 q4 t% S if(0 == length)% ~: E2 z$ E S" K0 O, m' X
{
8 J4 [ L# y w( b. g- J2 z+ q4 t // 禁用发送中断4 ?) u1 L# O8 @& Y+ K8 M: P
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ M- G( U+ x6 e0 i0 @
}5 K- u( d' g. r0 B
}
4 [- u0 N1 x" q$ _- N* i: Q. E7 c& G' B$ ?/ L" W* ]
// 接收中断
- M' Z$ L6 x \: Z9 O/ k/ a0 B if(UART_INTID_RX_DATA == int_id)6 r! d( W$ [0 Y
{3 t$ U9 h2 H3 L$ @4 Y2 k. i
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 g# l7 C2 d6 @1 g
/ _/ R8 ~/ D( K. a/ X" D D
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
' ~5 S3 @, |8 f! @2 J v! O }
* v$ z4 C9 T7 Q$ Y, a/ @; x1 F: j# G5 f9 e2 G2 i
// 接收错误/ ?: f1 B0 u) f0 W' j
if(UART_INTID_RX_LINE_STAT == int_id)
2 `' L. i2 {: _+ q% {- T {& v/ d) G% O$ G4 l* E9 D+ D
while(UARTRxErrorGet(SOC_UART_2_REGS))
+ E/ I! Z$ I" s1 ~- u! U* A {
& @" \9 |5 h% }: ?) i) L // 从 RBR 读一个字节
, D7 k c8 p% l& m7 ~+ t; B4 c/ y UARTCharGetNonBlocking(SOC_UART_2_REGS);
9 u& H# \) `1 T4 F }
% W* Q4 g# W2 U9 B0 O0 l }8 }; j9 T9 X4 i% U5 |$ G" W# o
& ?3 y" T( U" D, E$ L
return;
" q! x' I+ _2 K" G}4 z6 U6 ~2 z7 A" J5 Z$ N4 O" }/ ~
|
|