|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
, w. N6 a6 C F: k4 O+ ?% o/ y$ B
% P0 h( t, o0 \8 R) g! s" z#include "TL138.h" // 创龙 TL138 开发板相关声明; m; Y. M: t* r
$ a; c' ]: F5 x& Y$ k
#include "hw_types.h" // 宏命令9 o& z3 p2 ]. A7 y/ O( }# O
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器: R" q r+ M3 `8 N0 W& z) z
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器' k" a3 V( M0 i3 |' P: F
0 I; @1 G: ]3 \1 ]" B4 q) Y/ f# u
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明9 O' p1 z+ q$ ~0 R6 [8 @" F* F
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明4 O) h1 j0 C& h, K- j
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
! ?# \4 G1 H) I+ l: }8 Z8 J#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 C- j' }& V3 I3 B- C1 p& Z" o9 v0 ?1 L% x
/****************************************************************************/. o4 m8 x7 A, E
/* */
q T- n5 T" W+ i/* 宏定义 */8 |! z1 Q3 d* Y: z1 ?7 h2 v
/* */
2 s1 q3 E/ ~* J C/****************************************************************************/
& J8 S6 K; w" L5 N7 p// 时钟
! C/ n9 O- C9 P8 F#define SYSCLK_1_FREQ (456000000)& d; ], W" z& G
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)! B& B/ R# I. ]; I% `& K' X
#define UART_2_FREQ (SYSCLK_2_FREQ)5 s) ` W+ R( A# c# ^: u
3 P& c ?" Y! c/ I7 X: G/****************************************************************************/
: l2 ^' Q/ n4 ~* ~* O7 L( u: @/* */- S! K( D. Q ]7 o5 Y7 G! `& o
/* 全局变量 */9 p: Y% | e+ X
/* */
( ^9 f% c6 T, J+ V9 h/****************************************************************************/
2 ?( E: C* b, V2 [1 Dchar txArray[] = "Tronlong UART2 Application......\n\r";
$ W0 y, v% f5 [" Z
/ @5 S- N8 j3 z, x+ m/****************************************************************************/9 s2 n3 o/ l+ l" T8 [
/* */
6 z8 |4 r O8 u* \8 B4 x' Z+ S/* 函数声明 */$ Y3 h X/ f7 x/ E
/* */
! e' m0 q, r0 V+ g/****************************************************************************/
6 L! F" U; ?' {// 外设使能配置
c5 |2 U4 L- [2 Wvoid PSCInit(void);0 C! u {/ M+ V) e+ ^" a3 Y3 g7 F
% H6 S3 H" A* H+ X4 ~, v0 X$ W4 C
// GPIO 管脚复用配置
! J4 D6 r% t7 l0 a6 N, _void GPIOBankPinMuxSet();& B- o9 e* f) ]: G3 V7 B
( ^) E( d7 z+ I. q6 v0 @
// UART 初始化
: z: a% V$ [5 X; {: D' G. avoid UARTInit(void);' s% T! d: k; q* J% D* L" O
// ARM 中断初始化+ L4 ^3 Z2 A9 d' F
void InterruptInit(void);5 y, `7 I* I/ k9 u, e. h
// UART 中断初始化
3 T' d. ]5 S$ A) Y" Svoid UARTInterruptInit();! {. q' k) Y8 W! f# I' W
// UART 中断服务函数( [7 g# x3 o G/ I6 Q0 f
void UARTIsr(void);/ Q/ U C# Q$ O4 {6 K6 X: y
* O+ [% P4 J B+ l6 Z. e; K/****************************************************************************/* t- c: S& ^2 h5 k1 V
/* */' N+ A8 d& r9 F/ n) A/ t
/* 主函数 */5 m) H5 Q4 K6 m$ D% t
/* */- \2 T5 W5 _1 e! M$ u/ e, x
/****************************************************************************/1 [7 Y, W" W! V5 i8 H! M6 y
int main(void): D+ o+ c: u# W6 \
{3 A$ }! F! N7 c& T* t5 }) S
// 外设使能配置
9 b$ m. ?3 L: h ~! b& ?: |4 X PSCInit();
* \: L) j1 l: |- Q* J
; k, T: b: A2 w; J+ t, b // GPIO 管脚复用配置, g! m% a% q) g4 ~( j4 y
GPIOBankPinMuxSet();
) x$ U2 Q& i8 W3 X9 R2 k
' y3 e% l0 R1 W6 o" n: z // ARM 中断初始化' T5 S h3 [/ Y3 N( }
InterruptInit();' i( d$ t h6 m
( Q8 q$ F+ N) z3 y8 J
// UART 初始化
$ q$ M& h. L9 _7 l" ^ UARTInit();
3 y) {% R* f" P2 Y
- Q: T% U6 B) `6 J // UART 中断初始化3 q8 Z9 X$ I" }" Y1 w7 i9 s
UARTInterruptInit();' Q, I" J- }* y3 ^% D, k1 ?
8 O5 _; ~& Z2 C // 主循环
, ~+ O9 @- Y0 e7 b for(;;)
n; x* [& }. e5 m1 u1 l, r {; T: d( l* V2 Y2 n0 C) r# _1 s# f
0 O* M9 \. W1 n/ Y+ L9 E( z
}
8 Z. ~6 H6 n$ b8 d}
- s3 r* s7 f& V8 S O& r+ z' E$ Z& d& h. ]0 ]4 o+ R
/****************************************************************************/$ ~/ @) d+ J% @
/* */$ ^% x! L& H+ n+ S. F
/* PSC 初始化 */
$ n: |) ^8 p" ^& A ~" {& W( D/* */
# Y% ` ^6 a' J3 P. y/****************************************************************************/
# ~) |; s# ^/ q- R* M, P6 Avoid PSCInit(void)2 o) z( u1 X8 h' M, ^8 J
{
$ h5 U6 y+ K# z% n7 R( x* G0 v1 ^: v // 对相应外设模块的使能也可以在 BootLoader 中完成
1 R/ G+ H6 k8 x1 f9 y6 a // 使能 UART2 模块6 i8 a0 `6 I/ Q% C) z8 @; N
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; e: ^/ [& r- F- ?9 [) A% Q
}
- W* M9 V3 k) t, Q3 L
$ M: b- h$ _" c' t* V6 y! g/****************************************************************************/! H! Q; V, j |% j+ D+ z" B" J! ^
/* */
; V* ^$ s1 l; h/* GPIO 管脚复用配置 */( {7 j6 R( o: J* {5 V
/* */, j: T3 a( p, g" @$ o* X
/****************************************************************************/
# }3 T4 r+ b5 T' Q4 y/ ovoid GPIOBankPinMuxSet(void)9 X8 |5 C& @) \
{4 f! c1 X2 N0 v. g+ q W) e
// UART2 禁用流控* A1 V4 @9 q* h8 ~ h; K) S" i
UARTPinMuxSetup(2, FALSE);7 H+ ]8 h/ j( ], j0 J( Y: \
}
8 l1 v1 V" V1 E* W
4 i( ]+ m2 |; w; B2 |/****************************************************************************/5 i- n5 t5 x$ y* h7 f. E8 C: {! E
/* */
6 I: O2 \5 X" D* ?" J9 i* p! Z# V/* ARM 中断初始化 */# j( ?+ @& d g4 t7 q- }& b
/* */" t8 b. m# }, D: f3 R0 ^" ^
/****************************************************************************/
0 O( |8 P. G% Z1 f* O4 Avoid InterruptInit(void)5 H+ X5 b. _5 W2 U' X+ x
{3 K3 ?6 t. E, K+ M4 t' T4 j9 V
// 初始化 ARM 中断控制器
s2 Y9 l8 f5 {& Z |& ` IntAINTCInit();6 G2 J1 ~* C3 G, F
: z) c' l( i# w% M6 ^$ i // 使能 IRQ(CPSR)
S1 _5 e/ B2 C0 V9 ^/ g IntMasterIRQEnable();
( ]+ J* c: ]/ V# h; z0 p5 Y) u. t- H9 Z& T: P2 v% Q
// 使能中断(AINTC GER)
1 X4 P- g# O9 k0 b$ K. U; H/ ~0 u IntGlobalEnable();
; e1 k& N- ^7 L
! Z( K4 c9 ` w: R( z1 O // 使能中断(AINTC HIER)' }* C/ L2 k$ ~/ M; X
IntIRQEnable();
' U7 q$ V# n' z3 h; |5 ^}& f0 s0 {, Q& P+ _$ g2 ]2 b
3 V, A0 v+ C, I* Q/ G, F0 c/****************************************************************************/
: l; p5 N9 [( |0 D/* */
; V: t9 E( }& `* D/* UART 初始化 */+ l8 U. u b' ^9 o
/* */
6 e x- [( h% y2 Z, t& y/****************************************************************************/
. [" ~9 a$ D! s) Z Xvoid UARTInit(void)* }: r# E4 Q" n! y( f$ i7 r) y5 V, U
{# Z+ Q# q' K- p6 Y2 q( J' s
// 配置 UART2 参数
7 N, O: m) B+ Z9 T0 { e // 波特率 115200 数据位 8 停止位 1 无校验位5 W1 `1 Z% B# B# e, W3 l$ [
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 l8 e6 j) m( z0 X UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ {* c5 R# J1 V
// 使能 UART2
1 A6 k" z& M, L) g* ]3 x' d7 d8 G UARTEnable(SOC_UART_2_REGS);
/ J% [* t/ W/ z$ R: o q7 _$ F8 h5 |" c# Y0 x) }! I: X$ V
// 使能接收 / 发送 FIFO
& }, `0 R0 U* o5 G, S6 ^/ G* W UARTFIFOEnable(SOC_UART_2_REGS);! _9 s/ q7 c! @: f( S- b' R5 | W
2 s* G% f6 T" V4 |$ |* w" K9 k) q // 设置 FIFO 级别, ?0 a/ i. y$ {8 D$ m
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);) a) m4 C' R6 Q
}
5 t% O; C$ \; s: r3 w% ?6 C4 I
! b8 j# @) U" h( _/****************************************************************************/5 s# @$ U5 K: v3 t' b0 g
/* */8 h$ P, l7 F- k8 P' L
/* UART 中断初始化 */
9 X* D) S, o* S& w5 S/* */
) a" Y+ j: w4 ~; u9 ]! m# B/****************************************************************************/
9 V- g5 q' ~' j/ P4 Vvoid UARTInterruptInit(void)9 m- `0 n; j( w3 @
{9 `" d- |$ B' M9 [2 z' {- J
IntRegister(SYS_INT_UARTINT2, UARTIsr);0 }! @+ V2 A5 u0 X
IntChannelSet(SYS_INT_UARTINT2, 2);# y( m! n1 `( H: X5 @
IntSystemEnable(SYS_INT_UARTINT2);
; x/ j& w/ O$ `, B4 c, a L' K) W' z( ~* Y# m, V9 H
// 使能中断
1 d, @4 k% L( f& f: p9 h unsigned int intFlags = 0;
5 z" [8 z; W" P9 w intFlags |= (UART_INT_LINE_STAT | \1 ]1 j6 o" k9 } o! f
UART_INT_TX_EMPTY | \: ~9 F* C" _# n/ l
UART_INT_RXDATA_CTI);
4 k4 k" l4 y4 G, Z( Z6 f UARTIntEnable(SOC_UART_2_REGS, intFlags);! o) u$ t0 P- h
}& [( d. i6 c5 o3 {. @
5 a) [ B% V% ^" R5 s7 a- y/****************************************************************************/+ D1 n: x; U& f7 g8 _5 S
/* */
9 a, g+ k# l5 f7 h) O+ p/* UART 中断服务函数 */
U! [5 l. e2 r( B9 b7 C6 f/* */) n7 Y, l8 S4 o$ I4 o6 ]/ Y: c/ T
/****************************************************************************/
. @$ I- z. m% D+ }6 H( ivoid UARTIsr()
0 C) m& n& y1 [( E+ R{
0 x1 \8 N0 O: H3 s static unsigned int length = sizeof(txArray);3 R- ` P+ L" R& l, F8 P
static unsigned int count = 0;
8 X6 i# q2 I) g) V unsigned char rxData = 0;9 }; ]) \& j. k' p \+ C3 H
unsigned int int_id = 0;
0 f- D6 }* Y$ X- D1 K7 {
! J6 e; [% N5 \ // 确定中断源
; _5 J1 i; @% e8 b$ f int_id = UARTIntStatus(SOC_UART_2_REGS);# {: `" }4 G: I( ~4 k1 T6 S6 u
& S7 o+ P0 m9 [1 U2 X0 _' r/ n // 清除 UART2 系统中断
& O7 T$ f- S7 E, I IntSystemStatusClear(SYS_INT_UARTINT2);+ S9 j3 E* O, P* E: j
- y' Y0 w" u+ D6 I
// 发送中断
% y3 q0 @& M6 _) E( I, l( A if(UART_INTID_TX_EMPTY == int_id)
( n- J* K: k8 a- X( C6 F N {
% f( ^/ O9 ^% x8 H if(0 < length)! Z7 h1 D8 o" ]$ O! r
{
. C# D' q% C ]" { // 写一个字节到 THR) q" w( H. Y: A3 H+ ?+ J" e, i
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 _, D. l, j2 @5 \: h
length--;
9 e! }; `" L% w, m+ w1 H count++;
& L3 N' f2 T$ _" Q9 j }
2 Z3 k: D( o; ]7 B5 Z: [ if(0 == length)
* {, K" C. j5 D5 j, T% ~ {4 z9 Z9 F1 G' R- X, E
// 禁用发送中断
/ Q' L0 @$ I D3 M) B. E* O UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);3 |; B7 m+ ]+ ?' A+ |9 c
}
8 o1 U' s! \, |7 x7 _2 @( q }" m% u( o% A% r4 a
0 I8 Z% X4 O# i2 p9 s5 b. x# M6 y
// 接收中断! G" i, l$ w5 m/ j8 T
if(UART_INTID_RX_DATA == int_id)
$ L, e- G: s @' P+ r- j3 f {
8 v7 p, z+ Z, E/ q& R1 N( ]9 R rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* `7 X8 s2 \2 b, t h- b- L
H- Z5 O+ S: w5 t2 j& R# O4 T4 h ]
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
2 v5 l4 h+ c% y( [) T }
: r2 O6 |! T+ l" x0 Q- P0 Y0 K" |/ y8 l7 L
// 接收错误
: A- C3 d$ D+ C* ]8 M# @: ? if(UART_INTID_RX_LINE_STAT == int_id): ]8 p p% {7 a
{$ d, j$ H* y/ f/ j: t0 m! w
while(UARTRxErrorGet(SOC_UART_2_REGS))
/ k- F% V: }- G8 r4 d {1 r8 X3 @5 D" g
// 从 RBR 读一个字节9 R- P/ x2 x' I# i* w
UARTCharGetNonBlocking(SOC_UART_2_REGS);& s# d9 w$ F% O
}
. ?2 k* \( b8 r, c# J, {3 P X }3 b, j. T6 ]8 J, p) F) L A
& R% g4 l5 S! B
return;
f: X) N3 A7 q0 B}, R3 j+ V. g. b( N6 h1 l+ k: R0 X
|
|