|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。4 X8 x* N% d& v% T7 B
# k' r( e, K5 Y' j' `#include "TL138.h" // 创龙 TL138 开发板相关声明
1 p3 }% a' s, W- D
7 N2 V3 K, @0 s1 V. c- c#include "hw_types.h" // 宏命令
5 b9 u9 a& G! }7 J+ d. f1 }4 o% b#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器5 O% M7 f' x7 R7 @
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器" g- F ^" \8 B" Q
% ^$ b2 p) r' g; v% O9 I#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
% p3 Y& z, r; l; Y7 U8 m#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明) |2 T6 T f2 N8 }
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
% f- k/ E5 U' h1 c9 ^; c- h7 P#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
0 l% r* h3 I9 @* }3 i7 Q& F' b$ ^) V+ Y3 j. q* f
/****************************************************************************/& C/ |2 g) r( Y; N
/* */! x+ h8 ^ O" z( E
/* 宏定义 */& e& ~2 o' P' x; C; h' N
/* */5 U4 u2 q) s' G$ @; x% E
/****************************************************************************/- `9 m+ j9 |# Q. E4 b
// 时钟, u( y* a" E! g2 L1 O+ ^+ ]! a
#define SYSCLK_1_FREQ (456000000)
5 `( _1 X6 q! N! ~#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)- z z. \/ x# Z- P- Y4 G
#define UART_2_FREQ (SYSCLK_2_FREQ)
9 y: ?( x/ v$ I& o) N
' Y2 J, \* ^: ~' t/****************************************************************************/
4 U; f3 W7 `6 [/* */- i6 W0 S) H' c o
/* 全局变量 */- n. t0 {* ?: e0 A# o% D. [
/* */0 l5 A* G2 j" |5 b$ P/ b5 |
/****************************************************************************/& n. _: _4 P5 s$ A( r6 ]
char txArray[] = "Tronlong UART2 Application......\n\r";7 x: i3 M: k8 j* ]+ I1 w; d* }
4 W$ U( l" b: I9 c! N) j$ U+ b1 S
/****************************************************************************/' O! d" P/ Z; f
/* */
6 F" \! I2 C4 _/* 函数声明 */
7 }' i* ]/ V8 Y( D6 I9 M/* */$ q: s. g$ u1 a/ h: z o7 o" {. h4 ]
/****************************************************************************/
) l$ p a! |9 i& k0 [' U2 K// 外设使能配置
* S3 Z$ L( g Z0 g( Bvoid PSCInit(void);
/ p7 i; {1 d# L. G0 \) e0 r' u. O- v& }4 I n7 s% Z5 m
// GPIO 管脚复用配置
+ k- l8 b& j3 ?% g' j' Uvoid GPIOBankPinMuxSet();* Y: O) v* t' M% |
4 t; e! I6 p3 k8 s! `// UART 初始化. m# e# v2 f- p0 T& Y% X
void UARTInit(void);
3 O- Y- P0 Q5 q! k// ARM 中断初始化
- B3 y0 o" G x5 V# Gvoid InterruptInit(void);
5 F$ m4 D0 k) s( R// UART 中断初始化
. c% c0 p9 _& cvoid UARTInterruptInit();7 A3 d0 K7 }( ^# X0 t
// UART 中断服务函数
( y' M- V/ f3 t; i- _void UARTIsr(void);" b2 F4 y9 c- ?
9 I3 w" n. v5 K+ v) X2 }" d
/****************************************************************************/
, t$ l4 \5 a# u! O/* */ A& l- N! C) Z9 t8 [
/* 主函数 */8 p3 K1 `' D$ i: _
/* */
3 w) w3 E7 }! T/****************************************************************************/
. B( Q f( l; Q* Y0 s' L% x+ ^, cint main(void)
( Z/ j4 N6 U" N9 S" P6 Y{% }: @6 E9 r0 ]& N
// 外设使能配置
; n! N7 q, E5 _/ i$ p PSCInit();
4 I1 T ?' o$ G: y
. v) r' j6 ~% f, w // GPIO 管脚复用配置9 X; b% U m! ^! o7 Y" w" l
GPIOBankPinMuxSet();! D! F3 P/ |+ T; F Z
* B4 }9 d8 s! |" I v // ARM 中断初始化
: [: f2 h F" C5 w InterruptInit();
% z; x( j6 V- ?2 r$ P5 ]* S+ q: v4 v: b6 p K$ R4 j1 D$ n
// UART 初始化
; K$ B8 R2 y0 u/ }. z% n UARTInit();
: l5 T7 y" h0 V6 Y0 }
% ^$ F$ B( v. P1 k( n // UART 中断初始化
6 ^0 q' h; |) ]$ o; n' d UARTInterruptInit();0 @% e, z4 i' T7 R7 _' @
- d3 p5 x! s/ \1 ^ // 主循环
- p; _" K% K' o. r' L2 T4 M/ s V for(;;)
7 f$ `8 X( w- e( k/ U {4 h. T, s2 O+ y
( Y) F- T; P6 G' ~' a
}6 U# P ]0 R2 O1 F1 c( [5 I
}
/ F3 i: y0 `$ w7 r# f* b' U* d% A" W
/****************************************************************************/
4 s8 n1 c( v9 y1 K7 W/* */8 Z# m7 `) e6 Y0 B/ N2 m! c
/* PSC 初始化 */
5 [' g0 i8 C2 z/* */, I m* Y+ u. x- P8 b( A0 S
/****************************************************************************/1 o$ o/ Q9 j1 V0 ]
void PSCInit(void)
0 O5 G% O1 ^' v$ l: n. n7 N9 n{
; h4 H+ b" t* \9 I0 F U% w // 对相应外设模块的使能也可以在 BootLoader 中完成/ h1 V0 b3 V" o% R0 T
// 使能 UART2 模块
1 u- L Y5 H- a3 r6 N. {7 q, {8 R PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);" Q4 }. x, S" ^1 _8 ?7 n
}
; s6 U# f! P7 [: Y( l/ L3 x; d ~7 k; M( Q! _
/****************************************************************************/$ a+ Q8 t+ o$ G8 w! L$ m$ p7 P
/* */
! U) i3 j6 L/ g0 }1 ], H _/* GPIO 管脚复用配置 */+ t6 Q; y1 N; e% B) B' A
/* */
& Z. r3 B+ C2 l' e, v/****************************************************************************/
1 i; j9 ]- e. ^/ M% h: A3 Svoid GPIOBankPinMuxSet(void)
5 z4 j% R: x2 O{
# N" C7 ], W2 v" { // UART2 禁用流控8 \' B, D/ t4 e3 R; D) S
UARTPinMuxSetup(2, FALSE);
+ n" W) v0 H- a* Y0 ]}: c* o# e( d) r. K8 L0 r; V; ~
! L7 W$ j% ]" r! B+ C2 q
/****************************************************************************/
" y7 M3 ~6 A8 J6 s/* */
8 i3 ]; S$ Z- L+ V% [0 X* Y/* ARM 中断初始化 */
4 I( D8 Z$ c8 b/* */3 Y" e4 L" i' L2 D: W# m2 I; c0 k
/****************************************************************************/
2 Q2 e; x& X: I" _void InterruptInit(void)
0 V+ |6 P* K5 M; K) L{- w3 y! ~$ ]8 @: ^6 X: b, M- x
// 初始化 ARM 中断控制器
( R# m0 Z8 [5 d IntAINTCInit();- q) }# ^* n9 e5 E
! M" e) |$ r; Y2 ^5 x5 \4 U
// 使能 IRQ(CPSR): A2 {# C- r. x# u$ x+ T4 {$ M
IntMasterIRQEnable();) n6 q8 i& h; Y5 C7 n8 r
, G" o4 V* T1 O# i: H& X# X // 使能中断(AINTC GER)* W' h: d3 A4 |- u
IntGlobalEnable();
; w& i& {- c8 O
0 p: u0 G, w/ f // 使能中断(AINTC HIER)
+ Z* h8 N: [' ?1 `- k3 ~7 H& r IntIRQEnable();
$ `/ B* i9 s& X% L9 B% C# u3 W" g}" `* G" p7 B3 ~0 e' V. s0 Y0 J* c
* F4 R8 d/ Q( j" [# C# p" `( v: r
/****************************************************************************/
) f( f' m% Y9 m$ S6 `. ]+ h* |/* */
9 b& D8 t0 o9 V/* UART 初始化 */: H5 y; e& h' Z! U* L4 w' g' u2 n
/* */- Y- z$ K, M1 A: Q1 ~0 u
/****************************************************************************/# V1 H; ?4 u' G& @
void UARTInit(void)- @0 Q& Q) s& \, c
{
& K; }7 M& b6 i, e9 C6 `0 P // 配置 UART2 参数
]6 s0 P; S2 u' ]; d // 波特率 115200 数据位 8 停止位 1 无校验位2 O1 q; ?0 m1 k4 J
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 e# h. y3 C/ H1 ]. p$ F2 d* z5 d UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);# r0 W0 |( k- w; e: p5 _3 `3 c5 k
// 使能 UART2
! W! P' T$ ^0 Q3 Y0 y9 i' m# s UARTEnable(SOC_UART_2_REGS);) K5 w4 L# n# T
: b" N+ w$ z! C9 L P
// 使能接收 / 发送 FIFO
8 k z6 {- w' g; g* n UARTFIFOEnable(SOC_UART_2_REGS);
) R; }/ O2 I1 E5 P4 U
8 ? X4 @0 ^4 I& x9 \1 Q // 设置 FIFO 级别5 G( V" `1 l) b7 {
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" X! R I' j8 o W
}/ w6 a w0 ~1 Q. Q, n4 z
1 r k9 k& Z3 s9 X/ {- K& M/****************************************************************************/ ~0 {" h- x5 v N& r/ J: m
/* */1 i' o- d' _ C6 Y9 u
/* UART 中断初始化 */
0 n. D* G6 t( K& [/* */
9 Q& e& L/ W5 @' Z# U" ?3 j/****************************************************************************/& [, A+ X; L* q$ r) m$ z0 |
void UARTInterruptInit(void)
8 i& y# ~' z7 B" @6 P6 Z. Z# \3 G; A{
/ @9 }2 f5 J! A! ?( ` IntRegister(SYS_INT_UARTINT2, UARTIsr);- ~6 x2 Z) t- s$ k
IntChannelSet(SYS_INT_UARTINT2, 2);" b; I) d( s& B" ]# A
IntSystemEnable(SYS_INT_UARTINT2);
3 ]+ F0 b( ~3 N6 \7 b( _) h: p- f4 A% J- K
// 使能中断5 `3 ]4 F i1 r
unsigned int intFlags = 0;* x, x) u0 j, v
intFlags |= (UART_INT_LINE_STAT | \3 c& X9 z: Z' e. g2 H6 i. |" R
UART_INT_TX_EMPTY | \7 u; P v' D4 ^; s
UART_INT_RXDATA_CTI);
8 l+ S4 G P3 v: E5 m) z% U, Y UARTIntEnable(SOC_UART_2_REGS, intFlags);
9 m; s% W+ k' c2 m# A6 t}
1 f% O" {& ?- w* j3 V
8 i9 P8 q* n+ l0 [. c% V/****************************************************************************/
2 Y5 m! }* n. W" v% w! u9 C Q0 E/* */) A$ t( ?, S# h0 v
/* UART 中断服务函数 */' G0 J* K& D7 T0 g
/* */" {4 Y# j3 q4 T3 P& S
/****************************************************************************/6 b3 o, t' [: F4 u/ b
void UARTIsr()& D% b$ p7 o: D1 R5 K
{
& a7 O4 \2 G& A' z: y2 T static unsigned int length = sizeof(txArray);
6 V& N2 ]0 ~6 U8 |4 Z, V) q% t& H static unsigned int count = 0;4 o5 A- e& S& I* g" C
unsigned char rxData = 0;
0 Q+ U8 f5 W9 a6 c unsigned int int_id = 0;
1 u, x% w% B3 @* Q# p, k% g* A* e% k) ~" t9 |( k( f5 G: `
// 确定中断源2 J) \1 C& A4 w+ [' W; z% Q
int_id = UARTIntStatus(SOC_UART_2_REGS);
; m1 D# b7 p5 u; f/ V ~
. ]4 J5 ?$ r+ d5 ~# _ // 清除 UART2 系统中断
7 i7 C1 X9 G. @" ~. q IntSystemStatusClear(SYS_INT_UARTINT2);3 u1 y+ M, e% o; o N
5 a: p* ^# q/ g // 发送中断8 {; h+ q; K/ K* A2 |. E, W
if(UART_INTID_TX_EMPTY == int_id)1 _, x: y z) N" r) G+ g0 u
{
; {$ a* f6 F- h8 w( Z: t if(0 < length)
8 z, A8 h* @; v; ?5 V' C) a {
' [2 w" y, x1 B J0 N2 o9 @/ Z // 写一个字节到 THR4 |* w$ _+ d s. l
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
8 G9 f' V) l% m length--;! Q( t9 _, S( O) i& P1 q% C# d8 e- J
count++;
# i' z3 D! W w, o# a! a }
2 _9 A6 Y- S6 R/ r if(0 == length)! X5 k9 ^, Q, F
{
" w1 ]& i3 _$ i$ X8 P; y // 禁用发送中断- S# m K( x ]7 b3 Q
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' r0 B) [( f/ h ~$ n1 b }
+ i9 Z4 M$ E0 h- D# v6 C# X3 i }
6 V4 O% Z5 ^& U A4 u
" W2 M- r X* C `# T4 r$ p# c7 p0 d9 W // 接收中断* t. M$ i! ?- c z7 r; o
if(UART_INTID_RX_DATA == int_id)
+ ]4 ^: }3 \! C {
[4 w! p% f. f' ^ G: ^ rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ X! B8 U+ r# a; M# N
) l7 U, j3 k# i* {6 x$ B* ?& u UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);0 J5 n7 ~3 p' r( D) q+ i1 b( A/ I
}. G: z- V4 M1 ]& ]) Z U) c
, r a0 {" S; f* S+ N8 ~
// 接收错误
& ^* }4 v L* P, i/ n if(UART_INTID_RX_LINE_STAT == int_id)
) s0 ~+ H, `* t# \* y' I3 W6 [* k0 w2 j {. P" O ?5 S% |' f* i
while(UARTRxErrorGet(SOC_UART_2_REGS))0 N" @6 O% W% J) ~
{2 V/ x* e1 O/ }# u
// 从 RBR 读一个字节
i7 ^ }% M1 J/ P e% C6 h UARTCharGetNonBlocking(SOC_UART_2_REGS);
( \0 X! @) t/ o d }# W2 x& j) x8 v7 s
}
4 z6 K7 x' u0 V 7 [- H6 @' W) y9 a
return;
- k* ?& u: f" `}
0 _# _; L# u [6 E$ [3 B |
|