|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- a# W% a) D, ` N# C4 C R! P& N: A1 a
#include "TL138.h" // 创龙 TL138 开发板相关声明1 D& C: I! z9 H: G2 B
! ^ f1 ~: J7 F0 w. }, X- U6 V#include "hw_types.h" // 宏命令7 B7 i6 ]- {: w/ V2 x) H3 Y i
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器; _) F# d5 C2 _5 k1 ~/ F
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
' y B; e5 D0 g! M9 L) Z! T! o7 n" F. b8 ^- o+ k
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明9 Q0 _1 v( @5 k2 q* F0 B
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
! U+ @3 F! f. \) s+ C2 T' p& C#include "uart.h" // 通用异步串口宏及设备抽象层函数声明- `1 ~9 h# v2 ], z( F& a
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ i7 e9 F1 w, [; X% D8 _. f. t" ^
$ ?, ]/ [" M4 l, C& _8 f+ ?6 n/****************************************************************************/
7 h6 x1 N' V/ M7 D6 ~( b/* */
) ~* x) g/ p) e/* 宏定义 */+ ~: q& c2 Q2 J5 r
/* */
0 I, H( R8 t) x6 l/****************************************************************************/
; ` p2 y# ]& `. f2 U// 时钟
9 q2 m& g) z" A. q#define SYSCLK_1_FREQ (456000000)
. [' }$ F0 J2 e3 _/ z. b. s#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)5 g# F( E2 V% b( K
#define UART_2_FREQ (SYSCLK_2_FREQ)/ v9 I* I* R) R+ {3 T- h* `+ z
5 ^( w0 X% }1 l& ]- L" |/****************************************************************************/& R- m" |# i' N
/* */1 Y3 x' `: i6 {+ ^; |
/* 全局变量 */8 K" m/ [" E' @7 X& J
/* */3 X% I% a1 ]9 T1 V! F
/****************************************************************************/- A2 H1 y, \4 u$ a6 i3 r
char txArray[] = "Tronlong UART2 Application......\n\r";/ K# s/ w- z6 }1 c: R
% `1 c& W: x4 @/ L
/****************************************************************************/8 y7 h" I7 y) }' S/ f
/* */
6 I9 b6 u! ]5 o: o1 B4 ?. ~/* 函数声明 */ \7 e4 e) i/ t9 `5 l
/* */1 ]2 M& D) A9 g( @1 B
/****************************************************************************/
. ? p7 W- N$ a. ~; u# i: \// 外设使能配置
+ `8 Z& B9 E# Q( evoid PSCInit(void);
7 P9 F K; q c' O0 ]- X2 y3 Q, C( G. W) ^
// GPIO 管脚复用配置, N: Z& J4 K& G- `5 L( M: r
void GPIOBankPinMuxSet();
7 A* C, u2 m; K2 B" ]7 x) ?
# k- C5 X1 ?8 ~$ V/ E, v// UART 初始化7 B! ~. E% ]* ~( J
void UARTInit(void);
( e/ n4 m* v" a2 `. V7 x5 k- F: ^// ARM 中断初始化
( b& M c; M9 t& ^8 Zvoid InterruptInit(void);
0 ^ I* }( e4 y" h// UART 中断初始化
7 _2 R0 G2 P# Y$ m9 f% fvoid UARTInterruptInit();, a+ \2 L- }' ]2 d' `2 C& L
// UART 中断服务函数
. I% D. i: [1 P$ V$ q& ^0 kvoid UARTIsr(void);; I) _* K W- U
# f! M, e! p# u( \; V/****************************************************************************/8 u4 F O& j$ m9 c5 G# W
/* */' S. d- o$ ^3 m" W& D
/* 主函数 */ w8 k6 w) {5 ]- a3 T
/* */
) \5 b. A- v0 ?! o$ q- c/****************************************************************************/, V7 I2 X( u5 P1 K
int main(void)
% S2 L6 q3 [5 i& h- f/ N$ \{. N; n; k) T& a/ p
// 外设使能配置
3 E: x( _+ `; B PSCInit();
# J/ y$ }* k8 X2 y S
! d- J. F0 R! @$ s# Z! p5 o& c8 n // GPIO 管脚复用配置
' a% z# S- @9 v X GPIOBankPinMuxSet();
) d# c# d( }( K+ s; Z
( B( Q) `0 x0 ~. o s // ARM 中断初始化! I$ X" z% E- Z! |9 y9 c
InterruptInit();, Q2 V) B ?- s" i0 f
r* b* f* n+ `7 Y4 D // UART 初始化
, X8 ~! B( k0 ?/ F" q& b3 j& U4 z UARTInit(); G6 J# o; r( ^0 o1 r0 N) o' G+ @
: V3 N; G' c* i6 ?
// UART 中断初始化
+ p$ ^4 }, z& [9 b7 n UARTInterruptInit();
1 I# G0 f' k% F( v3 p3 ]; L @9 F/ N7 U, t
// 主循环* b) v- ]( ]0 ?& ]' h
for(;;). k% `, q' j8 ]
{
7 e" e- l7 r* B$ V. ]# x" {8 l) F0 n; j+ i) B1 I3 v" ]$ i
}
2 R" R" w4 N; T$ ^( a& G}- U) G! F# l7 f2 B
2 F3 c0 o0 W$ o ]8 c/****************************************************************************/
( a, w1 U1 R" V/ ^/* */
6 n S! G4 f8 N4 r5 P( [7 T- e# F( D/* PSC 初始化 */
/ w) z: v: E3 Q/* */# M! Z9 ] O1 W0 g7 ^9 S* L
/****************************************************************************/ L: c, v" j; V. X7 n& r+ v/ ~. t: l
void PSCInit(void)
- o% P# @+ R' {$ a{
2 t: u" U; R4 `. h // 对相应外设模块的使能也可以在 BootLoader 中完成& d h7 u6 s& n/ l) ?: Y5 H) G
// 使能 UART2 模块
9 u2 d7 i- e1 \. v6 r- w PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
8 m$ `6 L4 a0 n! J/ w! D}9 s( ~2 s6 Z( l1 n, E
" T# G+ `$ s0 [8 ^8 T$ A* l/****************************************************************************/
2 ?, A* A6 D: b5 I0 F/ p/* */
% H* d- s0 t/ ^: h" _- p3 t; O; y, X! ?/* GPIO 管脚复用配置 */
2 h8 ]$ K: F. |' f) q/* */" H! N7 H+ v# c: t P0 h. m% {! F0 h
/****************************************************************************/
8 N$ l6 k& `4 {3 h4 r' p' }3 V0 \void GPIOBankPinMuxSet(void)3 i! u0 v5 E( E- Y9 e8 ^6 F* c! q
{
, ?1 F5 E+ N3 ^% t' p8 { // UART2 禁用流控: e- |3 u6 r! O& c. L
UARTPinMuxSetup(2, FALSE);
+ ?2 @/ m3 n2 F; W" M3 p9 Y}
; {" G4 X! I/ D" ~' C4 A* r8 A) j$ e% B( {) Y
/****************************************************************************/. @0 e" i; l, w- G9 ?9 L
/* */
) v" D3 w: Y2 @; S& t- f+ g+ X& C/* ARM 中断初始化 */
( e/ a3 ^5 c& E, v4 Q; f/ j/* */% M+ `. V! l2 y6 Z/ E4 g6 k) e
/****************************************************************************/
, ^6 w/ c' S6 L I' O; Nvoid InterruptInit(void)
3 n4 X. y N' T: [- I0 o; }3 c: f{
( ^7 O& q- R- n6 y // 初始化 ARM 中断控制器
0 F( N1 b7 d' G+ i4 ]2 p IntAINTCInit();
( i* [/ [5 X- L* ]* X7 `2 R
: Q9 M8 E: o9 X# B$ d B: Y // 使能 IRQ(CPSR)
% y7 m7 ^/ p8 \* v1 Y IntMasterIRQEnable();9 o# I' S1 A3 r0 u M3 W
I# g+ _+ ], ?/ z
// 使能中断(AINTC GER). r- o- X, K1 G
IntGlobalEnable();
5 ~3 l# Y- X5 r& Z4 `7 y( N& r4 R1 _/ o, p' V
* I- G, T& D" a // 使能中断(AINTC HIER), ^/ Y+ Q ^2 c% E9 s" L1 l
IntIRQEnable();
$ h1 \* `2 \- ]- l* g/ y}
: U( v/ L. ]0 Q1 Z% ^% w' p
$ n' C6 S7 x" ]2 N! A/****************************************************************************/
3 y" o! l4 n; n5 X3 N4 G! p8 d A* R/* */& w3 ]' f, H. A7 J$ _( u
/* UART 初始化 */
" J. b- \3 D# c+ H1 ^/* */- a" d* T5 A( Y2 Q" X) H9 o5 B
/****************************************************************************/. @' A6 r5 z; k4 C2 U) h2 p
void UARTInit(void)' E. r5 @1 B3 o
{! R3 `4 l2 G( p5 u9 s' J- E& ?" j* j$ E
// 配置 UART2 参数) C7 a" ]; h1 |) Q! o* O7 [ v
// 波特率 115200 数据位 8 停止位 1 无校验位# `3 L4 Y) j% Z, S. y: C, v8 o
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
# y- L- f6 G' J6 @: H UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
y0 }" N- G1 c+ r // 使能 UART2; k( X j' l) }! \- B
UARTEnable(SOC_UART_2_REGS);
) P% _7 X1 `3 M d/ s; T7 w/ ]. o9 q0 @8 r+ N' D# q
// 使能接收 / 发送 FIFO2 u+ d8 O' K: `3 g- w
UARTFIFOEnable(SOC_UART_2_REGS); g5 v. g$ h/ i. Y- U
4 V0 H2 [9 G9 z6 O" M- O+ H9 o
// 设置 FIFO 级别( c8 |, R4 R; g/ @+ K2 l
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, f1 V. \( X) C& r}
3 R# _* b0 a( O; e4 o( \3 L) N8 `3 V& m, U/ v: F
/****************************************************************************/1 r+ V6 j1 M+ Y- n1 f3 B* e
/* */
0 t& I( h" L: \/* UART 中断初始化 */& _2 p' ]3 K- {
/* */
4 e( b x Q+ C$ d' O( r/****************************************************************************/ D1 J# E$ |' W6 i* X
void UARTInterruptInit(void)7 V) K V! A$ ? P4 |1 p) n
{
. @1 [& R6 O" ?* w7 Z6 \ IntRegister(SYS_INT_UARTINT2, UARTIsr);; x# K; m1 v/ ?4 m' K, m
IntChannelSet(SYS_INT_UARTINT2, 2);
0 d5 N5 }* j) O: J& n4 v( j- z& ] IntSystemEnable(SYS_INT_UARTINT2);
+ |, m* ]+ h/ B2 j& R+ W
+ O: r; c& v6 U, \ V // 使能中断
! u/ j8 R5 P- P( ^8 B5 h6 F unsigned int intFlags = 0;
9 V! Y: B: [2 z intFlags |= (UART_INT_LINE_STAT | \
4 L1 f( U6 T4 t/ S, N1 ?# |. l' J UART_INT_TX_EMPTY | \7 Q7 a. ^% d( A, P
UART_INT_RXDATA_CTI);8 z1 f1 Q% @0 z7 R" B
UARTIntEnable(SOC_UART_2_REGS, intFlags);
, l, b/ w. |7 K}# J# C+ _- f) o
4 x* G8 {" A: t2 R, l8 Q3 Q- ^
/****************************************************************************/# I6 v( `; g9 J5 y4 T
/* */4 u' |2 k0 D8 |* @9 `) ?! f+ p
/* UART 中断服务函数 */
' Q. k3 J7 D4 Z5 A M$ Z/* */
, q& K0 }, m, s1 t' I6 |/****************************************************************************/
, y7 d2 j8 @& w4 K9 Vvoid UARTIsr()2 ]' w7 J- b+ I# @6 J
{
% K# k) _( ~6 I7 L& I0 W static unsigned int length = sizeof(txArray);
' F( I$ z$ X1 M, ]" z, a$ k static unsigned int count = 0;
( }% E% l: \( C" Z$ H# t2 W' @ unsigned char rxData = 0;+ V `) `; \6 H" w" E5 c
unsigned int int_id = 0;; c0 H$ R0 l9 e _6 b9 [
+ W& S9 W+ J7 B2 ^- O0 s5 p& ]8 A // 确定中断源
4 q3 B* r0 d# U: W int_id = UARTIntStatus(SOC_UART_2_REGS);
( y3 F' g" E! a B
! q S! v X3 D' b9 G5 f // 清除 UART2 系统中断/ f7 u" s$ b. U# V2 y' l
IntSystemStatusClear(SYS_INT_UARTINT2);$ B9 C- v% f2 O4 Y( x9 X
8 ]9 W T, x7 j) _/ m. [, r8 K+ y // 发送中断# F5 x. H5 A/ t$ L/ C
if(UART_INTID_TX_EMPTY == int_id)' s) H' {+ ?) D! b
{+ b/ V' L. I/ n2 U- R C7 }
if(0 < length)0 ~. X+ t! F. M6 e2 {$ A
{- |7 y% F$ |8 Z0 J9 o! [
// 写一个字节到 THR$ B3 f) j5 {# T9 h
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
) P9 F. n4 j7 X length--;
6 J l% J5 v+ a) D. D; [ count++;. C( c% ^ d: F' I8 F
}! k7 J8 A ]0 p0 T
if(0 == length)/ Z% z# H0 s' L' a! i
{0 R5 \/ ^; b7 Y# S* M6 i) p% G
// 禁用发送中断 s* U- l+ P' m6 B
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);9 k0 s& C- P, Q
}
2 y5 i0 ~; {7 R1 Y" V0 f }8 o% F8 I" [2 {. \
) O Z' v# d! ]" ? b' h5 @8 e // 接收中断, j0 R9 e& C, S \
if(UART_INTID_RX_DATA == int_id) Y0 A0 l. J/ ~* {, t$ d
{
7 F" h1 Y/ k/ B rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ Q9 f, F' ?! t8 W; L0 G" k/ f
% S3 G6 ?& i7 a1 ?' d UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData); J! n3 @2 }4 } k0 P% Z, q9 b
}: O# c' J; v! Z5 O
/ s& M- N( v6 @. S // 接收错误
7 t3 }+ e6 l- `' _ if(UART_INTID_RX_LINE_STAT == int_id)
4 T3 c3 P t$ a+ r. L: E {
% n s$ d4 s7 M( H while(UARTRxErrorGet(SOC_UART_2_REGS))) i. d: \& _6 U1 b, b
{- i8 _( n4 M3 z; {
// 从 RBR 读一个字节/ |8 Z2 e/ z1 B) A8 Z+ Q
UARTCharGetNonBlocking(SOC_UART_2_REGS);* g, q$ f. Q# v' K
}
5 E1 a9 d/ S& B! x. B }
9 v8 E/ m3 A( m7 k* _) r0 k
! }2 V- }" N1 h- `, s% y( g return;
% `3 q- `% j5 k& ^8 c: @}( |" |3 ^! v+ n! _0 |
|
|