|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: V3 j; W8 {6 d+ {
5 j# u8 Z; E1 R, \5 d2 O2 t#include "TL138.h" // 创龙 TL138 开发板相关声明
! J- ~) ]6 U$ W7 z) @5 o: F
5 c0 @$ Z6 R/ ~6 D& S9 g- \#include "hw_types.h" // 宏命令6 t( b2 Q9 v4 U) f* J7 s, P1 l/ M V
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器, z! r5 W) e$ t" j
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器( y7 O8 Q1 J8 Y* n
4 D" `; T" C v# d' m; b; r
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明5 l" ~% [9 J& n1 B- h M q. M! D
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
" S$ }2 h1 s* C1 p' O1 p7 K2 B" x" V#include "uart.h" // 通用异步串口宏及设备抽象层函数声明6 B- ]3 n5 W/ G4 i
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ y8 r' |/ w; d" [
' v! |. |; j% X/****************************************************************************/) i( F* ^5 D# Z, [
/* */; I5 o% c6 _# b3 ?% V
/* 宏定义 */
; u& ]. s1 o: D v0 [3 x. P1 S5 ^$ D/* */; \9 w0 K: o) `) V
/****************************************************************************/
" g; e8 F7 M9 l8 u( V// 时钟
' m3 O% L' d% Z2 t/ R#define SYSCLK_1_FREQ (456000000)5 k' H3 a- V7 a& W, m6 a
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)) s- z0 v: \4 m6 E+ H6 E+ l
#define UART_2_FREQ (SYSCLK_2_FREQ)% u+ E/ j' c. w9 K
m# z. J) D3 v* `. l' S6 A/****************************************************************************/: ^7 W* } R1 `/ @0 d- w0 Q
/* */
5 t' \6 T0 Z, R$ D8 I G) @0 O/* 全局变量 */
# k b. w6 x( u& ?# D+ A h+ h/* */
7 Y* y8 L' y+ C- t& X/****************************************************************************/
8 z' ^) X! K/ N1 O! nchar txArray[] = "Tronlong UART2 Application......\n\r";5 W) A7 T6 l+ d2 M
: Y" S& n6 I C- p( d4 a; ?
/****************************************************************************/) ]& w" \/ X4 }0 R1 w7 ?1 g2 v
/* */
: ^ W* r w n; F( U/* 函数声明 */
9 V0 O9 K0 A6 F: F5 T$ v q, h5 |# ]/* */
7 J& J; X% M* B/ O' I/ p2 _/****************************************************************************/
7 v9 a1 ^5 \, y6 u' _ Z, F// 外设使能配置7 T3 W; {# C$ q* W
void PSCInit(void);
8 q+ G% E2 }' [- P" E* j+ Q& ~8 b
// GPIO 管脚复用配置! D0 E3 U# Z) ~+ A+ {8 g! {
void GPIOBankPinMuxSet();2 i1 `3 d0 y- S8 G# N' e
+ n% J, g: m9 @. c6 o
// UART 初始化
9 M! o \1 i: r8 q$ v8 {8 E1 m- C6 A- kvoid UARTInit(void);
# u- [3 _: L7 z2 X// ARM 中断初始化
- ~2 y* q( D# a, b4 Avoid InterruptInit(void);
3 `# r6 X# k5 U% `1 X7 T, u// UART 中断初始化- _. {6 k: t. h& K" t% ~
void UARTInterruptInit();6 z! |$ g& q) I* m" u6 W# G+ Y
// UART 中断服务函数3 ?4 U: O+ S6 ]$ @8 p0 u* q
void UARTIsr(void);+ {' U- R/ W- \% z
1 l v* p( x+ Q! ~
/****************************************************************************/2 Y6 o+ M7 D7 [
/* */+ P- O9 s6 E8 U% c& H
/* 主函数 */
1 w9 Z, z. L$ N+ J* V: H/* */ a$ \0 I. }- i
/****************************************************************************/3 e2 n' S- [$ i& A
int main(void)* U, x% A* D/ J4 P# B5 l% U W+ x
{
1 v" K# E4 F' I6 }6 f# h$ ~ // 外设使能配置' x2 ^/ p7 O0 U
PSCInit();: O6 Y4 i, @. s& t$ z0 K
9 z& ?* ~( C* q/ n, I; Q
// GPIO 管脚复用配置' E+ ^. l+ j' g9 Q' _
GPIOBankPinMuxSet();
0 S, Z& g7 L# j; p
# T% `5 V# L) n // ARM 中断初始化
0 I+ |6 V3 V9 h& ~7 n, x6 y* | InterruptInit();" n9 z2 b$ t* {" T
5 }, ?! c6 t+ v9 |
// UART 初始化
1 \: S* r) ^4 Q- u9 c UARTInit();
, {' }5 W {3 R& R2 u/ M" p# ~' \
; D3 ?) E0 M( \+ g6 x+ Y# o3 W // UART 中断初始化 l3 m3 u9 Y7 H- @
UARTInterruptInit();) p; O& o8 n* T3 B0 B
! ] y# Z8 u, c+ [
// 主循环2 _# d8 A& e6 t1 s! k! U% m
for(;;): K# d( r$ C9 f0 `' m$ _9 F
{
2 B# p' ~7 K0 `0 V
$ m B9 ] F% u" w }1 d) P! L: y* w; f1 ]
}
) |' H2 L; T9 T4 @3 d5 W8 e Y
6 n" `2 s: \2 S2 H6 y/****************************************************************************/$ f w& g1 @" U+ U9 c
/* */. N& m* J) T+ N9 b
/* PSC 初始化 */
. c2 J& a I+ Z& V2 v7 }/* */
' I! q7 I6 q/ p' f R! H/ s/****************************************************************************/, }( S9 O$ M! }2 h5 g# ]
void PSCInit(void)
2 l/ t) q$ {$ t# o' {{2 s3 g1 \' v @# A+ K2 Z
// 对相应外设模块的使能也可以在 BootLoader 中完成
( D$ x& ~" U& W // 使能 UART2 模块- @& d" k3 H' v- ^# W4 i& f3 T' O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
3 R% j; \4 Y$ t}
. ~. U& V! z& z- H# m
+ C* m9 v' `- I4 ^/****************************************************************************/. t4 D2 H/ I1 V! s% d5 Q+ X( L
/* */& i! V" f$ W7 B( i3 U
/* GPIO 管脚复用配置 */
$ u/ x6 A/ E8 w8 ` Z8 ~2 t/* */
. F, Y" {4 r$ `; k* Q7 z/****************************************************************************/
( C5 I1 Z# k$ ivoid GPIOBankPinMuxSet(void)3 `! W3 y' p# ~2 N4 _
{3 [; H6 j/ l0 z6 n+ W3 Y0 G$ C
// UART2 禁用流控$ C3 c. P2 r9 G7 B
UARTPinMuxSetup(2, FALSE);* a @/ `) X, u* B6 }5 a9 o6 B
}
" D/ F6 F( ~5 R$ S3 p7 r% a( T
% v3 O/ A4 W3 t% e: j4 b/****************************************************************************/6 `' D' h6 e. z
/* */+ i, @; U: Z2 G9 j
/* ARM 中断初始化 */
; \( L: U3 s. F# `6 C4 g/* */2 X3 t( F0 D h+ f4 r6 }
/****************************************************************************/
: B& D' }) X, t9 ]1 hvoid InterruptInit(void), O ?; b/ P3 B' k
{' j7 `7 h$ L& M+ c
// 初始化 ARM 中断控制器
; h9 Y) V% c1 ?; t IntAINTCInit();+ x: d+ b. b- T
9 P w) Y3 e8 v; N9 r
// 使能 IRQ(CPSR) J( ], X3 R1 @, n, |. y# ?$ g1 X
IntMasterIRQEnable();3 }+ R2 h) B: H, ]7 n
( p/ v, H# v9 X# b! x/ i6 B // 使能中断(AINTC GER)# e# L! ]* \# Q7 Y% h8 L; U" w
IntGlobalEnable();+ u% I: o3 t& G1 f1 J9 D) w! S: T
1 D* c5 X& M$ k. p6 T: X7 @ // 使能中断(AINTC HIER)4 b! M7 i9 ]* g; O) V& |& W+ n
IntIRQEnable();# b2 l( F W" G d( a
}9 g ^4 P& S5 g) H
5 o' J( \7 n3 Y! P
/****************************************************************************/4 q- e7 ^5 A6 b& D1 j
/* */
N* w" \ g4 }& B2 a" N6 G/* UART 初始化 */5 h, c! x+ J/ w$ Z* ~: Q8 O
/* */4 j6 G! y1 u# v. Q: t
/****************************************************************************/8 o8 _; Q- C8 ], Y/ _7 X" j9 a) S
void UARTInit(void)
+ Q( i5 y! Q% F/ Q+ \{
' i- T: H# h; Q // 配置 UART2 参数
+ w# W) r) |# o) V" e/ r // 波特率 115200 数据位 8 停止位 1 无校验位" x( w3 N6 T5 A- p& N
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 A- S6 J4 j% t" r7 [/ T UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# M6 {) g2 ? W# o // 使能 UART2
8 |4 E* `( h8 B2 A& [1 d: x. [( R UARTEnable(SOC_UART_2_REGS);
4 B2 l4 f8 i8 w+ \4 H6 D5 w; D( _: f6 }
// 使能接收 / 发送 FIFO/ p2 G$ E; L: y, U! t, D$ h+ m
UARTFIFOEnable(SOC_UART_2_REGS);
' }. N6 N6 x4 v" T
$ |' D8 \1 E: D& C: y // 设置 FIFO 级别 _" l/ e, y# }; O# V( P, J3 I6 E6 f8 X
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
- y" i) n; H. O1 I ^ E8 X' x}; S! e; s k* f: f1 _( z
! ~) P( y3 ?4 m: B7 [; _: w/****************************************************************************/. E6 i1 }2 {2 c- a$ x4 T
/* */
* b) ^, r& {1 T. K/ {( w" |/* UART 中断初始化 */0 V/ A1 O; q, _3 Z6 ~/ ^
/* */* ~" r6 Q {8 F6 q' T; I! K6 H
/****************************************************************************/
7 M ~' U0 Q, I, Zvoid UARTInterruptInit(void)" f' `" j, t' k. c% I# {7 X
{& ^% f" r+ h |* m6 {* g4 S
IntRegister(SYS_INT_UARTINT2, UARTIsr);! _# {# Z% B: F- u7 |
IntChannelSet(SYS_INT_UARTINT2, 2);
4 i; T8 F: Q$ @& d IntSystemEnable(SYS_INT_UARTINT2);3 p7 o/ \. E; Z" T* w }7 [
2 f8 n- i4 P o: H' } // 使能中断
# c! a% `$ y9 _$ f6 f# f* w- G! P0 Q unsigned int intFlags = 0;. P2 X, n& f& H& | x! L( f1 V$ x! p
intFlags |= (UART_INT_LINE_STAT | \
! C5 w8 J0 j8 y/ Z; m UART_INT_TX_EMPTY | \! e" c: _6 W1 x. r& Q+ n& w+ D' \1 P
UART_INT_RXDATA_CTI);# O% k: {, y4 R/ Q7 t' i! T
UARTIntEnable(SOC_UART_2_REGS, intFlags);3 B6 ]; z$ \' D9 S" i0 B
}
) g/ u: D2 ~4 M w3 v* B9 t z) |' x$ o6 H& j5 c0 D
/****************************************************************************/6 N8 t* _6 h) i, F8 e4 Z. c
/* */
) P. ]+ N7 c4 X) U8 g& l/* UART 中断服务函数 */
% f& J# c# X1 P' H4 f/* */8 M% t9 l& s' ~' H
/****************************************************************************/
, G1 D: T# O3 ^/ Uvoid UARTIsr()
& D, d) @' d" U% L* H A{" i5 h( u+ D! G+ c" w2 l
static unsigned int length = sizeof(txArray);
0 i' s0 k. R, ~% a static unsigned int count = 0;1 j, m# F: S F1 ~" k6 O
unsigned char rxData = 0;
1 [3 n% i# C1 J) L3 i8 m: Y% l unsigned int int_id = 0;1 n7 P3 N; M. C
, [4 v; Z( X. L8 P3 i0 {6 X
// 确定中断源
. |0 b+ t L0 `) l8 { int_id = UARTIntStatus(SOC_UART_2_REGS);" R% ]% } X9 b" X
- ^, l p( _- a. ?4 r9 I
// 清除 UART2 系统中断0 _3 i6 {5 n5 ?
IntSystemStatusClear(SYS_INT_UARTINT2);5 p2 W: I& b* u/ V
4 G9 N3 T7 n; G // 发送中断* H( N9 }& X( o6 I1 Z
if(UART_INTID_TX_EMPTY == int_id)
* g. _9 y! H' r4 O) } { z; c2 C% e1 z! B. O; C! ?
if(0 < length)7 U: H/ R, t; u6 J6 m# s" k
{
4 v/ {5 |$ @/ i. }3 ^" ^" ? // 写一个字节到 THR: _/ H( F' G+ g: _1 ~
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 ^+ O7 F+ {/ J) s; } length--;
' d. s* D2 k! U; ?, E) {( B2 j, Y count++;
4 K7 h2 y* K# o& A: }( \ }3 n5 Z) J: X2 n6 i
if(0 == length)
) ^5 B! J4 n! m) Y2 } {, P9 }* z( D+ T2 t
// 禁用发送中断& x0 H7 P. i5 t* o' R) p' K
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 d2 K. T: ^ X- T }
- H+ I; u2 j8 d/ K H8 y/ `5 y }
& t" [: i1 {! j% l
Z5 f" a9 x# Z# _" b5 L$ d // 接收中断, b, ?; }. {/ K; M$ Z1 b
if(UART_INTID_RX_DATA == int_id)
& E# r; d5 f4 F) p {( H, V! o* Y$ Y1 u# }! D
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
a: q8 d% F4 a3 D1 m" H% i" {
" Y; A O) a1 x% a5 L$ {! U UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 V) v9 ^6 q0 p" Z }; b% k. r+ |3 {7 o; k4 B9 g
; W4 G; o$ r( ~, }1 [4 B
// 接收错误
. I6 u- f- m/ w1 S' k/ A) S1 {3 S if(UART_INTID_RX_LINE_STAT == int_id)
4 B3 t" S: X6 J {$ J4 l, \( p" p$ V- W8 C
while(UARTRxErrorGet(SOC_UART_2_REGS))
3 g, J. }5 \' i, R {
* |: U' g. Y' {9 A# [ // 从 RBR 读一个字节* T! l+ B% `/ G" _+ N
UARTCharGetNonBlocking(SOC_UART_2_REGS); Y8 B. b; p2 V' q% D
}
1 g: b& V: b* x7 u! `: p9 H! r0 K } R: W8 c. `, `. h, l! g
5 C/ ^! w% l% N0 Q1 _
return;
* f8 R% ~% D0 B! V/ b/ V) l}2 [- [; D" y& N; U. D; C. }
|
|