|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。& H+ r8 {) ?& p3 c, R0 R- M
& \2 c; [& O# j# b: K#include "TL138.h" // 创龙 TL138 开发板相关声明
6 x2 G. A5 u1 Q. H; m: R
: |3 }9 E$ A' r; n/ f& I#include "hw_types.h" // 宏命令
9 x7 Q) s( w( [* M8 R#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器( Y( k5 E0 s$ Z
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
+ }% \$ [' m. {6 L4 w- K
1 k3 [% y8 ^7 S( N; }: Y#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明8 f7 X7 V# d& k
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
n( |& Y$ s7 |& I#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
& a, W/ z" ~: ^#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义! J/ v( H% Z" G7 |
4 ?+ f& C1 G: G9 U/****************************************************************************/# b% Z! \8 f2 m9 _
/* */
6 L$ b. F' U$ z; x' z/* 宏定义 */
' c0 w* v0 M2 r5 I. {9 ^% l/* */5 i2 p5 E V: B; b" ]( u; C
/****************************************************************************/
+ x5 L! |' X. k% i) {// 时钟
5 b# S6 F/ Z1 S. i#define SYSCLK_1_FREQ (456000000)
+ W* Q6 A8 V# B% s6 u9 U/ q#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)4 p3 S6 Y: F6 z6 A, _% m
#define UART_2_FREQ (SYSCLK_2_FREQ)
) N+ e; M7 r" q+ O$ J
, j8 _& c- O) }% O$ R! H& t/****************************************************************************/
1 x1 [6 @+ u& y! z% A1 Z# {/* */
( g3 \0 w. {/ G1 \& D/ q/* 全局变量 */0 @( S% |; S e0 f# c
/* */, h$ ^8 {3 A1 l, B. p" E
/****************************************************************************/
" H. I8 M2 ?& x# F S; l& d# \char txArray[] = "Tronlong UART2 Application......\n\r";
c% h% V6 |1 B2 ?: h2 y6 P, i9 t$ ?* B
/****************************************************************************/
4 ]( S0 `& G3 Y! i4 H9 L1 P6 T/* */" C% n6 ]1 V4 E+ C2 U
/* 函数声明 */
S ]8 X3 m$ z/* */
: F, n5 H; G% Z* }- [/****************************************************************************/" W7 l% Q v8 O% k+ X; a3 G' ^' A6 A
// 外设使能配置
; M9 F$ L7 [+ F( S' \. Fvoid PSCInit(void);1 K5 {" o* a3 j: h% a& d
6 t7 v6 J: m! o3 F9 H
// GPIO 管脚复用配置5 h1 @( Y D8 }% w# a8 {
void GPIOBankPinMuxSet();
; K4 w7 i4 a4 _! p
9 d& d! K. _( R3 T% M7 }// UART 初始化# c% [& A6 B1 v; g. k3 p' i( f
void UARTInit(void);( c+ ^( }3 _+ W5 R+ U$ X
// ARM 中断初始化
% T. q9 u9 h! d: c D1 N( w- Xvoid InterruptInit(void);0 D7 _3 C. u. ~
// UART 中断初始化
$ J; ?3 o9 E! C$ {, Hvoid UARTInterruptInit();
# g" w6 U+ ~6 G- ^// UART 中断服务函数
& s1 \+ Q5 S7 k# B. H+ svoid UARTIsr(void);
+ B0 c( I ]% B5 s2 T6 E1 x) k7 E* d3 v2 {
/****************************************************************************/. b- h8 i: w. `4 j# l# @
/* */
! U' o( b7 \1 N5 H/ v# q/* 主函数 */5 C* r2 M0 a8 D4 w' }1 m; D
/* */' S" G5 Y- l, {! L; f( \
/****************************************************************************/
1 _0 }0 v1 O3 w! c3 R+ I& fint main(void)/ S5 I* W% v6 q. n, \
{
" U# i) W( O# B5 R/ C // 外设使能配置! v1 L. m; V# e9 \8 R
PSCInit();
" [* S2 J4 _, K; e$ c) k n 1 k( e: v# k: p8 y
// GPIO 管脚复用配置
- M1 L/ W g6 P0 @) n' N. G GPIOBankPinMuxSet();' |2 [9 \. W, Y) O0 I
) ]; D1 p) ? |8 x* h
// ARM 中断初始化
' I( }* z/ p5 c InterruptInit();4 i' h2 O# W( g! d1 c" f
, f$ X; p& `" o
// UART 初始化9 O1 B8 G, N9 X5 C
UARTInit();
2 V9 n U) h- b# F) o" s. M/ r a9 [6 J% l. @1 b0 d7 l
// UART 中断初始化3 n) u7 t$ U- a
UARTInterruptInit();2 h2 O! I0 y4 J" g2 x: w
. m% s* q2 S1 g$ a, v) r/ ~ // 主循环
; `% k8 ]$ _" u& c* e9 X6 j& g, t, b for(;;); q) l) @. p) G( b8 S
{
, }; I+ g' S, F1 M2 D Y# x8 g _8 L9 F- w$ T8 Y. S
}) r' w4 U7 ]! X- f
}) c' {% e# a2 I. [- L# J4 T7 i
' j: M) w- y6 l% T9 y. v
/****************************************************************************/: Q* T! i, b y* S- r" e- Y
/* */. r( l- m- c( i& n. W
/* PSC 初始化 */
( @; i: P$ d9 o8 L% a2 P/* */
7 y3 S3 l: y& }4 j4 d3 s* F V/****************************************************************************/# V7 W0 v4 Y2 l2 V6 V
void PSCInit(void)
X3 Z8 i/ j" Y% _; t4 P- z{
# B* X9 u' n- |* @0 X3 G+ m // 对相应外设模块的使能也可以在 BootLoader 中完成6 B8 Q" }, ~( m
// 使能 UART2 模块8 O4 G$ l( x- a2 p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
% r. X. f" M" L6 ?}: N0 c% ]2 D8 L# e0 {' P
) J: v b6 y" L7 Y9 y2 L) d, E7 ~
/****************************************************************************/& e1 n% z( w3 V
/* */8 D. l4 [6 o+ {$ P- d8 b
/* GPIO 管脚复用配置 */
* X0 }# d! p, }/* */
6 E2 d! Z6 f* }: U/****************************************************************************/
4 H( y" F2 q" P, Lvoid GPIOBankPinMuxSet(void)
" x/ `2 Y5 B+ Y6 E1 ?( g" p: u{, h, F6 Z/ n8 z# L$ K( I& C0 s
// UART2 禁用流控! {9 k5 a/ I! f5 J, G: S
UARTPinMuxSetup(2, FALSE);& ~' C8 L l0 v2 q( W# L
}
& O E' I6 u: O o9 Z8 W) B' A" d
5 ~% O2 E* ]: E3 O V* W+ P/****************************************************************************/$ _/ C, ?* Q* L: {% ~) r. D
/* */
8 y" ]; a2 M$ C }: \% t/* ARM 中断初始化 */* G' W5 Z2 y# D" J
/* */
# j- ^% i# A# d, l/****************************************************************************/3 @" e& b( t- Y! L
void InterruptInit(void)
3 j, g; }2 C: |2 x0 s) l& _{
2 L w7 x$ {, Y; p6 `$ G // 初始化 ARM 中断控制器
9 G9 s( U' `! H2 u6 M% |+ E/ H IntAINTCInit();
! m! H) C9 v4 G o
/ f& t# h0 F+ A7 u# e) J // 使能 IRQ(CPSR)
! k+ V& I7 X. Q" L# Z" v/ s* ? IntMasterIRQEnable();
7 J- t' T' H- w" c( ]
# d; g/ Q. s. G# `9 ]) V+ u0 J // 使能中断(AINTC GER)
6 }* e, d5 V2 E7 b0 N7 x IntGlobalEnable();& L; v, Q8 |/ n' U* p
5 G* k! l: T2 u* J // 使能中断(AINTC HIER). j- m6 C" D8 S- m2 W! K3 N3 R
IntIRQEnable();
: `! Q! r d1 }}; E1 q. j* N; p) d# \ H
0 H* S, M; Z$ L, |0 _/****************************************************************************/
) N' I1 C0 l" H$ N/* */
* f6 S9 e; G2 J& w6 W- B/* UART 初始化 */
4 |, S7 w; t3 b8 C" r. t3 [2 n0 k/* */
: {9 T; s9 o$ e, r% E/****************************************************************************/
* {$ M3 P* f! K: K! y" g3 f: }; nvoid UARTInit(void)
) U9 F; ^, i" b9 L( c2 b{
. ^0 {" b z/ R8 Z( K) C* J // 配置 UART2 参数
; e, Z7 p. c `* d0 s // 波特率 115200 数据位 8 停止位 1 无校验位. T+ S" B& l& C) u2 v5 I
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
! q" S+ Z6 z/ \+ e7 x UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* s* N6 J% k/ F* {- P; G7 _- d" J
// 使能 UART2
! [8 M6 J. u' @* c2 w4 f UARTEnable(SOC_UART_2_REGS);! m: L+ f9 z: W8 N, o
2 h2 X0 l1 n" d; t/ r4 `/ v9 Q
// 使能接收 / 发送 FIFO
" @' f+ R- N$ m* p8 F UARTFIFOEnable(SOC_UART_2_REGS);$ ^! l6 z3 E: ?% f5 P Q, M
5 H5 h; P) Q. l' |3 {/ o // 设置 FIFO 级别
- C6 r8 G/ x% O0 j0 N: k UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);7 a% f) i; h+ \% ~0 V! `- G+ |0 }. b
}
6 D4 `. Z, v7 A$ K, j! X$ d3 b
/ |+ G" c$ a( f$ ]/****************************************************************************/( \5 V& J+ W' N/ X
/* */
. q7 e8 i7 P5 ?2 B/* UART 中断初始化 */
0 i8 }1 M: U& d) z; b. C/* */" h7 \6 L3 R- Z6 ^+ ?: _
/****************************************************************************/& }. V0 e: z' H" W* ` N3 v* M
void UARTInterruptInit(void)4 S; X1 z" V( b4 @+ q, Q
{
+ X/ T+ \2 R. Z- l0 e IntRegister(SYS_INT_UARTINT2, UARTIsr);4 U9 k) `/ [ C
IntChannelSet(SYS_INT_UARTINT2, 2); T" g' e- B1 v2 E2 u5 J0 [ m
IntSystemEnable(SYS_INT_UARTINT2); A4 r! G' f" ]/ S6 }7 B* j
" u2 C! s9 P3 n: d2 D2 j9 |0 a& |
// 使能中断
5 Z% R; V1 G0 o# I( ^# ^ unsigned int intFlags = 0;4 Y4 V9 `- g$ n+ o0 L
intFlags |= (UART_INT_LINE_STAT | \$ o; o* v7 W9 g
UART_INT_TX_EMPTY | \
. Y& A. ^- E" L UART_INT_RXDATA_CTI);. I4 J1 Y4 G: J! K, q6 V v
UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ \( {- K0 Y! W k2 B}; P" l7 d$ y+ b7 g6 J
" H. l% @0 Z3 M+ P/****************************************************************************/
: o# u$ s7 B" c1 }1 p4 L. O/* */1 j1 q) y4 }8 i9 S$ s8 u; R
/* UART 中断服务函数 */& }" Z$ B# L5 \* L+ ^( S0 Y
/* */
: Z) ^' }6 D' M/****************************************************************************/0 w K$ w: J* s: U; {
void UARTIsr(). j" h* f; \# S; e
{
; u' i" y, [- ~' G t static unsigned int length = sizeof(txArray);4 n `; ?8 g' q3 b* _- r
static unsigned int count = 0;7 H6 C0 `, z9 z; U& ~% P; K
unsigned char rxData = 0;
) c' e- q4 H8 {7 k/ l4 M unsigned int int_id = 0;
+ P9 Y5 c. P- B0 L- |* z! \ j1 p1 ^: q' n* r( s& S$ w' i
// 确定中断源
7 Q1 G& [& e5 b. R2 X int_id = UARTIntStatus(SOC_UART_2_REGS);) n! m/ o) {0 w( `- V
- V# S/ b# ^" Q' i/ K* i0 c // 清除 UART2 系统中断
F8 L T9 N5 N; X9 \% u IntSystemStatusClear(SYS_INT_UARTINT2);
' v, e$ s4 o* g) t F9 j- H
; _8 `; A8 N0 Z/ n( j4 ` // 发送中断
! `: [8 M6 e5 W3 ~5 Z if(UART_INTID_TX_EMPTY == int_id)
4 s4 Z& ?4 I. P/ T' { {
, ?+ P0 ^! i7 | if(0 < length)
8 h* o, U2 |; | G, K2 D {
6 h" S, d1 c" K" P T3 L9 g$ z // 写一个字节到 THR3 Z+ p( b3 q" t1 V. q; o, I
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
) [! ^ d2 Z G5 L length--;
8 ^, u3 C% L1 R5 J" _( v2 Q: d* Y count++;/ y# q2 ^" T* r; d0 X
}: x5 L9 _; {3 l& b# J
if(0 == length): K3 }) b2 V8 b8 E2 A/ P
{9 C; \& b" Q& R' Y
// 禁用发送中断) O6 [; I" a9 n- S* C5 k' N9 S5 g
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
: G! A' y3 t( ^; B3 K, h$ a: O }" o- D6 A4 f3 h( B; {- ?# F) Q
}7 m9 y) _/ t; P1 w( `+ u/ C
) I- e) l: _" p* n6 K1 P+ X* W // 接收中断
! e: n$ K7 I- E9 ~ if(UART_INTID_RX_DATA == int_id)" L& V. B$ x* ]: e* C
{( Y: Q1 L& y0 A4 H7 `: i
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);. n T9 J$ R* U1 Q
9 ~1 H2 N4 N, T9 w7 W6 f+ h
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. G5 T9 ~* ~7 H5 q/ y
}5 l. C) y5 G( O8 V0 ~7 Y! D
; F8 H/ B5 l, ~) u. }9 h! p
// 接收错误
% T: U' _- e, t- _ if(UART_INTID_RX_LINE_STAT == int_id)9 b" ]6 s/ m/ B* ~5 k! a
{; w0 U0 X6 ]. E; u. n! y$ U
while(UARTRxErrorGet(SOC_UART_2_REGS)); H, d" {+ Q# ^1 L2 O3 l" m& \
{6 J, v9 o0 m( y6 A L! w1 I" B a6 Y
// 从 RBR 读一个字节
+ ]. |- l( B4 a; T6 e4 r, R7 l" F UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 x6 R- Y! M q }# _' A0 J1 j/ [7 ]" J4 P( [8 g: I
}
8 |6 ?, q$ v/ U. R, _ 9 H* ~' s5 x+ B' ]- ^# v
return;
" w. R$ f5 Z4 z' H7 n}
* M1 W7 Y; {2 I9 f0 {9 e |
|