|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。, t' c! F# O7 O& ?2 t7 _9 _2 @
4 ]' s* a# |+ w6 M, \' X; ]# h0 V
#include "TL138.h" // 创龙 TL138 开发板相关声明
# B( Y5 k" c) @2 r0 w; T3 f" p/ T, H
#include "hw_types.h" // 宏命令
' |6 b9 |1 Z% p8 O#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器$ v8 s4 {$ `. w4 g/ D
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
: y J9 M. a2 x# O1 z. g* l3 w- _/ c0 P/ z- T* W* C
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明& d+ o1 u* d) g# E% r6 X$ ]
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
, j- ?: `5 V2 J#include "uart.h" // 通用异步串口宏及设备抽象层函数声明& o( |2 v, N9 G0 Z5 p9 O& \
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 C; S: h1 y: d8 J
, m) ~+ G* e' w
/****************************************************************************/ ^; S1 j1 A2 Q; n/ Y: [# p1 G
/* */
9 ^0 f# W; }4 d: I. S; Y o) u8 y6 T/* 宏定义 */. @+ Z; q% c3 t9 U2 `. m# v
/* */6 B: F+ T( ]2 u% B, i) g
/****************************************************************************/0 t a7 o' f9 k: R5 Y
// 时钟. P- k2 P# H$ m0 L/ A
#define SYSCLK_1_FREQ (456000000)
7 B3 g1 I1 h2 t; D#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
8 z5 a: B% V0 p9 @: N#define UART_2_FREQ (SYSCLK_2_FREQ)) V( W9 Q9 q& B$ @" Q
S2 \" ?' a% C7 ?/****************************************************************************/
) s+ v1 K) R8 G0 X6 e/ D+ B: d! P/ X/* */
% D2 Y- n, u6 A' n2 C: i/* 全局变量 */
# j3 b! v5 ~% D! J5 N ?/* */
6 s7 n, @+ D3 X. S2 V d/****************************************************************************/( F U0 m+ v- y/ @$ G
char txArray[] = "Tronlong UART2 Application......\n\r";
, D7 O+ a | M8 @( B
* c. ]2 u5 v8 \. c/****************************************************************************/, i4 X0 S! F, F7 I
/* */
. M6 q9 U6 n; G6 l1 s/* 函数声明 */1 N# ?, g1 x/ h4 f
/* */ `% D( |0 H4 B) m2 }% `
/****************************************************************************/* F( s; c7 y5 B8 E5 E/ {
// 外设使能配置7 V" y5 T4 s D. S0 T
void PSCInit(void);
# _8 m' o4 g. R" p( g$ y% U
' n4 ` |# C" `" ?; ?. M4 g// GPIO 管脚复用配置
, V& j6 V( M. V* wvoid GPIOBankPinMuxSet();
: u# \; r5 \2 R/ `1 c5 c& O( l) N& V
( A- i4 e/ J$ D8 ~/ t3 H4 w- @3 O// UART 初始化/ b! V& J* Z1 m# k- c4 ]* R! d
void UARTInit(void);- ^5 A, A- |- E% N$ \4 \* Q4 @. g- n% T
// ARM 中断初始化' O# W+ J2 f, K+ z' \
void InterruptInit(void);
. w1 Y! ~. m! D0 m// UART 中断初始化
) ^# n0 F }( X/ l j kvoid UARTInterruptInit();! l8 f' i( z6 @* s
// UART 中断服务函数' R5 d q! x9 @) n
void UARTIsr(void);
7 Q: O8 Z U* s1 T' U
) x2 ^" ]/ o X) V. |. v7 [, R `/****************************************************************************/5 h1 |1 S. ]2 O- K
/* */; v8 Y0 O7 M8 T# A
/* 主函数 */
9 k& E" @4 U$ O% p1 D8 I2 u4 C! }/* */
& Y4 K( b3 S* z/****************************************************************************/- i' G/ N8 R- G/ m1 j2 D
int main(void)
) k* d* j a! A# ?8 r" l. c{( }& ~5 d/ S+ R' s2 x% Q& |
// 外设使能配置
" [; g; C8 T( D' [. _ PSCInit();
+ z' v+ ^' g% r' [) m: {
; D% s! m: \: A // GPIO 管脚复用配置/ t+ B S/ p& x
GPIOBankPinMuxSet();
8 k3 Q& `& o: h3 B4 S( |0 H0 s. c" a/ U* F$ A( d. Y K" c, S% y9 W
// ARM 中断初始化
, ^: {# _/ U& f) n InterruptInit();& N ]4 P& w) s1 F& Y
5 s* m% ?2 o3 c+ t) ~+ h1 C' y
// UART 初始化. g1 T. X9 k/ k$ n. c" k
UARTInit();
( U; i; J# a# l4 \; e5 j5 D, n) X' s. E% z$ U0 p# q- v" s) F
// UART 中断初始化
: j% z* m& A" [9 k" V' q UARTInterruptInit();& S! U, G5 P9 _) I* Y8 ?
7 @6 `5 Y2 J' o! F. X
// 主循环1 `% r- j+ q" f8 S: S9 U, \
for(;;)
# k" `/ R; c1 L3 [' P {7 _. W% m( x) K7 l0 r' m; J' {
$ E/ j* @2 P) l" K* g4 k/ R
}. _0 k" H- J5 d) c8 a" q
}
?, b) w- I2 L* k4 h$ d' h2 _* z# r7 B( w" Z5 k
/****************************************************************************/
+ o J1 P' U7 c8 f# o/* */
! Q, V& w% i' B0 t( f4 D/* PSC 初始化 */
8 z* y( T$ o% i- N4 l% \4 E/* */
. W& }. h U6 _/ `1 p4 A4 z/****************************************************************************/
# a0 F$ T" R4 C$ w& l* G% svoid PSCInit(void)
2 D, [4 z, A* X3 V6 j{
( b; B# z T x$ x. t/ n) R. g7 t! T // 对相应外设模块的使能也可以在 BootLoader 中完成0 L0 N% g, `7 j
// 使能 UART2 模块
5 G/ @7 ^7 y& [6 d PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 F j, [4 u# Z4 K6 C
}
0 l" N. P- P/ T4 \1 C- S0 o# N# Z) B; V) ]
/****************************************************************************/
+ u0 K. J4 r5 `- C/* */
, k5 _' ^; g; I8 {3 p1 F* x/* GPIO 管脚复用配置 */
" J5 q& {6 [2 H# }/* */7 c' a, a+ w/ [+ X @8 q4 J
/****************************************************************************/! c; B b. y4 ~, @: `* x6 V
void GPIOBankPinMuxSet(void)/ Z* ~* G% ^5 K; D7 u7 g2 Z
{" q) _* p6 V/ Y- Z; ?# }4 k7 t, G* g
// UART2 禁用流控4 e2 j& x6 M0 v7 Q( Q u2 r
UARTPinMuxSetup(2, FALSE);
6 v' A3 A! l& P" U+ c8 C6 U}
! z4 h- Z; U7 m$ b" q/ m. X6 \# R% l: Y+ O1 [/ Z2 W
/****************************************************************************/
( j' _2 r! c4 U' ?8 {) Q/* */
2 A8 e$ Z3 ]- Y1 {) t! g6 i/* ARM 中断初始化 */
@6 ?! M6 F) |2 a; D( S* P/* */
' Y& ^4 {' X* V/****************************************************************************/7 B' S% P; g8 N9 ?# }1 [: G! _
void InterruptInit(void)
: i* D+ U* W: J B4 d{7 l& p# Y% h# b; ]) T& K, w
// 初始化 ARM 中断控制器
7 ^* r9 N$ X7 Q0 ]' N0 } IntAINTCInit();
, I- b1 F, p0 |# ^3 Z" Y" @8 S7 w1 R# ]# R% ]& F8 o
// 使能 IRQ(CPSR)( j c* a9 X. _# u$ W
IntMasterIRQEnable();$ T8 v. N! F& q+ C* u4 A% W0 y
: K% M; a. H* G. g, H9 `0 _ // 使能中断(AINTC GER)
}7 h1 K/ M& x& \7 |6 [ IntGlobalEnable();
, t8 u( z% k" Z6 c' q) L3 {1 A1 O$ w( n: n( z8 W/ O
// 使能中断(AINTC HIER)
: ~+ o& q' b2 \5 O; ` IntIRQEnable();
2 ^* m9 Z1 w O( E( @4 [1 U}) E" K2 V. N1 m; L1 O; _
5 L+ F" W+ W& P2 k: e5 X; Y) E, `/****************************************************************************/5 f. w. t0 w1 @/ X, I( Q5 f2 X
/* */
7 E9 L5 W+ x( R ^/* UART 初始化 */
5 V- X. N8 {2 q/ [# ?, C* E* R/* */% p9 r- V" O1 l% [5 e6 C
/****************************************************************************/
3 ~ n! u/ X+ Pvoid UARTInit(void)6 ^* _0 D {$ @8 Z2 m4 l
{
. |( ^( ~' G3 ] // 配置 UART2 参数
) O( U- q7 X9 R8 L( W6 u // 波特率 115200 数据位 8 停止位 1 无校验位, y: n) \2 D. X/ U2 [
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200," ]& E/ Z, g! ^5 W
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' E0 Z1 t% N2 ~3 U6 ] // 使能 UART2
" a U& B5 z0 x: t; {0 c UARTEnable(SOC_UART_2_REGS);) E$ s. I! h/ i
X# a5 }3 S0 a% P+ ~3 g
// 使能接收 / 发送 FIFO p3 p& p5 p9 ?& i% z
UARTFIFOEnable(SOC_UART_2_REGS);
* c% @0 G8 Q- Q. \. w# }* v9 W' F9 P) |/ R. j1 t4 {& c1 ~+ C: {" g7 T1 o
// 设置 FIFO 级别
" m* J8 V8 a& F/ ]8 s UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, o0 f0 w: \/ C2 y/ E7 g6 [}
1 `: I1 u' u# H# Z7 I, n( {3 n
8 j7 x5 j* g# E" r' z, ^ a" K/****************************************************************************/2 a7 u- S8 e8 H' P6 \
/* */
$ z) f" m0 d9 ~3 u6 R/* UART 中断初始化 */" e2 k( ^" D4 E( L
/* */
+ H& _$ w3 {& S( b7 @/****************************************************************************/
3 o4 C5 _( \6 j) ]void UARTInterruptInit(void)6 O8 D* j+ h+ z! B0 d
{
5 n9 ?/ w( y) Z) Q# C. P R' G* b0 s IntRegister(SYS_INT_UARTINT2, UARTIsr);
. q' G# Q( G0 ]6 T; n$ e IntChannelSet(SYS_INT_UARTINT2, 2);: `1 P5 O( r" [
IntSystemEnable(SYS_INT_UARTINT2);
& k3 Z C) r& b% Y4 b6 x/ _6 \' F
. v8 }, g/ I% _* ^ // 使能中断
4 z/ q: Y% u' v; k unsigned int intFlags = 0;
0 }8 ]" @, v( b6 s- S intFlags |= (UART_INT_LINE_STAT | \% x8 X/ m4 n7 T8 O$ T
UART_INT_TX_EMPTY | \2 N* B7 V) E ^( @! Y( B1 T
UART_INT_RXDATA_CTI);+ O" N/ |+ ]/ O
UARTIntEnable(SOC_UART_2_REGS, intFlags);
% ]+ r8 u0 ~/ ?4 l}! D! a9 L. ` t$ s0 y) ?% E4 e
( d7 X* A& b' k$ t/****************************************************************************/
7 Q6 W2 R' i9 K9 ]2 {6 E/* */
7 ?. H. X$ b+ o T" k) I/* UART 中断服务函数 */, z8 E; e1 a( d4 s
/* */
& Z h# d& R% a; x6 L0 ~' f* B/****************************************************************************/
7 ~' x2 r3 z- Yvoid UARTIsr(). j$ ?; [9 P" R+ M* b$ {
{8 M- O/ K' s3 E) |
static unsigned int length = sizeof(txArray);! G) N! B, x1 d1 J* \3 c
static unsigned int count = 0;
$ R- t! j, u! | unsigned char rxData = 0;- v+ x9 p; b% n
unsigned int int_id = 0;- Y7 ~+ K4 ]5 M2 U
! a( @& R5 m& J, c2 K // 确定中断源
% V8 f& S8 C: v9 T+ i int_id = UARTIntStatus(SOC_UART_2_REGS);
; b' I& A/ N' r+ |9 E
0 u5 `! j. ~& ^9 t% p1 v+ k8 D // 清除 UART2 系统中断
3 W6 u; s3 O% Z0 M IntSystemStatusClear(SYS_INT_UARTINT2);
' l& ^5 `, x0 A6 b3 f& D0 g+ H0 n- o+ M! _/ ?
// 发送中断1 _ @$ K8 g9 M* L6 a
if(UART_INTID_TX_EMPTY == int_id)6 }( `9 |4 q" k3 N1 m; a# G
{
9 f C1 x; C; a: o# W7 y8 O if(0 < length)
" b$ G; }4 j- G. [0 q, | {
, m' R; H; X6 ?$ ~# n1 ] // 写一个字节到 THR. d- h" |( E$ a1 s$ }
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);7 l" V1 E) r& [8 \; @
length--;
+ _9 s7 `4 w) A count++;% D0 w( w3 u5 ?' ^5 V D* y. q2 A
}
+ D( [3 b2 Q; U if(0 == length)& y% w. t& E# ]8 `0 C5 y2 g
{
a/ A4 J! V' ]0 S // 禁用发送中断, H8 t3 _* ]$ h8 Z9 H
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
+ z; [% M7 K' S2 I }
2 s& L4 f4 ~' D# k7 y# T( ?! W }
4 l" e' z& }$ G' s3 N& Q( Q1 _9 Y: P: T/ D
// 接收中断
6 I8 k5 K6 q% X y4 h if(UART_INTID_RX_DATA == int_id)" l6 x. X0 o& {6 l" K
{5 E! M7 K: B% u6 J% Z
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 }4 g7 I3 S5 k2 O& _- Z: p! ~1 D; x, w2 m! c( s S
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 m: |; |& Q7 K, T
}5 w) F9 P: x* g/ P
2 L# h+ p8 {/ U3 T& c6 U
// 接收错误; a. S0 S. j; R U- Q3 R `" y* w
if(UART_INTID_RX_LINE_STAT == int_id)( o9 f0 u4 I0 x2 l X' @, A! M$ N
{
1 K1 k7 ?' P% Q1 b9 J" F' T+ U while(UARTRxErrorGet(SOC_UART_2_REGS)). G7 @# d7 u1 @; L1 R
{
" O/ V" {- q: K; {4 B1 T // 从 RBR 读一个字节
0 w' p9 d7 x, y' ^ UARTCharGetNonBlocking(SOC_UART_2_REGS);) Z& F1 ?1 G/ b9 ]3 U+ c0 C, n5 V
}
/ o4 N7 i: j" u' b- H( N7 ~) `" p }1 _) K/ _! h5 n, T* d' Q7 t% d O
( q6 h f B& i: |" w; k" H: Q return;# z# R* ~ a9 Z% c0 T
}
: a4 C: y9 S: Q |
|