|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
. c0 [ y9 S1 `9 X, S; J3 u+ Y; v. ~ G1 H+ A1 n+ H. L
#include "TL138.h" // 创龙 TL138 开发板相关声明) y, J/ M+ x, f/ S
+ G6 X1 D# u$ G: P( s+ _" e+ G
#include "hw_types.h" // 宏命令9 ]" w. f/ ?8 X5 {
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器: H/ R. \4 _7 ]( l! I
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器& t9 L) W& h& F7 g, {: W
) E3 Z, y( @9 e- R9 m" D; o4 J8 Y! E
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
' u1 T4 j- W, o Q#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明; B! [: P4 l; p! n2 w* ]
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
" j9 m1 s: b- ?$ k0 {6 q#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
% U" x4 Z" n$ j' u+ \4 l& ^+ \/ _# e0 w% c, k! o0 F, `+ R/ F
/****************************************************************************/
/ ^) o) x2 l( S$ p/* */: |; N( e. j r z
/* 宏定义 *// q* U1 M5 x" I% y" V6 M
/* */
- O; Q/ u4 b2 W* }: P% k7 x/****************************************************************************/
2 x; M& V# f+ ]4 b// 时钟
7 R+ y) y! p* s' ~6 l#define SYSCLK_1_FREQ (456000000): x# z6 e5 r4 s/ F% q
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
. G1 ]! p5 j5 Q#define UART_2_FREQ (SYSCLK_2_FREQ)' r5 n7 `6 f3 X* o& P3 Q
$ s; D/ k, s3 u3 P; O: S
/****************************************************************************/
$ ` K; i$ K1 g. {. i/* */
3 t$ s; j2 l) V! |' V/* 全局变量 */! p1 F3 v4 h, v8 V" b$ j
/* */( K% p$ C+ I% |" N7 T/ f I
/****************************************************************************/
% k( P. r1 }8 @* O) _char txArray[] = "Tronlong UART2 Application......\n\r";
5 I3 N4 X3 |, X% R
6 {: z% c' ?& B# L/****************************************************************************/' R0 a/ [9 S( V8 o
/* */$ H9 P4 Q) u$ B
/* 函数声明 */
" ]) Z8 l) i# }$ J/* */
6 A# v- q3 e# l9 O5 q% u' ?/****************************************************************************/
6 t% h1 J. |( m3 d2 b// 外设使能配置, \* Z& [4 s% v3 ~% G n0 R# Q
void PSCInit(void);
7 R; H: i ?1 r# b0 r* w9 h! ^# L5 p, _, G
// GPIO 管脚复用配置8 \1 m$ L& N/ f W
void GPIOBankPinMuxSet();% [$ B- u3 ?! G1 b8 A; T. q5 u
( e4 P* u7 F! h- `; c
// UART 初始化. }( B7 A* p/ ]. B# g$ M
void UARTInit(void); O9 d+ v: t9 P2 N0 h
// ARM 中断初始化3 U3 x7 w" K. [7 o7 t3 c! D
void InterruptInit(void);7 y: W7 }) D3 E
// UART 中断初始化
5 a/ Q4 x0 b* t& n( evoid UARTInterruptInit();
2 X- |( P$ R$ m: q6 f// UART 中断服务函数
5 N: y; o% O9 h: A( f) u- r1 vvoid UARTIsr(void);6 [# z8 j! d9 B6 f; l x a
+ w, v! V9 Z9 ?7 }* F/****************************************************************************/# d3 c" U* Y3 m
/* */
8 G6 J/ ]% D7 o4 X9 A/* 主函数 */" f/ O/ x, h M4 p8 Z
/* */
2 ] o' H/ U1 Z. E2 h3 m( O6 L/****************************************************************************/
8 d F1 `3 ~1 z! l2 \; B& nint main(void)1 X: j" S W- b0 T$ W% {8 p
{
8 W/ G' X5 j1 o6 {+ x- K // 外设使能配置
8 `+ b2 x& W" ]4 i" ~5 X PSCInit();
2 M0 T5 T% k9 Q6 V2 d2 ?5 f( @
& l3 Q* o5 a( k" L! j$ Q // GPIO 管脚复用配置) G9 Q/ z, O/ T+ _
GPIOBankPinMuxSet();
4 U8 a* Y, p$ h8 I/ U4 N7 G
4 [: n$ g5 \0 c1 ^& r" |) T // ARM 中断初始化
7 Z+ o6 D4 }# l% q' L* ~! z InterruptInit();0 V5 g4 Z- I7 w3 O
* `) E" O- S# q! {% y" U) X // UART 初始化
' ` v1 b; G, c% W0 v UARTInit();" R$ X' C- ` `% x2 n
2 J0 k- ?& Z, Z4 s
// UART 中断初始化
E' B# ?: k1 W& F( K3 m; |, M) v UARTInterruptInit();
8 q9 J+ h; L: S; C9 ~) K V
$ z+ O( Q/ D: s' T& k8 m // 主循环# Z8 g; M- B0 a; z
for(;;)
) y- W2 z. b3 B" ^ {
* y* K4 o1 v, ]- V# j8 D0 v) f! y2 O) W j( k: |5 ^
}
) I1 I6 F5 |$ |+ z}) K' m6 R" b/ D. o: U( l
5 R9 P3 Z6 E+ k
/****************************************************************************/( p0 m6 j* R" o1 ~
/* */& R( ^, ~" f7 P( q
/* PSC 初始化 */. C G, \+ W7 N/ t1 t, l
/* */! L" L9 G7 d0 I) P
/****************************************************************************/: J8 f6 ]4 p- }7 }7 p1 S$ ^3 \
void PSCInit(void)
& q2 ?/ l; l/ P) G o9 [0 N# Q1 T{. E7 y+ t& ^+ }+ S1 n
// 对相应外设模块的使能也可以在 BootLoader 中完成/ J2 f% g+ n' U% ^8 Q6 k% H' U$ P$ G
// 使能 UART2 模块, R* L- W. J5 [2 }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* z- k9 t) n# [+ N0 u: ]' l) B
}
( k4 H1 X" @ e" ]
8 e, ? _! Y( q/****************************************************************************/
* l& X; K v" V1 g. y/* */
/ Z, q$ ]7 r* L: O" h. D/* GPIO 管脚复用配置 */* d" W ]0 O2 R# Y! P! a" K, V
/* */3 F: i3 }% C( ]* P% ^' c
/****************************************************************************/1 A, `; \1 `4 O# s
void GPIOBankPinMuxSet(void)
1 o% ?2 \4 C& _8 h+ F+ q4 x4 X& S{3 x+ Z' x# S1 b8 {' J
// UART2 禁用流控) ~; b9 B. P$ u* o1 v
UARTPinMuxSetup(2, FALSE);/ @2 `0 a. S. l! c G
}
# [( j, ?9 I0 l! w y: U: p
4 t6 J# n, R( m: v, O/****************************************************************************/6 _+ p: Q% z+ E" F l6 C- I: _( p
/* *// v4 |7 ]2 E+ y9 ~! [1 C
/* ARM 中断初始化 */6 `+ J# r2 n% [" u2 p8 ]( M
/* */- m7 Q' U+ N" c$ j: d5 T7 @0 L
/****************************************************************************/* q7 x4 E: [! ~
void InterruptInit(void)
% Q) C6 l3 b+ L* Q{
O: s, q# v. p& ? // 初始化 ARM 中断控制器
' z) `8 A- h2 X& O IntAINTCInit();9 k8 c9 F/ R# m2 d' _
# y) A, s" Y, G6 r% ]: e // 使能 IRQ(CPSR)
9 s1 t2 h; F1 i. K IntMasterIRQEnable();$ T8 |' Q! ]; t, L
* B1 X4 E+ k2 } Y+ U7 j // 使能中断(AINTC GER)
/ T/ d# X% \! I2 U. J0 ~# y IntGlobalEnable();' d( B8 `! z5 w/ z# a9 @) U
`! b5 \/ v3 O) n/ t) F
// 使能中断(AINTC HIER)( U6 l& W! A0 e/ Y- @- I
IntIRQEnable();
8 I) D4 {0 f. {& w4 [# F7 O7 k}
- M% P& d6 w, i N) ^
6 ?% W5 `$ h4 R- E5 }1 T/****************************************************************************/
& N7 ]* r8 e$ Y5 P `! U. X9 I/* */- @' l! n0 z9 t; p5 L5 Z1 f+ T
/* UART 初始化 *// T' B( z" ~& I/ M
/* */
7 G' U" ~9 S6 _( ~* q; D- j( h o8 H/****************************************************************************/8 P* o0 H# }- {3 o5 H! s
void UARTInit(void)6 B( T+ Q! {( b$ W L0 O
{9 N0 k3 d6 Y. G9 m5 R2 f
// 配置 UART2 参数
2 T0 ^/ H+ i* F // 波特率 115200 数据位 8 停止位 1 无校验位) E2 t( F* [1 } t
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
/ V% x/ X! @ n' ]7 i UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% N0 P4 }: \6 ~/ F
// 使能 UART2: E# R8 d9 i& m
UARTEnable(SOC_UART_2_REGS);
. r1 ?8 A5 t( Q+ A' T' n: P" P/ v! \5 j! q5 o! j" q
// 使能接收 / 发送 FIFO
! _; I2 R/ v. o% L# m, q' ] UARTFIFOEnable(SOC_UART_2_REGS);3 T2 R# n! I9 M' S3 }3 f7 J) u
! t! W' P" D, K7 X: Y
// 设置 FIFO 级别
( M$ N% U- u& s UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, l! m3 d8 w) O0 H}
3 k& G, m; B* h& T) |. a4 g2 D6 Z# C( K) m# X
/****************************************************************************/* r' w7 V' ?+ L$ Q- T [
/* */4 T c& R0 h1 ?0 Y
/* UART 中断初始化 */0 C3 q5 O0 s ~6 x4 _" l
/* */5 U3 y* x4 F8 S' E& p2 ]
/****************************************************************************/
) a* ~1 l. d. dvoid UARTInterruptInit(void)" [* h' `2 u' i1 G1 I
{: e, l4 @7 _( N0 | B, _
IntRegister(SYS_INT_UARTINT2, UARTIsr);( z r v) ] R+ I* k# I/ j
IntChannelSet(SYS_INT_UARTINT2, 2);
@* m# k7 r1 n IntSystemEnable(SYS_INT_UARTINT2);
$ B, Y9 \- ~/ N0 w
) `" O' ]1 v; _ // 使能中断
: c5 s9 K9 S& E9 A( g unsigned int intFlags = 0;
. H9 `$ R4 J" \' V9 c intFlags |= (UART_INT_LINE_STAT | \9 U2 y( r. v& H1 N1 g( w( t
UART_INT_TX_EMPTY | \
! t, ?2 H6 u; M UART_INT_RXDATA_CTI);
3 C& b/ B' `% j. X; K; [ UARTIntEnable(SOC_UART_2_REGS, intFlags);; J( T) ~' L# V
}5 h% T' ~) ], Y) c
/ p" G' r# u9 k Z0 _7 k& C; ^% {
/****************************************************************************/3 p) s1 m7 A( @) u/ X$ n8 ^5 c- f. d
/* */
. e& r: Q. T( G5 p8 _4 K- [: j/* UART 中断服务函数 */
4 k* y+ @! N1 U$ y9 i! Z/* */- }5 _1 S4 y7 u! d8 Z
/****************************************************************************/# q# n* l7 i- [1 R* L* X/ C0 T$ a8 e: s
void UARTIsr()
& z+ E4 x! @6 B1 h: y{
6 ^4 w( P$ X) Z' h5 x static unsigned int length = sizeof(txArray);2 }/ `4 s& V0 n4 g4 o. c
static unsigned int count = 0;
$ P$ c3 G8 k0 ~) h* V unsigned char rxData = 0;
2 d5 [( S' O9 d unsigned int int_id = 0;& Z6 i; _7 ?/ ^# m
! q6 \" H0 a, ^' b4 i" I
// 确定中断源
. y: W; Y5 `. W9 v1 J' ` int_id = UARTIntStatus(SOC_UART_2_REGS);
! U0 m8 T% Z7 Y2 P* f# {- T$ }7 }, C0 S# D
// 清除 UART2 系统中断
& [9 o: M' k5 b4 A5 s; \ IntSystemStatusClear(SYS_INT_UARTINT2);8 V* c% E* H9 x+ P/ n" Y( y% u* R
; k6 @ c# [8 v& U // 发送中断
9 b# g! \0 G/ c# k/ G2 T if(UART_INTID_TX_EMPTY == int_id)# @- |9 Y4 c; A! E
{4 c& o6 k( }8 o
if(0 < length)
" q6 g9 w. A0 e: u/ s' } {
2 n% g r2 j3 w7 u // 写一个字节到 THR
7 [( }- U+ E: k$ M+ { UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" b% k6 e2 @1 ]( ]* R& y! h$ p
length--;9 j0 p4 P0 W) B" T
count++;
! A' A% \' ?- G+ g }
$ L) F- u: H) B+ T y if(0 == length)
U9 ~# _3 q, `* E* R6 H! v& { {' L& x- _9 v9 u$ e& C4 F( s
// 禁用发送中断
/ q* L% P Y4 \2 _+ ?8 Z+ { UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* h( b G" Q' K. T
}
8 S: {4 f5 U: O8 O2 ? }
0 w" r7 n# p& ~( S7 F7 X
* P2 \* i% M, A1 x3 G // 接收中断
/ `$ }1 b" w1 c0 w2 c( p4 U if(UART_INTID_RX_DATA == int_id)
$ k7 v N# d8 L {
- r8 m2 i) b1 y- r/ ^& a- A rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
$ R- M3 l& t! c9 J1 X8 P7 G1 `/ b$ e2 s- K' V
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
. W1 m" o* c+ J2 x4 ?; w# [% t }0 h, }# V. [8 I6 b
$ F& O3 r( A/ T: G // 接收错误
) o/ o6 `" k+ Z7 _) i( [3 q if(UART_INTID_RX_LINE_STAT == int_id)
r) w& L/ } j3 C1 ^% S {- k2 d# K% k+ Z( J3 W
while(UARTRxErrorGet(SOC_UART_2_REGS))( q+ K+ e# O5 M% G2 K2 E
{3 r6 T: Y) S/ n; K
// 从 RBR 读一个字节
" P2 s8 _; Z8 k6 k UARTCharGetNonBlocking(SOC_UART_2_REGS);
% w# d; h% t! R9 c4 ~- V }8 g, K, n0 m' Z" d4 h8 ~0 N5 S' w
}
" j( z' r" U$ B" I 6 i9 q+ w* Y. p3 w- }
return;* r! |" W& g0 V. d' I
}+ q# x# b! c. M- [8 U
|
|