|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
' ^% ]) H2 V" k3 _) P' Z; Z! @8 I7 U
, c D' D; G& \# F* F: K4 [' E#include "TL138.h" // 创龙 TL138 开发板相关声明$ ~/ U0 a. {9 X- i3 o2 T& y
3 u$ B3 |5 |. a) f; K9 W" p/ d1 V#include "hw_types.h" // 宏命令
; ~1 u1 s% ]" r; E" V; W% H" v#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
7 h3 C. j9 g4 H#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
$ n! _; [8 y: f; w- ~& m% |# i. H4 X, Q" \3 m& C4 J# j' c
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明0 g9 u7 D, c# I# X$ z3 m Y9 e
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明7 q- z5 O$ V2 D8 F8 o
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明+ f# r% W' F/ z
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
, R! p/ y* ]4 Q( y5 b
8 j' S* K; b) w1 b/****************************************************************************/5 J( V! t! m* G# w3 d9 v: L
/* */3 m" I' N* ]2 _4 v) o! d
/* 宏定义 */" _* v2 s/ r8 m; q" M2 N
/* */
6 C+ E7 r9 Q, e1 n$ T/****************************************************************************/
# u4 V7 Q, ?) q$ H* E( `: z// 时钟, g( [& j3 J0 `3 P
#define SYSCLK_1_FREQ (456000000)# r0 U1 l y( N) j3 H: c1 ^- c% y
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
. d' l$ _$ t* T. c#define UART_2_FREQ (SYSCLK_2_FREQ)
) q& N; S# n1 X9 y' R# p2 K7 I: s# s$ U+ E) ]* a% o4 p) Y
/****************************************************************************/1 Q% G- H( U8 \ M
/* */
( }7 S7 I* ]! g! k3 t/* 全局变量 */8 c1 u3 {9 O7 E, i7 q' M
/* */% _" g* N" a+ [2 }# E
/****************************************************************************/! q3 ]* A! x2 w0 [; A0 f& `5 o
char txArray[] = "Tronlong UART2 Application......\n\r";
9 q4 j, Z( l1 b( k
, g- M0 l% x' B: W0 E/****************************************************************************/
: E1 e f) }; s/* */
1 s; r ] O5 {. ?" C/* 函数声明 */
) l: F" R! ?, A/* */) I2 }9 |) J1 g r( P
/****************************************************************************/) J% u; z# y, f. D
// 外设使能配置5 w' |! d1 J* g# _; m/ c" t' B
void PSCInit(void);& |3 ]- S. P- D2 t s
- M9 h6 z5 D/ h- [% D. h' V* x
// GPIO 管脚复用配置
3 }+ _6 t1 M5 G. dvoid GPIOBankPinMuxSet();
+ i4 P5 L- ? N4 R5 b8 G2 h# J5 n4 z, i- r
// UART 初始化
7 G. ^- v# S$ ^. f, s7 hvoid UARTInit(void);
1 L* O0 a% D; o, W% [// ARM 中断初始化1 N( A R$ D- l. N/ _
void InterruptInit(void);
9 h7 p5 o. O7 ~4 I! j9 ^+ {) A// UART 中断初始化8 _" V; G5 h& @) D1 B
void UARTInterruptInit();/ P0 H6 k& R0 Y# x
// UART 中断服务函数
0 y' U5 N8 G% C' t+ n" D% S! C evoid UARTIsr(void);$ s2 N7 V- A) t# x" Q4 d& m, [0 k
" Y8 |6 q; A2 f& b
/****************************************************************************/
6 j2 T* h1 b! z8 [, `0 ~) E2 Q( }/* */0 k3 a: ~8 v3 A* k1 ?
/* 主函数 */" X9 J1 i; U K1 B
/* */
1 j2 j9 x) J; h4 w/****************************************************************************// V( x6 C" d! K7 U3 @
int main(void)
6 X% D& i( o; Z) D, }9 v3 k0 _{1 R' f8 C/ ?( E6 G$ p- a
// 外设使能配置& R" i/ e) @9 A) J8 t$ f
PSCInit();
% J/ h0 [! T1 |+ p" L * }6 l7 s' K4 }/ D* h
// GPIO 管脚复用配置
( r W; T9 Y9 q2 m9 [( v, H, O GPIOBankPinMuxSet();. g! v7 d' @6 D0 ^; d
0 _" w) }) O u# o( J* s0 m
// ARM 中断初始化1 V' f5 E! T* y2 ~) q8 v7 ~2 G
InterruptInit();
& Y5 z6 `' C4 ^+ P. s5 B' s
; a) O/ e4 U, k& X$ e! P( n6 Q // UART 初始化( c( g. W0 R" }
UARTInit();* b# {6 ~7 `& G0 ]
$ r" q8 c, }" `9 |$ u3 {6 { // UART 中断初始化
0 R, f+ e0 b' n. P- `4 `4 G4 \. H UARTInterruptInit();
2 m4 y1 {5 {0 G" ?+ e7 y# K. Z x$ G* |, q
// 主循环
) a( t" _6 R$ r' n8 u8 S& }, p for(;;); J$ | B. T2 ^9 ?3 T
{: S# G0 x5 G4 C0 L
$ _1 b; ^8 p0 P: [
}7 A! ~& T0 Y9 @0 v7 b
}% h( L& [ [; z) U2 n. a/ F
& e6 v0 y7 y q+ V/****************************************************************************/5 P. c2 M ]+ ~' o
/* */8 s1 y4 B4 W. j( X
/* PSC 初始化 */3 B3 c, j7 m" U" d- [
/* */0 X1 l/ p k4 H F% Q0 B
/****************************************************************************/7 \7 N( _# ?* V" F, }% T
void PSCInit(void)
0 S* F% ~ Z% H7 ^5 \{
8 c& W' P3 a A* o# u1 K // 对相应外设模块的使能也可以在 BootLoader 中完成/ e. s" z7 G/ P) A
// 使能 UART2 模块
; ~- t& C9 W: ]5 z+ }! I9 v PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
6 [5 z( e8 F6 y1 A' q, \/ A7 K}% K ^ R) ?6 R8 C- V& H# E2 ~6 P- R
' _/ o7 L6 v. G
/****************************************************************************/
7 @1 D- \3 O2 K8 w2 j5 ? _, I: O: W/* */
- i3 P9 P, a% T/ x! e- ^. o/* GPIO 管脚复用配置 */9 q2 x# ?) x9 [8 A, y) I
/* */% R. g- N" b+ B+ Y- Q
/****************************************************************************/* p3 u, p# u* r! u* Z
void GPIOBankPinMuxSet(void)
/ ?% f- X |/ `{
. o+ U& E+ Y. G6 k. d: b // UART2 禁用流控# i3 F: p _' Q2 B+ D- V* |' a
UARTPinMuxSetup(2, FALSE);
1 X' D9 m8 b, C; t9 O& u. F}
5 m* ~) x$ i8 s5 ^8 F- Z4 T0 r
0 E% o+ q3 u1 _8 S. u& b/****************************************************************************/
/ D, a- n- [- a7 l" o/* */
0 {# o5 C4 @* j/* ARM 中断初始化 */
^ \# a. J* W( v5 t6 v/* */
2 A; \" A) ~" y4 ?7 {* t3 Z9 K/****************************************************************************/) ]2 n2 z! m! c T
void InterruptInit(void)7 n& H% M* S. s. ~( s1 s2 n% T
{6 _' W) k! j+ K5 X, \
// 初始化 ARM 中断控制器; f; n) d8 g' \4 s! m
IntAINTCInit();+ H# \' ^# T) m5 j# H
) o$ {4 _9 ~- {: z3 b1 h // 使能 IRQ(CPSR)
. ]( ], V8 \# x$ C8 }8 @ IntMasterIRQEnable();
$ |# `5 [( h$ f; O5 ~5 G/ ^2 }6 I: b4 a0 K) c' b
// 使能中断(AINTC GER)* f9 ^3 H' `. Y
IntGlobalEnable();
( a( h0 m, a3 e# V1 w: l0 e0 e4 W2 F- y. [
// 使能中断(AINTC HIER)
# e+ m3 h5 l5 x( [# w4 z IntIRQEnable();
0 s9 q( O+ P2 @+ u4 Y}
& c" H7 T5 M& k7 F& p; }6 n2 L! C& D5 g) B( f1 a6 o1 r. i6 o4 D
/****************************************************************************/
: S9 [0 W4 ~; V' L" K/* */5 M+ Y2 C5 k, b6 x
/* UART 初始化 */0 ?7 X a, A# e, D
/* */. X: \9 R( g8 O7 z
/****************************************************************************/
3 Y4 g/ c9 H( Gvoid UARTInit(void)- G* h0 a0 W* ]1 h K$ H; _- X
{
3 y0 Z# o( s0 H+ X* I/ _' f // 配置 UART2 参数5 k3 t6 o8 P5 o$ D
// 波特率 115200 数据位 8 停止位 1 无校验位
" y! \" ^4 G( \1 H UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 l4 R7 F$ m1 u2 T, S6 r5 X UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
) z2 X; L- n& c f$ D( \ // 使能 UART2
3 n: r: b' @4 Z+ u UARTEnable(SOC_UART_2_REGS);8 U- i- v; Y+ u1 T
: e* g" v3 e! S
// 使能接收 / 发送 FIFO0 P( W4 r; O" t: @
UARTFIFOEnable(SOC_UART_2_REGS);
' R$ U! `5 Q7 ]0 _$ B* \0 `% ?! i& A6 f0 N
// 设置 FIFO 级别
6 Q0 L3 q f8 u" k0 S" I UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
' z: l" v* @: O3 D}0 p! i* Z7 R/ @
: S5 }/ L: n3 Z" Y
/****************************************************************************/: o6 j0 q0 c4 O6 H
/* */
# F. _: j5 F& X5 D* }( U- o+ N* O/* UART 中断初始化 */
/ J r# x0 d7 P/* */. N C& z" D/ ]9 g; w% p: ?7 R) h
/****************************************************************************/% Y% o5 o. ~4 v, k* L
void UARTInterruptInit(void)
+ C; ?7 W6 o% d% J3 A. d9 I- w{
. ?% |5 A0 E- Z* p9 \ IntRegister(SYS_INT_UARTINT2, UARTIsr);7 e$ b1 @! |0 W2 m0 }( r
IntChannelSet(SYS_INT_UARTINT2, 2);
! t$ r# A7 q5 f M IntSystemEnable(SYS_INT_UARTINT2);5 C; F; \6 }6 q( t( C! ]8 [/ O% Y
3 R1 d8 R8 s( O7 m
// 使能中断
8 p' [ ^1 k0 ?; ^: | unsigned int intFlags = 0;( V) D: l+ J* M& F7 E5 M' o
intFlags |= (UART_INT_LINE_STAT | \, q! }9 g: V8 R3 M6 r) |$ B
UART_INT_TX_EMPTY | \
6 v5 M3 Z1 ?3 }- c( p3 n UART_INT_RXDATA_CTI);4 K a5 `. p: \: x0 V0 U
UARTIntEnable(SOC_UART_2_REGS, intFlags); |: F1 N2 R& ]& q) [
}: {+ z! Q0 f6 h5 a: D p7 N
! t% L$ l* P4 }0 M0 e' o/****************************************************************************/8 L) K O* o' M) y2 {1 \
/* */
) C3 [$ Y' r7 j1 h. T; i8 |/* UART 中断服务函数 */8 `+ v2 @/ L1 I2 ?8 V: b4 ~4 ~" p* k
/* */* o: G1 d* S5 q/ G
/****************************************************************************/: ~. h- V: y1 a I4 b" }! n' B5 y- n E
void UARTIsr()% |4 K% d% ?4 d4 h- X% j$ I
{8 f6 Q7 `/ b8 r, b3 C7 l8 l
static unsigned int length = sizeof(txArray);
3 m7 w6 n9 r% g2 ^ static unsigned int count = 0;
9 o6 I( t8 d# c; k: A unsigned char rxData = 0;' B4 E6 h/ ]7 Q6 z7 X @# a7 J
unsigned int int_id = 0;, ]& _# X+ M9 p7 n7 R% c- Z: i
9 I7 C+ Y4 y* u
// 确定中断源7 N7 I/ D( r) T7 l( v
int_id = UARTIntStatus(SOC_UART_2_REGS);3 |5 c- K5 P4 j/ \1 A! ?& Q) C! B
4 O& z0 \6 s+ u: v' ^& Z, P7 ~
// 清除 UART2 系统中断! T/ [3 M( ^5 \% Q* b
IntSystemStatusClear(SYS_INT_UARTINT2);4 {5 U+ h4 |- {1 F X2 `6 m- l# ~
) Z# k3 @ Y$ y2 |/ V // 发送中断+ D: W/ G: L: f) y1 N. r8 R
if(UART_INTID_TX_EMPTY == int_id)) F5 ^3 O! c3 P9 k4 I1 u5 ^
{
& }) ?% z& P* ~- U2 S if(0 < length)* x) R9 X0 S' q1 i$ A
{
2 `& B' c: s S9 V0 M, {0 ]- {$ R // 写一个字节到 THR
0 K" q- A4 `7 n4 Q: _% B( q UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 \5 \* P8 ~, W; Q7 i. n' D0 b
length--;
) J! O; ], x4 P& c0 f, w count++;
1 K9 B6 _4 J6 T. v' y4 Y }8 j0 A; U5 U0 Y/ N# `9 Z# P4 z2 ?' r0 c
if(0 == length)
2 c5 y' R/ Q* O' p/ T4 F' o- S2 n0 I {
2 e+ f! ?0 u) Z3 G2 t9 x // 禁用发送中断
( ~& I7 U i# m! ^2 M& i UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);( J1 V. g! }- S' c
}
% F: b& ^! Z: F& P( L }( m6 x. p, m( m* D4 |
/ B* k. k" f) U
// 接收中断
. O! f, O/ U3 h8 \1 ~ if(UART_INTID_RX_DATA == int_id)6 q* B6 M. f# F- ^; p# u* S
{9 \ F" e2 n B
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 u( r I6 O/ y, I' l. u5 ]( y/ W' u( c- F, d5 K9 A
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
, m8 L( |% R+ B, W, C4 ^% Q6 H }$ Y- ]8 K$ f: y* K( c' X
9 @9 T; l3 O5 u. `& M
// 接收错误
0 {0 |3 S& [- x/ h. X' H if(UART_INTID_RX_LINE_STAT == int_id)8 o* q) q- ?" J% Q( i
{4 j1 c1 q$ S7 v9 d1 Y
while(UARTRxErrorGet(SOC_UART_2_REGS))
" e2 o, O- U$ `2 F" N {+ z/ B' n( b; l/ z/ F+ H8 Y) {4 z
// 从 RBR 读一个字节
0 L# k7 ~& v7 c UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 Y$ |* N% ]9 z9 z" E6 V }& Z9 a% b2 D1 f" y9 T2 K: O( D
}
/ p9 s8 Z4 e. J; ?1 d, C( Z / ^' X2 u$ E8 b3 E* n8 c
return;
, P( q. n! C( u' B! E L}+ n) o T( { |# O
|
|