|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。+ Z+ s8 E, G) q& Z1 k0 u3 l6 q
/ P+ {# [% G. r9 ~1 J8 @#include "TL138.h" // 创龙 TL138 开发板相关声明" D* s( I# Q2 J2 M: {
( p6 j& s/ n0 m3 s/ i" _#include "hw_types.h" // 宏命令, f% A$ r5 v! \) o& |% H/ `3 g
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
; B. r. F. s% h l" D8 c# Y O#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
/ d! U- s4 e: H5 q: b3 l% G% {/ E3 Y2 g) o$ {- }) t
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明/ j2 V4 q2 I3 {. c# B$ v
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
6 H0 ?2 q8 Y4 H2 j5 K2 I6 v0 g s#include "uart.h" // 通用异步串口宏及设备抽象层函数声明 P+ A& r1 e$ G3 O3 Y* c) `
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* g" ~4 \; j2 }- P8 o7 N
- c) y, T0 \! c, G4 X$ q# w
/****************************************************************************/
. r7 K2 M, u+ r. p# C; A* F/* */
% x5 x6 S# u" J5 z& d$ u/* 宏定义 */
/ k# W+ p/ c" B/* */
; k5 M* Y7 i U& n- _/****************************************************************************/8 q$ h' w6 C3 n- c
// 时钟+ _9 B# \5 ]) u; i) Y/ J% T
#define SYSCLK_1_FREQ (456000000)/ {2 w/ }- l1 m
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
( F' C1 I: N# n4 G, N! S#define UART_2_FREQ (SYSCLK_2_FREQ)' _5 U9 A) Q7 x' s) K" D( ~. a
! e2 p( m; q0 T* D2 S/****************************************************************************/1 q7 K# F7 s2 l: s0 H Y
/* */
+ g! y" f1 d/ j2 M: p% T/* 全局变量 */) `) B3 L) j1 v3 A! B$ s
/* */7 B+ u+ a- \: V$ {1 V& \
/****************************************************************************/
! e2 h! t3 f7 Q" [4 m$ U# @char txArray[] = "Tronlong UART2 Application......\n\r";) w) B" C' v p) }+ L
/ v7 X( {, P$ B+ W& m/****************************************************************************/
( Z! N5 [2 l; A5 V* u/* */
. G( p! K& T2 q4 c% }/* 函数声明 */
Z& y) H1 ]% O, G: v/* */
8 t# y) l* t& u( I* M4 A% Z' U/****************************************************************************/
2 X- P t* R1 L# P// 外设使能配置* N; T3 r5 o4 F6 p8 Y: [1 q
void PSCInit(void);
0 D1 x4 q2 F; p- ] F* O$ j% ?. x% Q
// GPIO 管脚复用配置
8 u) L* r- w1 Lvoid GPIOBankPinMuxSet();
* r. D4 S0 o/ w
& P5 k. I# F. l3 {5 k2 B// UART 初始化1 u/ G9 R6 F, K
void UARTInit(void);% B# L* w" ?: ^5 p3 a7 m( b
// ARM 中断初始化% c) C4 v3 u& A3 n" w$ S- A
void InterruptInit(void);3 H& p. c+ P( i9 v
// UART 中断初始化+ e$ D2 O+ ^# q, p' n0 i6 `
void UARTInterruptInit();
( D; K, z: {) \; W3 B0 v! Q// UART 中断服务函数6 f& g$ ?- B* p( u
void UARTIsr(void);5 S% L7 }: X5 Y1 M( ~
4 X2 \; q7 O' d9 X
/****************************************************************************/
0 Z Z9 _% ~2 G/* */( f- U; x- _0 w" P
/* 主函数 */! {) ^ j4 C) o( r
/* */
% O( N2 g: g P* a/****************************************************************************/* ]" P4 B, Z; i' M
int main(void)- P2 g( \4 d- ?* b: J. b) V& z% m0 E
{7 l, I, s0 U0 c6 O% b. L
// 外设使能配置
. s9 ~& c) P, y+ g _ PSCInit();) ]; g1 L8 C/ [3 s& c
3 |; [: Z7 v8 r" q7 i$ w
// GPIO 管脚复用配置
+ j% M2 w+ e( ?7 c3 I0 A1 n% v GPIOBankPinMuxSet();
1 p/ a" W7 k! J+ }! L# r; T3 Z* d; V7 w i; @8 B' V/ F
// ARM 中断初始化
) W7 V7 p; v! ~+ u InterruptInit();
. _, ?- P, x! q8 P% v0 j e5 Y( X2 L0 N4 U E9 p
// UART 初始化
: H L Z9 ]5 j, U4 _ UARTInit();
% C$ K5 ^- Z1 z5 k: F
- K4 E" F/ {8 K0 m- n: W2 S5 H // UART 中断初始化
' x+ q3 `+ O: j- L3 _3 Q UARTInterruptInit();3 O5 d! e% `7 K5 G `, {4 i
4 v8 E7 w* ^; k/ m6 [" e, s |
// 主循环' N2 B. \5 g1 G& v8 }
for(;;)
$ ?4 ~% `) r. C: ] {. y9 k; V& S* n
' c. I2 `+ u6 C+ ~* `& M0 H7 H }
3 @9 r" \, u8 C r6 F}
C" |4 ^6 C- k ?) `1 W( A* j C$ j: `: u4 b
/****************************************************************************/
) |4 B, H0 B. ?, _, z k/* */& }( i* K7 Q) v; Q( ~2 P9 Z
/* PSC 初始化 */
% Y5 X; [4 S1 f/* */
8 \* Y0 a" v$ t7 ^0 P/****************************************************************************/
- Y$ @* A; d t* w! \void PSCInit(void) O& K+ Z! v2 E4 `' v7 }
{/ {- {% \. H' i( p
// 对相应外设模块的使能也可以在 BootLoader 中完成4 \' s* `9 a8 C4 G7 x. M" e
// 使能 UART2 模块
: h4 T' o3 A/ F PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" ~% V, }5 e" ^9 z}- Z; o6 b, K& O1 t7 ^+ _
5 o1 m8 ^2 i) Q
/****************************************************************************/( a- B4 z7 H e! X n+ g
/* */" U. T+ K f" |" T# K, p
/* GPIO 管脚复用配置 */; q# _" f1 g. F4 S( U) p
/* */: B! @* A, D B+ B& ^
/****************************************************************************/
' q3 d+ r8 y% u# h8 R( q/ bvoid GPIOBankPinMuxSet(void)
+ w" ~+ Y/ y2 j- d+ ]5 c. S. H{
4 a0 x) s6 z4 C( U) w& T // UART2 禁用流控
, i1 P- V# x$ N UARTPinMuxSetup(2, FALSE);
8 w4 n" s: W& [ H* A2 H8 I7 |}
" V/ d2 A a* @0 C7 n2 u5 x+ J5 N4 c
/****************************************************************************/
& u( S$ l# Q8 B/* */
! ?- Z$ |2 r |% z6 A3 E/* ARM 中断初始化 */
' V; Y, ]4 s- t8 z- O/* */
; S5 c$ Y, Z& I* C! g( I N/****************************************************************************/
" H8 X. j0 p9 Yvoid InterruptInit(void)
0 a6 C+ {/ U' |- D4 g5 a. O& H3 j7 K{
* O2 f; [! B6 o. A' z( a( q // 初始化 ARM 中断控制器$ L! C+ C5 U1 P+ l$ W6 E
IntAINTCInit();4 ?' @. ?/ S5 Y* D7 n
& d& U, O+ i- f% X* @ // 使能 IRQ(CPSR)
9 H! ^: I/ A, @: w5 f0 D IntMasterIRQEnable();
8 {5 ^ I- o/ S3 ]" |+ O" l
1 u' q y; m/ E, |/ r& c& e, v- w // 使能中断(AINTC GER)9 m$ r Y( W9 c) H" N0 X4 U
IntGlobalEnable();
$ Z& C: K" O, G% f8 Q) `% M& x0 f8 |/ k7 o3 }2 @4 x. E
// 使能中断(AINTC HIER)
1 J+ j q: ~" l* H IntIRQEnable();$ i" l! q) ^# y* X, b: C7 B% N
}
" v5 R4 Y4 }+ t) r- Q' t( G& A' B
+ N/ b' @% s5 q6 d9 s1 G8 I5 @/****************************************************************************/
6 D/ p2 b3 E# J' C& \/* */
1 {! D) Z! H4 `3 G/* UART 初始化 */! o" O% p9 x& \" M) `
/* */' U2 _9 W/ [2 _' u1 h
/****************************************************************************/: ]# {# @" ^5 `
void UARTInit(void)- ]1 F/ R1 z7 h- b
{( {% ]! T9 x4 z$ y* r- ]
// 配置 UART2 参数- g2 s2 X! {# e) C/ A. g! C
// 波特率 115200 数据位 8 停止位 1 无校验位
8 s" C# I& h$ J. m# e* ] UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
" M/ f3 v* _2 t8 E. e UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; B1 X4 u: _& E ^% s8 [& f' [ // 使能 UART2
- e! N: ?3 T0 h. s, ] UARTEnable(SOC_UART_2_REGS);
- @# v2 F" y$ E8 _4 @
! B9 i0 ]% P1 z% R8 N // 使能接收 / 发送 FIFO6 C& ~( g) h+ d1 y4 U0 |+ e
UARTFIFOEnable(SOC_UART_2_REGS);
; K/ Z# e& m: ~ h2 \0 [* K d0 Y2 |7 q6 A* R3 D
// 设置 FIFO 级别
# w% K3 L5 y U- B Y1 w UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ J( v: Q/ D# J; n! P5 g' B}
) m( e) M) y- M: X( }. g- ~) }5 V2 B3 W6 F" f& i
/****************************************************************************/! l& A) x' a/ B) V3 b; n
/* */) t6 h, Q6 `/ L1 ~5 v
/* UART 中断初始化 */8 j) a% `: J0 O; f! ?% N
/* */
! Q8 ^7 c/ u# M) f$ b+ o* L/****************************************************************************/7 Z: z+ G( T: E( d
void UARTInterruptInit(void)
, F0 b) Y& G6 o! b; p{
3 M% U% j0 Z- X" [! e IntRegister(SYS_INT_UARTINT2, UARTIsr);. h7 ~" [: c1 `
IntChannelSet(SYS_INT_UARTINT2, 2);
4 @" p, |7 s9 d: e0 k IntSystemEnable(SYS_INT_UARTINT2);
$ Y' s( B7 C; l" r) ?
0 z' t& `, y# V- M // 使能中断 H2 V+ f! k/ o9 J. _9 m: a
unsigned int intFlags = 0;1 x8 X7 t: G0 _% ^ B/ C
intFlags |= (UART_INT_LINE_STAT | \+ s5 [7 K$ m, Y' K
UART_INT_TX_EMPTY | \1 H4 Q% r6 k+ C, o
UART_INT_RXDATA_CTI);$ k {+ p c4 [6 e, @9 i. `3 j
UARTIntEnable(SOC_UART_2_REGS, intFlags); F! t% D* L3 i' T1 ~" M7 ]( k- k
}
' r5 I+ \) r6 S, y0 e8 U- ^4 d
3 b* }* o% }+ k/****************************************************************************/
5 ^! b* c# r p1 f& F/* */1 D. M+ ^! f! d$ q+ @. L, I+ a
/* UART 中断服务函数 */) x( F7 {9 U$ k% l
/* */
, B1 @# B2 }+ T! {& p* {4 e/****************************************************************************/) R2 y7 l: P, M/ R8 Y. i4 N
void UARTIsr()
/ t8 X/ z3 w' g: T/ Q( _/ M5 s{
^& q! m! R5 n } static unsigned int length = sizeof(txArray);$ j( Q3 y' U1 n! W& {+ b6 }
static unsigned int count = 0;
8 O4 }. I4 K+ P; f1 T4 b* f unsigned char rxData = 0;
8 z. U. z( d$ a: a! T" n e unsigned int int_id = 0;
2 v$ _7 i# `# u2 {: A! K9 N) m; N! }$ L" W
// 确定中断源* N( D& S# c5 T5 x- q5 z8 O
int_id = UARTIntStatus(SOC_UART_2_REGS);4 j I$ S# B4 I3 t, R# c; m; i
1 I7 o8 L8 o6 r3 ]8 Q // 清除 UART2 系统中断8 I5 K$ t, k2 s
IntSystemStatusClear(SYS_INT_UARTINT2);5 P: E( t( H/ {- Q- C
( Q3 r, C4 L, r0 R2 v' U {
// 发送中断$ b! C1 t9 ?: b( Q3 m8 |
if(UART_INTID_TX_EMPTY == int_id). ^, T& i: [+ T7 t2 V# l1 |
{4 _9 C. B' J4 s
if(0 < length)4 ^5 G( u3 ~& k/ P! }+ n
{
M& s$ H) a4 a- @; l* e // 写一个字节到 THR4 @/ Q3 a7 s! b+ w
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);6 p" c; X4 X1 k9 J! x# `
length--;$ ?( d! a' O j8 [+ I
count++;
+ p7 K0 U+ k( A }- [7 b6 H6 d+ s9 t6 _
if(0 == length)
8 e8 N6 d0 z( p% N# \ g* B1 o {
& h7 R) P, e+ d6 a5 w4 { // 禁用发送中断+ {$ u; b$ L. ^1 S0 A9 {
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);, N _0 x8 J0 r1 c2 h, G, r; D
}9 }% B! t5 V, B+ {% ?* }1 z
}$ D6 _, z) G+ j2 E5 h
( X5 `+ @% s3 D0 V) e3 ]; [) |, A
// 接收中断! g0 g9 C5 K. d6 ?
if(UART_INTID_RX_DATA == int_id)6 h8 ?3 \& g, Z. o5 S2 t
{
; V& `9 M9 O+ M0 o7 C% b5 u rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
; d9 H I0 F( P$ S6 R p# W, ]7 t8 e) s
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 v1 C2 D+ a) d3 [
}7 L5 p6 E9 [$ v% z, y" \" ^- |
: a% N$ n+ o! ]6 ]
// 接收错误$ J. D. B/ D. G& D
if(UART_INTID_RX_LINE_STAT == int_id)
( K, T" q* f/ E6 v( y Q6 ] {
j! F! A! p5 ?$ h$ _ while(UARTRxErrorGet(SOC_UART_2_REGS))
$ G6 N! {8 N- R+ K6 M' V! A$ O' _. o {
' Q8 d4 p* U6 V/ m/ P: } // 从 RBR 读一个字节
; H4 Y1 k( `+ ^9 B' i7 K. p UARTCharGetNonBlocking(SOC_UART_2_REGS); X1 ]( O7 _: a
}
! J& a* Q8 f, r9 S v( v: `3 ` }) S; W4 i9 A4 n8 Z& l# H2 j
% E# N7 s# ]" S9 @" D% s6 e! b$ }
return;
& n, {' n9 ?' H" K}
; i4 U b! w2 n5 y6 ^, C |
|