|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
' v- x& I& I4 B* x/ G6 E" ]; R$ { W- H3 H6 P7 w% F( F" T
#include "TL138.h" // 创龙 TL138 开发板相关声明
" X, l/ c% |* T
: k/ O9 N% A {0 z#include "hw_types.h" // 宏命令! Z, H1 p: G" ]( M
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器6 [' i- i5 N9 y" c a: m, ^' M
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器3 {' O& p# [4 K4 l8 x
- A7 `6 Q2 r$ l) N3 O/ j
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明- a6 o& o( v# V9 d I
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明) q; R/ M' P% J; C8 P7 E; P
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
' p% x4 m) N2 t6 m#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
6 L9 C' [+ H% h( F
5 }" F+ u. C6 ]3 K* V) i/****************************************************************************/4 }( W: d ^0 s8 U# \9 S$ R/ S2 `1 b
/* */
0 {" H' M4 O) n& g" p/* 宏定义 */
6 |% O0 |, [& @' `9 ]4 I; Y, m+ N/* */$ ?! f- N/ u1 D
/****************************************************************************/" K* n; }. I) _4 u
// 时钟0 X. W# a' Q3 a9 J$ P- S) o
#define SYSCLK_1_FREQ (456000000)$ _; i5 `( r+ g' Q
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)1 e3 t4 B6 a7 j: {3 S" A
#define UART_2_FREQ (SYSCLK_2_FREQ)
# \: x9 q$ a+ |8 k; n: B) Y
9 G6 x9 ]5 w) t# {# ^! L/****************************************************************************/
1 I$ Z ~+ ^; z. Y, n! c/* */
: Y, T# N Q7 |; P, e/* 全局变量 */! `6 A8 S. z j
/* */
- t5 L, \2 _% _/****************************************************************************/
' J9 G- B1 e, T) P7 Gchar txArray[] = "Tronlong UART2 Application......\n\r";
8 `, f. X) ~& @3 a' T1 O" R: e4 l% R6 I- `" @9 T( x) E! s p$ e$ d
/****************************************************************************/
8 \! O/ W# I' H" a/* */
, |" ~1 A- P' g* G6 Z5 g/* 函数声明 */
: G- i& M9 D/ A/* */
# V. Z2 h' i* L9 d- M/****************************************************************************/
' c0 D8 K0 L/ L& g) v& U0 H8 L// 外设使能配置! K0 z. O: u5 l6 Z. R' f: T. A
void PSCInit(void);! m4 F# N Q4 o+ k9 s
1 E) C% l1 A4 `% P% _" p// GPIO 管脚复用配置, n" o: |/ p7 T9 G/ k" z7 z6 G3 Q
void GPIOBankPinMuxSet();
+ z1 r! o, H( H1 u; o* z% T) y7 N6 b5 p+ F( Z9 E! R
// UART 初始化4 Q" J, H' D# c1 L0 d# P6 @5 }
void UARTInit(void);
) y$ z8 g! T4 b( U/ k7 D) @// ARM 中断初始化
" I% J- S. u% J0 P Avoid InterruptInit(void);
i8 `% a; c8 }. }4 \- w2 K! d// UART 中断初始化" c) a1 J8 l L+ I2 B0 j1 J" X
void UARTInterruptInit();# s2 F8 K0 [* F: Z( s( R
// UART 中断服务函数. O5 i: w1 S4 a- z
void UARTIsr(void);) @. [9 J% q: P8 l+ M. r8 [
9 i; P- {3 L9 _9 |" ~/****************************************************************************/2 C; }1 \- q7 B. G+ ?
/* */
4 L* p) A5 O8 e# c3 X6 e/* 主函数 */
" g d/ _: B3 Y% C4 n/ v) c/* */
& c' n' _# x4 l- _1 C _" [/****************************************************************************/
7 a5 M2 l! R h) Q9 I9 C& Rint main(void)
9 {+ p; L1 A7 z% n) O{" e2 v' d& }3 a$ z! R
// 外设使能配置
+ m3 ]6 k' `/ ?) I PSCInit();0 A3 Y5 h4 r- a, ]/ u3 h
: Y% [% g( ` v" c
// GPIO 管脚复用配置
1 O$ h1 G) J. b/ m0 T$ z GPIOBankPinMuxSet();
4 y: e9 w" d% _, f! c* t
2 p7 d$ f7 V! r // ARM 中断初始化
. x* Q; }4 L2 _5 v InterruptInit();
$ G$ m8 ^( V2 Q" E# L! e+ E: C1 ]( {* B
// UART 初始化; H0 n8 Q8 ]; i; k& l2 |; N
UARTInit();6 I5 \' I0 g, U% o
9 ^8 E0 X, }. @! ~" @# ~; _ // UART 中断初始化, f% w6 w9 v3 @. R8 v2 |; w% u
UARTInterruptInit();' [" s! e8 X( w8 g# S
+ E3 `. j; J9 p# S& ^$ P // 主循环: L+ S' Z$ A& x) [# w6 a# A
for(;;)
3 ]: h, n% g0 `# `! v6 z, B {5 c5 g% |/ v7 J1 D% V4 k
. c% }3 |3 {4 E }
2 S' ` N c' A! a" Z+ e' S" E: F}1 L$ m8 [3 O1 n# m4 u
. d# t% @6 Z9 N" d, K
/****************************************************************************/
0 h/ F5 m8 y. h; }3 ~/* */3 m8 n2 i! i' y4 q3 {( F
/* PSC 初始化 */2 L: ^6 U0 M; W
/* */
- r5 B! o; p& B( ]/****************************************************************************/" j! L0 ^' K. Q' _
void PSCInit(void)5 E. m' A9 S/ Y% p6 q! A
{& w' h2 i% P9 F3 H! J& d% l
// 对相应外设模块的使能也可以在 BootLoader 中完成8 C' R: u; o" D; ~% P
// 使能 UART2 模块8 l3 Q5 \7 d R5 I6 ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
* }0 ]6 F, Z c6 o/ g}' h' _: O2 c7 } P- f2 n7 U
0 a1 _8 X2 p& v9 }' Z5 ?/ `/****************************************************************************/
$ d D! r I: |' K; Z/* */
, {6 g# w. J! x& `. g/* GPIO 管脚复用配置 */8 P4 b l# D; R, h& q. C
/* */
& u2 T+ r+ H- m/****************************************************************************/- Y1 P8 {' A! _! n/ h8 j8 L
void GPIOBankPinMuxSet(void)
9 I" D4 d0 z# r5 L$ U# W& P{
1 H8 K A# M7 O // UART2 禁用流控
, B) O- E- c* g, b UARTPinMuxSetup(2, FALSE);0 r i m4 z1 W% ~6 w- K
}
& O0 s+ s" ]& P5 Z, a1 i ~. I$ F: X# w5 ~- R( S
/****************************************************************************/
7 N% {) D4 ?+ ^* f; Z7 K/* */
- T4 L: C4 O4 B: w: C/* ARM 中断初始化 */ {' U% t- A0 t; p6 B+ s% g
/* */
1 U6 f, E! H5 G6 k& X) w/****************************************************************************/
9 M. f/ v, f& O) }6 @void InterruptInit(void)
. ?2 a2 H& B% V2 E$ A1 _& }{' t( D, k5 w$ Z, q7 B8 J* v
// 初始化 ARM 中断控制器$ z( }0 o# v5 ~# M3 E& p
IntAINTCInit();
8 `* I$ ^7 V$ B. V+ A6 o
5 x, D4 w5 c# }% }9 q // 使能 IRQ(CPSR)
: ?% j& j0 N' B" n' C IntMasterIRQEnable();! G/ e, [5 S6 E8 {( D; d- k5 _* j9 a
`0 Q7 l2 ?& L* b j6 h
// 使能中断(AINTC GER)
& P- c; d4 Q& c% L IntGlobalEnable();3 n+ s# a5 N9 p7 H$ Y6 p
/ } b9 C4 V( K5 a: N // 使能中断(AINTC HIER)
/ e: ?/ G: g0 U. y IntIRQEnable();2 S# J% D% `6 x" X3 N* N# F
}
, N: f; ^* I* G* T' }2 j2 {3 l3 s- g [6 j# X- s
/****************************************************************************/
3 Z/ `! O7 a! i x+ B2 |8 J5 }# e/* */
% I' h- {; q* ]! ]/* UART 初始化 */2 g. H% s$ A) y. [; r+ E
/* */
" G9 F% t* A: Z7 g/****************************************************************************/
. o( g' g6 y+ @' E1 kvoid UARTInit(void)
' h+ t5 ^6 G9 |# Z8 v8 ~{
0 ^. D4 [+ q* m // 配置 UART2 参数
* c1 k' S8 ]# T8 [ // 波特率 115200 数据位 8 停止位 1 无校验位5 \7 E0 M# x+ N' z) a
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ A# t3 A/ h2 @; x {# _4 D UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);; [" `5 p9 j4 ~
// 使能 UART28 c/ @+ ~, H% M1 x) ]3 ~
UARTEnable(SOC_UART_2_REGS);- Q0 ^# \4 c3 [8 J2 V" Q
# E0 Y3 }0 Q* n; G' v& @
// 使能接收 / 发送 FIFO, j" a9 m" ~! i* G$ B9 |
UARTFIFOEnable(SOC_UART_2_REGS);& c' W0 M3 N/ s$ t+ m4 y5 o
9 v2 s% `2 d4 d X# h( J% k/ c // 设置 FIFO 级别
0 f" R' J& C5 j' n% Z1 w: q UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
3 x- D% U4 G9 \. M% x) z# c}
: H: d( @ x& P$ e5 C8 Z! L5 @/ W& e8 \
/****************************************************************************/8 {6 a. l# b1 s% U1 y/ E# L
/* */
0 A: a2 ^0 q0 t& S/ K/* UART 中断初始化 */6 T' {5 S( R0 ~- N/ G2 f3 c
/* */
! ?- q4 P$ D* s, V! N/****************************************************************************/
2 k( {/ ~2 x5 evoid UARTInterruptInit(void)" r0 s; z3 U C$ `# c9 t5 q2 f" N6 h
{
2 V7 U; e3 ^1 X) O% n& y6 W' v IntRegister(SYS_INT_UARTINT2, UARTIsr);
/ r1 ]* g! z2 R9 k5 ]$ { IntChannelSet(SYS_INT_UARTINT2, 2);* U6 I, z+ q( w2 r8 P7 i* K* e, [
IntSystemEnable(SYS_INT_UARTINT2);& i8 I. v$ x5 x' n
6 M- T% y2 u9 ^! a // 使能中断4 N; r9 T) ~) f+ k3 Z7 X& e8 ^' J3 H
unsigned int intFlags = 0;2 K; g5 ]! D) T7 a
intFlags |= (UART_INT_LINE_STAT | \6 R! N" p, A+ P0 U5 z
UART_INT_TX_EMPTY | \
0 n6 y- f' \# d4 Q: @( \% V+ O( ^/ ^+ j UART_INT_RXDATA_CTI);
0 T4 @3 h5 @5 w$ c! L UARTIntEnable(SOC_UART_2_REGS, intFlags);
" Q3 T1 M1 }( ^3 l, `8 u# T}
2 p" R1 w4 {- R# }) V
) T$ j9 {* C) ~& O* U) q+ ?* H f/****************************************************************************/
+ b5 F4 M8 v4 v; E" q/* */$ Q& A2 T1 q* O8 {, q# a& I, n! }
/* UART 中断服务函数 */, x/ K( u0 N1 ]1 f }
/* */2 r+ G+ N' O, a* x4 b. X
/****************************************************************************/
. e& P- \6 |; S- ?; `8 ~4 q& qvoid UARTIsr()
8 w9 V+ n( j& p/ }' j{3 ]& I2 ]& O! k! k. i1 J
static unsigned int length = sizeof(txArray);6 d* b$ N4 b7 |, u# U
static unsigned int count = 0;1 S8 l) V1 Y; P
unsigned char rxData = 0;
$ \& H3 C5 z2 {) h8 @5 E unsigned int int_id = 0;3 q; }" ]% I. A7 _
2 e r: b; t) `6 D: N+ Y
// 确定中断源; x0 Z- f" o3 V! D0 Q# h1 I
int_id = UARTIntStatus(SOC_UART_2_REGS);) \% S+ k# o' @) Y
" y! h4 p' ?2 u; M6 |- ^ // 清除 UART2 系统中断! Y2 n/ G+ G5 _( R- U
IntSystemStatusClear(SYS_INT_UARTINT2);
3 k, }; T; \) o. o% f0 M p B2 f* |+ d$ V
// 发送中断+ G. k \- `- h! l K# q
if(UART_INTID_TX_EMPTY == int_id)
- ]* I: m( s# z2 z1 |+ _ {
5 k0 ] L$ L9 o" \( I8 c if(0 < length)
/ |% R) m/ b2 p5 T4 @ {5 w& r4 S0 w0 C6 A
// 写一个字节到 THR" T" l2 `' _ y' H
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- S6 {- q3 H0 C6 I* n6 s, z
length--;7 M+ ~! ?' C; ], Y" H
count++;
& Y: j u6 P% Q2 G% g7 z" P }
6 `/ |7 n; o$ H0 b; W' O6 a9 q6 o if(0 == length)
x6 i5 Y" h# Y/ H, z9 p& h4 } {* A$ R2 Y, G$ {4 O, [9 @2 p- @
// 禁用发送中断1 m3 ~9 A2 s0 z' ]8 k( f
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ n+ t) m& W6 \
}
9 m r! {. @/ o6 q }+ i! I2 d% W q+ J2 {7 l/ @
+ V$ t9 L* s4 I' D- f
// 接收中断
4 Q; y$ K# @9 w# [; B if(UART_INTID_RX_DATA == int_id) x$ M' k: u7 Y" [
{& n+ Z( a8 ^3 A1 r
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);, ~& ~1 h* ^/ [9 | Y8 l5 x1 ?
9 r% }4 i, o4 ~) |9 u. D
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);& u* b% |8 q& m6 C U3 \# E* G
}
8 V. m2 `1 C/ F' u3 e+ `6 l2 a/ k& w- `( h5 e
// 接收错误4 |: |0 N- n N
if(UART_INTID_RX_LINE_STAT == int_id)
- F9 F% g8 l# R- j# M p9 z$ Q { |* U- l: h9 X p
while(UARTRxErrorGet(SOC_UART_2_REGS))! g; N0 P( N% L9 A! o
{7 H- h+ M" d: P. w
// 从 RBR 读一个字节
9 l1 s0 _- k* ]7 U4 c UARTCharGetNonBlocking(SOC_UART_2_REGS);: y9 z+ W; A1 k2 Y* t% y
}
) \& ]# G- M, T$ J! Q }! n0 u7 C; D( u, l
0 j$ v* S: U% l" Q
return;3 v; U, Z; r/ W( G
}( |' F+ G" E' r
|
|