|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。5 ?8 }) _! J% }! U. P% @% T! ]
, l" ]; ]) Y' n8 y: w9 s
#include "TL138.h" // 创龙 TL138 开发板相关声明
6 L& M# S3 _8 t( }% |% A# _& z7 H$ e5 ?; ~; @; _' N5 p) ^& X
#include "hw_types.h" // 宏命令
' b1 @8 J. ~7 K+ X3 M#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器& e+ d2 J2 `( e! `4 y0 ^& J
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
& Z! r; L$ r I4 K* Z5 q) a# k* S! {
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
# Z0 z! ?$ D) O, D; @, P#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
, t4 c4 l, d# w4 G e# f* g#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
; Z; T6 l' _* q0 R4 @2 c0 l7 ^5 K#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义; B8 @1 T* A2 n- ^9 u% a/ n/ c
' S; H- v7 I4 k- P$ \5 y2 q
/****************************************************************************/" X$ D" b$ [$ h7 ?# v4 X) k
/* */3 h7 L" j1 y/ i
/* 宏定义 */( q$ c# R0 \! Y6 o* B
/* */
, U8 [4 F: @ `0 g2 n/****************************************************************************/
3 n! x5 S8 |% s+ U// 时钟
4 H3 \/ p# y! x7 i" l: [#define SYSCLK_1_FREQ (456000000)
/ I R: e2 a% ~7 B. j#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2): D; p& I7 ?& l5 v
#define UART_2_FREQ (SYSCLK_2_FREQ)
% @' e v6 _: W ^; A. N4 r9 o& x7 Y, Y; t
/****************************************************************************/
) g; _" B0 N# w u) _; G3 B/* */. V c y8 X0 w
/* 全局变量 */& k. P, n8 W# q4 ^! C, g1 r" z
/* */2 K" K* C i0 P! i: y. L( J
/****************************************************************************/
/ g6 z. ^. s* N6 d; V2 pchar txArray[] = "Tronlong UART2 Application......\n\r";
3 M3 b& w% Q: X) N4 ]; w' x+ y Z0 {: _9 l; b
/****************************************************************************/
" i1 N+ k: M* r( A4 }, s/* */
/ E6 x8 p+ M8 Z/ [/ q7 e8 o1 S/* 函数声明 */1 j4 C* h6 e* E1 P1 J$ a! w
/* */- F. y' g( V U. v: d
/****************************************************************************/. P7 J/ W/ d+ u2 u: U% \5 K! O) f! s
// 外设使能配置. ?+ O2 H4 Q- \' b# A
void PSCInit(void);* O$ T; b# ~( `% C
0 J1 L, B- [/ @& N// GPIO 管脚复用配置
* p; ~# U/ E* L( D1 U9 S% kvoid GPIOBankPinMuxSet();
- k! [; o0 h( E1 s5 L! J' H+ ?% ]3 ^- F# X' U0 }
// UART 初始化
/ e0 e: `5 Y8 u, |/ b$ vvoid UARTInit(void);
* \ x& K8 g g// ARM 中断初始化
5 r! x- X! s% u7 X( J% D( gvoid InterruptInit(void);/ b& J/ y. A: k& R6 e
// UART 中断初始化3 ^7 G: k; C9 Q' B6 @. q
void UARTInterruptInit();
9 u, s- C6 }" A// UART 中断服务函数
2 P' q$ X/ M& h3 w3 U7 U- Jvoid UARTIsr(void);
/ n1 \; q- C# H" ~6 w% {5 _& u& O' B' L' @, M7 y& F
/****************************************************************************/4 i9 m# @" ?9 w# w, P
/* */
* w3 l+ |0 Y: Z/* 主函数 */ l, f% o7 {5 N% R1 t
/* */
. ]2 O8 [" m* c: ^7 b4 F. h3 D6 t( X/****************************************************************************/
0 _( c4 G2 V3 Sint main(void)
6 W1 L ?1 R+ [" s8 z8 }7 \+ y8 e{5 _3 M! C. E; ~) W e3 i0 W1 j
// 外设使能配置
) t" C* @2 {) f8 ~ PSCInit();
; O$ K7 O3 O' J( _! B0 F - q0 f8 H; ?0 q; y
// GPIO 管脚复用配置
- q- W' p' Y ^: Y GPIOBankPinMuxSet();9 A* f& u# f+ j
2 H9 x+ v0 t& ` // ARM 中断初始化4 K! s* N7 C7 E8 H/ F
InterruptInit();
7 w( s; n6 i7 h0 b3 j
3 ~8 e/ I2 Y" X1 ]5 V // UART 初始化3 R( @& \' e/ ^) [) e3 Q U7 q
UARTInit();
5 y0 {) i" K3 a( i W
3 b, C8 y" l; F! I# ?$ \: ] // UART 中断初始化4 }0 e$ p3 I2 O. k2 D0 u
UARTInterruptInit();4 d5 t* U1 M1 K' n" C, L
7 d3 i$ j) U$ c( A9 |! ]' t+ Q
// 主循环
, h! `+ S) d4 F. J. u for(;;)+ S3 _! z8 }7 Q1 b7 p
{. M8 F' T/ Y4 n0 ]+ D
/ h( x, v9 x c
}
' d: o2 e2 H6 U}/ {- Y. d3 `1 V2 S; v3 |
8 ` G8 C" ?+ D2 [/****************************************************************************/
/ @" b4 Y: d1 ?" D- Y( S- ~9 Y/* */
) E9 W+ U5 D! T+ J% @, S5 {% l! Y/* PSC 初始化 */5 M5 J1 V, Y* H& }, C
/* */" m# G1 q$ F( \7 s3 _
/****************************************************************************/
) X1 n l4 M1 N5 Hvoid PSCInit(void)1 Q. p' U; q/ \6 A4 J7 Q4 y7 }
{0 h' z$ l9 r; Y9 i: v
// 对相应外设模块的使能也可以在 BootLoader 中完成
4 C1 A: F# {% \ U8 b5 A/ f // 使能 UART2 模块
7 {1 U0 u0 J- ]* i PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
) h5 A- @8 A0 Y: g+ c2 t}
3 @0 z7 z1 `1 ^. M# T
( v: G9 g+ \- {3 s, a( ?/****************************************************************************/! b& x8 j/ `% Q8 Y
/* */
9 S! |5 H6 G5 q1 M4 M/* GPIO 管脚复用配置 */
" a. B9 ?) O: M: r: V9 n/* */
6 }0 i1 j. g6 K3 M c; Z/****************************************************************************/+ a* W! O7 o+ d
void GPIOBankPinMuxSet(void)/ R8 y* ^; k% H. l/ V
{
; f: N* E9 |& V: a4 L- U // UART2 禁用流控( P& B; O4 g! F) ~, ^' f: L3 r
UARTPinMuxSetup(2, FALSE);1 Z4 M( m$ ~- N( F6 s( m
}
0 V. |) c4 [' g; z* w& E8 v p6 v5 `- w# ^2 C
/****************************************************************************/& R( m7 T4 U' [7 g0 N" {
/* */9 g- w2 s' S' }! Y3 q( j! U- u- h3 p9 T
/* ARM 中断初始化 */& n) k6 ^: @& Y- p, P v0 e
/* */6 Y( Q, _7 r# u! y
/****************************************************************************/
9 Y9 y* k2 z7 _void InterruptInit(void)3 |3 j- ~2 _7 Q: B, S9 }7 {. |
{! m$ c( [2 c" b% }, I( w! X) t9 K
// 初始化 ARM 中断控制器
3 `( c1 |3 R) _+ ]0 t0 H) F% i" K IntAINTCInit();1 I( r1 y5 A7 C7 R- X. ]+ V
; P, A1 M v I( H4 s$ N& p // 使能 IRQ(CPSR)
# F3 Z) K( S1 R! H) z5 m IntMasterIRQEnable();
0 J6 d8 l+ y; D! F. F1 y- q
) e. g1 h3 z0 w // 使能中断(AINTC GER)
6 _( m5 W+ X! B1 C8 l& H IntGlobalEnable();
) B2 g. m- I- x% S' r/ n) v1 Z. D: g' S4 e! c$ q) ~5 V2 f
// 使能中断(AINTC HIER)6 O0 r4 W5 l, {& z
IntIRQEnable();
: u9 q+ G/ F( L6 n}5 n4 @0 r% {$ k; @ S; b
& @& N# [: Q6 l" d5 m( F' h) p
/****************************************************************************/3 l4 k; G2 t( y" k
/* */
, ~5 D$ v$ B1 i( d" @/* UART 初始化 */
5 h9 z4 j2 s; R7 W3 j/* */
% v0 m8 t7 s+ y* v/ L. C/****************************************************************************/* ^! E |! ~3 R% O% |
void UARTInit(void)* w8 R$ c2 a- L0 A+ u: Y
{
' n* o- i) B& ] k' R* P; J+ f // 配置 UART2 参数$ k% s% Z; U( |9 I
// 波特率 115200 数据位 8 停止位 1 无校验位
! A; J0 N( M ?& \ UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
3 u$ j5 ?1 s% x4 f$ \9 e UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);9 @) B! j) g$ Z
// 使能 UART2' A. K' ?5 ?7 Y9 i. j& X
UARTEnable(SOC_UART_2_REGS);- k! E" ^, b M+ [( H, {
: r$ k1 S( A/ e
// 使能接收 / 发送 FIFO. C% b* X9 A8 d, S, e7 y) j% t
UARTFIFOEnable(SOC_UART_2_REGS);
7 R& S j N! Y2 Z* F: U1 ^3 l7 r" }( ^, W
// 设置 FIFO 级别/ B! K2 Q# V5 H; u$ b
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, Q5 N d" R' U* H F} M2 T2 z% G3 H* C
0 C2 D& u, g7 R$ m E* U3 M; ?/****************************************************************************/
2 i- Q5 Q$ M, c- }/* */
1 S% B5 a5 S% L/* UART 中断初始化 */( o* \1 z9 J1 D7 T. S$ Q, z
/* */1 E/ n, O; z& P' I& y% U
/****************************************************************************/% K: C- l( E2 C5 X
void UARTInterruptInit(void); a+ Q5 }0 g& G
{" n& Q, G' P* G
IntRegister(SYS_INT_UARTINT2, UARTIsr);% @& g/ t! E! M& v5 r. J2 x
IntChannelSet(SYS_INT_UARTINT2, 2);
+ A' z( s2 s- v9 \3 T ~ IntSystemEnable(SYS_INT_UARTINT2);, R0 \+ s; E* p- N
! @- ]( y) P" [7 v8 t // 使能中断" m: G6 S, {$ k- x y/ S8 W
unsigned int intFlags = 0;
& H+ _# P: H l# @/ L intFlags |= (UART_INT_LINE_STAT | \* t0 Z% j5 z' s+ f; [: O$ I
UART_INT_TX_EMPTY | \) U1 T& ^; Y/ a$ w% ]" b( k
UART_INT_RXDATA_CTI);( U& t, P/ A; J' L; Q% F8 f6 s
UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 g- `, f0 v# M% S}/ r& u6 H3 c/ n0 a' J* A
, C& r; O$ W$ I5 ?/****************************************************************************/* T4 F9 m5 c3 Y; G0 Q1 I
/* */
) d- L6 J* y2 x5 x/* UART 中断服务函数 */! @( S! j4 Y0 C4 V2 S7 n `, G1 |
/* */: b9 N+ u, s8 W5 I5 ^( S6 Y% ~
/****************************************************************************/3 M# U1 d. s& i1 I1 j' I0 s) K
void UARTIsr()5 Z p( Z2 _; a
{; a9 U9 {6 F+ Z) j
static unsigned int length = sizeof(txArray);. R. L* A- T: y9 Z+ j
static unsigned int count = 0;
6 V" o6 I* w5 o7 R5 r unsigned char rxData = 0;- Y; Q8 ]& J0 V- j+ J0 \, T, y
unsigned int int_id = 0;
$ g9 [1 `2 N5 ?4 D& [& d
# [' r& |* C! g3 T2 t, v // 确定中断源
+ ?/ {' ? b) p1 b# w7 `% o! K int_id = UARTIntStatus(SOC_UART_2_REGS);
+ `' l' [* _# ~- N
" l; v( p3 A z) t, ]; | // 清除 UART2 系统中断
- K1 f0 P, n0 ? N, H IntSystemStatusClear(SYS_INT_UARTINT2);
" D0 o+ N) g* j: z; R R3 o7 t
1 H |: B3 I" O; k1 { // 发送中断- ]/ [( l8 F+ x7 O r) C7 y0 a9 N
if(UART_INTID_TX_EMPTY == int_id)
' z* R2 Y( }+ y {
% o/ @5 G: W5 R1 S) s% H* ` if(0 < length)
. M* D Z* u1 }# L; a2 {* r {! o( n) }# k# i. K1 i8 @9 G$ S+ s
// 写一个字节到 THR5 t9 s+ b' Y3 Z' X* a0 {- h
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 A3 a) Z& _! r) ~% O" V' R length--;( E) w: O, C# O! j" U
count++;# ~' x/ `/ d0 X& A
}
% d& R/ e) Z& ^ if(0 == length)% {5 v7 D+ v6 ^+ p# {- v
{
% ]! Q' `# |# h4 ^9 {6 \3 c& ~ // 禁用发送中断
/ |) t* F. T3 g! r2 ^: I UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
/ @% ]7 F v$ J) X) C0 Q2 O& d* I }
6 F5 [. e& i2 u8 N5 \' ? }( |' |7 K7 V! w& B
U$ @) ~: H6 `7 z& [7 m" f/ [# R
// 接收中断
: |4 y" @8 ] f+ Q/ _5 @% U if(UART_INTID_RX_DATA == int_id)& V" y |7 f& S# w
{9 E5 y4 Y7 j7 R, H0 m; _! L
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);9 q4 }+ R7 v$ s: B7 r
5 f L* ~: q& N+ P" T0 F0 O, _
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);0 J' P$ [% f' `) d( t+ R
}
4 {0 [. S8 c/ y0 j# F& \
/ N+ N, ]% d. p: u3 M# M' q% z. ~ // 接收错误
" G. {# r8 _+ T! |8 [0 @2 |' @: R if(UART_INTID_RX_LINE_STAT == int_id)
2 ]6 c8 }' p) T% ] {0 {2 E# L' n+ X7 G- T
while(UARTRxErrorGet(SOC_UART_2_REGS))
- u" M* {+ t }1 W6 _8 ?# k {
5 {( G" p- q0 J' J // 从 RBR 读一个字节- `/ V% T; C2 V9 F0 J, m
UARTCharGetNonBlocking(SOC_UART_2_REGS);( C2 P4 m% L& ?+ q" `) n
}& X) e! j: u; u& i* d, e
}
& U" E/ D# E2 p5 c
* i4 c$ K2 M6 x0 p return;+ u4 _3 X4 j7 G
}( W0 o# c( i8 ?2 {$ {
|
|