|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: v- J( Z6 \) u/ `- c3 q
. z1 S9 _( U; A ?( p
#include "TL138.h" // 创龙 TL138 开发板相关声明
2 g2 c" \/ {$ ~$ z; b2 b4 ?8 w7 k' P( Z% V! t: Z! P) Y
#include "hw_types.h" // 宏命令
( @$ U9 x4 `. n- I7 j7 a#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器- i! b9 W2 ? A8 _7 W+ q. k" d
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器* [) ~! g2 A3 W& a
1 h) H1 f$ P9 Z- `/ y W: z# c' P
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明+ y& f" v5 u+ u- H
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明5 r2 e+ @, j, Q. U9 B' U
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明" z# Y2 Z3 j% k. s$ B, }
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
4 W$ F& u8 E: R; Z3 k9 K* P% @6 A; B p1 C1 |$ y$ c, z2 ~
/****************************************************************************/' V! d- _* I( i T P
/* */7 ^# P Q4 ~; q1 K
/* 宏定义 */5 Q, Y& q9 N3 w# P/ c' J
/* */ t* x+ J2 v. N! F
/****************************************************************************/
5 Z) h" e) }0 w# Q// 时钟
' k' J' d1 N" G' `1 @#define SYSCLK_1_FREQ (456000000)5 |/ C2 d3 U* {
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)/ w& Z: B8 s: t4 L
#define UART_2_FREQ (SYSCLK_2_FREQ)
" Y( g+ s* L. J
" L3 u- Y* t* B) R9 i/****************************************************************************/
4 |# k- G. o( y$ k# y \/* */+ n# m+ N3 S( b+ [: p3 a. | X T
/* 全局变量 */3 Z9 ]1 b. G9 L" l- i: J6 \
/* */ g; m' W3 _" H6 M
/****************************************************************************/
1 e1 z3 A) I; ^2 Ychar txArray[] = "Tronlong UART2 Application......\n\r";
* s$ K% v4 y: H) P$ e$ C8 e4 n$ q$ s# X0 Q$ r/ y' Y
/****************************************************************************/
6 A1 `; l& h5 l, I( [) J2 ]/* */# N9 [: p* |. D* y
/* 函数声明 */
. T/ L% ~1 A+ q+ B/ G$ q( \$ U7 D/* */
6 I7 s& v( M( y+ X/****************************************************************************/1 J4 U5 v9 q8 \+ a) J; d5 I0 D# k' y
// 外设使能配置0 V* |2 G8 f; \/ v) N) ^
void PSCInit(void);' g* n% T8 ~. Y8 \+ \3 z/ z
5 }( c+ H$ Z. w// GPIO 管脚复用配置! A( B' G4 j! A+ K
void GPIOBankPinMuxSet();+ u) V. ]6 K! B) ]! G3 E E% ^
3 E# i N0 d B5 Z/ r+ i g4 n// UART 初始化2 J5 c# Q: |) y) a, a5 K$ Y+ K
void UARTInit(void);
7 }6 J2 ~+ s8 R// ARM 中断初始化% z1 i# ?0 H% N7 Q) q* M' s+ F$ t
void InterruptInit(void);
! d4 x- Z) I6 F, u& v// UART 中断初始化1 U( a3 p" ?5 n
void UARTInterruptInit();
3 ]* [: E% Q" v3 n. p1 S: j" S// UART 中断服务函数
3 `5 T- f( K: s& e& b" t* Evoid UARTIsr(void);0 i0 X. A- e8 A: F ?
; u5 M& u( d5 D$ c/****************************************************************************/+ k9 j, X& k3 p
/* */
2 q" o* r f2 f1 k2 \& R+ N1 `, v/* 主函数 */) h% l; T6 w" p
/* */$ _' P- y4 i% J; C, N( b. v9 M
/****************************************************************************/
6 X+ E- e, ~. W4 Uint main(void)
) K T1 f$ X" c( |% \{
; @+ t9 w6 C# j. @8 ]" k/ e // 外设使能配置3 C s: k5 \0 l5 R
PSCInit();' Q" ?7 t4 e7 h. _/ B$ e
% i _% O4 ^9 Q/ }
// GPIO 管脚复用配置
( a& a9 r1 x6 a! S GPIOBankPinMuxSet();4 h4 t @' O% U3 a' c/ x( k3 P
- m9 }5 @$ Q R3 b9 }4 C$ I4 R
// ARM 中断初始化
. z% B; k k" m3 J% n& I$ p; S& h1 X InterruptInit();
4 ^" G2 g$ H) k W/ j a
* N8 E# P0 w2 P) Q; z0 q // UART 初始化
8 U7 g! N8 i4 n7 S9 | UARTInit();( M4 @* {5 Z0 I2 w
" l, x" E: ^0 z' ?' r/ j // UART 中断初始化0 }& n0 A& q( a- D
UARTInterruptInit();
. l& ?. d4 m' j7 C. R% }( Y6 X. I" }& A( _: P' B g
// 主循环, }8 ^. c8 H- V1 ^
for(;;)/ I) ^% @- \# F( e
{- ]0 G/ m) B8 w8 j
9 G1 Q1 y3 l! Y8 f
}
6 \7 k( N$ J9 u4 _- w% K+ P4 S}! n* i$ a4 ] m4 y
- b# `, @8 Z5 |) m0 L6 {' J2 E
/****************************************************************************/, i6 ]/ s1 X- ~; \) \
/* */
$ f/ M3 u. n5 @: {4 x2 }/* PSC 初始化 */! n" B4 @7 T2 P& D
/* */, \- j% }; F x
/****************************************************************************/$ j/ ^1 r2 o5 k4 J5 w
void PSCInit(void)/ k' r& ~2 e) v8 O
{+ v! Q Y* z' |! t2 m, ~
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 U7 d% W+ ~ F1 i6 b, o7 z // 使能 UART2 模块
& }) B6 {! ?; |, A. _7 _ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
^) H: W" S' R P9 o w. {# `) A}* a" @* e2 ?# y6 P
3 D" t& p9 b1 J$ a
/****************************************************************************/
- t- [3 A( n4 {2 R2 c6 _8 I: u3 {/* */
- H2 Q' |$ O/ Y8 U8 L6 T/* GPIO 管脚复用配置 */
! H+ s( s' _3 }, z) [7 T/* */
8 t8 k$ p+ m! K$ R0 y/****************************************************************************/
; C `$ Y2 a& O$ ~void GPIOBankPinMuxSet(void)
! @, r+ T+ B( Y) m- |0 _{
$ _4 k5 l# \. M // UART2 禁用流控
: l; i5 k( ^/ S UARTPinMuxSetup(2, FALSE);% h8 L W" F( \! o
}$ ]+ U& Z b! }# Z5 W
3 c" j; z# i b! K* i7 k1 t/****************************************************************************/
4 V, s6 D9 i1 w( F N# p& c/* */: h' g, L* e$ f2 q# Q
/* ARM 中断初始化 */7 I) L0 r5 T' [3 h1 V
/* */ M8 p% s' g9 b
/****************************************************************************/
6 P0 p% m& U8 n1 q% K4 \% r/ Avoid InterruptInit(void)9 W m- l. O# J4 H
{
1 m% l" u4 D6 b' n7 e // 初始化 ARM 中断控制器9 p( o/ P/ u; s8 G, W8 h- D
IntAINTCInit();8 w6 [+ y9 \2 e0 v) v& {/ s4 |) A
/ g {/ e# `$ F( X7 w // 使能 IRQ(CPSR)5 ^. ~# f8 @' L3 q$ H9 ~
IntMasterIRQEnable();
. A& p8 c9 r/ h( o5 S) H7 K0 ~' L, E1 x
// 使能中断(AINTC GER)
2 K" v' F: B* T4 n/ c" t IntGlobalEnable();& h2 y( v* v/ N9 a3 V7 o1 P/ {7 @1 ?% C
8 i+ X1 `% k( ~7 ?
// 使能中断(AINTC HIER)9 A& x% x; N$ p; Q; H9 l
IntIRQEnable();
* z* q# R7 A7 G8 r}
% C7 |5 J$ Z8 @1 p0 N+ i
5 S2 V6 Z/ q. q( O$ k/****************************************************************************/" J) B4 y3 F5 M8 I. a# K
/* */
% J. l1 h4 a, U/* UART 初始化 */
* |) ?; L( J6 O/* */& _5 s1 Y* u& F& V) I$ N
/****************************************************************************/0 C5 C( |# y$ c- r/ T# Y
void UARTInit(void)
, {9 {( r2 ?* m) i+ T* s{
7 j3 N, t9 `$ B8 O5 a' W6 z/ J* n // 配置 UART2 参数
/ c6 @, j8 W- n // 波特率 115200 数据位 8 停止位 1 无校验位9 p5 T, c2 [6 a+ d, @
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
5 O* y" w0 ~: a* C' L4 {' c UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 a% C% M! ?$ t9 N$ b5 r // 使能 UART2
|1 R l* P0 L) e5 e UARTEnable(SOC_UART_2_REGS);6 S2 V4 G4 P% v, T. R; B
5 V# ~) C/ `% \ // 使能接收 / 发送 FIFO
9 }, b& E5 k: C UARTFIFOEnable(SOC_UART_2_REGS);4 m# s B6 Y! G/ |- J! F
6 v2 x( a% X7 F9 b/ Z# F+ t1 X7 C2 D
// 设置 FIFO 级别9 ~( [- Z2 g6 P' X0 t i
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);. r* m# ?5 `# G
}
; C0 t) e% U$ V, }. U* z$ i6 T" F$ K( h1 d9 m8 d* e! V+ X ]( a/ x
/****************************************************************************/
1 ~3 p: Q: q8 D/* */. [8 L9 ~) t; @, s9 h1 w1 r
/* UART 中断初始化 */8 @+ [3 F- N+ b& b0 P
/* */& j3 g0 u2 h5 ~. e/ t3 g/ T% s
/****************************************************************************/2 W8 o$ W! h& ~9 ^0 e0 s
void UARTInterruptInit(void)
: O1 W- _$ e- n* a! R* k" h{
c5 Q5 G3 Y& k7 r1 j4 I IntRegister(SYS_INT_UARTINT2, UARTIsr);. D: N4 R, S( n& D
IntChannelSet(SYS_INT_UARTINT2, 2);
7 k7 P% @! L2 }8 W% |# R: n IntSystemEnable(SYS_INT_UARTINT2);" S" {# r/ T9 [0 u
5 o6 O7 g$ g# ^) p4 c // 使能中断: Z% ?. B# G1 F" Z; v: L
unsigned int intFlags = 0;8 E1 n" y+ x4 Z+ k
intFlags |= (UART_INT_LINE_STAT | \
0 y1 E! Y6 ?" A UART_INT_TX_EMPTY | \" v5 v0 e5 |3 R0 ?
UART_INT_RXDATA_CTI);
. x# E' A' x& `" c( u UARTIntEnable(SOC_UART_2_REGS, intFlags);
9 \- i h c" x- d# P0 m}
/ b/ a$ ^- R2 _ J
) s6 v# a/ [/ T# j! N1 V/****************************************************************************/
. w' ~. B4 {2 o V( h& } m/* */
- T0 k; _+ G& a9 K) ~/ _/* UART 中断服务函数 */8 p" `" E3 v7 j. g. P" [
/* *// _ v% [7 [" \
/****************************************************************************/9 @- \( e/ d. x
void UARTIsr()
( W* l0 K& s9 n- M' d{# V! J, Z/ c6 D E, B2 Y
static unsigned int length = sizeof(txArray);4 }5 V0 Z8 j! M4 T& D; }5 H
static unsigned int count = 0;
' k& J+ [2 u- T+ H: w, |# M unsigned char rxData = 0;
' A) I3 f8 q1 e1 F unsigned int int_id = 0;
( G. r b/ [; x H; ~' F/ C3 N3 q
' k2 V1 [9 |( X) c* P3 h7 ] // 确定中断源
0 g: s" ~. R# G3 k& Z, E v5 _# ^ int_id = UARTIntStatus(SOC_UART_2_REGS);, ^' C' [2 a% p5 ]6 i# B6 q) }& k7 F2 Y
& Y9 o, x% v& |3 E0 R // 清除 UART2 系统中断
2 S, Y" d! H; h; X8 }6 ? IntSystemStatusClear(SYS_INT_UARTINT2);
: U* k4 x; n" P0 s4 ]4 c% N3 t% @& x# S# m Y- e# a
// 发送中断* U# L, Y- K/ }6 v
if(UART_INTID_TX_EMPTY == int_id)5 p0 k# }( Y e9 J- ~
{* {" g% Y2 X# q4 g/ k
if(0 < length)
7 |) h7 ]# F3 i9 L {& o) `0 v$ a/ r- [8 [
// 写一个字节到 THR% q4 R6 m. e( c
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);( L, o% }- ?3 o# s S& j, i
length--;
* \4 O) \, \+ z& j$ O @ count++;
+ P3 ~1 ~1 a" ~ }
% W' R3 t: N3 F' A6 P if(0 == length); m- w# E9 T; Q, x: e
{ K, T" b3 i# ?( }. D! N( U
// 禁用发送中断7 I4 d: A+ g% C: D3 B( d! k0 F( l; h
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);2 l+ N: v) F) f2 M! F" y* E
}
m6 S3 W A" y n }2 `0 N" \3 w; y( n0 `
: N6 r0 @* q! ]/ E; P- ?
// 接收中断( l8 [; C+ `' o8 r+ e* v# N$ M( `
if(UART_INTID_RX_DATA == int_id)" h: @$ C7 F' \# v
{' x* S7 g8 i9 T8 I
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);: I# ?( R! r+ S
- ~& E6 h( K! M7 f/ V
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
! Q8 r/ P- U! _. w' A2 ?" [$ S6 z }
! C- Z/ f/ w& R3 d' F9 ~! `- l
8 B% V8 c; n- ^4 y // 接收错误
) C3 o0 Y3 O8 ?& }# A! g, ?, m% u5 Z: p if(UART_INTID_RX_LINE_STAT == int_id)9 c2 u9 d+ h' `1 B) h* L
{
" k" L" l. o& K" A# B while(UARTRxErrorGet(SOC_UART_2_REGS)), ~* B. _. `/ j
{
; J @1 H& g7 D" q% S) d6 w // 从 RBR 读一个字节
0 I- k0 A0 {6 T: E) O: M UARTCharGetNonBlocking(SOC_UART_2_REGS);
- N* Y& {( Q( ~) P* \9 g }7 D6 y1 h3 L: x% x) F0 y- H
}' E2 b& _* y6 `0 K7 R: _1 b
! T r1 ] j1 p; x) R9 l return;
9 L0 C/ _7 Q6 Y$ t( c2 w/ B}
; w1 i0 O. u' s0 A8 G U* s- ^ |
|