|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。/ r2 V) }% Z- F3 H
% O3 B. I; D* X) m0 A1 i4 e% J; A* f#include "TL138.h" // 创龙 TL138 开发板相关声明; b. [1 D0 @8 @7 h+ q: O( S
7 f" A' y+ I0 i- b1 y, C$ ~1 L) p#include "hw_types.h" // 宏命令$ I+ R/ Z9 d, j+ J
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
2 C2 f2 P' C K- c#include "soc_OMAPL138.h" // OMAPL138 外设寄存器# y. }/ K; {- P7 D# t W! o1 B9 l( Q
7 f* X6 P9 L+ d: A1 q
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明. a$ w* Y8 k5 S* u
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明0 W5 M6 {# |7 h8 A2 }1 C; q- ]
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
( k& Z( o4 j, U# v) a#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义9 Z9 E0 o X9 ~ A( I8 E
) L# m, Z9 @! ~% R/ x$ T/****************************************************************************/
; E9 ?. ~# P/ V7 i' I/* */. F. ~$ c0 M) m, l. K e' r( T& e7 l
/* 宏定义 */: e( V, ]: ?* n/ {
/* */8 m/ A1 j( h. B
/****************************************************************************/
1 Y. W6 k' v% f% f2 J) o// 时钟! [" H- O2 Q& G+ v! f
#define SYSCLK_1_FREQ (456000000)
# o: p. R, f3 _6 a8 y0 e#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)# B7 p0 C7 `: \. x1 ?0 M6 N5 E
#define UART_2_FREQ (SYSCLK_2_FREQ)) B+ a3 a+ j: V& p; ?2 m+ H
P/ G h4 C7 w+ X3 s: m+ [: U
/****************************************************************************/
0 o7 [ c( t& ~0 g F9 Q/* */& `5 b7 k) M" m8 e
/* 全局变量 */
8 m3 }, b, u' c" e! T) p: v8 F/* */, E. X( d. G2 Z, f4 a% S
/****************************************************************************/
4 a* o* e3 j3 u0 K9 i3 Fchar txArray[] = "Tronlong UART2 Application......\n\r";
2 r# m6 p- X0 e w8 G2 ]1 G
. G. d- Q3 [1 y* ?1 r/****************************************************************************/
0 [+ n/ U8 N, P- r2 ]* `/* */
$ ~% x4 c# A! ?, g6 P5 {/* 函数声明 */, q! \& l+ N, ~
/* */$ S/ I7 `) _- B% ~* E
/****************************************************************************/
/ g$ o' h9 ~6 R+ |% y4 }$ o// 外设使能配置
3 `, x+ D, @% H3 F) m, V# s# ivoid PSCInit(void);
# v4 Z' p {- l5 n B- j
1 D, r; Y7 d8 q4 K- \5 ^6 e1 p9 `// GPIO 管脚复用配置
4 h3 D. E/ ?6 p* `6 k) [void GPIOBankPinMuxSet();' r# z: D( h, z% o2 d
" Q* d/ _9 ^7 U+ X% p) ?8 `
// UART 初始化
9 c7 q5 q/ ?) t% t( m# pvoid UARTInit(void);
' j+ F. t- ^8 ^ W6 K# D! j// ARM 中断初始化
1 b* _& a* H" [3 V0 j) Y, k) nvoid InterruptInit(void);
% d5 Q; {- C3 a1 P// UART 中断初始化: i0 V; j2 e! G' ^% F: i7 X
void UARTInterruptInit();
6 H) ^1 L. a* H1 i6 n! Z// UART 中断服务函数
: E k6 |5 k$ Z5 ^/ L+ l Bvoid UARTIsr(void);
1 x, M& f) F* X1 z6 U$ t. t0 R2 f/ J( F" Z, ~6 Z
/****************************************************************************/- \- d% V7 ~$ x
/* */
9 M5 V+ _5 X4 [# `/* 主函数 */! |# R+ u* \7 { T
/* */! n1 U3 U1 j0 ?' J9 R* C
/****************************************************************************/
# u% P) w6 ]" o( hint main(void)
; Z* G7 |+ l% q{% M8 o! z2 m' P9 c! `# O; |
// 外设使能配置
) ]9 i5 }, a( }! f PSCInit();
) C, l4 e# E {: ^- i/ X - U: I+ E- `( e; `* c
// GPIO 管脚复用配置
# d/ W3 V3 ?' [' t GPIOBankPinMuxSet();
7 V: L7 d% I3 a* x( P6 C
1 U$ ^+ F! E0 f! K // ARM 中断初始化) H4 M2 E! E/ q9 O8 D
InterruptInit();
! Q3 y; ^5 N7 `" K2 K
3 H# s" E9 `/ B! o // UART 初始化0 y v) e6 g' y$ b* Z
UARTInit();
, ~8 T. G9 X0 @' l% ?
8 k* {0 C+ R2 a0 h& }5 S, \ // UART 中断初始化7 O: e/ T7 ], u9 j0 |) w4 C& @
UARTInterruptInit();
" Z& ~ [9 Z3 @. r% w( ]% N
: E0 p g$ I0 P4 q4 n, ^' E% \ // 主循环
% j4 D* W/ Q9 p; P/ ?5 L for(;;)% `& ?3 L8 ^' [" k G$ |' @7 V
{
# T+ \+ t/ j8 ?. R n1 A1 Z3 o; X9 f1 `( `+ E
}
7 y5 _: }) ^/ r+ J0 s}, l7 g3 k' s: z9 S% ^
1 c a0 R# I. x+ n4 ?/****************************************************************************/) l, V" I+ ^' i
/* */( Y6 \' b5 x( @9 W: l# P
/* PSC 初始化 */: Y/ K. [3 K+ c/ X! H8 _
/* */0 G5 ]6 s! e/ j
/****************************************************************************/
$ ]% V4 _. d6 Y) ` a' C" C$ Bvoid PSCInit(void)
% E% ^5 e7 M7 ^ a! ?- d; k: I{5 ]9 U# |% f( w! D' {0 k. x* G. F/ s
// 对相应外设模块的使能也可以在 BootLoader 中完成
& J; P, _" C7 e+ s // 使能 UART2 模块
: w3 R" z& D* _8 s7 }6 x6 k2 Z$ C- p PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);$ z9 S: D b' S, j* d
}- E, D# S: n* a* l+ X) V
9 m4 u0 h0 T Q. }( c/****************************************************************************/0 a* b I! H+ z8 H& r: m
/* */
$ T3 `0 I. B% r9 ?/ h K/* GPIO 管脚复用配置 */ {' x0 ^ z) q. `% g- P, Z* }
/* */
|6 g6 T% M8 T4 B( }- q/****************************************************************************/
& R/ _5 k& W" w5 j& i! N& {void GPIOBankPinMuxSet(void)# Z% y" g5 A! H2 u
{
, C; i" U4 o% j4 A5 D1 R // UART2 禁用流控
2 j8 S: j9 j' s3 f) d: G UARTPinMuxSetup(2, FALSE);
( v% J4 |1 l8 S) F$ H5 |}
2 u" y- A: R& q9 B
) B# O1 ^0 @' E/****************************************************************************/ t! w5 p2 |+ L8 n' q
/* */
; `7 o8 Y5 s: K6 I" {/* ARM 中断初始化 */
. y# r% d7 T9 W# K/* */% P" N5 M% D+ E9 r. v
/****************************************************************************/
- K7 b% {, j' C5 G/ C1 V- Evoid InterruptInit(void)
* D) N* ]- T5 ^* B# A{- @9 O7 m) A$ B" |8 Y
// 初始化 ARM 中断控制器
0 w5 `, j' v3 {: P& t IntAINTCInit();; ]: U4 o0 |6 I$ c v1 N+ a
/ z1 R% p' R' `6 l
// 使能 IRQ(CPSR)
% C" J+ ^+ ` |7 ? IntMasterIRQEnable(); B3 [& \ r C
% B+ w$ c. f, _( l" K! s( i
// 使能中断(AINTC GER)
3 x+ L ~" G5 x: H IntGlobalEnable();
. V4 o) L @0 {4 e6 V
! J9 w* T4 @/ m2 t // 使能中断(AINTC HIER)
5 a/ c( _' Q0 M7 f' t; Q0 A4 m IntIRQEnable();" D, w+ M5 B- a& _0 U5 y/ K4 i
}
! L1 v1 r* @& f( x5 S1 |3 C
3 D v# r ~: t, G2 a/ h# e! j" \) O/****************************************************************************/, b) G- t$ b. Z* y
/* */; G8 X+ w6 s% @1 q0 E
/* UART 初始化 */; K/ v( _5 I: |' F F
/* */9 k7 ~5 ]& l" R5 ]. x9 P
/****************************************************************************/
/ U4 z. N! [3 I4 u M: Mvoid UARTInit(void)( f; x1 M7 j7 _; A' q" s1 B
{. v' F1 y; X' ?6 @ N) w
// 配置 UART2 参数& x3 k! W; ]" r2 t
// 波特率 115200 数据位 8 停止位 1 无校验位
" Q5 J; ~5 k Y$ x1 ~0 n2 A# S! P UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
4 K: u& W. j- ]6 w UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 Q; M ?' `$ H* u# }2 U, W* Z // 使能 UART2
+ K5 g' W4 u& c% F, |( D6 k UARTEnable(SOC_UART_2_REGS);
, b& V+ U6 u! L
3 |$ F0 w! U1 I* Y' v& k- ` // 使能接收 / 发送 FIFO' H. s1 R6 W& L# W; u; J
UARTFIFOEnable(SOC_UART_2_REGS);9 o$ q# G& c0 y0 q9 h" m9 _
* y9 X+ _: k& s t. j, k# L // 设置 FIFO 级别
( N+ K$ A# e1 b$ G9 w$ G$ L UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" I' m5 D& H3 {# I( M9 `
}0 }3 O1 t6 n* ]) ?
3 e }2 Z) h" p( m0 ?& W/****************************************************************************/
' w' g, [* o3 B/ f' x/* */$ _+ ^& e- H' v6 G$ s! |
/* UART 中断初始化 */
( z7 M3 z& e+ J9 _/* */
! X+ y2 z! W8 K7 g7 j+ Z/****************************************************************************/5 `) t! U9 }0 h
void UARTInterruptInit(void)% w1 C ? `: l$ S
{; m6 [$ E4 C1 ?" ~% K3 Q( b0 M
IntRegister(SYS_INT_UARTINT2, UARTIsr);
4 a/ u Z% K- L* R6 C( z8 p IntChannelSet(SYS_INT_UARTINT2, 2);1 z8 P: s' A1 x0 E
IntSystemEnable(SYS_INT_UARTINT2);% s8 v+ `! P+ T: w- F! ?; a0 g* A
( Z! h9 B8 e8 E# e' v // 使能中断
0 l7 O' T0 |8 Y unsigned int intFlags = 0;% h! i: E; z: `6 Y$ W8 p
intFlags |= (UART_INT_LINE_STAT | \. s% s6 ]6 u- ^! z
UART_INT_TX_EMPTY | \
) I4 Z5 r# z. N3 a; F3 U UART_INT_RXDATA_CTI);! P6 V/ [9 d+ N4 v
UARTIntEnable(SOC_UART_2_REGS, intFlags);+ t Y7 b! Z2 S) _0 j9 v/ A
}
. t1 B8 @! {" t6 x
! N, [# y: t1 m/ t: ]/****************************************************************************/ f# y2 |0 n" O& G2 D0 O
/* */
$ }0 a! P2 b- p8 K. t/* UART 中断服务函数 */
2 i; M# J: \( Z& y/* */' D! D0 k( y6 v3 \- ]9 I" |* |
/****************************************************************************/3 d) J. J9 M( X9 Q; W5 E3 y7 H/ V
void UARTIsr()0 a9 G6 C0 r$ u! k5 C9 M
{
% A2 G" B$ n' u5 Y static unsigned int length = sizeof(txArray);$ S) t, t3 q! W" I
static unsigned int count = 0;" o8 o* L. j3 i. D+ a8 `
unsigned char rxData = 0;
$ T' [0 ]4 [$ }; |9 T" G+ k unsigned int int_id = 0;
* s u8 x3 E4 G z$ o5 R; `( V S- G2 G# j
// 确定中断源
6 {+ J9 t& H8 i& o4 e int_id = UARTIntStatus(SOC_UART_2_REGS);4 N, C, W. W& _. M* n0 x0 c
7 i' Q3 i6 j& }4 m# c5 q // 清除 UART2 系统中断
8 T5 m* ?$ k% e4 O2 n IntSystemStatusClear(SYS_INT_UARTINT2);
+ `0 P7 A( O1 {0 e* G$ H2 g! S* g
// 发送中断/ L/ @2 V& K5 |( ~
if(UART_INTID_TX_EMPTY == int_id)
, c" `" N. e: f) Q3 D* \1 Q {" e6 f1 V9 T8 \ m
if(0 < length)
% A1 z5 F9 `3 R6 l4 q" X+ s* v {( G+ [" F( X6 }5 e$ i1 u& y5 C0 e' S
// 写一个字节到 THR( i- @; V! J. n& m
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 I: ^2 d& M7 x3 A length--;3 z$ n7 }, i# Q3 L6 Z
count++;5 d/ `1 G" ?; n, K, _% w9 i0 d
}5 ?, ?5 D0 X8 {& j* S
if(0 == length)
& N1 I5 c" }0 l3 X0 G8 ?8 R {( W6 ~: q) @$ h3 h& _( R
// 禁用发送中断 o0 @5 o; m: ~4 N$ R8 D
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);6 m# R4 W9 P* g8 f
}! n5 }6 \0 ~' R) ~! N! Q
}
5 r. O0 W" K- s
, Z) t3 ?* C( M // 接收中断& y ]7 _% O1 A
if(UART_INTID_RX_DATA == int_id); p' D! F% k1 a( K1 c! z9 M. [7 O, P
{8 x) l3 [% o# a7 ^7 P# Z1 @! V7 }
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 \+ t+ B- M1 m% Y5 n
2 M; F( B+ Y: R5 i- J6 U! s UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
( c h5 W( Y5 U- g' G! _ }
! w) k, {! |" ]+ ~- C1 V E* i$ P. n8 p- M0 e
// 接收错误* M: z. Z1 h9 Q2 Q5 N# K( u3 P
if(UART_INTID_RX_LINE_STAT == int_id)0 x5 \0 v; h. L, J. V4 y8 G' ~( S
{' j7 T7 k( ~ Z0 `- P" b% q4 |; S
while(UARTRxErrorGet(SOC_UART_2_REGS))
8 O3 y* ]2 g R$ `4 V {2 `! _; t( ~- x: } b! B2 G
// 从 RBR 读一个字节
' |2 [$ v. |% o, _! O UARTCharGetNonBlocking(SOC_UART_2_REGS);; u( }' J. U6 e# |$ n8 w! k
}1 E7 R2 R+ Y, y, H+ J' {4 N& _7 q! g
}1 ~+ d h. L/ y
9 V: ^' X- y: k' [. T2 ?3 ]
return;
) A$ B$ H$ o0 g) }$ k7 h$ b}0 s- N; `- w$ n
|
|