|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
& V9 ^2 x& `* i- x m4 {
) O8 j' K4 E1 W, F#include "TL138.h" // 创龙 TL138 开发板相关声明( \& _: N' R" e! ~3 T& ^% d; x
8 k% l/ ^$ t& X R! F3 f
#include "hw_types.h" // 宏命令: K1 @2 _0 v9 h( O
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器+ x X5 P$ j& Z) |: }' L7 r! T
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
" y( q& G2 w1 U- B, k1 f7 y# ~6 E7 t6 g, t1 ?
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
9 S" H, f' o& ^' _#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明9 r3 u% o9 s( ?5 b8 t
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
1 L( N& ?! l9 S; C+ z#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义 p' g' ]# {% R- z
- z. x x; R7 z' n$ d3 m/****************************************************************************/
" a5 _6 ^0 ?1 V) p/* */: N2 ` K# h% h8 n2 L3 b
/* 宏定义 */
' d& x) t; ]. Q8 [: P# {/* */; X7 j8 }+ V, x. Z6 p2 g
/****************************************************************************/& T1 }" o; `, T! S C" ?7 q) u
// 时钟. k( r; B; Y: Z* |
#define SYSCLK_1_FREQ (456000000)* A( a) g4 b8 A
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)8 {! w7 G: j: x8 o7 O
#define UART_2_FREQ (SYSCLK_2_FREQ)
% |, P: U$ g1 ^8 d3 m! V4 G$ Y3 `7 D# U# |
/****************************************************************************/5 _1 q# k0 c2 y+ t. ]0 v
/* */
" R- G6 `3 L" x* Y1 Y/* 全局变量 */
2 c, @; U( P8 b/ R4 w/* */
/ L' E( h1 o5 Y* s3 l/****************************************************************************/
. e! u# Z0 v; ?' H$ Echar txArray[] = "Tronlong UART2 Application......\n\r";% {0 _2 K5 h! w
2 Q, w% f$ h) x, d# }1 O- ~/****************************************************************************/0 C: {) g5 H; N {) y3 H
/* */) g: B; T8 Y- c4 I Y
/* 函数声明 */
5 `' X/ \3 t7 P; ~/* */1 C& |+ p* e. U& C7 H3 V$ O0 J
/****************************************************************************/
7 a. Q# s) j6 v9 M! S// 外设使能配置
$ w; O5 u6 F" |! fvoid PSCInit(void);; c$ |* x2 A7 j6 E: x" \
+ u7 u0 t% ?9 I
// GPIO 管脚复用配置' h1 i' T/ x1 C# y8 x. E1 E
void GPIOBankPinMuxSet();
$ K- E& L% \# G- j0 D: B/ L" D# t
/ T4 q# ^4 ]* @1 e0 S5 a// UART 初始化
% g4 n8 P [& e) T! W; h: Qvoid UARTInit(void);
8 ~) }+ _; V6 r+ \4 j3 L// ARM 中断初始化0 m D3 G2 d) y- \( Z! f
void InterruptInit(void);
" T! ^" c- r/ N8 r// UART 中断初始化$ W: ^ [* |) v$ S+ v0 K7 U
void UARTInterruptInit();
/ p9 y/ R; _6 {- C) y) x// UART 中断服务函数
8 [; x/ h) Y. L; N. Z) l7 ovoid UARTIsr(void);9 |4 o7 t/ s+ {6 A$ q _8 l
9 p7 P: m2 @# D1 Z2 G- @' n7 \/****************************************************************************/* \9 J, `- j# _$ x& ^
/* */0 ^2 g" T8 X5 a, V; k
/* 主函数 */0 T. J+ @1 g2 L# P
/* */
" ]2 l, p* G; l4 _3 F/****************************************************************************/
$ O" p N2 v( A: Pint main(void)$ w& [% _- j, X
{% n( w2 |: x6 S3 J9 G" L
// 外设使能配置% H2 ?5 S6 h7 J" n$ U$ X
PSCInit();
- c8 }6 j, P s$ r7 z 1 ^2 V. g0 C! r s
// GPIO 管脚复用配置
$ f( h: B) B j$ Y GPIOBankPinMuxSet();! U" K; i, i7 N( h* [" |! i) `
0 T# i7 X( z( e8 z* J6 y5 u: {
// ARM 中断初始化4 }# [1 F: c2 t* O+ k
InterruptInit();& M" R( w( o# i7 d v" N
- I* u! E, y6 Y- e& f7 e( j2 f
// UART 初始化
3 i6 ]+ @6 _* p# f5 T9 D3 Z UARTInit();5 e2 E4 { E9 N5 |& ^ t# O
- ^2 S0 u% |: |% y. g' [* e0 m. u4 \
// UART 中断初始化4 Y `) L$ A( L: G
UARTInterruptInit();
) n/ G ~! _, `& X+ S, P) r+ g/ k$ l
// 主循环* C& N/ L. e- t2 @5 I
for(;;)
- f# _$ n4 h# @2 t& j {
0 \# {2 u% H o( K0 N$ ~$ Q
/ b3 Z* Q1 Q8 o( L. A! N- x }
6 l# |! T) G6 I4 b' k: E}
( f: b1 O9 u' ]4 Q. D4 L
( \8 Q8 n9 |4 P5 r( {4 n/****************************************************************************/9 B+ N3 x$ | w
/* *// @; q! Q- Y8 B o. G
/* PSC 初始化 */" l! ?' \9 W8 V" v8 s
/* */1 ^6 b2 h. n: ] A. n' B- N; e
/****************************************************************************// c$ B. w- D3 M* m4 [9 m7 I
void PSCInit(void)
' M7 A3 k) F- k{
1 P6 d# S* Z, y% D // 对相应外设模块的使能也可以在 BootLoader 中完成
* S0 O% }# j' A: Q8 {3 S // 使能 UART2 模块% x: y7 v4 V& U Q; o% d; j
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 O, v; f7 k. a7 ~}, g1 ^" x& J3 F* {8 B9 F
: N O9 V3 c; {! @$ a; R/****************************************************************************/8 N; {- z, I8 ]/ A5 _
/* */. a2 k$ q+ a- c3 }- Y; m( z% o
/* GPIO 管脚复用配置 */
! o P, t, m# E3 c& D3 g/* */
# u6 g& e3 C: w/****************************************************************************/
1 M& h* I7 w% \! J! J8 f$ k7 qvoid GPIOBankPinMuxSet(void)
# j* ~1 F3 Y' o{
% L) h" M3 r4 [: r4 K // UART2 禁用流控
/ ?5 z0 P0 l, Y. J7 x UARTPinMuxSetup(2, FALSE);
5 u# K$ m: F/ O2 A+ Z/ {2 U}
+ p* y0 n. k/ s: z- R: a+ H$ E2 r% I9 a* `" }" j
/****************************************************************************/
# _" O/ g) m( G$ A8 `/* */
2 E9 U7 Y) G, { L8 d1 d/* ARM 中断初始化 */
# _ p2 A; a5 {6 Z/* */
. K. }9 t! H, O/****************************************************************************/' L2 f% L& v( T8 {: x* e1 Z$ F! v- w
void InterruptInit(void)" p/ g- |' d) i' I/ O5 j
{
' O+ m' v2 x5 n1 g' I# p // 初始化 ARM 中断控制器' U" ^$ s# Z% }' N4 G. s1 b
IntAINTCInit();8 L7 g$ V( x' ~/ T
! O* C# `# a0 F% v4 M
// 使能 IRQ(CPSR)+ f/ P% u p a
IntMasterIRQEnable();6 S8 Q2 A- g) X2 A# k3 m
E+ b9 V8 g& g, _) w9 l1 h // 使能中断(AINTC GER)3 O" O# V# W" R! l1 M( S1 P
IntGlobalEnable();
6 ]6 w0 q$ h, a+ [/ r7 Z! F% F5 _* F7 W
// 使能中断(AINTC HIER)
* `- ` O( l0 ?) l% z IntIRQEnable();
! r) l% b' ^3 J: Q g5 [' T}
7 _5 a& e8 @2 ^( S1 R
$ F; W8 q0 h7 _# \/****************************************************************************/
* _( o" W1 F4 ^& E% E8 J; e/* */0 X# U# W( c, I8 ~9 L' M, Y% a8 K1 h
/* UART 初始化 */, g" S$ m$ w3 f$ j% v [
/* */
" J% l0 A- F7 V/****************************************************************************/$ D c: H9 _7 e% h
void UARTInit(void)
" _; g/ Y7 M+ }% T) ~8 ~{
) k+ z6 ]+ J' \; W, g) z // 配置 UART2 参数
4 t4 @8 g3 |4 o+ w8 A // 波特率 115200 数据位 8 停止位 1 无校验位/ U- y, X! p! a" _3 k
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,! t4 F/ ?6 z- `. Z
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 m0 X: B' v( L" G // 使能 UART28 q1 `2 E' |3 t! n4 Y% u
UARTEnable(SOC_UART_2_REGS);
# N: A+ g x9 E/ h% _; h! _( R- _3 x- x8 f, O7 z: A
// 使能接收 / 发送 FIFO! x1 s+ u/ }! l6 c ]3 d" E1 l
UARTFIFOEnable(SOC_UART_2_REGS);
& J- ]$ Q3 l' Y2 o3 D l6 a$ I. ?0 M
6 r o: e% g d( R) T // 设置 FIFO 级别
* Z/ k/ U" g2 K+ b UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);' a Y- c# o* Y9 q% }5 x
}
$ l2 D( k9 _& X& z8 A$ J% J# E0 I; S% N" n
/****************************************************************************/
( G) L+ D9 x* y+ D/* */
! S Y) W( G7 T) v; M/* UART 中断初始化 */. W/ V. M, _0 q* J0 u' J
/* */0 V% S! [, e' J
/****************************************************************************/7 q! q6 H0 S& r1 q! @4 K" [
void UARTInterruptInit(void)
9 \. Z2 w3 @9 h9 c{
% F! m3 s% U( h; j IntRegister(SYS_INT_UARTINT2, UARTIsr);
1 K0 k9 q. q) H6 H) z IntChannelSet(SYS_INT_UARTINT2, 2);
9 f" ]0 _: I* |6 X1 o IntSystemEnable(SYS_INT_UARTINT2);9 _2 h) D u9 t9 u" `2 Y
. m( K' W1 I3 m& e5 l" G // 使能中断
& ?) U8 C" y' ?; t) N unsigned int intFlags = 0;
' H' A* b- K" u% L* H6 r intFlags |= (UART_INT_LINE_STAT | \
% W6 l6 u$ ~0 L/ m UART_INT_TX_EMPTY | \
4 @' R6 K- j, E1 b$ ^* a, k UART_INT_RXDATA_CTI);
( m# |# E' W, t- H UARTIntEnable(SOC_UART_2_REGS, intFlags);
% @3 M- A$ `6 [* X& }. }}
- @5 E3 B- ?5 f. P- Z* n
; @+ a+ Y6 `) ]. x* w) f/****************************************************************************/
5 l0 G7 l; |4 g. ]: e& Z/* */- c4 z' m! S8 u- Q3 ?
/* UART 中断服务函数 */
/ y9 s/ u5 L* n/ o/* */
1 U( q2 b& b" j9 w: ?/****************************************************************************/: L. D. S, i& f' L
void UARTIsr()
9 o2 z& X6 @" O; t{* H5 z `; s' c6 c; X% Q
static unsigned int length = sizeof(txArray);: J; G7 j1 E7 t0 [) t
static unsigned int count = 0;
& _' \# i, \. F/ V- ~ unsigned char rxData = 0;/ c6 b5 t3 i& W
unsigned int int_id = 0;
! P, L# g m2 N+ G9 @$ t2 Z& i6 X' c. Q8 ~ c
// 确定中断源
. F6 T# V. k% T int_id = UARTIntStatus(SOC_UART_2_REGS);
+ L. [0 e M: L5 n. w' |0 y: G C% l; G4 z% {" l: ^
// 清除 UART2 系统中断2 r; N Z/ L! ]% N* {* [8 h
IntSystemStatusClear(SYS_INT_UARTINT2);
$ m8 ~4 p" ~. T) s) a& ^3 F8 d N. W( ]& O" c" a0 b9 ]
// 发送中断
- `( y }9 b- l' O I3 A if(UART_INTID_TX_EMPTY == int_id)
& F0 V1 G% J& p* C {
7 b# [1 u8 i$ A if(0 < length), V9 G/ P4 n, N" |+ Z( C1 }
{2 a, |$ q* o5 d
// 写一个字节到 THR" G4 D" i3 {* f
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 @( V8 d1 l2 [6 W, q2 P$ [' s
length--;
1 ?9 F! d t0 k. i5 p9 T t; U count++;& r% \- ?6 s0 Y3 t; Y6 B7 @
}# z3 l/ H3 A# ^+ k$ e
if(0 == length)( d- ?( f& U$ s: H6 }
{ ]" X9 ]! Q# Q) H( Q
// 禁用发送中断
2 _9 Z2 u( f. x+ w1 V* P UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
9 K( F, D7 n1 h p$ r }2 i5 s* X6 k% m7 t1 \$ F
}* N& e S9 S7 K' A: L9 t
! L6 o8 O" @# i" ^( r$ ?4 y
// 接收中断
- A8 N- E4 q* W5 V: k, g if(UART_INTID_RX_DATA == int_id)9 v6 P, m ]' ~, d. G
{
9 i+ ]0 p/ W: a3 x rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);/ Y0 r( W, F" D( X+ |- ?
0 S7 b2 Z3 c* U8 F" D6 W4 X- D
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);+ ^. K' H9 ]0 I# x
}8 A4 b2 X5 K' @- T( L* g& |. J
3 |) x L$ Z) S // 接收错误
! u# ~, ?' H1 C' c/ ^ if(UART_INTID_RX_LINE_STAT == int_id)
8 v, n [8 S& v4 v3 a5 v* g {: M$ ^6 h! E C6 T" c
while(UARTRxErrorGet(SOC_UART_2_REGS))- L5 e; H9 N% {! B" L
{
: [! E$ O, r$ e; y. z% M) B% I6 { // 从 RBR 读一个字节
& p \ E( K$ b# O9 S% R+ L UARTCharGetNonBlocking(SOC_UART_2_REGS);5 p" Y1 N7 z. v' `# C/ [
}
+ O6 R+ }7 }1 ~( D }1 B0 Q. Z& O. V6 u1 k$ V3 P$ R
5 o: j R/ y: X+ M/ a+ B: \ return;
! c% a+ T; ^" S% A) ?}
+ U" _1 }, s6 v" l3 Y. p: Y3 I |
|