|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。. ]5 y5 |) ?0 L! H" _/ \) f$ U6 @: o& U
, J8 V+ [. E4 j$ U) f3 a, W8 ` o#include "TL138.h" // 创龙 TL138 开发板相关声明
1 o# f: s; k' ~: O' A8 w
9 X, @/ C; G1 ^: ]2 t#include "hw_types.h" // 宏命令8 J1 C* v6 k: H( U
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器$ l L- B% W* T* M& K* }
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器# E# i* o2 ^. Y' R
& G- A' L0 F1 A#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
& U0 A* X5 i% P& I" o% O#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 T7 k! g- i {, w/ U: }#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
$ x. C) ^( [7 E- K7 {#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义" o5 R7 A1 W* N1 Y5 x) Q m1 |
2 ]2 b) g. A' m/ G/ t* A K
/****************************************************************************/
( B$ x& Y% s+ r* ?3 A" U8 h" b/* */: C/ A: K( @& G: v$ X
/* 宏定义 */. m# [9 c: G& o" ^% j5 T( l
/* */; a7 r: S* M/ y+ h
/****************************************************************************/
* J) s8 n3 h8 H _ r1 [& a$ V// 时钟0 Q9 A0 {1 m8 C% t x
#define SYSCLK_1_FREQ (456000000)
. T8 i/ U5 `/ U% g W, d#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
/ r: N+ }+ ]8 @. {#define UART_2_FREQ (SYSCLK_2_FREQ)
, W) D2 |) G" r9 P7 @7 C( M7 p. Z4 K$ v- ]/ `
/****************************************************************************/5 Y' n3 b8 m. N6 r0 e
/* */8 P. Q7 p# @. z
/* 全局变量 *// t: P& I; P0 a4 w# i4 |1 m; T
/* */
0 o" {& \% M! k" G- [. }, u5 |/****************************************************************************/
- |; \ v# k* b2 s# \! u0 l3 R" j* Bchar txArray[] = "Tronlong UART2 Application......\n\r";! H4 s; x: H7 A" m- M$ u+ `
+ Z7 ~. ~" W/ s$ F# z" s0 U9 |: q/****************************************************************************/
2 D. Y+ X" E) l3 J/* */, |+ U% ]' ^2 f; F% d' I
/* 函数声明 */
& k# d; d; S6 |/* */0 _/ x- P s% R; _
/****************************************************************************/- ?( p% j* {7 u& h8 z [
// 外设使能配置4 N' k7 N; h% k) l6 X& A
void PSCInit(void);
, H1 O0 T& `" T
; T G2 y% ?4 t, L7 Q// GPIO 管脚复用配置
* d$ B `2 i5 F( K& Q* nvoid GPIOBankPinMuxSet();
$ e5 A4 `1 [& f- ^2 \- o" L; z Y* h# m0 S
// UART 初始化
" S3 A* @/ h+ C @! F( N" w2 |void UARTInit(void);! r: J, D8 V! b2 S9 B$ P; b
// ARM 中断初始化1 l) `- f/ i- \6 Y7 u: p- \
void InterruptInit(void);
: L% X/ `) J9 [! m- k, H; g. o3 s// UART 中断初始化8 E9 |9 }, ?* T/ g
void UARTInterruptInit();
A" c6 W- f% |; E; g, w// UART 中断服务函数5 n6 p B: Y2 r
void UARTIsr(void);3 {# [8 \& n' {7 l- J5 [7 t
0 g" f" w: m. y* |; {& f6 [ [9 L/****************************************************************************/
! K0 v8 F, Y# `9 Y2 B! ?) B/* */$ h$ X0 r- H+ j/ ~ W) z
/* 主函数 */* B9 v( H t4 o( C9 B
/* */
; B2 ]$ C# ~" Q" Y; t2 ]& ~ W8 y/****************************************************************************/
- K: s& R: V- aint main(void)+ f3 P, W2 a$ c
{9 }4 b5 A8 B! E" [
// 外设使能配置" ^& Q2 e) }! Z
PSCInit();, A* Q4 ~% c. \$ I
5 ], p+ `8 z; t9 y, ~2 g // GPIO 管脚复用配置: O$ V1 [$ v4 _+ g+ @9 ?$ V. d7 v
GPIOBankPinMuxSet();
P6 ^+ ?' K8 |) U, `+ B1 F- A: ]; j
// ARM 中断初始化7 P1 s% r i2 ?0 h1 f
InterruptInit();
- B' m8 g- ^! ?7 _/ l
7 G, S% e% x' r, | // UART 初始化
0 S; J" X! u; s8 A1 W UARTInit();& Y0 Z; B N# y* A) S
6 `* j% E* K6 u- C% ` // UART 中断初始化+ g: \/ f* b' O) h. ]
UARTInterruptInit();- z* D& G# g0 J- B0 B1 L4 o
" C" C! H8 Q4 C$ _6 k+ K7 [
// 主循环
: m9 j7 _+ M% L for(;;)
- r0 t" k& R& n [% I4 f: o {
5 \6 a6 z- C$ `: D7 V2 E5 e6 M! I
}0 Z; J4 ^4 A4 {5 @- Q
}
% }/ J' q1 L* r# e5 j) \) a0 V/ Q) |$ _4 v0 B! Y) P7 q0 |8 B
/****************************************************************************/
2 F- A/ i- A, l- L* t% j/* */
0 V# h6 B1 F) K7 n( a3 }; F/* PSC 初始化 */
4 q @/ s* ~0 k% ~" W# M/* */' Q' X3 b9 M# [4 Y' I
/****************************************************************************/9 J- f6 M6 e/ c, f
void PSCInit(void)
( x% r0 P* k2 U9 T0 A{
7 D7 ?2 B3 S; S- j; D! ^3 a // 对相应外设模块的使能也可以在 BootLoader 中完成
% \& L0 x% K4 P z0 o // 使能 UART2 模块7 {# K& e$ w* L. P7 Y7 h
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
5 x j' `" b6 ^! u}
" {. `% C% F( h4 @; y+ M) }2 p8 x; x* |# C5 N [
/****************************************************************************/+ f3 d, d7 s, I: `4 C( W
/* */: H& [/ j. m0 x
/* GPIO 管脚复用配置 */. E+ @* b7 C! u+ Q! [, V' q
/* */
e$ _1 U4 K0 g4 x5 T/****************************************************************************// u$ p! w# t% j
void GPIOBankPinMuxSet(void)
+ w* k# r& }! s5 l; R, V G! n{' R9 n# ^& e( t7 x" m( V4 J
// UART2 禁用流控8 k b3 f T/ @$ e
UARTPinMuxSetup(2, FALSE);
% u+ H$ N- s; e& C' M}' \( O* F( S0 n7 a
) q! `5 q5 y( i E5 a. s; X F$ T
/****************************************************************************/
; @% _: p# T2 x5 G0 R! f3 q' k$ v/* */
; E) P0 c' A0 q+ _) f( R* H4 C/* ARM 中断初始化 */& { d6 J+ R* n. S7 l
/* */$ `5 j2 Y6 i/ {$ H# p
/****************************************************************************/9 g" I* A6 }% Z! b7 B: S
void InterruptInit(void)
7 B, G+ Y* T9 N4 N4 r. }{
5 L0 u4 @7 w5 W" p d+ @& { // 初始化 ARM 中断控制器* N3 S& L7 ^, B; l& \; v7 m+ D
IntAINTCInit();
+ G8 S; }% b1 ]: v5 {5 J; j/ m+ @4 ?- X2 v; `* b
// 使能 IRQ(CPSR); [) x9 V; y: y
IntMasterIRQEnable();
7 t$ V5 v6 s! ^2 V4 r: h( e: h
1 i% \6 l% T- K // 使能中断(AINTC GER); u& J7 E3 ^" T; |# \& ^2 z
IntGlobalEnable();
. u/ `: |) i8 h+ \, R& F* N- C& X. f% K3 |: s
// 使能中断(AINTC HIER)( L6 v. |% |- ^* c2 H' F8 D- x( x, w
IntIRQEnable();
8 \' H7 P8 ?9 _1 P}- ~" s# x) m8 c" v ]" ~8 T/ Z
/ F. ?1 K0 G( Q& n. h. D
/****************************************************************************/
- S7 p7 ?- ~" M$ U% {7 Z3 y/* */
# d) P. U* T; R6 C; A' C/* UART 初始化 */# N3 f! `2 z- L4 d1 L) c
/* */
# M; E' ]. h! {% G/****************************************************************************/
3 ~9 m# R- F# [7 C3 e3 ivoid UARTInit(void)
# H, f' `7 j! o9 d z ^( E{
. t. p7 K( P5 b- g, K // 配置 UART2 参数, p9 s, B5 v8 B
// 波特率 115200 数据位 8 停止位 1 无校验位
% u+ V+ H0 f& L6 J2 X UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,9 |8 a* G; |9 ]2 A6 m( _4 x: X
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);5 S a4 ?# x v- a
// 使能 UART2
( o. h, [! B' h8 \6 `! U UARTEnable(SOC_UART_2_REGS);9 \- f( ?* f7 a) c6 Y! E
7 \' j$ n6 x! M4 h) u5 [ // 使能接收 / 发送 FIFO
* v" p* ?5 [* V; [/ z! S UARTFIFOEnable(SOC_UART_2_REGS);
& R' t5 p6 T Y9 w; b: a
! o" B( q/ S6 z$ f+ ^) t, f7 V // 设置 FIFO 级别
; | Z7 B& g3 }0 E7 v" z6 q UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 }6 f3 I( p# z! n" B; q}8 G* R* M4 V! E7 x# d
5 O; T# O# Z k' {1 s& f, a
/****************************************************************************/% E8 o' B; e' W5 D5 e
/* */7 U: O) D2 ^# b3 @" e
/* UART 中断初始化 */" K+ |6 K1 Q6 ~0 U6 F
/* */
; y# ]7 j( U5 A9 f! [9 k" q" m! \( ?/****************************************************************************/
d/ l+ a* {. z) U" T/ M3 S# E1 gvoid UARTInterruptInit(void)
" ]4 a" G" E! T5 ~0 x% ?# }{
: A& G5 j5 y% f. F8 w! R+ z IntRegister(SYS_INT_UARTINT2, UARTIsr);
" E7 _3 x! _! S: f8 |! N IntChannelSet(SYS_INT_UARTINT2, 2);
3 W9 c! Y& G0 S' S8 N IntSystemEnable(SYS_INT_UARTINT2);% m. o9 ~# L1 r. k
* a8 G- [2 [' b0 z+ x6 r- p5 R
// 使能中断
+ ~5 w3 s. l2 v6 e5 X/ I8 E unsigned int intFlags = 0;
. j* R, S+ D A! V5 K/ j% S intFlags |= (UART_INT_LINE_STAT | \2 L. o# e* A5 N0 N' N
UART_INT_TX_EMPTY | \$ b: e( w0 }' o2 ?
UART_INT_RXDATA_CTI);
( H/ }& ?( U8 H7 ^! d UARTIntEnable(SOC_UART_2_REGS, intFlags);
- e, i* z B( e$ C}
% j' e" R6 N: f# L
' z3 V! i" w* ?& }* @$ ]/****************************************************************************/
. v" M, L$ n; m$ Q1 E, L+ m ]/* */6 ?* J5 r# c- V+ W! n
/* UART 中断服务函数 */
$ S4 O) u' |& @4 u2 x6 b6 U: m/* */
0 Q1 ^9 W/ I: C9 I1 I) v5 }/****************************************************************************/% Z$ g+ ` x: E; T6 L7 D; }( l" }
void UARTIsr()
7 p B7 `; R! Q0 W" u{# ^* x& f$ u& c8 _3 H4 E
static unsigned int length = sizeof(txArray);- `2 |6 h" ]# T) p! T' K) {+ h
static unsigned int count = 0;1 h0 s7 Y5 F7 D; S2 q% [
unsigned char rxData = 0;
2 f- v# Y6 X Q7 k* R3 v; b, j unsigned int int_id = 0;
0 Z; z0 |5 Z7 x8 A: C0 Q
( r" A8 t4 A. d: q+ c1 ]8 i // 确定中断源
% \ o% ]- [; Q5 d- r) e5 B" I int_id = UARTIntStatus(SOC_UART_2_REGS);! t9 j& T5 v* I2 _
: l# Z5 v! R- H' a
// 清除 UART2 系统中断3 E3 u, p7 V! A% g+ Q8 \% \0 E
IntSystemStatusClear(SYS_INT_UARTINT2);
- Y0 E8 r$ g* |# \5 M6 d2 s/ D- ?! |4 @, j
// 发送中断
* `7 g2 S$ N5 b0 z) o, D! g2 A" d if(UART_INTID_TX_EMPTY == int_id)
% X6 A7 X* L# K. k {
! p2 z( F3 O* u! q& _: Q if(0 < length)
6 D; \, ~ i! O4 x; J% I {
; u" H$ k4 j! U1 o3 c- S$ F // 写一个字节到 THR, B9 ` r1 @! {# }& ?/ v9 P4 u
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);, x& M5 f0 M( ^( ~6 \
length--;3 M4 c. w, G" O1 k S* V
count++;
3 z$ z" W7 B" K1 U }
" G' c2 @% d Y2 c0 P if(0 == length)8 B7 O ?- a a% l/ ~
{( l- ^! a) T. s. Q
// 禁用发送中断
& h- _+ i8 v: n! A) {2 I$ c UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
$ q9 d: m+ T% a" S- T }- T U/ m# N# [9 S8 W3 s/ y7 D; G
}
- N, x% Q$ e& a+ M; E L' B+ @ t3 l J
// 接收中断
* t1 [$ ~, T9 f5 p/ Q if(UART_INTID_RX_DATA == int_id)0 ]: F$ A6 J" E1 N
{
0 j, O j! A9 m h rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
- x+ `4 B3 X! q* @8 x; S1 n& {! w. y D2 X" p" v4 s2 h
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
& t8 o2 T" z: B1 ~* E }
% B0 e( X$ C9 X9 L" d
' n" s- z: ]9 i' |$ w9 p // 接收错误2 ^' R5 _& u# g5 l% R+ v; ~/ u- ]
if(UART_INTID_RX_LINE_STAT == int_id)
; x5 _, g8 R' v( _: V {& @0 Q9 Y4 ~" i$ W6 g* |# n
while(UARTRxErrorGet(SOC_UART_2_REGS))) n$ m! U' m9 T& b6 Y
{
, w6 A3 V9 E; i6 ]* b: _ // 从 RBR 读一个字节# ~1 k v* b) i$ r. z/ Z: S N
UARTCharGetNonBlocking(SOC_UART_2_REGS);. L! @! ]) v+ `, L
}4 a4 Z- a: m& D: ~7 x. T% R
}
) D: K$ v& Y0 u3 }% O) d' v/ k
, a e+ g% s. R4 n6 q return;: Q0 O* f' {; h, |
}
# F' ^6 L0 ?8 C" v% j |
|