|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。; W/ z7 A2 I k/ ^% N3 A
v3 @6 f* w8 X9 h. b% Y" K
#include "TL138.h" // 创龙 TL138 开发板相关声明
: G2 x* H- L5 B& w9 W6 U7 g: t7 [/ ]
#include "hw_types.h" // 宏命令" M4 y6 Z; R% @7 z
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器- B' T1 M+ m7 J0 {: W0 Q, E! e
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器. L" q& g8 ~. x b
! K* V6 M/ x7 s. b m. D7 O#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明0 U- l' Z$ D" T6 m) [1 P% z. c$ I
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
$ `: u3 N8 x& ^+ C- b0 B( ^#include "uart.h" // 通用异步串口宏及设备抽象层函数声明% G" p# a, g- B$ N! o E
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* U4 z# S. t+ B4 R6 B8 g, I
8 y; \, y) G; X5 |. A: t
/****************************************************************************/
* |, d3 G' }# u/* */1 U3 t7 ]: E/ y' j( n! Q3 X
/* 宏定义 */
: |, ^, b1 t X9 b# V$ `/* */
7 }) c8 }0 ?1 Z: z( C }( }. ~/****************************************************************************/
3 R5 x$ Q) v" N& |& Z8 S// 时钟6 ?4 }: G1 q% S% D
#define SYSCLK_1_FREQ (456000000)
, F- S6 H7 i1 q% P2 h#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
$ e+ x6 ^# z2 G#define UART_2_FREQ (SYSCLK_2_FREQ). c% B, V% q: K/ Q
8 q9 ` P- s& {' [/****************************************************************************/0 D" X. A" j- Q2 P; H9 V
/* */: T+ K7 v$ W1 x! ?$ }0 W- G( s
/* 全局变量 */' A$ Y7 _6 z; G! Q+ d+ h
/* *// }9 ^7 V% ^9 h/ K" S6 C' M
/****************************************************************************/9 y" x3 x7 d `% p) h
char txArray[] = "Tronlong UART2 Application......\n\r";
5 u% R6 m. N% q8 [/ l( L# Z6 ~# F z: u' m+ Z
/****************************************************************************/8 L0 t( C6 C4 j8 ~
/* */7 C7 c2 F. `- O
/* 函数声明 */
6 m" r+ E% u+ ?4 s3 ?5 R9 C/* */. e* u# i9 T+ P3 ^8 V' Y& c
/****************************************************************************/
. m8 d$ \0 i: L- E3 t" h// 外设使能配置
$ M5 e, L% F( Y* S1 Qvoid PSCInit(void);0 y) ^ @8 |; N9 k
! \1 S: k& e) g! D& d, Q: A
// GPIO 管脚复用配置6 d. C: F* z) @+ e' F/ s% {* [& v
void GPIOBankPinMuxSet();
# f ^% s i3 H0 L% |+ Q7 Z" H8 E" G, u& ~( B7 K
// UART 初始化4 O* U( d- U8 d8 `& ?$ `3 }2 ]
void UARTInit(void);
4 _1 f% t4 z* Y' n// ARM 中断初始化
1 |' Z7 o5 ?$ ^. N/ rvoid InterruptInit(void);! i0 m0 @/ a3 G
// UART 中断初始化
* y+ h, q8 L6 [" v3 Hvoid UARTInterruptInit();! t" V" z7 c$ m+ d a! G$ ~! ?
// UART 中断服务函数# A1 X e+ L: S% F7 [; |- W6 q
void UARTIsr(void);% i, e, g3 V- P+ ?$ M
/ y# L3 M4 _0 q# ]
/****************************************************************************/
% {3 c0 n4 \4 M* _% A! i/* */
" V% o- L/ h: Q$ \2 o; s& O5 e/* 主函数 */" C) Z+ f! _' R0 o) Q5 `. N
/* */
5 P$ E% Q- J- f8 f/****************************************************************************/
o) O2 ]1 {. ?+ n7 K0 Fint main(void)2 P* K$ |& \9 y4 G1 }% _
{
* E! w; K6 { K4 I/ s' k // 外设使能配置
, Q9 V! @( I6 u" U9 d" M, h PSCInit();) _9 b, s# r- m6 h1 L; L" J* J
- B N( p# F- `' A4 T6 n* p // GPIO 管脚复用配置& ^" y3 ^) k6 W+ @6 v2 k' b
GPIOBankPinMuxSet();4 G- h8 o4 w; b( p& C
7 {2 R& m! |( V7 J7 ^' U/ X% ?* m( o+ T
// ARM 中断初始化8 S; ?$ ]" T7 s" G/ n; S
InterruptInit();
3 z7 y4 d% @$ P
7 t6 z- p( M0 g4 M1 S& ]4 t3 {0 L // UART 初始化; c {' {; o# P3 b3 ]* }9 _
UARTInit();" H2 j% ]- Y1 o: a. |3 d
7 @# F' [. K i& Y/ C, d# ?$ M
// UART 中断初始化. |2 p8 a) `8 `% L# E# N: U4 x6 q; Y
UARTInterruptInit();
& ^. c7 j _( c) Q; F" `5 x5 J! G$ n! \8 Q! U1 b9 X9 \. d9 ?$ S
// 主循环/ f& d% t; l3 ]
for(;;)
5 s' S' R' M% X5 A' H9 O. ~ {
9 H/ l1 K0 A$ f/ P+ @2 i1 a8 [
1 W/ G2 g- j0 L* U- G4 D% i; h }; r0 D' F* d, P
}' g/ G! a' E7 h+ B" H$ B. g6 Q
1 e2 t& o; L2 ]$ P" F/****************************************************************************/: ^+ h$ j/ d, i8 p) L
/* */
+ s3 X) ~4 C: u: i) ^# k Y2 e: n4 y7 ~/* PSC 初始化 */
$ P# b9 U0 \% }3 Y/* */' [; c4 n5 B6 G3 B1 u8 h
/****************************************************************************/
& \0 r6 ?1 ^& t3 j, ] \( _( Yvoid PSCInit(void)3 I/ Y+ r* X9 m( j
{
: z. e: ^3 B9 j0 z, }) d# d) @ // 对相应外设模块的使能也可以在 BootLoader 中完成
5 g& L. J) {. O$ z9 L1 |! ^ // 使能 UART2 模块( r; Q% z: i# B5 y& F* A
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);- _( W9 B1 V: x$ W/ L
}
; t7 z c; h2 t3 k/ ]5 d* i' T: h& D2 Q8 E
/****************************************************************************/
: R2 g U$ Z2 |2 ?" g$ ]" }0 y' r# o& B/* */
* U& x1 `6 Q6 ~3 c, S& b/* GPIO 管脚复用配置 */) C! V9 t: K, Q
/* */8 d& Y& P) S7 }! b2 w0 X
/****************************************************************************/1 h, \1 Q1 L1 \2 c$ F% w/ b
void GPIOBankPinMuxSet(void)5 S- S" o/ T% l2 ~! m
{
9 [5 G9 p9 x3 g- t/ y% ` // UART2 禁用流控
7 T7 X& v. X1 T( ]# ?9 M* t9 w UARTPinMuxSetup(2, FALSE);
" D7 u- A3 K: L+ |2 l9 ^}6 R3 f3 X5 n0 B' m; ^
9 Z* @0 I3 P; |1 [. J
/****************************************************************************/2 @& B5 X$ O$ X& L" q; c0 p$ Q
/* */ K" t7 s5 U5 o5 Z
/* ARM 中断初始化 */4 k' E, k) F$ @2 `
/* */5 r _1 x( z! X! q/ t$ H
/****************************************************************************/
6 U7 W+ H* Z# t% q) Lvoid InterruptInit(void)+ K1 e- b# l# \- _' r- ^
{9 }! n0 v" g8 e( q7 _7 G5 R8 m0 e
// 初始化 ARM 中断控制器- l0 H1 h$ m' R( @1 o9 r1 P5 Q
IntAINTCInit();" {( Q' u. z, i* @9 x
, R+ _: ^" u; f9 c // 使能 IRQ(CPSR)
; [9 v3 |4 O! f0 ?1 S# ^! r IntMasterIRQEnable();
: N+ V& m% P: W
& e' _& H7 b1 W. H3 Y7 s // 使能中断(AINTC GER)
, @6 V: b( |* ~ IntGlobalEnable();3 V& @0 s0 V$ Q5 y' }
5 r7 I+ p6 ?0 s; Y // 使能中断(AINTC HIER)# }7 v" b7 z& s7 ]: ^
IntIRQEnable();
+ Y' O) N Z7 f* ?5 K}
" N% V9 @$ i. k
. `& ^2 s8 `' Y, i/****************************************************************************/9 p+ x7 J: V( W/ a0 l* P
/* */0 _ a5 M* p: m/ X, u
/* UART 初始化 */
& T& J" K! A5 Y$ i/* */8 a/ n+ k9 N: d4 b( u9 z- G- I
/****************************************************************************/
8 d/ }7 f0 X7 |5 e0 lvoid UARTInit(void)
4 r, {) j9 \2 d$ v6 b9 n/ [- c) F9 q8 `6 _{5 \3 [3 q/ p! G3 f* N& s5 Y
// 配置 UART2 参数1 |' P2 Q, @' g8 e0 S$ ^5 S
// 波特率 115200 数据位 8 停止位 1 无校验位5 W2 ~- W- {4 o! H0 [8 F6 ]
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ o$ N* z! R: ^& a$ E$ [3 z8 D+ O UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' y- M! U5 k: B9 b4 Y // 使能 UART2
# m! O/ U' W, j4 A) \( d UARTEnable(SOC_UART_2_REGS);
. b; r1 C, ?+ f: N
3 h- ?$ q ?: E' T) {' \9 u$ P // 使能接收 / 发送 FIFO
' K/ p' N3 L# H( g! q UARTFIFOEnable(SOC_UART_2_REGS);' c# O+ Q# r9 q: F
# H9 q3 e% B! `3 f' T, k
// 设置 FIFO 级别
- D! `6 l$ B, m" A3 [, { UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);& s7 u1 X: Q- W1 ?( u( Y( U) m% p
}7 B" h8 |- A& {0 v3 Q; E: [% W
5 K5 \8 j; u3 S+ e, V! x' b: l/****************************************************************************/2 |2 z+ U# @% f6 c
/* */& G( g" L S7 M, b
/* UART 中断初始化 */; q1 ]) D/ i$ |$ N' ^
/* */5 y9 s* w, v/ L3 `# N' I9 Z4 \- v
/****************************************************************************/
9 n3 h0 O: S9 S! S8 J' e3 w+ ]void UARTInterruptInit(void)
6 ]! o2 }0 }+ i& x* ^ |. U1 [{
! u. p! S, z5 U IntRegister(SYS_INT_UARTINT2, UARTIsr);0 C+ R/ X( O2 v, G6 u; ]
IntChannelSet(SYS_INT_UARTINT2, 2);
) b* E9 l& {; R IntSystemEnable(SYS_INT_UARTINT2);! ?; J. A6 b. E( m
- I: i& l8 W' j
// 使能中断0 H; _8 J4 d' I& Z+ c
unsigned int intFlags = 0;9 `) ^# |& q, w( {+ L
intFlags |= (UART_INT_LINE_STAT | \
6 E( J- Q+ M X) E4 j* | UART_INT_TX_EMPTY | \' ^' U$ K* [+ u p9 u2 v) H8 [, F
UART_INT_RXDATA_CTI);
9 N( Q; n+ W% U3 A( C0 x, x; P" M8 m UARTIntEnable(SOC_UART_2_REGS, intFlags);9 `* {2 T+ S4 K( w
}5 M$ B4 F4 q9 \
. U9 K0 U* {4 x7 x. U+ Q4 k% t# r% M/****************************************************************************/0 F& Q7 B, z" n/ y
/* */
0 |& ^8 j8 H# j& G& o1 m/* UART 中断服务函数 */! C* Z0 s3 t) q3 i" ^; g: o4 G
/* */
, P, H4 r- A+ N9 ] w/****************************************************************************/8 f- Q7 ?6 h" Q
void UARTIsr(), F% }0 q& F9 d+ V/ Z
{
, E+ t! z3 p, \" }7 J/ z* ?) V static unsigned int length = sizeof(txArray);
& O* [3 t" X' ]8 X6 n static unsigned int count = 0;
' F# ?' r" B. m, ]" Q unsigned char rxData = 0;4 I7 p: V" ~+ N9 w- }
unsigned int int_id = 0;$ o4 l: ]' W, Y% T5 {: p I3 m! ]
$ g2 `- a0 Z! f5 A // 确定中断源2 Z% c X' @0 L; I! t. G" v
int_id = UARTIntStatus(SOC_UART_2_REGS);
8 e1 D; ?8 W: M' e6 v8 x) u( N. k$ U' F7 @7 W0 b0 Q% Y& X1 y
// 清除 UART2 系统中断& M2 \/ u7 R$ r- x3 M
IntSystemStatusClear(SYS_INT_UARTINT2);
) q3 K* O4 G2 t( [
6 e( `) U6 Z$ _- I& x$ F // 发送中断
, w- t7 R" h0 P( X$ m0 v! H if(UART_INTID_TX_EMPTY == int_id)3 m# L! V/ f' u' y0 X. {
{
- A: m3 X/ r% a" ~ if(0 < length)6 \' x5 y. H) P- e, l
{
( y, _8 l3 T4 N2 B0 E8 X7 A // 写一个字节到 THR
: Q! M* ~, ]+ R3 T8 ^) _1 I UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);* _: ~3 B& j" D. _3 c% c
length--;; C0 h' K$ @1 @
count++;
- P- s) H; {3 z: B ?% ` }* E* f" H E, }8 P. k
if(0 == length)
9 c0 \- H, J. k. C% V0 X {
* r, ]" [& u' q1 l' K- j7 R% c- X // 禁用发送中断' e3 Z X; n2 q' x$ W1 ^
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
+ g0 T( g( ?8 N2 T$ m1 D5 f }
, N6 `) y) q/ _% u; x6 ^6 b( K }
4 u* S7 Y. V4 n9 F3 g: S
8 a+ `9 |/ n# T, s // 接收中断0 }# @ P7 }) ^1 Y, ~" }& B
if(UART_INTID_RX_DATA == int_id)
5 p8 E0 B2 a) V! }/ W- ~ {
4 l+ A# }: i( k! D- T' A+ x% ?; x rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 w | D: M1 D+ M; e8 ?7 K3 M* @+ @+ v- z' l' H7 h
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);3 V' R/ q$ C1 `. k4 J
}
6 n' D# O" _9 V$ |$ E7 ?# L( n3 l, u$ ]3 U5 a! T
// 接收错误: P& T: |0 Y: @+ q
if(UART_INTID_RX_LINE_STAT == int_id)3 n* P! w E6 J' |, ?/ r
{- v; b# M: A( \* n
while(UARTRxErrorGet(SOC_UART_2_REGS))/ x1 l6 _: t% O& a$ y
{
9 |: M9 l; x' T! H& D, }; y // 从 RBR 读一个字节
E3 Y) V! j# W ]& \4 A1 f; t UARTCharGetNonBlocking(SOC_UART_2_REGS);
, Q* \( s9 i# q' k) G' k }
) N6 [* P0 X0 L+ ~ }
# b8 f' ?$ ^: l+ t* U+ B2 d
# ^+ F: S6 E) w, k% i' w; V) ]1 O return;
+ r. [9 \2 }' R* s6 L( j* t: U}
# X0 c& p+ C4 u |
|