|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。# u* _2 u" _4 N3 X0 e8 k1 r/ Y9 w
. g2 r1 A4 s- \" Y
#include "TL138.h" // 创龙 TL138 开发板相关声明
6 l e2 d: Y: }0 y% q# U+ n8 S0 w! m: k8 E9 Y1 A) u Z% B
#include "hw_types.h" // 宏命令
1 b, }3 T3 X" v, _+ o4 E#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
/ a8 T9 }% G5 F7 h" q' _" }#include "soc_OMAPL138.h" // OMAPL138 外设寄存器+ A, U1 {3 O. r" A! T6 |
) J6 m% K& t: ^, @#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明+ q2 b* s/ y7 _+ V! ]/ l
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明( T! ^2 {* P( i
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明4 D% t+ ^' i5 J. |: n+ X' k& M3 Y
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; {: F: h5 m2 |; Z& v+ s# X' j) ]! I7 @1 Q5 O Z
/****************************************************************************/
; t! V( \6 _. D- j/* */
% v/ V4 C) A7 ^/ Q/* 宏定义 */$ {9 x. v$ W6 z. f( y- O! x$ k
/* */
: v2 X9 y# p3 l2 D5 t- R/****************************************************************************/
0 a; P) N- ~3 s' \' k1 L2 d// 时钟 Z% Z+ v2 v q' R
#define SYSCLK_1_FREQ (456000000)1 ^( q; W; f7 N+ K* ~
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
! o( @2 l& e4 Q2 L4 O#define UART_2_FREQ (SYSCLK_2_FREQ)
7 e0 B9 e$ H7 k6 \( M' d0 K2 ^0 c' S- F
/****************************************************************************/
8 `2 Q+ u. w2 [0 \' Y! ~6 j1 {* ]2 V/* */% a* Z2 r. s. [) c4 p
/* 全局变量 */
- O ~- G) u6 ?; B, t0 Z/* */
6 s4 d4 ]/ [( T3 ?& E& R6 N/****************************************************************************/
* v. S8 S( f4 ychar txArray[] = "Tronlong UART2 Application......\n\r";
# e6 C2 j/ a: a8 H" q5 x% g1 \2 u$ j
/****************************************************************************/
$ d( \& {. n9 W( q: m, Z6 R9 Y; Q/* */4 f2 P! h0 e! n' X
/* 函数声明 */
% _* ~2 M6 S. m' ~) J. Z' H/* */' ]/ P: j2 N' P& |. Y
/****************************************************************************/: ~2 I- y% [& e) e( M R
// 外设使能配置5 s; K) m7 d0 Y* f" U+ Y
void PSCInit(void);% L: e: @$ D o6 k7 Z0 `) h
: J5 k$ ]" E4 H# I
// GPIO 管脚复用配置3 F; H; u0 h' j- l5 ]8 m
void GPIOBankPinMuxSet();
. X, K0 ~" b H0 T& z. I9 O) ?5 ^
) @+ q! Z F" h/ G// UART 初始化; o) ~6 R: Y7 p: y, N# N( J
void UARTInit(void);5 h3 o. v, n! N: E" n, A T. L
// ARM 中断初始化
: F) O# S& A* r5 }6 [. fvoid InterruptInit(void);0 z6 a0 `2 E$ s/ G) B3 S6 e9 V
// UART 中断初始化
) q+ Y8 L- E0 g+ b6 h' s S8 Mvoid UARTInterruptInit();
, e0 k# R* ?" t: [) R// UART 中断服务函数
2 P7 c8 X- _" F# v# kvoid UARTIsr(void);
* g1 v! _& S' w1 C; W
, g( ]& d7 `/ X) x& b/****************************************************************************/
/ s; `5 k* o6 }" \6 k( ~/ e/* */
9 P/ F3 A' J1 w4 V/* 主函数 */9 t9 L+ D8 K# A
/* */
, w) b6 J" d0 h/****************************************************************************// G& `9 |" c( T, c$ d! E0 n7 h
int main(void)( g% \# m& Q8 ?1 F1 R6 h& M9 _
{
2 d2 ?" V$ u6 m, U v // 外设使能配置4 [( o% [+ I$ [& `4 d* @6 @
PSCInit();! x3 b; B- |7 v& t* _5 S
$ E- o/ x+ U" I2 g
// GPIO 管脚复用配置 a* _& c$ ?; a( f* g+ c4 R" b. E" A
GPIOBankPinMuxSet();
: k: f' w* E( v& c9 N! x+ [) M, W. C5 A# V U
// ARM 中断初始化( v' k4 l8 T+ x) U/ G6 R9 m4 h
InterruptInit();
+ k) I; {/ B! Q' d' `$ R. ~2 Y- A3 J' {, B7 B" C
// UART 初始化
" [2 W' M3 `+ S3 o* F0 C UARTInit();
7 C ^* u% `+ ]# |6 q( ~7 U) X$ ~0 U B5 s: j# ~$ F
// UART 中断初始化# H' w+ @" H9 ~' W2 `% h/ T
UARTInterruptInit();
1 f3 _7 h# r' L6 @4 J
, i! x6 m8 S: ^+ L# s1 y // 主循环
5 f$ C. y" h5 H% a1 J' J6 R for(;;)- x! Q* X* Q/ G- C# R
{
- g8 _/ P, n. a$ b- R( T, k0 ^- [
# r& c! ?- o4 \: z6 ~- y }
+ o7 U3 Z* `5 K' ]}3 S" a& x$ o4 s3 q
% z2 E5 j$ \( E4 f5 v/****************************************************************************/% \8 P# O1 v# h- S: y# T1 X
/* */
" t. P! b8 o8 x6 M4 ?, Z8 l/* PSC 初始化 */
' [8 k" H+ u/ L: ]/* */
/ m* Z' H2 Q2 M( b7 e1 v/****************************************************************************/
3 N# w4 e; {! cvoid PSCInit(void)% [/ M: y) Y& F
{5 F1 t7 z+ g( C' B3 p0 d# ]* o l+ s
// 对相应外设模块的使能也可以在 BootLoader 中完成6 I4 P- t% M$ ?7 ~. }
// 使能 UART2 模块
7 Q1 L1 h, o( W PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ M" o- ^4 U6 ?2 I: e}
2 p+ U( v' B( T- Z& l6 I
9 z7 j8 m( ?9 S! j( i6 s+ G5 Q/****************************************************************************/
0 T& b* z) r" Y! x( J/ e, f# f9 @/* */
- x. i3 P- Y! B9 [/* GPIO 管脚复用配置 */
: @/ E. H8 t; _! V; S( u/* */" B, g- [' k E) A4 l- X
/****************************************************************************/
" D4 v9 d# K3 N, G# L0 dvoid GPIOBankPinMuxSet(void)& u: t9 }* @) l
{$ @, ^0 h2 I9 a: y8 S
// UART2 禁用流控
( o/ X/ D s0 |8 U: I UARTPinMuxSetup(2, FALSE);
1 G% I7 F# G: G# J}
( A# h: p. K' X; V4 q$ }* C: E5 R }* c
/****************************************************************************/
* X6 N5 G7 e3 u. ^" j2 I& V. G* U4 j% n/* */
1 v4 U! L# v; |' V: Z# R/* ARM 中断初始化 */
2 ^. G+ z1 g9 Y5 H, Q$ o/* */
; a1 V5 t/ ?/ n0 M( A/****************************************************************************/
( A3 ]4 t) Y1 T& f7 r8 A( h) |void InterruptInit(void)8 m+ _5 b* _2 j. z( s
{
; b" X/ ~$ q! X3 B" Y1 w; r( ? // 初始化 ARM 中断控制器
9 M' w0 A6 R& n/ d F IntAINTCInit();
9 B9 F8 b; w2 _( K- ?7 d3 q9 d
5 A# `, g& ^1 Y // 使能 IRQ(CPSR)5 ]7 W( n6 ]8 X, R8 Q/ I; O
IntMasterIRQEnable();
4 C$ T2 F4 r& h7 d0 S* |# W* @) r: H4 U X
// 使能中断(AINTC GER)
_% C! a) {! d% A- w, Z IntGlobalEnable();0 P: x- d0 y7 S \, g2 \
- i" m* v" X5 u% l6 C2 i) Q7 \ H // 使能中断(AINTC HIER)5 i! t# `( S3 e" m
IntIRQEnable();
) B( M: z2 \, S. ^) C% z+ A! E}* S5 w# [) X5 s/ H7 K
' {% F( m t% }/****************************************************************************/
) |! t9 i C$ N: f$ Z0 h3 g/* */
, k- ~" f, ?4 h) w6 R/* UART 初始化 */
$ i* r( F$ E9 D0 a. h) a( ]- f" W/* */9 V6 @' O# `' ^5 Y) x8 K9 c! K
/****************************************************************************/
) D: y* X5 u* \5 M+ Ovoid UARTInit(void)0 u6 E3 F% r' ^! D
{
* X- n. `3 c! Y // 配置 UART2 参数
+ c+ W: O8 e' r# A2 {$ d) p D9 m // 波特率 115200 数据位 8 停止位 1 无校验位 x* O2 {+ I. f! ]4 v: Z7 Y
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) H% i+ g3 l( [( F3 m UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);: n+ X+ b# Z8 l* O0 Q9 W& y' m
// 使能 UART2
5 K, i( f# Y$ s0 [6 x9 d UARTEnable(SOC_UART_2_REGS);8 _) [ v* h4 P
0 w# R6 i; s5 f
// 使能接收 / 发送 FIFO/ g& p$ A) ~ G( r! @% r" s
UARTFIFOEnable(SOC_UART_2_REGS);1 M5 B, Q3 A. B% s
- \2 @* f$ B1 O) c; y N n8 s# \
// 设置 FIFO 级别
" r6 M7 }0 b9 Z2 Z5 l3 K UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 ^' U) V& x$ W9 q3 P# s8 c- d}
8 M/ s8 }6 D* t; X
1 U; Y2 A, S' p8 R' L# k/ p/****************************************************************************/; r0 {& v/ o% m1 o6 U% X4 N# M; W
/* */$ S; ? P! d, n0 Q! N0 J& I! B
/* UART 中断初始化 */$ b. y D" B/ D$ X
/* */
! f" @& _4 L8 X) H/****************************************************************************/' ?4 V ~8 J: p# O3 w
void UARTInterruptInit(void)& T- w6 `8 _4 I' n
{6 q+ ^- ]3 v7 s7 b3 D: y2 Y9 q% q s
IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ ?% k6 N1 ?. c: b5 H; Q IntChannelSet(SYS_INT_UARTINT2, 2);
; [+ H- z5 d5 G IntSystemEnable(SYS_INT_UARTINT2);4 c' l. Y5 n& ]
0 o3 z7 a. `9 V- g& [5 _ // 使能中断* e# V. L$ Z0 f0 p. c8 \ T6 a; {
unsigned int intFlags = 0;6 f/ ~: `. J; g6 N, J
intFlags |= (UART_INT_LINE_STAT | \
2 J3 T6 f! c2 ]% x. l UART_INT_TX_EMPTY | \; X8 d% S2 h3 I2 b- [/ @9 w" [
UART_INT_RXDATA_CTI);2 z; L: O6 g) T
UARTIntEnable(SOC_UART_2_REGS, intFlags);
& g7 r. E" h4 i/ O0 y: f}
2 j7 g0 I7 z0 j" U
* U, }' X* d* z7 O+ v5 A" p: T, f/****************************************************************************/( W7 b" x3 W+ N
/* */1 \, G7 w- N1 E% w- [
/* UART 中断服务函数 */
6 F {( d% c7 i/* */
; H) e0 R5 y0 O, f+ C: |/****************************************************************************/
3 \9 ]8 h2 B3 H# l' ~3 F* uvoid UARTIsr()
, B/ ^5 n* W- s d8 C{% f8 ` w8 S; I1 i H. b
static unsigned int length = sizeof(txArray);
7 i7 d& h1 _0 q& o3 R0 p static unsigned int count = 0;, U- R8 H8 U1 U! s! C' V
unsigned char rxData = 0;5 b* Z" I9 M4 v4 R
unsigned int int_id = 0;
D0 i1 `/ K8 Y9 i6 |: n; U. V# B7 f+ Q; _2 q
// 确定中断源5 k# }2 @; i7 Q
int_id = UARTIntStatus(SOC_UART_2_REGS);
1 N0 Y+ g0 w7 x. I6 u6 u* s9 V/ Y" V8 A0 z% ^! h: y9 E7 p6 Q S
// 清除 UART2 系统中断, S h6 W" H& x4 i$ @8 U, j7 }6 R
IntSystemStatusClear(SYS_INT_UARTINT2);
0 C+ h( T& s: R
, U3 {$ r! s, Q# Q // 发送中断! R3 _$ s0 K1 N z: ^
if(UART_INTID_TX_EMPTY == int_id)- x- B' m2 i/ |
{* o1 k- x& G2 h: N/ o" q7 z6 f
if(0 < length)* z6 K4 ~: N) v9 @( I* z
{4 \ ^8 o3 U8 P) A( {; ]' ]% E3 a( }# ~! X
// 写一个字节到 THR
$ Y' C8 W2 T' b# W+ w! E UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! S F5 O: E! L' a/ Z+ H length--;
4 D& j7 p5 I7 s& s5 a' A; b count++;' x+ k5 ~1 f) u% j: V( i4 X5 y& f& G
}
: S% D7 o/ u3 {2 C6 K if(0 == length)
h9 {1 U0 K) ~8 ] V: n {
6 `/ N7 B+ z$ r* H // 禁用发送中断6 }# o9 b& w. A1 D
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
2 w. ` ^2 ]3 s- x& u* |. h0 u4 ?8 | }; @0 P7 f7 _3 H$ V0 j
}
2 c$ S+ i1 _) N) T: W7 C* z' d: @6 y0 p$ c8 [/ F" j; _
// 接收中断% W* `0 ]5 p& F8 y" ^7 n) K# F) G
if(UART_INTID_RX_DATA == int_id)
) T+ h5 D4 X6 a8 N" z- J {
* \; ^/ M! ^: w0 h6 R rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
; p. x; x/ t0 h; O+ s) {& d0 H
: f/ C0 L; n' r! a7 O5 a UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);4 S1 m8 |$ H$ U5 }0 A7 b7 L5 Q
}
/ h, ~9 u1 x, Z7 e: j- J
- z5 U- d$ ]$ J% |3 z' G // 接收错误
- D' j/ V5 ?9 a2 d- b if(UART_INTID_RX_LINE_STAT == int_id)
0 R* @0 L7 Z: `- l {- g# h/ S# h0 d& U/ K
while(UARTRxErrorGet(SOC_UART_2_REGS))
# f& m% ~ [( t, D) _# v {
' K% Y5 @- P8 I' D2 K1 E4 b) a" i6 @ // 从 RBR 读一个字节
' @/ W, x" E+ d$ m; N3 b% j UARTCharGetNonBlocking(SOC_UART_2_REGS);% \; x9 ~" H' G9 K7 l/ A& o3 J2 V
}
- p, T5 O5 i4 ^$ e# l/ e }
8 F) M1 I& U: u9 y3 |: `
[1 P6 B* U! P7 _! f* [ return;' z% x9 ^: v. w. m1 |) W
}8 A+ w1 x2 F3 H+ _ |4 \6 l
|
|