|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
, g+ j }% \, X. F' F
9 S# J* y+ _8 B3 U' e/ f% a z/ E3 k#include "TL138.h" // 创龙 TL138 开发板相关声明) K7 E9 {8 o S: x) ^7 o% X, F ?
% i1 |4 y1 Z( j$ ^: u' Z
#include "hw_types.h" // 宏命令/ Y' l0 O8 y3 E
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 m `/ S+ J% ^( }#include "soc_OMAPL138.h" // OMAPL138 外设寄存器8 G3 N# `. m2 E5 f! m8 o
! G- N6 K* t2 R& ~. y+ u#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明9 w. U$ T3 ` f4 V# D2 s
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
1 ?4 l, c5 z# v' p& E* A# S( i#include "uart.h" // 通用异步串口宏及设备抽象层函数声明; N" ^% f+ I# W4 H' l) h# e
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
+ i) U9 \ g5 r; S! p5 ` f$ X
$ O3 K/ |, ~# ^7 p1 S' @4 @$ E9 `4 O/****************************************************************************/# [ Q# \2 N6 ]0 r/ r& Q/ n7 H
/* */
& @8 m& P f" G1 k3 [1 G; a/* 宏定义 */
2 e& _, Y. `% w) C) ]1 }$ ?4 h/* */1 I$ _) ^+ N4 `" H$ I
/****************************************************************************/ l2 h$ x- ?6 [5 [
// 时钟0 [# x- C( }, I$ w
#define SYSCLK_1_FREQ (456000000)2 Q; Y- @2 U1 e& C0 R; M n: a
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)+ w* b4 W) M4 R3 ^8 @$ P1 \
#define UART_2_FREQ (SYSCLK_2_FREQ)
% h# o$ Z% a, W+ Z, y3 _' Z y. g) T* S1 ~1 h
/****************************************************************************/
+ J- H* S' t$ R& J( {/* */
0 a8 _: g6 C- Q4 K7 [/* 全局变量 */
, G* i0 S& l- ]9 |/* */
( Y Y4 J7 o P& D! w! `/****************************************************************************/# ^% v9 Z+ I! z6 D- S
char txArray[] = "Tronlong UART2 Application......\n\r";) [! D5 l' R$ w/ W) a" m
! \ z( `4 C+ S$ M/ z
/****************************************************************************/" j6 ^3 d5 S% j8 A. f
/* */# q" s- E- \4 }' q/ s7 V, r
/* 函数声明 */
8 R G/ o) i8 O/* */
5 J; F; D. d) W, V6 T4 t/****************************************************************************/# x+ K9 x* r' l1 U
// 外设使能配置
! k8 |6 |0 S7 ~' r" ], Tvoid PSCInit(void);
& H& M2 k6 M! [: U2 N. P2 `7 q* q0 K! s( d
// GPIO 管脚复用配置
9 Y1 v% Y. a# ?3 A1 fvoid GPIOBankPinMuxSet();
, G2 S5 o& ?' E8 u3 F; `3 [. H7 C( @* Y0 D
// UART 初始化
2 w! v0 {" {; D2 fvoid UARTInit(void);
" n* w/ v8 o7 |( j// ARM 中断初始化
2 I% ~4 X4 E- m$ Svoid InterruptInit(void);
& N3 D( ~0 j! I7 J. `- t) W" _. n// UART 中断初始化
. V# D; {, w4 _* I' o6 W+ I& Yvoid UARTInterruptInit();2 L9 N) e. r9 n7 s6 S( e( ]
// UART 中断服务函数
# Z: |+ P3 T& Q) G) a2 qvoid UARTIsr(void);7 \1 ]5 r" C6 o; F
: D# s% C) q+ [% c/****************************************************************************/
/ Q0 x: d3 y- ~( X$ z8 ?# I) k' A) Z/* */
0 l# |+ c1 c5 A8 w% X5 V, }/* 主函数 */
$ T# ~ a7 W% b/ M7 |% Y3 d/* */& a7 @! L3 E& s& e5 ]
/****************************************************************************/; w0 h; r4 U& @* X* p. ^
int main(void)3 p1 O" K8 x; r7 G
{ S8 u4 P& R1 ^. p, n/ c2 U
// 外设使能配置
; A% j5 I4 W4 S$ G- b/ H( s# c& C PSCInit();
' H! D+ b: x% m( {
4 P; r) j ]6 N6 I$ c: K1 R* z // GPIO 管脚复用配置4 ^2 u! l3 \( [: t$ P( Z
GPIOBankPinMuxSet();5 J5 L2 I) b) V
" A% n+ w# [3 t5 Q& o
// ARM 中断初始化
& u' T9 s+ [$ L7 s InterruptInit();
" L. E- `- r N' @
3 V) t* a3 T- Y# M // UART 初始化
, ?5 z% H) i. U- C/ @- Y UARTInit();. H$ S; N& P. h6 s$ m
! d' D# {( m8 q B: G0 a/ t- z
// UART 中断初始化
# i2 E% J) ?& ]; i% b UARTInterruptInit();
, \+ d- P' \' _! S; z
2 L# K7 o) u- V$ {% ^7 W5 D // 主循环0 w, V* p9 ^7 y3 A/ q2 }* R6 i
for(;;)
C4 i; I. a! T/ h1 x1 v1 h {
: I7 l- M* T7 e* t R, @% e5 |2 q( F r/ q
}
$ j( m' k5 u) T/ `- {6 g* {) y# E}
' P& F" ]- f& l: w7 N/ x
/ }4 W# d! j& c* {6 [3 x+ i/****************************************************************************/0 G; N* }0 d& `$ Y2 Y% a. t# a- V$ ~
/* */
, C* u& x; v4 x0 T! H/* PSC 初始化 */
; D; Y E) e% {( X* d" @ {& A4 p" T/* */ I! r8 I$ T4 s7 B3 f) P& f! e% Z
/****************************************************************************/" ~* z" M8 R4 e1 d' M
void PSCInit(void)
7 E* `! [+ d- \$ a ?! w# a- O{' g# ]+ i9 {6 W* W% z
// 对相应外设模块的使能也可以在 BootLoader 中完成5 c8 j- c3 f3 k% S
// 使能 UART2 模块
0 H/ N% B& F# Y8 O: ?. U PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
{* }1 q: T. \# W1 P}
& n# d# E( v+ s2 [; X
; X. i+ `5 @. y& W' L+ F9 w# k/****************************************************************************/
, n9 F- D) e! V5 Q/* */1 s Q7 M/ d( T. g( G
/* GPIO 管脚复用配置 */ q" G) V$ V/ c/ K
/* */
# C N: O9 C7 q3 D- m/****************************************************************************/* l' U3 d e' A+ m0 O
void GPIOBankPinMuxSet(void)6 Y& C9 Y2 H" \/ P" H
{ R. e9 J7 r" g' i3 \
// UART2 禁用流控7 i% t* y* k8 S. k7 m
UARTPinMuxSetup(2, FALSE);
. `9 J( @1 K2 q) l+ N2 A}
4 L' ^9 M$ E) e. t) U
}: U; @6 A' }5 Q T. |/****************************************************************************/
1 E/ ]- P0 r- D( w( C, X/* */4 p1 \' I% F3 J" R/ @
/* ARM 中断初始化 */
+ `9 M* v+ V. K* j( I9 s/ a8 y/* */5 i- s) p+ e- \
/****************************************************************************/
7 e& E& ?: \7 A1 f% Q+ B. avoid InterruptInit(void)0 f( y' t; d+ ~8 A1 z8 \3 X
{
$ `. f; e k% t& T/ E) x4 U1 s! Y# y // 初始化 ARM 中断控制器 Q) k! \' I4 J2 g
IntAINTCInit();; ], o: Y* _3 c- L
+ `, S# p' D2 m$ Z2 z5 n
// 使能 IRQ(CPSR)
+ Z) i& t! |" Q# v o" t5 t" l3 v' G IntMasterIRQEnable();
/ e8 R0 A0 w- z# l5 D# P3 {+ T: c/ j5 C: o+ Q/ }
// 使能中断(AINTC GER)- ]# B) q# ]" p2 }, T/ X
IntGlobalEnable();# z# n5 a4 K9 `& [! Z- s3 w! B# m* g
5 b! G$ E' ]3 a: d
// 使能中断(AINTC HIER)+ }5 a6 }' x' F& {
IntIRQEnable();
, Y3 Y+ Z. ^: I) Z$ T+ `, h}4 Y( A, S# C: Z
9 C" c) d" E0 R0 A# |
/****************************************************************************// N8 n; D; a: O' G/ ]( n
/* */
0 H0 r0 C9 D& C' u3 F/* UART 初始化 */
/ l; P k# A, p: J! K: t6 r- r/* */* {8 H( {2 l7 `1 e* A! J$ O5 l
/****************************************************************************/* ` w( M! J. a& w- y6 s
void UARTInit(void)
. d. e# G7 ]! K, B* N: u9 `{0 p2 r, M0 z3 T& A+ v" g" H: i- W9 h
// 配置 UART2 参数
1 e; q, R- N j: ]+ ?+ X1 u // 波特率 115200 数据位 8 停止位 1 无校验位 |$ E4 @& b8 h( _! u+ i7 Q
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,3 b% ^6 c9 `& T& r( {: D
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ L% L8 L; ]9 B: A# b4 a // 使能 UART23 Q: r, r9 E$ `) {
UARTEnable(SOC_UART_2_REGS);
/ P0 D# x/ Z0 ~; A d, b: b! B2 D" Z; ~4 S/ d
// 使能接收 / 发送 FIFO
5 f9 U( r& \4 A6 [3 z$ Y UARTFIFOEnable(SOC_UART_2_REGS);) I7 `# k3 O8 `: K
: a$ f6 C+ F" B* i2 @
// 设置 FIFO 级别
8 G1 o+ ?" `9 ~. h* J- h! i UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);* Z2 ]1 y0 ^1 X( H2 B+ [
}( v- W# k2 z/ D2 S7 H
- I/ Y8 d) A1 o/****************************************************************************/! L% z8 W! }* K+ z X# R. r2 _
/* */
, e' P/ \' Q' Y+ W3 u5 E/* UART 中断初始化 */. N+ c2 b( c& i8 c( H& f# i
/* */# R4 [; U+ I1 g" H: Q/ x
/****************************************************************************/
- k' Z/ q5 J: Ivoid UARTInterruptInit(void)
+ d {( g" b# j8 S1 _5 c3 H{
V" K' T( w. P$ N IntRegister(SYS_INT_UARTINT2, UARTIsr);5 l$ F. r3 @% W% m% e
IntChannelSet(SYS_INT_UARTINT2, 2);
6 O Z5 M5 d( X$ R7 y IntSystemEnable(SYS_INT_UARTINT2);
+ c. P% q& @$ W1 @
/ W* D8 O ?( }: A$ N( e // 使能中断
3 a2 O V; v3 p" u$ [1 S P unsigned int intFlags = 0;0 p# [! D& I+ s7 z9 N) F4 t
intFlags |= (UART_INT_LINE_STAT | \
- r# c( ~6 a1 {5 u% V" i8 ` UART_INT_TX_EMPTY | \9 N5 Z) A* O' N* Y, T; W& V3 B5 N; m
UART_INT_RXDATA_CTI);
6 l0 N4 N# a$ I UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 I. n9 b, z# V+ j$ \}6 O( i% j9 [" U" s- O# P
% w. _3 M, D: n( Q
/****************************************************************************/
- M K* k& \2 c6 |. k& ?/* */6 M) L8 e# F( K# L. G& A' p
/* UART 中断服务函数 *// q$ T" t$ B$ j& r; y4 c
/* */
/ j; V. i1 t" g. t2 F# G/****************************************************************************/0 X4 G1 G v3 V( a; ?' g6 [
void UARTIsr()2 ~7 q+ o0 T, x- `9 i, c9 j/ Y4 {
{
0 ?3 i$ D9 |: F/ h1 W9 l static unsigned int length = sizeof(txArray);
$ _' {; K/ a" T, S! M9 r. I static unsigned int count = 0;& S" V$ C9 z) b" v' u+ Q \- R$ b
unsigned char rxData = 0;: k, Q& H$ P, V' j% M* V
unsigned int int_id = 0;2 H% a/ i! N( Z" i
# a5 N o: N! n4 G6 c: R // 确定中断源- ]0 q7 _' g: ?$ Z8 _0 u& @
int_id = UARTIntStatus(SOC_UART_2_REGS);
& s) ~* H: n# {: V e6 N+ T- F
& E, ?' R0 p5 } Z% L* ` // 清除 UART2 系统中断
1 K: _+ u8 A) _# U9 V5 y IntSystemStatusClear(SYS_INT_UARTINT2);
$ a' K# b7 w$ R
& \8 ?$ Z. n, G3 e" r6 q8 B# j- n2 e // 发送中断2 B; }9 B8 ?4 D1 [
if(UART_INTID_TX_EMPTY == int_id)
3 w" K! ~- e1 F) P. I3 Y$ B {) n4 j( n! V7 @- U7 U5 q" w
if(0 < length), T% w- w7 D8 v" O# D. W, @
{+ m( m6 r3 G, q
// 写一个字节到 THR
8 Y/ a, {0 @+ e% F4 g UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 j' F# O$ }6 E/ p2 P1 u% e% J
length--;
3 B+ O* t; T6 r) I) J count++;
! x' a- U4 c- _6 X7 l0 | }: I1 g6 l4 ?! _% u! K
if(0 == length)# C0 R7 Z/ O; p: @" f
{
# U, e7 b- \- {! z // 禁用发送中断/ [4 Q! f7 o% i- O4 S
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
. y" u! B N; E3 s }
; P, s1 }3 v4 X% ]( _* @0 a }- c7 o) A# X8 D, z' k* |6 b4 q( J; }
% o" l& x3 U+ c# T r) a2 ^/ I // 接收中断
6 O+ O; {; y* j4 B0 O( J2 Y0 @ if(UART_INTID_RX_DATA == int_id)6 g( i7 b1 G& ~* S0 g& Y
{
8 F/ G) N/ z5 |' \# s rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" |- r" w2 F/ v9 T- y1 z) Y5 p5 p- ? r2 X1 x$ D" |
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# c' J* E+ U0 c }
& r n- ]% q/ d5 v* }3 Y( q8 a- J# f2 l
// 接收错误
' R& J" o, H- a) R& s! f4 r* K if(UART_INTID_RX_LINE_STAT == int_id)
0 R: P: K6 N. H w {
+ H! _" w) z# t% W8 {# P. B while(UARTRxErrorGet(SOC_UART_2_REGS))/ ^( P; f6 J* c: ]( R* g% A+ q& h( E
{
. ?5 x( A+ c* j- q* g9 n // 从 RBR 读一个字节, j3 _9 }$ n4 r! ~$ ]
UARTCharGetNonBlocking(SOC_UART_2_REGS);
: q: A: s& r0 ~4 ] }
' _# s: A. a8 g8 r } q5 D, F3 h! Y2 M8 }: u( f7 T
% x* B, @9 P* O, a1 Q+ ~ _5 M return;0 R9 J ?, u7 [' e, M
}4 X! J* t' i& D- z) S
|
|