|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。 v" L4 B2 l, W8 e# Y- n, u. y
$ V; N5 j, W& V8 A H2 z#include "TL138.h" // 创龙 TL138 开发板相关声明
- g6 X+ P" U) q: n: w8 o. A4 F5 s! n* Q' n8 S% B7 u! ^$ e! w+ O
#include "hw_types.h" // 宏命令: m$ ^- q) x; b
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
2 {; r3 x, N) _+ v% P0 R ^9 R$ m#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
2 ^" L8 n9 j2 k- N i* {% @) C2 D. X8 b" G6 g
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明4 U* y, ~6 N; c/ X
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 j ^% L! v3 Y y) k% E3 x4 U4 f#include "uart.h" // 通用异步串口宏及设备抽象层函数声明* b; d) }0 v# V y' c) a W; L
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 c. J; Q4 |5 m' G* T! G X4 R% v8 O# Q* h' D
/****************************************************************************/; Y* |! S1 @) x. x
/* */
# x; p V# b& i/* 宏定义 */
/ r* a4 W; E- s4 p/* */, W; f& n9 ]( T4 G$ w E2 X+ }
/****************************************************************************/
# n% h4 e; ~4 A/ O( }// 时钟
# q" c8 n! q' M4 N' i- U#define SYSCLK_1_FREQ (456000000), [* [; U! m+ v0 @' n5 r( W
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)1 O. Q+ F+ k9 \8 o
#define UART_2_FREQ (SYSCLK_2_FREQ)
! t+ J! M- B( Q7 w/ v, n
$ F0 W+ @2 u2 B3 u p! s3 u+ j, g/****************************************************************************/" U0 G9 x" s9 T+ ~
/* */7 _. Q) l: L& m q& T
/* 全局变量 */
1 Z9 G+ D) x# w$ q9 d' B* s- V, K/* */# \' B' e/ N" g1 c* Y+ N. _
/****************************************************************************/
5 w( T0 N l+ u; bchar txArray[] = "Tronlong UART2 Application......\n\r";4 |2 D( b1 W1 }8 M) E! O
' q* \4 S8 c C x/ t1 N/****************************************************************************/
" @* b+ Q' y9 E+ e/* */3 W d" p) O; ?. v+ ?
/* 函数声明 */
" R v: }( F+ N$ C/* */# A+ Q: {' {' h1 }7 k
/****************************************************************************/6 A3 _; n' _; {5 B' a! h
// 外设使能配置
# @ ?0 B% \+ E! h, X; Lvoid PSCInit(void);
7 \& o( ]9 q0 {( F9 }( f
; z2 a& m& e2 E: K9 y; {/ t# A+ Z// GPIO 管脚复用配置
% B2 X( ~" u: V5 w! T6 o% rvoid GPIOBankPinMuxSet();
! {( M4 S- o6 k7 y# Z
$ J/ N0 j2 S7 U0 n# y& h// UART 初始化
7 x+ y8 [" W$ g: o( x$ y2 L& `6 T2 nvoid UARTInit(void);$ \" M n, Y/ [& m V. \
// ARM 中断初始化
, L" Z0 `+ V# A, x! Y! i; g ]void InterruptInit(void);
5 L. R, ?( D% T1 L// UART 中断初始化
7 l3 p! f) h# a: Kvoid UARTInterruptInit();
& C& v; l/ G% b# Q) Z8 Z1 L& R// UART 中断服务函数
3 g8 _4 r# x. s0 Ivoid UARTIsr(void);
$ j& {2 F. C- i9 G# q& w; c
2 y' E! g+ D9 A) `/****************************************************************************/+ B$ q3 ~# X9 n# t
/* */; c0 N( ^7 U, F6 K7 x
/* 主函数 */
6 b6 L+ i- @( W/* */8 ^4 s* r. o. _ X" O5 `5 j
/****************************************************************************/
2 ` U: w& L& v$ K5 \+ m6 Zint main(void)
' y& P+ x8 o" `7 A{ C' Z' R6 ]" X [ Q. ~( E7 `
// 外设使能配置
8 E* k# ~7 n I$ A2 y( x. b PSCInit();$ K1 D8 y/ _+ X1 O" Q1 i
2 m4 p+ F5 l) n* C' T# e // GPIO 管脚复用配置
; X# A% b; n2 T: U. C+ I5 T5 ~7 e GPIOBankPinMuxSet();
9 o. _, { e+ s5 H- [- X3 l+ i) R, ~9 \) B8 x( o5 v! L; y: b/ K
// ARM 中断初始化
- c* q. e3 {- i1 j* p2 l InterruptInit();) O9 E z3 ?; ^& T! K
& f8 ?$ ?. w4 U7 I O5 [" v G
// UART 初始化8 \3 s `6 |# x( g# i. \
UARTInit();
6 K# j- O! N! K+ m8 C
s) T, S' x* d. K6 x3 L4 i6 ~7 d; u6 I // UART 中断初始化" K$ e! v7 e% l+ Q7 O. M4 W/ ~
UARTInterruptInit();0 \3 s; Q8 R, _4 R' _6 B1 d
! }. m. i1 ?7 r; M3 }
// 主循环% G3 T5 U( X# Q y
for(;;)4 Q, U$ l' O7 x. D( P. p/ N4 N
{
6 d& V1 ^ z0 y& A7 V; l# G" |3 `6 R
% f" z% p) S( M! w- T, q, n }/ ^/ d8 P7 ~1 X7 V# Z2 J2 m
}
4 k, E* {' E0 c i
7 O$ P* G, K6 I$ @$ a; F/****************************************************************************/6 b$ [4 S- f$ E
/* */
& \# B6 Z T- S0 Y: P/* PSC 初始化 */& L7 }+ d* J+ m0 C6 \3 W
/* */
a5 @9 W2 K' I6 I# k( ^9 ^/****************************************************************************/
- \) q3 O6 k, B- M( p( Fvoid PSCInit(void)2 e' m, H) y# } i! U
{
6 \ k6 O/ J" M% D5 O+ \ // 对相应外设模块的使能也可以在 BootLoader 中完成. Q$ @% n: O7 m0 u" B
// 使能 UART2 模块
. u% F5 M1 ^+ x3 g' D) R2 F2 { PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( q: K! S% O0 I4 \$ T
}
7 B: Z3 i: e6 ]) R, L' @% e5 J- q
* x# Y1 q3 a6 p2 L/****************************************************************************/3 y: i t) s7 S/ B5 r$ Y
/* */% L4 ]: j$ U+ V! t( a; \
/* GPIO 管脚复用配置 */
. D* B7 [0 q9 J1 a' t9 h/* */
, ]: U; U1 c5 \9 H* P) Y6 T- W/****************************************************************************/
Q" j( W/ B" _8 r# hvoid GPIOBankPinMuxSet(void)
; ?) Z Q1 f4 J; w3 p( H" `5 |{) B! C$ \; J) M r* W
// UART2 禁用流控 q7 i' g) h$ X7 t- W
UARTPinMuxSetup(2, FALSE);
% t$ P% W7 L5 W4 z3 c0 C* B}
0 z8 }8 M7 w9 [9 p, q" {% i! n* C& k
; T( d: j$ B& e( ?8 u* f5 B6 W) X p/****************************************************************************/
! ^. ?5 ]$ [7 g3 B; i' F/ i/* */
4 Z4 D- G4 ?) ^& {& d/* ARM 中断初始化 */
9 {) [$ b# I+ \2 e4 t1 j( I+ J5 D) ^/* */# Z* M$ Q1 t2 m, ?# y
/****************************************************************************/6 o/ P& l6 n6 p/ @6 [
void InterruptInit(void); V0 n7 `9 ~7 t' t# d; q
{
& c- v" ]/ m2 K // 初始化 ARM 中断控制器
+ F1 v3 y/ t+ {. N IntAINTCInit();
- W9 `* w: a# T9 W9 R `
% q, T' f9 U! ^4 b // 使能 IRQ(CPSR)
% g. }/ d( y+ w; b5 l IntMasterIRQEnable();' J5 F/ @. d# W% I1 p
: W2 E* v7 D6 G1 m% [8 B // 使能中断(AINTC GER)2 c+ t* I7 S3 \' N7 w
IntGlobalEnable();
- A& J; U: c8 z9 f$ I1 x& B6 @1 k2 S% J& y+ e
// 使能中断(AINTC HIER)
7 K M( j$ J0 L$ J/ ]: R IntIRQEnable();
$ X% d/ a7 W& j2 \1 z- d}
6 X& a6 K+ d5 r t6 N, j
) ~+ l; q( y* j/****************************************************************************/# c( r3 y) _2 e4 x9 h+ s. L4 Z
/* */
7 x- \* w1 L6 T3 i/* UART 初始化 */7 _( t$ k8 h2 W0 m
/* */; d. z& H0 M6 X
/****************************************************************************/
# p8 d+ k( F- w" R0 ^void UARTInit(void)
0 v! o. c5 G, ~4 T' O5 u{4 x' e7 }6 y+ I0 s. ? u9 w
// 配置 UART2 参数
8 u* s* H8 a5 c* Y) y, l' l // 波特率 115200 数据位 8 停止位 1 无校验位
4 X% Z1 Z( Y; b6 o UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ N) f; W; f B. {+ b9 h UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" {% @! t! }7 a
// 使能 UART22 f' A3 a7 u- G& c' _7 m
UARTEnable(SOC_UART_2_REGS);$ z' [2 O$ M8 ^' P# y3 A' U
/ T. F% g# _+ H) H: W: L
// 使能接收 / 发送 FIFO4 K$ q3 O1 ^. }
UARTFIFOEnable(SOC_UART_2_REGS);
2 q. H% b7 u5 p* d7 K6 O# R2 F
2 H+ Y8 ~& l# ? o0 V/ z+ W& ] // 设置 FIFO 级别( Z! C: |2 [! u8 T$ Y1 ]$ { u# P
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);$ T6 N: {8 t: @; j1 W1 a" B
}5 N% |2 g t) \
; Q+ Q. W+ L" U# f% E/****************************************************************************/
* ~5 k# n" W& j6 B5 k" `/* */
8 h) b, R" X" a' y% C/* UART 中断初始化 */
4 ~. I' ?/ u: @/* */+ P$ `! d2 b( U1 ?, K$ q! m, j
/****************************************************************************/
1 _8 ]/ U# q% ~. t( U' C- Rvoid UARTInterruptInit(void)
; _; W% @: V0 F; O. n9 A{ R* I9 `5 ~( V! }3 n% g& P9 n; E" b
IntRegister(SYS_INT_UARTINT2, UARTIsr);8 L& a" L& p% Q0 H, K
IntChannelSet(SYS_INT_UARTINT2, 2); O( `8 D3 V3 p) f4 Z" i
IntSystemEnable(SYS_INT_UARTINT2);
1 Q* K- F" o; z1 h
9 ?" V8 S3 x3 S, N0 b' v // 使能中断
+ o0 s+ x7 o( U: B* w! b- b1 V. \ unsigned int intFlags = 0;- @* _( X1 V9 V9 Y; U
intFlags |= (UART_INT_LINE_STAT | \
" Z# Q; P @$ a: ?& \ UART_INT_TX_EMPTY | \4 g/ i7 U f1 Q5 T& M$ D
UART_INT_RXDATA_CTI);+ H1 _0 n# i$ v4 v$ P/ s; G! r7 z1 ~
UARTIntEnable(SOC_UART_2_REGS, intFlags);6 n, _, B$ [3 W
}4 H, p! {7 ^8 X9 K1 t
5 a( @, R5 Q% }6 l
/****************************************************************************/
8 w$ d6 q* H* v" P. d/* */
D. F' C# F4 F+ o; H/* UART 中断服务函数 */
5 k9 N) ]- M |+ y" o5 T/* *// I4 l6 X- F; i1 s3 ^5 ^
/****************************************************************************/: S' d- p' ~3 e) f8 b
void UARTIsr()
5 @: M9 d: ^ A. j{
- P6 E# f/ U; b# g static unsigned int length = sizeof(txArray);9 s$ D9 l4 W" v0 k" u W( z
static unsigned int count = 0;
1 x! \) q" Z1 C7 w, ? unsigned char rxData = 0;
( Z; \+ M( m& f' m) u/ k3 ` unsigned int int_id = 0;) T, t) n' j9 M' d3 Q
! q4 h9 \% |5 W) J
// 确定中断源0 Z( @+ g$ e7 m* R7 P, _/ r' Y6 d
int_id = UARTIntStatus(SOC_UART_2_REGS);% V% s8 P j8 r: O3 {
% W( n2 s- F: u. Z& H
// 清除 UART2 系统中断
! V/ i& p) }- ]1 {! K IntSystemStatusClear(SYS_INT_UARTINT2);
5 U9 _6 x. r2 M+ w7 z5 Q
, ? e' p( d2 m0 R& K, t8 H // 发送中断
0 l% N8 q1 U( N% u if(UART_INTID_TX_EMPTY == int_id)4 C0 k F5 D, k% s# R& u) r" ^
{
8 o0 t e3 D6 k$ A4 X+ S if(0 < length)) c( a. i2 U& d# f+ i" L* z# ^1 [
{; p2 ~0 h _9 X5 X6 I3 F+ F
// 写一个字节到 THR5 U/ N9 w9 _+ M% C: d$ Y
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);4 N$ d( _; Z% W0 a3 |5 x4 J
length--;1 a: k* P( r# N" d
count++;+ d2 a/ z: T" n8 C
}' G. g4 K" O8 J; \3 l& y9 I6 Y
if(0 == length)
. b. k8 M4 g% L$ U1 \6 | {2 w, ~' m. |1 r0 d$ ?" |4 e
// 禁用发送中断
0 p6 k C" s! ]- W UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 A6 b( ~/ ]+ d# `2 j: u) L }/ S' P/ ?7 ?+ Z2 m
}! A4 g& P. z2 a' j# }
4 k6 p0 z" s8 q' x9 w7 }( B4 I
// 接收中断 q# G/ ?8 f5 C
if(UART_INTID_RX_DATA == int_id)
7 I+ ^- w- c; @ {
1 W( k. E9 H5 N: `0 E; O6 } rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
% P3 r3 h9 N. X9 h Y* O0 ?) R& u+ A* z( Y! C$ u t; M
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 a6 H3 H4 c) m }
) O( X! c3 c: H6 ~9 N* F+ K$ g- `, q7 k3 q! j
// 接收错误" d0 K8 o0 A- e( a* {3 G. f+ L
if(UART_INTID_RX_LINE_STAT == int_id)% d/ V# L$ D4 w& }, V
{
7 w( R* x% Z, w/ m while(UARTRxErrorGet(SOC_UART_2_REGS))
7 ~0 l7 N6 Y7 [3 z {8 \. f' T5 h/ F) ]3 ^6 [
// 从 RBR 读一个字节
. B# v! H2 w( |" t' q UARTCharGetNonBlocking(SOC_UART_2_REGS);
$ Q' e6 V/ i) t1 r: C7 C- S }
: A0 H" v0 V8 @2 \6 b& Q }, z3 t7 O0 `1 {$ k
: _! f8 t; g+ |9 x5 C5 y% w% X
return;1 x6 |$ i( m4 r0 T' D
}
3 {, b4 {! R4 r. [ |
|