|
楼主 |
发表于 2019-4-30 19:45:08
|
显示全部楼层
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。; O, A; L- U7 c: Y
: N4 H" A9 b* O$ }& J#include "TL138.h" // 创龙 TL138 开发板相关声明' h( i% h7 {: N3 {& x
3 k' T' ]+ h; y. T! x
#include "hw_types.h" // 宏命令* n2 V8 |. y: Q2 s9 Z
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器$ [2 A) e9 Q/ |( |! m
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器# T g$ n+ F5 R& d
$ s" Y& Z1 U' _; J5 Q* z#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明( V, D; ?, u5 i' f+ s. J, i. ]) k
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明3 C9 k, t6 E3 w/ J# K
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明7 ]+ b' `+ g/ q0 l
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
% {- _& `6 C* y1 |4 H o, |* e- o3 v G O$ A# Q4 Z1 t
/****************************************************************************/& V2 v' q( ]$ J
/* */: Q" j- m' O* E0 f, m1 P
/* 宏定义 */
# z" n0 G7 S- u% w% h$ q9 F/* */
" c8 _- J- ]( R4 a2 |* L8 t; m/ h2 `/****************************************************************************/4 O0 A# g3 w+ N& ~2 z
// 时钟
5 F; n2 `% k6 B( w$ l) |#define SYSCLK_1_FREQ (456000000)6 g, p2 _/ V9 ~ A4 ~
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)% V! }5 t4 q, R7 T) k6 C
#define UART_2_FREQ (SYSCLK_2_FREQ)) s2 y. [$ _' x4 m0 G
# P( z/ Y% X( c/****************************************************************************/
7 R9 K. y+ N5 w0 J/ `4 e: X6 R/* */+ {% P1 x7 A6 V8 }9 I) _
/* 全局变量 *// q& W: x1 {" R- ^6 j4 i6 v2 e
/* */
- i h: D! M. `# H$ Q- m) G/****************************************************************************/
, c' E- J; `! n# Z8 jchar txArray[] = "Tronlong UART2 Application......\n\r";4 ?- F3 o2 E. O+ m& F/ [1 i" V
4 I- @9 v6 W D/****************************************************************************/
% ?( w6 ^4 Q/ D0 r! W/* */
# W: n, D* f& B/* 函数声明 */
7 ^/ `5 x$ w. P- |0 f/* */: o7 S3 H {( t0 y! I* ]# Z
/****************************************************************************/
; F* g5 X- C( F1 Y// 外设使能配置
& M4 @) T3 [" e* D- H: u5 m3 `void PSCInit(void);
. T8 w+ K C: w7 ]1 P% v; M# y
8 c1 G' ~* l/ J// GPIO 管脚复用配置 ]7 A4 Z2 g7 h) c& @. z3 K3 |+ b" i
void GPIOBankPinMuxSet();
" {6 k' C1 _$ |0 ?! P$ r, `+ q; s+ G$ O+ \, y6 @3 A# ?1 G
// UART 初始化) u1 |( ]% ~5 \% I: Z/ \& r
void UARTInit(void);/ n3 L/ f; w5 Z9 t+ C
// ARM 中断初始化' r9 j$ m5 M! ]6 L
void InterruptInit(void);! b D0 l6 P3 D
// UART 中断初始化' G( h5 N+ Z% c$ S( e" ]
void UARTInterruptInit();
9 `; i) C& l# S* j// UART 中断服务函数
- |1 G+ ? o* e: o7 p! ivoid UARTIsr(void);
. [/ Z/ W) h, z$ S5 U
/ [. b6 u ?: l- ]7 @/****************************************************************************/
! w+ e5 W9 b9 c! x# o0 c4 x/* */
/ o' X! h( C' L. ~6 i- c* U/* 主函数 */
$ i6 B6 k* _. v3 A/* */
: L' o5 r+ f2 X! ^* Y/****************************************************************************/9 w) D, O& F* k* {% t! O
int main(void)8 }& G$ R- G5 N& [( M# B. O
{
6 j$ V& k( v% b) G6 N- K // 外设使能配置+ S; A2 I1 {6 m1 j& ]- |
PSCInit();. @3 ~$ R' @6 S3 e5 w
8 Z( s* ]* A* \+ n# w
// GPIO 管脚复用配置5 f4 \3 E/ b. W1 r4 {
GPIOBankPinMuxSet();0 W" K. ^/ z$ R; j6 }5 _, x, V! r0 e
" A# `2 i" [- h6 A: r& N" V
// ARM 中断初始化
1 S& y" d* y$ g, Z; U2 G5 f InterruptInit();
/ v" P X% m5 `9 ^5 i2 F0 n* a! L9 z/ `
// UART 初始化2 |5 R3 q% c5 j8 c$ |
UARTInit();
W$ |% ]2 o# C" ? L2 w% g& ^: H' P/ ]- P
// UART 中断初始化3 h( p/ b" b% I* i) B1 ]5 J) _
UARTInterruptInit();
9 d% [2 x5 N# [- ? S) s0 U4 g" }1 g) {/ J
// 主循环
0 N5 K/ Z5 Q) L$ j2 G5 c% i+ x for(;;)3 J1 S1 |. f! u- k
{' }& a/ p* c' D |; L
3 x# X# ]( a" b! T# d }, X; q. @8 {. A1 x
}
) l% c I' t- Z! [& o1 W
' M) f9 k* B4 x0 H4 s/****************************************************************************/
# U7 b I/ K4 }! n2 a8 t! y/* */
6 M( V6 r7 @4 J" t6 S6 u, A/* PSC 初始化 */' {; |6 f" C: I! U
/* */& M. P9 k/ h, N* j
/****************************************************************************/
5 G7 a5 |) s8 P2 jvoid PSCInit(void)
% o V6 e5 w& `3 ~' W* Y! K; H{" c. o5 h: s3 L: Z ]+ [; u$ i
// 对相应外设模块的使能也可以在 BootLoader 中完成; F7 J& ~* K7 s$ p, ^6 \
// 使能 UART2 模块* \2 F% R9 q8 |- I; q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
: F9 \4 H2 G# L: f. [: Z/ ^}
' D, W* d" E% ~ ~* B
1 |* `- R6 [4 T" ~$ z6 P/****************************************************************************/' x6 z) G6 R' t Z
/* */
' |5 h' R) \4 v7 U/* GPIO 管脚复用配置 */; _" ?. J: \7 \
/* */% \$ E. J& u2 r4 A0 [7 d
/****************************************************************************/7 j' n7 ?+ s, _" {
void GPIOBankPinMuxSet(void)
1 h/ b( T6 V2 n$ s& r$ g" |6 g{
: B& m4 V8 \" ~9 K // UART2 禁用流控- @5 a( S, J6 W1 j3 e# s
UARTPinMuxSetup(2, FALSE);, k7 v$ N# A5 W* i3 L0 U* q
}
- d3 @% ], l; ^; N* _. o8 T! e) K( z
/****************************************************************************/. W) ?% L z- G* r- @, X- q: L
/* */4 {! G9 k% c) s# {
/* ARM 中断初始化 */
+ c5 a7 p) f* t" B/* */
% h/ a* ^: {! b2 g* P. s3 M/****************************************************************************/
$ I6 [8 x7 }: `4 \, ovoid InterruptInit(void)& h# o2 I6 L" Q) H3 |5 }6 Y
{3 ]5 ?0 c) T/ o+ P3 y+ V% y. _
// 初始化 ARM 中断控制器
& s: ^1 i v; p+ u" i1 a7 R IntAINTCInit();
" ~, i1 p0 e3 n, Y- ^( ?( l9 s# |+ `3 l" e! o
// 使能 IRQ(CPSR)! f+ A+ h5 a( j$ q/ [
IntMasterIRQEnable();
( _0 s/ ]" K; x/ I( r
9 n- |- i. a: `7 ^# x& |" k // 使能中断(AINTC GER) j( U+ n- s7 h, i) F& a
IntGlobalEnable();/ ^ ?/ ]) ?- C
7 P5 S. o& L& V, a1 z
// 使能中断(AINTC HIER)5 l0 S8 C* g9 Y1 G" ]
IntIRQEnable();0 q, v; W& P3 y
}1 D& P. k. a3 b: E( f$ W
* _1 f/ P/ @' b& k/ G
/****************************************************************************/
. n, B! |8 W- z0 G G/* */" K; x1 p& L- ~/ m
/* UART 初始化 */. E R/ d( e, O- y- V
/* */
: m; Q+ ?; C! ^/****************************************************************************/. F0 E N1 A' X1 v7 S
void UARTInit(void)
/ S1 f3 C* s7 {$ N$ B{& ?' s3 b+ k# F: x, W* G L) h; m
// 配置 UART2 参数+ \3 w" a. x8 c# D) {# d! M
// 波特率 115200 数据位 8 停止位 1 无校验位- K& V! i, `. x7 G, ?& X- V
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,. ~' I8 ^" h% Y M/ I
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 r, I8 g9 t. P' u/ B9 Z, A
// 使能 UART23 r, g% x9 k! n E) d" u" C
UARTEnable(SOC_UART_2_REGS);
* C+ N* U( U, x% v/ w1 m/ U4 v
// 使能接收 / 发送 FIFO
) \$ l9 ~! b% z8 w. T& H UARTFIFOEnable(SOC_UART_2_REGS);
( B8 ^ [+ V" N4 f, H$ o( ~
5 a* }3 ?# I! u/ V. ~+ a# g // 设置 FIFO 级别
# B" P1 A# a1 t UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 n% H: ?# E& m% ^}
$ l X4 @1 x, I# H& X9 ^" G& s0 h# m: I( y" k
/****************************************************************************/
+ L9 D! x4 J. W4 Z/* */
$ X) E" Y8 F9 v; s f/* UART 中断初始化 */
z4 o! C3 D' N% H0 @/* */
0 J+ A: m! C. N3 q. O- y. M: F/****************************************************************************/
* a8 v& b- f }/ c. g/ [, H% ivoid UARTInterruptInit(void)6 @+ e$ M- d: ~% n O
{, e- R( a1 \: |( `+ [/ U, z
IntRegister(SYS_INT_UARTINT2, UARTIsr);; P$ C, t& H8 p! h* u$ z
IntChannelSet(SYS_INT_UARTINT2, 2);
' |! c# u! L$ H5 ?9 _% v IntSystemEnable(SYS_INT_UARTINT2);
" y) g4 l. H! g9 e! c \2 y
7 D6 y0 ~+ H* W5 l. f% k0 k9 G // 使能中断, ]6 H- x2 ?+ g2 Q8 j6 m
unsigned int intFlags = 0;/ [$ b( Z5 Q) \* t: S8 l: w1 X
intFlags |= (UART_INT_LINE_STAT | \! x5 z7 t, R0 a# H" ~( Q$ Y% |
UART_INT_TX_EMPTY | \3 A' B+ k- L" T" @
UART_INT_RXDATA_CTI);& V* l2 i/ V$ ~
UARTIntEnable(SOC_UART_2_REGS, intFlags);
! S! L7 I5 Y+ Q& B" ]) H6 Q% F) l}
( n& U1 V8 C, b- M: ^& @4 \0 W! T7 {. }8 [$ i/ y, I, _
/****************************************************************************/
9 r6 `. o7 _2 W' @8 q/* */
7 Z# S4 G) d9 ?9 _4 Q/* UART 中断服务函数 */
K* K' s4 v* ?% P1 G/* */
- f9 c2 F$ K& _! ^/****************************************************************************/
7 C( E- P1 B; {6 S2 yvoid UARTIsr()) L- A% j r3 ~
{$ E( I: E+ g# ?- i; j8 C% {" C$ l
static unsigned int length = sizeof(txArray);! _( J0 K! b" f
static unsigned int count = 0;3 N, d8 k- C. Q/ g7 E. T
unsigned char rxData = 0;, r/ `, k& K2 g+ j/ B/ _
unsigned int int_id = 0;
' ~8 W: K3 t1 q: b* c: Z$ R& W9 N6 M7 P3 \- i8 P8 r& G `1 r
// 确定中断源4 `3 s7 T; K/ T5 P" Z8 J
int_id = UARTIntStatus(SOC_UART_2_REGS);3 U' d+ p; |* Y8 u* F" t/ J0 A
+ Q2 \1 J/ p5 C# i, v! j
// 清除 UART2 系统中断
, [5 n8 M: f1 f IntSystemStatusClear(SYS_INT_UARTINT2);% q! {! g( A. }
+ f. y4 `& h' E" \+ q, r6 n // 发送中断
5 } O4 g0 |) \- L) U3 X if(UART_INTID_TX_EMPTY == int_id)3 L" z9 Q( B, t
{
( z! ^, A$ W* N1 l- e$ S if(0 < length)
/ q& Y. ~' {5 E/ c. R* s% m {+ @) u% q9 e* x4 @1 T" o1 {8 m
// 写一个字节到 THR7 {$ F7 L5 L* M! ~7 I
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 a8 b$ T& B- N& Y
length--;
) B* H3 P3 \! d0 P6 J. @2 u0 Z count++;
* d; \9 ?# M- v' |$ {1 Z( ^1 b }
% q! e3 n! \, D if(0 == length)
0 b( f& o, K% D$ Z( F U {
& T0 A. m( L" t // 禁用发送中断7 e' v3 o2 ]- s% r. K, R) e$ M
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
) E, u3 ?; D; B1 W }
8 t, r- p4 {8 g. g: v1 U }
9 w& ^( l- o3 J/ B+ F7 ]" g+ g! M9 |( }+ d' E$ ^$ g1 g- ]. s
// 接收中断6 m( J! [0 o" ?
if(UART_INTID_RX_DATA == int_id)
1 `- D7 ^; X8 A2 P. c9 g {
* t" j; m5 P: C rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* a' N' G% d3 H/ e6 c" w2 _! Y
) x. m3 Z: x9 l+ M8 l
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ [" h- a% B4 s1 O5 Y/ ] }
$ @7 w, P# ]: h; ^6 ]/ p" K8 n; u* M7 k, b
// 接收错误0 f. t0 \2 H9 M( @: ?, N: R" d2 [
if(UART_INTID_RX_LINE_STAT == int_id)
: c* A3 \# t2 r! |- r {
4 c) l- n0 U! G) |; T8 r3 s while(UARTRxErrorGet(SOC_UART_2_REGS))4 D( U+ F; v! e
{
* |! P% ^6 g5 j // 从 RBR 读一个字节 u/ A! Y# [1 ]
UARTCharGetNonBlocking(SOC_UART_2_REGS);4 P1 {, X( {5 T1 y; _5 n
}
- A- B7 O% u9 l' m }+ _' A4 S# i# M+ A! ?- J6 _
8 R4 G1 q( [! E return;
$ F* A, G3 O7 l0 z, Q7 s}
. _8 y3 k2 R( v |
|