|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ E0 k- V2 a& E# F$ Z0 T7 g, z% q% ^! @6 n
#include "TL138.h" // 创龙 TL138 开发板相关声明6 h( c! _6 o4 k
/ U( d/ C; a' S$ ~6 I2 ~6 d
#include "hw_types.h" // 宏命令
$ G2 }; S8 M, I#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器* d# X5 \, t3 V9 ]7 h6 n$ O- v
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器) `2 s: e, l" M
; T& k6 B) O3 c1 V2 s
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明- l5 L+ K7 c* I+ P; \* x$ Y
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
2 ?5 q- R1 `1 [8 h1 ?0 o#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
5 O! _/ G$ C- j: D' H, _#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义% Y6 E7 M+ a! Y9 D& s2 ~
0 |1 ^& f5 ^1 \6 n. o
/****************************************************************************/
% r% f& v1 ~4 k4 l/ C8 h% F/* */
: s( \! o2 y4 f/* 宏定义 */
5 w! N1 i+ L. P6 W/* */
8 t& S+ T6 v, X1 H& o+ C/****************************************************************************/
& a& c* _# ~2 K4 o5 I' V; i8 K// 时钟9 a- F# j8 _4 }/ ^- O
#define SYSCLK_1_FREQ (456000000)
& W0 {9 e' n# J% R2 C% F#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)1 D' A2 Q& r, p. k6 z
#define UART_2_FREQ (SYSCLK_2_FREQ)/ M. S. Z/ F2 D. S) d* D
& d7 m/ g4 N/ k; G5 [% q8 c/****************************************************************************/
3 m. r* a! }$ X6 B; }1 y) G3 `8 _. N/* */
! }) ]; H6 J% n! @) I/* 全局变量 */; j2 J0 r+ o6 B% G) E7 d
/* */ E7 a2 _5 \ ]; v6 u, m, D
/****************************************************************************/! t' A \7 x% D
char txArray[] = "Tronlong UART2 Application......\n\r";
! x S B& B# I$ A u. W- ~1 T0 p4 e
/****************************************************************************/
; W0 i- m- ]5 g& D/* */
+ K z- _1 s2 Y/* 函数声明 */
# A7 d2 f3 X( q/* */: J0 r* e) E9 E9 ~9 o4 W; ]7 ^
/****************************************************************************/' I7 h; q# } |, C
// 外设使能配置7 P+ |$ c) z7 G* E- B
void PSCInit(void);
$ ^. S; i4 h2 y' ] X: U' I" r1 M; p: C2 F
// GPIO 管脚复用配置
7 E1 ~8 G8 b) K% Kvoid GPIOBankPinMuxSet();3 X9 v* K, E# {2 Y* [, N/ R5 T
( o) p, @9 q$ U- q& @; M
// UART 初始化
' t' k8 J; r6 b$ O' [void UARTInit(void);7 }0 d% @0 U5 S) N1 S
// ARM 中断初始化: F% B3 m# H4 Z
void InterruptInit(void);
+ }/ s8 I) l& `0 {) E// UART 中断初始化. [. {# t6 H2 P- D; H
void UARTInterruptInit();
# `5 R9 {5 L/ {7 K: _2 `% U% w4 G// UART 中断服务函数
' M" A& c$ U9 O- W) D9 C9 Cvoid UARTIsr(void);4 m3 Z9 G, P& ^. T
! `% s+ E' T8 Z$ z2 s6 b, G/****************************************************************************/3 k4 k( o! r' a2 ~( r0 j: t
/* */
3 U8 I E2 Y# ^/ ~. \' s2 ]! P/* 主函数 */* ]9 b' \+ p- ^; [/ r" v
/* */# N" {* u4 r" K) h% G
/****************************************************************************/
) [5 r6 q# c+ C7 v. f6 Pint main(void)0 w/ `- w. h( P: t4 [7 x) K" B
{
& f* o3 g! ~* w. c$ r/ ~ p) i" s // 外设使能配置" d+ d8 C( h8 @+ z% L/ S2 ]
PSCInit();
8 ^3 i# {% i' ? 1 M# P3 [8 A9 Z, n, @6 d. w# f
// GPIO 管脚复用配置; E. X) W. Y3 t* C e
GPIOBankPinMuxSet();1 N; \; G5 n$ O5 [
6 s* K% y* V( u/ e) i9 N+ E // ARM 中断初始化& P5 J V+ t" ?/ _
InterruptInit();
9 z, J: j1 b1 n- u5 n# l+ n i' r, R2 ~( F0 h: Y' G0 \
// UART 初始化
( k% B$ }+ I7 T1 F; y* ?: M UARTInit();$ g- C5 t: J, R* M& ]" n
. ?: X9 y4 [# J$ I5 n& f" M$ A/ B+ s // UART 中断初始化/ h4 g r) o- q! l( C- g6 d
UARTInterruptInit();
- O! G# W9 a! f9 R' g1 W* A4 n) K5 ]0 v8 t9 {! w
// 主循环
7 U9 m, J4 k. P5 V, I0 Z! o; [7 f for(;;)
* W" r& H! Q& | {% ? d+ m9 z+ {& U
8 E- z, t Z3 e; z' d& {8 U }5 M, W: Z7 v+ j
}
; l. j. ~. r+ T: k' [3 L
' H0 t% l" I8 N' O1 a/****************************************************************************/
7 m0 ?1 K+ r: P9 ~/* */
" @; e. b- u3 D- D6 \" B/* PSC 初始化 */: \% K- s3 N1 i2 k7 Y3 n4 V
/* */
* |! `% A; i0 Y7 o9 T/****************************************************************************/
# M9 N1 v' x, d+ u$ b) [7 f$ @$ Pvoid PSCInit(void)
! g: q* k+ i' \5 k; ^{
5 Q! y, W: K. ~ // 对相应外设模块的使能也可以在 BootLoader 中完成
# H% Q5 a% o4 g // 使能 UART2 模块* k a# W, X# G8 _/ K& r* V
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; [, N) X- l( v; e3 j, C}
) E" L) C4 I: L, G- Z8 |
; Q6 ~1 S! [; F" B7 k0 r( J3 [/****************************************************************************/# C/ P# ?5 m0 t0 x0 r
/* */
* w+ f8 M0 M, K: D% x0 ~/* GPIO 管脚复用配置 */5 P2 J7 V1 {- f' }+ t" Q9 J+ \
/* */
+ D) k9 k; W5 d5 ]/****************************************************************************/7 f! d8 ]. Z& G- T1 |
void GPIOBankPinMuxSet(void)1 ^/ Y0 N. T& G+ B1 K* x8 R+ w/ t
{
% z. ^+ {& ~- ]# U( [; y; q4 r // UART2 禁用流控
; ^& L; b! ^. @, m UARTPinMuxSetup(2, FALSE);# [. x! C& r7 T+ @) G
}4 b0 F5 `( m- a4 I3 l( K" z
( ^$ M; y+ t1 n- r- e2 o/****************************************************************************/
! W5 Y& r4 W8 P: v* {( f/* */( s+ ^: R3 z- I2 B+ k: W6 S" q
/* ARM 中断初始化 */) `+ {5 G% I/ i% h
/* */! u& e8 `1 n' Q2 T; [. w, g( X
/****************************************************************************/" p& R8 S4 {1 e. K- t6 H2 f4 ~
void InterruptInit(void)
# x3 f8 }/ N2 p{, ]4 h: U3 Z" W' h& L5 d
// 初始化 ARM 中断控制器4 W Z& C: k' E3 U9 t" `$ p
IntAINTCInit();
* @2 I1 F- v9 D& a& c3 {( j+ A9 ~
// 使能 IRQ(CPSR)
4 b1 v! [! T# x0 J% ^ IntMasterIRQEnable();
' l2 G2 R; O0 p' Z: e; e
0 p8 g3 v$ U, }0 @; W1 D // 使能中断(AINTC GER)9 ?8 W- H/ z/ {! j/ Z G
IntGlobalEnable();
; E" B; [; O- W M3 S) W' S6 |6 L, I& f2 j* Q! U+ F- G
// 使能中断(AINTC HIER)- w q+ g# a/ r; _3 z3 [
IntIRQEnable();6 P9 U& V) J0 Z! t9 r$ k
}
9 B. X- U7 q3 A3 a2 f* K: I/ {/ O% Z2 h+ R
/****************************************************************************/2 v+ R7 ?/ K+ V& ~+ `
/* */6 t6 T7 h) k# d. j. c' @5 g
/* UART 初始化 */
3 j8 J$ u3 J& ^) i; x% k3 m6 D. q/* */9 o' a) f5 }2 B! L
/****************************************************************************/
" y# P2 I c- x) Jvoid UARTInit(void)& n0 u: b7 _8 h
{3 q4 i5 _0 c* h. @& Z! v
// 配置 UART2 参数& C" f* }1 Y) D* H" t5 R8 m
// 波特率 115200 数据位 8 停止位 1 无校验位+ _: Y+ G# R' B3 M7 l
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,6 h4 m1 E# K5 W8 s1 _' S+ k; H
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" L0 o$ q- e; r# I // 使能 UART20 F; e) ^$ u# V! \
UARTEnable(SOC_UART_2_REGS);
# u: [" Z# X& z5 x. e3 S# S, f; N) U5 E1 `6 S3 t/ G
// 使能接收 / 发送 FIFO* K2 q" |% x" A* W
UARTFIFOEnable(SOC_UART_2_REGS);1 r- N; a- u1 P4 Y8 B- u
: ]! _3 j+ x, w2 r, n5 J+ O
// 设置 FIFO 级别6 x! m( l4 Z: i. `$ j& j- d
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);8 q; ]- n }. i
}
7 j6 l, T- J r$ [+ J* U( ?2 M; n& h5 L& C" k5 t
/****************************************************************************/5 V$ g6 i0 U+ C, K* L' I u# n: J
/* */
& s% d( U, r- w X) C# Q% u& W k/* UART 中断初始化 */& r" z% h N- U. j5 V! _6 K" y: f
/* */
{9 ^0 n" l4 D" L1 M6 z/****************************************************************************/
5 g* {& H# X+ `8 U {# h6 a6 x9 Nvoid UARTInterruptInit(void)7 U7 ?4 }. Y" F+ `, l
{
, L6 Z& ~* j- M( R, \ IntRegister(SYS_INT_UARTINT2, UARTIsr);" r$ s7 T- Y& _, U8 t0 D: p( [6 g
IntChannelSet(SYS_INT_UARTINT2, 2);5 _$ e5 f. V4 M6 Z, ^, G
IntSystemEnable(SYS_INT_UARTINT2);/ Q% s! f! q8 P/ X
3 n: V, w0 r2 }6 ~
// 使能中断" }0 G; L w w3 l
unsigned int intFlags = 0;/ m& r9 z7 j/ m- ?) g/ N
intFlags |= (UART_INT_LINE_STAT | \7 d' p4 [0 q* p) ^: \+ `
UART_INT_TX_EMPTY | \, W3 h% d5 t s0 [
UART_INT_RXDATA_CTI);- L# f3 I$ }; [% m3 |+ B
UARTIntEnable(SOC_UART_2_REGS, intFlags);
& t* E$ a% u% K8 [$ s}
5 j: l, m& O/ O
* A5 P9 j- I" P7 R: K4 Y/****************************************************************************/
- H9 m; e6 A; Y* V' {0 P( a8 h3 z/* */; j8 v+ h2 E/ s9 B3 O5 M Q/ _% `
/* UART 中断服务函数 */
3 {3 W5 u8 b4 h8 t- q, _+ J0 N( B2 H/* */* }, {! ^$ S/ n3 d, Y* _; |0 c) p
/****************************************************************************// E' h0 t; m$ \) ]7 K
void UARTIsr()
b1 q6 T: N+ \; S{
N2 x. b6 R+ S* L static unsigned int length = sizeof(txArray);
" u6 J# N2 x7 `& F static unsigned int count = 0;
3 S; R. _8 K% i; x' W" U4 q( i unsigned char rxData = 0;
* X8 \& r. N9 S7 Y" j6 R unsigned int int_id = 0;- S2 [4 F- d6 E
* Y+ B* d" Y5 A, s9 M4 M0 m! D4 A // 确定中断源& X8 M3 V+ L6 _* |5 n' w, F A
int_id = UARTIntStatus(SOC_UART_2_REGS);
% G b9 r* p3 A! M: w
; k% }9 s; k* [. p0 H) R // 清除 UART2 系统中断1 w' ^$ k8 Z7 F+ O$ _1 N2 R* {+ a
IntSystemStatusClear(SYS_INT_UARTINT2);
, X6 ?: E# ?) i6 _ b
, u# C7 T; }) i: W8 I // 发送中断
/ k+ u8 y4 t( @% e0 T1 n* I+ n1 z% X0 n if(UART_INTID_TX_EMPTY == int_id)/ N. R" ~. U" o$ x- T/ \' S4 @
{# I3 k# z4 W& l% y4 ^4 R/ M! c
if(0 < length)
1 s; p# z% ^1 I% | C1 a {
2 ?. [) k9 b1 L, f. M( `$ y6 [) v // 写一个字节到 THR$ H) g2 Z9 k! K
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- @( l5 S1 b4 v
length--;
% i' V7 a# n+ \* q2 J" B8 | count++;( ?3 w- p. y! b5 _- |% p
}
* v+ l$ O5 d: D9 n, g* a3 E9 ^! i3 J if(0 == length)1 J* y6 ^& H/ ^) G6 U4 e" T3 P2 a
{
/ D9 N2 |7 m+ m$ v9 O // 禁用发送中断4 }- ?. }: n! a' j
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);0 _2 L* g% Y7 t. H" x1 e; P4 ?, `
}
5 {5 M8 [, ~6 b$ Q) K }
; a% A& Y! M2 Q1 a4 A
3 c& w4 n2 W# h$ W // 接收中断
2 Z$ C# Q/ z) V$ g if(UART_INTID_RX_DATA == int_id)
2 Z, M' Y, ^4 Z/ K2 R9 G {. p0 C, i1 _3 {6 v; `' f
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ }. m" V+ K7 @" L( y0 j8 [3 X/ @5 O1 b# Z- ~/ U! R9 c: R
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);% q/ M5 N/ i2 P S& x: A9 G: q. {
}7 S# |; b; |' _2 F0 @& ]
8 t, Q$ X$ e) d M1 p' g
// 接收错误
( V$ T1 _5 c* @1 Z, z( M) H if(UART_INTID_RX_LINE_STAT == int_id)
7 j4 d* y/ n% Q {" y7 c p/ q/ }' S4 K$ `
while(UARTRxErrorGet(SOC_UART_2_REGS))
( ?, G- h, U2 H {
6 ~3 E* j/ B) ]7 L- J# D // 从 RBR 读一个字节
$ D$ X" @+ ^7 t2 F- Z UARTCharGetNonBlocking(SOC_UART_2_REGS);( H9 J- Q2 D. j
}
* ^( K3 ^& X- k7 X/ S6 `/ U! v }
$ o1 c" y$ P* f) V0 a6 E
: \3 t4 L! T" Y" U" l- w; G return;$ O5 M5 E; e5 f0 v8 b
}; f6 v5 \* Y0 @6 u0 A/ u( g
|
|