|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。5 T2 k- w$ T: s6 P
2 k" ^( \$ o7 ?+ i9 `1 j6 x0 q#include "TL138.h" // 创龙 TL138 开发板相关声明
/ ?8 Y+ [' F( @5 ?( W
# g2 d$ e. I) n% y6 }1 i#include "hw_types.h" // 宏命令
4 \, b; ^9 `) K+ f#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
. g6 J- m; g/ K#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
" t8 Q' ^, x% U3 [& Y( U, `8 N2 y5 g& H8 Z5 c1 P1 ^8 y
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
# \( Y9 p' v/ Y#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
. f+ m# [' o+ N#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
$ a4 y- K' e( K, _' v7 L. s# W, h#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义/ a5 E/ t1 F' |
2 [; f7 J& i9 {9 \( \+ b( E/****************************************************************************/ O/ A" ]3 U& {& x% y: b0 S
/* */
- ]+ ~+ F l0 _/* 宏定义 */
9 [7 v7 |) i& O, a9 q4 E( E9 Z- R/* */( R0 `+ R) n) p( S& }3 ~8 [( q2 f
/****************************************************************************/5 c2 B" `3 N( W( B) Z- b a; m
// 时钟 ^; T4 i/ |/ Z* ~, t7 r
#define SYSCLK_1_FREQ (456000000)1 f3 o6 _: P% i1 J: z3 d' N
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)# L% V+ _% _8 A7 G" }4 @
#define UART_2_FREQ (SYSCLK_2_FREQ)
6 [2 I7 N3 Q( W" r% u% p7 K- s0 n8 H% V
/****************************************************************************/+ S, x5 ^1 o) P% _! D( z
/* */
a3 W- o& ?6 N1 t/ `5 \( D/* 全局变量 */
( G2 R/ K6 ~2 A" ^/ q9 M/* */
0 N" `3 V+ b4 U! R# o* G! ~0 s6 W/****************************************************************************/
* R* }3 k w7 O# L- `! \# }' mchar txArray[] = "Tronlong UART2 Application......\n\r";
% g3 f: h5 }2 Y$ D& A: D
0 G( \4 V0 u4 {; C* G4 X/****************************************************************************/
: X9 O g- _4 D! U8 m; C" n6 u8 M n* |/* */3 B R! l6 Z% \0 {+ o9 }
/* 函数声明 */
2 A2 `# T7 Q+ v. ~+ |/* */
; q# }" s. e F" r$ A! \) D/****************************************************************************/
' A" h, }' p- U, t \// 外设使能配置- Z4 U% _7 d0 W: g* a( j+ D! j
void PSCInit(void);
) C, F6 g1 y# s b+ M/ H! f. a3 b; M$ U0 X) o
// GPIO 管脚复用配置& |% K8 I. I1 ], P) l
void GPIOBankPinMuxSet();
# ^; F* Y( o/ J* A4 I$ n$ K9 r. g4 ]3 N8 D& p% D5 k& ]) x
// UART 初始化+ ^- I# j6 V4 `) X& n2 C4 }( T1 H5 g" k
void UARTInit(void);
# }) h) }0 d2 |& s// ARM 中断初始化+ x2 F! r; j! P' [( Q# Z9 J4 {+ {
void InterruptInit(void);: ^; U( ^' t+ [, j
// UART 中断初始化/ Y! M( T/ d8 q4 _4 |' ], s
void UARTInterruptInit();
& R) Q! J8 @# q- r3 d( G. v// UART 中断服务函数! h* K& l) D+ m/ V8 a
void UARTIsr(void);
* e7 f b. t$ o; i( V
9 N2 ` E" a" }: P/****************************************************************************/
9 i( |1 n9 K5 O4 w3 G, ~; O: n1 r/* */
! I) y0 r# P' ^, T+ b/* 主函数 */- E. F. F$ q* Q6 j4 T1 W8 F+ }; T
/* */# n: r% Y, R( _* Z
/****************************************************************************/
\: [5 e u" g) L- P- w& zint main(void)
+ z) e( b% S0 t O' @8 ^{
! \0 E& K& r3 U# h // 外设使能配置
( g& B J' P4 z% n7 |& G3 Y PSCInit();+ v; E" m: D9 N: t/ }, q
' ?: D0 \, H2 ~$ O, | // GPIO 管脚复用配置+ Y) B0 K2 m" v: y3 A* }6 Y
GPIOBankPinMuxSet();
! b0 T3 n7 s8 c5 [5 {) q7 y4 g) ~% G, `8 c# J$ c2 T" y
// ARM 中断初始化8 z) R$ ?. s1 X6 T9 t2 Z
InterruptInit();
8 n5 t% R8 Q9 T: k; K# E0 a& ] f0 c
// UART 初始化
- U3 S9 f: a& h UARTInit();
5 p) s# X8 o2 f# O. ]/ u$ r! c ~" C- o# I, k( r
// UART 中断初始化6 A# ^) V& r7 A& W2 X" d
UARTInterruptInit();
' A w# h6 g' y5 L4 O3 `. G% t# K( u8 ^5 V: u& M
// 主循环
" d; z, y: ?6 B# O for(;;)
, L' ^# C; w$ A: _! f {/ Y4 ^" E" z6 x
5 Y& V+ x% N% [6 |) _- F
}# G3 p m: u4 c. i( }, b
}6 _. Q" Q) {$ _' ~! Q, W
8 `2 }5 I0 ]$ ~0 V0 x0 I0 l2 p% `2 a
/****************************************************************************/
6 r: i8 S5 l1 I0 L! c; j/* */
3 T2 D+ t. `4 x/* PSC 初始化 */
( U& ?9 q6 R7 ]* R$ i4 @ w* z) r/* */
" {" ~, B6 h* {8 P/****************************************************************************/
/ a5 N8 B+ Q! n2 F4 c9 v9 Evoid PSCInit(void)9 A4 X Z5 J+ D/ p- ]% `8 j
{- ]5 o5 ?/ Q( R: C! a
// 对相应外设模块的使能也可以在 BootLoader 中完成
3 Z5 w ]7 \3 G1 a" w8 P. r" Z- Q // 使能 UART2 模块3 }. [: x, y: Y, |' [5 q1 {+ u
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( c. i2 w$ z6 t. ^
}% R, @# Y$ v0 a8 C8 s# p/ W. v
" K) }+ N% _1 T$ R8 _8 q: x/****************************************************************************/; q7 Q, S& C t: i8 k+ S
/* */
: c4 T! q( L+ b) B5 a6 y: O/* GPIO 管脚复用配置 */$ S# X& [# O; i
/* */1 V( h4 T4 q: X5 D5 k8 m' {
/****************************************************************************/
& f2 _( v/ A3 |% m, T7 Uvoid GPIOBankPinMuxSet(void)8 A2 f1 P5 l" i, X& E6 w# f% f4 `5 P8 J
{
, i3 w) \+ [/ h! c- h% A" G3 O // UART2 禁用流控
' Q, ~; _; n1 e9 M% a: U/ f. A- w UARTPinMuxSetup(2, FALSE);
; ?" z$ ?) O3 l2 ?: i}4 O# c, f1 c- L5 H# Q% C
) h: t, V. u+ ~/****************************************************************************/
/ v# I& ~5 P- S# j1 K, [$ J/* */
: q5 R. ~/ B+ Q' B& d0 f( j. G `/* ARM 中断初始化 */7 X+ R( N( Z$ [; t! ]4 m
/* */$ p9 a! C: h" B* l Q) V
/****************************************************************************/; \( f, @' w" ?' \; [! F6 R0 W
void InterruptInit(void)* K6 E, ^5 ~9 Y: i( B7 I5 P! f8 e
{
: k7 V) T/ n1 U1 ~% b% X n' `' z // 初始化 ARM 中断控制器
+ O9 j, i/ Q# d) J& D3 U4 E/ R w IntAINTCInit();
* V* c3 C/ L% j- j3 j* b- i1 J) ^, x' {; P, e1 Y
// 使能 IRQ(CPSR)2 h8 P, A9 O& N0 W5 h# y
IntMasterIRQEnable();* x K0 f! i: n7 ~1 s9 O/ y% a
) T9 Z6 y. y4 H) a
// 使能中断(AINTC GER)1 [2 G* f5 z5 }1 c; z' y4 ?; O
IntGlobalEnable();
/ C' P" j+ M2 e
- i7 F, m& T* C // 使能中断(AINTC HIER)
A9 R" Z5 L y' b5 m IntIRQEnable();
% P8 i; q5 v! i}
) e0 e# Y! X9 z @/ }! _
* l" ^7 {" e% B' `+ s/****************************************************************************// H; [4 ?( d% e. g8 k
/* */
" d# g0 c) M( W4 p- ?/* UART 初始化 */# y/ h0 v; ]9 f+ ]! l2 n5 e
/* */
+ n* B1 Y1 @: P, R' n/****************************************************************************/& g d' V4 R$ y9 P2 o1 F, W! c2 N
void UARTInit(void)
M) {1 h. W, \0 C+ t" X{. W5 O8 M J i. _4 ^' ^! h1 [8 D
// 配置 UART2 参数
& K+ Z& U, i6 c# i2 p# d // 波特率 115200 数据位 8 停止位 1 无校验位
; S4 @: h6 u& B4 a UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,/ B3 ~0 ^' S i3 Q! d; |
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);2 T. g$ U) I4 L' {+ n
// 使能 UART2
% z/ U) a, g7 {+ a& d7 y UARTEnable(SOC_UART_2_REGS);
+ k/ n ~3 e! U" W# m, |0 `' C1 S
2 F/ T# r6 Y) B; b+ @$ M2 J // 使能接收 / 发送 FIFO- S7 u/ l) T6 s* Q
UARTFIFOEnable(SOC_UART_2_REGS);; ~8 x( j- Y) r5 b7 I& R) w, o9 }
, ~, l' T, z1 l: ~6 ?5 {; W // 设置 FIFO 级别
1 p3 W" Z2 b: u: F; h UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" e/ ^- N! T4 z; @4 y' N! \
}
" q3 e4 X7 ?, V7 v n
/ ~" t2 f1 C. F/****************************************************************************/
1 H7 k& L7 y7 @/ o/* */
8 V. C( a& }+ I4 e/* UART 中断初始化 */
% s7 |" N, g6 M' E9 B% o/* */
5 e- c6 _) t+ E6 S. G/****************************************************************************/6 U! T- S4 F4 y5 R' c: y3 J
void UARTInterruptInit(void)* P/ A: _3 N) |. q. g) Q; B8 D
{+ U% w& {. R' ^/ t5 O
IntRegister(SYS_INT_UARTINT2, UARTIsr);* Y& P U |# N' R0 }
IntChannelSet(SYS_INT_UARTINT2, 2);5 F8 I* p* W6 {( c, i% q- U y
IntSystemEnable(SYS_INT_UARTINT2);
1 C, y+ e9 E: l2 j4 h6 r, z5 p. r j* I5 g0 G) Y; J: o3 I0 d2 B5 r$ R! }8 ]
// 使能中断
4 X' O0 k/ [7 w! \6 v6 } unsigned int intFlags = 0;
! B* C; P- E$ a9 d" P: p) @ intFlags |= (UART_INT_LINE_STAT | \
1 x+ J8 Q9 \/ v; C7 g! A UART_INT_TX_EMPTY | \
3 }! d& k: m3 t7 L# Q UART_INT_RXDATA_CTI);$ j4 l5 M! j- q1 w) O# p8 g: P$ p6 W
UARTIntEnable(SOC_UART_2_REGS, intFlags);
6 @/ f1 x: u4 g; d1 G% Y$ ]6 Q# `}) x, w, `. o* L
7 g; I+ c6 w2 j* S
/****************************************************************************/
( w! ~/ B' }5 q/* */
. Q( t8 J6 D+ ?, W4 S- u/* UART 中断服务函数 */
- T. O. w# D3 u& V/* */5 Y' g1 N5 a1 _4 h4 ~5 s' v
/****************************************************************************/
1 T3 q5 o, @3 u: R. r5 F: ^9 F( mvoid UARTIsr()
- `" M* h( \3 X) }! ]{7 z# p: n; Z2 h0 w$ k. P( w$ w
static unsigned int length = sizeof(txArray);
( Z% A0 Z+ h2 u! F6 S# E static unsigned int count = 0;+ Y) H! `5 m, r: o/ @6 z
unsigned char rxData = 0;
\2 F' q( B4 U: r* _ unsigned int int_id = 0; p# F0 a0 j5 \8 f2 o7 C5 c
( l5 Z4 b& u# } // 确定中断源
$ q! F( ?* c: [# ]0 s5 a' G int_id = UARTIntStatus(SOC_UART_2_REGS);
, U" U* y3 X# c! o# K4 M
3 u2 e4 J7 x0 s) M |0 O; s // 清除 UART2 系统中断. {/ m, `0 p& z% J F7 ^' I
IntSystemStatusClear(SYS_INT_UARTINT2);
) C7 D- a6 F3 R' X. ~# \) g6 v
" H$ K% h$ r: s$ h5 t( a // 发送中断
9 K9 P8 S$ f: H: ]' | s3 n! b if(UART_INTID_TX_EMPTY == int_id)
& g. j2 @/ Z- y! ~0 a7 t0 h {# \: c4 T; z, d
if(0 < length)
0 J" [- n3 b& }" z0 U {
4 J# G: k. D x5 L // 写一个字节到 THR. A- U u: q+ q; h8 y5 j! C3 M
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
. C! u, F9 w, B6 A* h) q length--;" Q, X8 }) s3 g% u& s* ]
count++;
% C6 e- e4 j( Z2 l1 c) L }
5 X% D5 e* j0 W. R4 x, w+ S if(0 == length)9 E$ b Y9 P/ X
{1 N- v% L T2 H: z; l
// 禁用发送中断( L9 o! G) e' {4 |" Z8 W
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
$ X6 I3 f/ e& N# F2 y6 F& G }
, ?! h- {& |( I3 Z }
( p( m; I$ ~! U, l0 Z, q* ]$ \
- f/ h. S7 \2 e8 j( D& U // 接收中断5 x* x& B; N* ^! |7 _. [ [
if(UART_INTID_RX_DATA == int_id)5 \- p4 |5 N8 R
{
" b8 S* q2 o5 { rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( L% g/ g( q* z8 }1 m* x6 K4 J; I* Q; Y" [ O7 \
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);+ q4 p8 q5 }) {$ {
}
6 E8 @7 }3 i0 m- F8 _# o9 q. A4 p5 A! x
// 接收错误
" D2 L: M! O1 ?' L Y if(UART_INTID_RX_LINE_STAT == int_id)
0 A- N9 N4 m" ^6 A$ ]* \: r, z {
+ W. l. B% ~" r( r0 { while(UARTRxErrorGet(SOC_UART_2_REGS))
5 x V* h" M( K4 o) g8 ?6 _- ~ {
: x5 l, T; O$ N9 G! R // 从 RBR 读一个字节
* I0 S( k/ {7 F" v UARTCharGetNonBlocking(SOC_UART_2_REGS);
" J6 _- W* d3 J* J6 E }
4 q/ F4 n; i0 \7 s }
4 Z+ a2 S# k. ?2 \ X9 B 1 V! Z# k Y. Q% J; N
return;
) F3 |' c) B9 `' ?}1 w; T! ?: l" x
|
|