|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。- _$ }* J+ R2 x+ P& Z* {# \5 T
% U' Z6 f& F' I) |" H8 E#include "TL138.h" // 创龙 TL138 开发板相关声明: }' s# y+ B E( R4 ^
, F7 s) R X# x7 M8 R p) S#include "hw_types.h" // 宏命令
@$ h2 N9 O2 b. y* {7 M2 ]#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
6 q- `% C* a" Z1 }* }4 Q#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
) E0 [. l) `# G# x! @+ I4 p
+ Z z& y) J& `6 c1 @ Q#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明: i) b+ Q' }4 _
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
i7 `1 }# Y" B5 M* h; B* s#include "uart.h" // 通用异步串口宏及设备抽象层函数声明2 Z$ g/ \7 W, g% O0 S1 a
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
% {+ }7 @: }6 l5 r9 k [
+ u4 }/ u* T& v: j3 V [9 F/****************************************************************************/
' e" e0 n9 i* U. c% s& h/* */2 Y& a6 c x3 T& ]+ j! S
/* 宏定义 */
+ [6 p5 _ l7 u- ?9 F/* */% R, K! k" i4 n0 o8 V! I% S3 i0 t( @
/****************************************************************************/
- @( P* }; J9 ^( {- t" u9 L// 时钟, Q8 I0 l ^9 z+ I# N' u
#define SYSCLK_1_FREQ (456000000)
' d1 Z5 v* u: U#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
1 ]* e+ a+ S1 b8 V: s% N#define UART_2_FREQ (SYSCLK_2_FREQ)
2 p5 e9 i- I3 i3 q) x9 A3 t
3 p7 y+ k4 x; G ?+ T( R/****************************************************************************/
2 l' `. t: G" F/* */* p; Y' X. r& e5 f: Q; S
/* 全局变量 */
% k! ~: }, I7 m( |/* */
1 n; N* i9 T1 n( M/****************************************************************************/3 B4 ^ }) ^! b3 ?/ |7 H) J
char txArray[] = "Tronlong UART2 Application......\n\r";# a5 y9 B# [- L0 P+ b9 d. Q- {
/ c a( W3 p0 ^
/****************************************************************************/
4 g- s2 } v+ n. f4 m7 O1 s/* */+ K* |( q S+ P1 j ^ m
/* 函数声明 */
& T# t: }5 c$ B A/* */
- a9 f; i7 S( C/****************************************************************************/
: r2 e; }0 m& m* I7 e// 外设使能配置
) Y0 g! |' o9 e6 b! Jvoid PSCInit(void);
/ z- M' j! }; U% z, ]2 e) f u) |4 W: ]
// GPIO 管脚复用配置
* D9 x. f2 X Y9 dvoid GPIOBankPinMuxSet();' y' R$ i, b3 i
+ V3 ?+ Y7 z% `: ` F
// UART 初始化
4 B" ^$ c( m& t- Pvoid UARTInit(void);
) B# N3 \# h" W- o* p$ u$ f( K/ P+ S// ARM 中断初始化: F7 s3 z) Y B( \ D) x
void InterruptInit(void); A3 X( l% \4 r! g
// UART 中断初始化
8 K( T( w$ o. A, L0 C X( evoid UARTInterruptInit();4 }0 w# ^* q, ~+ y# k
// UART 中断服务函数2 {+ ]* J* U) C ]/ n5 y
void UARTIsr(void); e- R, _$ e, p8 v. W" [
$ Y7 b' `" b* W4 s2 u, Z& A
/****************************************************************************/$ T3 m( {, a6 H, d
/* */
. |0 b( B$ X3 R0 N, e9 ^( q/* 主函数 */
5 e" L* B5 C$ d J8 n6 M/* */' \ `% d1 y5 D+ q: Q5 [) V; i* t3 {
/****************************************************************************/
& k5 E' o; _. m1 Pint main(void)
& a0 U P+ Q" {3 j: o) `{
. i1 {" U5 w- O1 y& H, A: C$ G // 外设使能配置
; d4 F K% P* y) r PSCInit();
! D: G ]' E; u- e ?& ?: k
8 ~! D: ^7 x$ e$ A" g- Y: l$ i3 a // GPIO 管脚复用配置
4 S( Z( C; c ~4 k8 w, @$ ^! V GPIOBankPinMuxSet();7 }7 M4 b; Z" P% Q9 i0 q# F. b. @
+ F! a$ |/ B0 K
// ARM 中断初始化
# e' X4 C. k) s% Y/ d( T InterruptInit();
/ \# w7 N, O: ~+ ?
0 H+ E1 t" y: T9 o2 U( d // UART 初始化* P% [) x, X7 w
UARTInit();
. E9 U/ f4 ?) P) A; ~+ z% ^( ]7 r; _: A& D
// UART 中断初始化
2 g) \/ m! H* o9 a% _ UARTInterruptInit();6 g- q& j J8 U) }! [0 R6 q
Q) q( a- ?0 v+ e: {) M
// 主循环
7 q) k9 y# y8 m5 c- E8 D1 K for(;;). \" o) w0 {( `9 Q# p) I
{
( z8 X& V" N6 n( L8 X0 N' ~: a# {. y5 w" c3 P3 G
}
* M6 l B( |9 A5 w4 [" p" E8 B}' m, d) Q# m: K- v$ }
' s8 W. O: u/ A8 G5 I6 Q6 t) l
/****************************************************************************/
2 K( B1 |* A( h; { r/* *// I9 q! @" h8 F% p. g+ E! b
/* PSC 初始化 */- H* c9 E6 b8 L6 c+ F2 M
/* */
7 x* |- K* [9 b) p D/****************************************************************************/. x# w4 E" e% [9 B
void PSCInit(void), S9 B: ]- y/ F6 }5 V
{ i# s0 ^9 j( x- R4 h3 K
// 对相应外设模块的使能也可以在 BootLoader 中完成4 d0 G* g& K# `5 ]* r
// 使能 UART2 模块8 q! M# U3 c4 Z6 D7 w+ t d, R" h
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);2 }9 H! G& n, v( P+ g! g
}
( \4 o X" W7 t2 D, B- l! k# Q% Y5 @
- s1 v( X" K9 }, R/ U' z/****************************************************************************/) W3 g- J) L: F8 w: z0 v# }3 F8 Z& [
/* */
- C) e3 U; h. e$ a {& z/* GPIO 管脚复用配置 */+ Z! ^4 P* ^0 F1 q
/* */3 i$ e. d) i6 }% g
/****************************************************************************/
7 w k7 d/ ~- m2 X; m* m: Dvoid GPIOBankPinMuxSet(void)9 |( q' a- \0 M. ^+ o
{! Y6 @0 _& K6 c3 |
// UART2 禁用流控$ [% V9 x' G. h5 q6 Q5 ~1 l
UARTPinMuxSetup(2, FALSE);# X( A+ i" j$ q7 _- O
}' X: Z# l8 i/ l2 X% i3 G
6 p7 M; J2 W" ^+ p' D/****************************************************************************/' q2 q u/ E. e- T4 G! y0 @
/* */5 n N& C3 U$ @! z1 \& U
/* ARM 中断初始化 */$ O/ p7 J% G9 T" F8 O
/* */
$ J$ e+ C2 I: W4 l! {( z+ J/****************************************************************************/
8 r# l" A+ \' k5 E1 \4 ?void InterruptInit(void)# L+ w$ d* x) [% t) [7 @
{8 r3 T- Y, R) `5 s
// 初始化 ARM 中断控制器
3 A& @" L$ V3 R: y$ X! | IntAINTCInit();, U. A, w l/ v, h8 u
9 J3 o* j* o/ ^
// 使能 IRQ(CPSR)( E6 F: |6 K: i# i1 l+ a7 ~
IntMasterIRQEnable();
: O- W5 N# N- n4 |& k5 ^: s7 ?+ K* ]% a( A ~- ]) ]6 u4 R
// 使能中断(AINTC GER)8 H- x2 s' C7 H
IntGlobalEnable();
! \. I! |0 r) C8 l, T+ l; J$ {0 u7 K1 u7 w. |! d p( f) ^- |
// 使能中断(AINTC HIER)
( K) f' x2 L" }5 w3 E3 m IntIRQEnable();
$ Z/ D e3 O V& S- h" G}
* I. t( u. Q( Y/ N6 l
1 u' b5 [* Y: {8 ^8 Y9 f4 }/****************************************************************************/
. m$ Y* y0 h5 |+ Z- d' X3 Y8 j/* */
3 K( B$ C3 {! {5 H0 f; L" {6 Q; S/* UART 初始化 */
7 g$ }1 Z. j& a" p+ T8 i/* */
" R/ K1 C t, @! _/ d* T/ N" h/****************************************************************************// L1 M, J8 `7 ?7 q) t: d' V# D8 e. E9 o' a
void UARTInit(void)& C0 i* ~+ g0 T+ I8 h
{
/ k3 i! X' c" W L // 配置 UART2 参数
$ o! U, i6 c- Y0 i; Q0 }7 U // 波特率 115200 数据位 8 停止位 1 无校验位1 h4 [( Y1 l0 \
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,: X% U5 V$ q7 u. i T
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
/ p! Z& `5 ~, {5 b: s- l // 使能 UART2
& D1 R5 U/ K5 G4 H. A& ]9 G UARTEnable(SOC_UART_2_REGS);
; [- V! Y V; x) k& r [- {4 X
+ Y l: l! B0 z/ X$ e6 ]- x$ ] // 使能接收 / 发送 FIFO
# t; x; h# C& k; {, \6 [0 ^ UARTFIFOEnable(SOC_UART_2_REGS);6 \3 `" n- w; X! w' _
! b& u n1 d% Z6 [) ?$ s; U: n- ]! | // 设置 FIFO 级别
$ ], m( V" P$ i' F% x# Q UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);9 d/ \( X8 X$ r$ X) @
}
: [& g2 U7 l! H2 {* q* P2 Q: V t4 l$ H2 f4 T: U4 N5 P) X
/****************************************************************************/
& o4 N7 H0 y! e/* */
/ k8 u7 o3 s7 z1 I; k6 j# u/ k% Z+ D/* UART 中断初始化 */4 m& u- B6 ?& T, ^8 _3 G
/* */
" m: g& d; h1 \9 l/****************************************************************************/' E, X, D; V! F# `) [! x9 z. |
void UARTInterruptInit(void)
! p% N. N: n1 a0 R( u' l7 @{! F9 w* y v3 v. ]2 ?
IntRegister(SYS_INT_UARTINT2, UARTIsr);
/ K3 M0 @* }' X) m$ w6 p; {* |3 L6 s IntChannelSet(SYS_INT_UARTINT2, 2);
+ a/ B2 F! F! B2 G4 A* B: w8 j IntSystemEnable(SYS_INT_UARTINT2);
6 E; r+ @, f# B: a2 C1 M/ f; a. k! V L+ m7 h5 d2 D
// 使能中断* K9 e. ~4 M" ^
unsigned int intFlags = 0;
: E0 Y! u: X8 L6 u8 j intFlags |= (UART_INT_LINE_STAT | \6 o3 Q- w5 l( C8 J, H; G* [4 D
UART_INT_TX_EMPTY | \
5 N' T- p/ w7 T5 i8 ~) u% T0 O+ d UART_INT_RXDATA_CTI);
- j) L; `% C$ F7 U" p; B UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ P1 C+ d6 L! d# C# Z2 G6 F}) m# Z% d$ |( S1 }/ o
& Q- R6 e0 Z$ z; r; o9 N" b$ [2 X
/****************************************************************************/
, x- M( i- j0 t0 F3 f5 O9 M6 [/* */" B5 Z# E) m5 h* \' q0 r5 A# Q
/* UART 中断服务函数 */
7 `* v2 y( S; ~& ]( n+ p8 M f( O/* */# k/ I+ ]+ x+ E$ A; ^, l
/****************************************************************************/, k9 L1 h$ V: k. U; p
void UARTIsr()
/ j2 j6 [. g1 E, A* X{
' I- p/ D0 P* p! g' H static unsigned int length = sizeof(txArray);) g- k$ N6 {4 ?
static unsigned int count = 0;
. l+ x" Y# a Z3 l unsigned char rxData = 0;2 p( N* s* G2 x% Z# ] |9 x* j
unsigned int int_id = 0;
% s4 `& K' t; Z3 a( R Z
: M0 X' ^8 L$ g X Y' g% }$ d // 确定中断源7 K3 T. d1 W$ K6 G
int_id = UARTIntStatus(SOC_UART_2_REGS);( N, D* u; K+ t) l- k
+ J# w5 j2 {5 a // 清除 UART2 系统中断& i3 f$ A U; C
IntSystemStatusClear(SYS_INT_UARTINT2);
8 h, K, c. C! N& r Y! s5 v' _% E4 F7 z" H, w4 }3 F7 k
// 发送中断6 t7 Z A% x$ D- Q) h5 u7 q
if(UART_INTID_TX_EMPTY == int_id)0 z7 J# `# Y! E/ C
{
6 h( r( K! ?! b0 p/ k3 h& z if(0 < length)
9 E/ @) Q+ ?# m) Z+ B7 C {
. |" A/ W+ O4 t% I4 W# P // 写一个字节到 THR
4 n* H" n% l, {4 v UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);& W% @; { B' z* X& U( a; j
length--;) G8 a0 M, Y4 I4 k: o5 q
count++;
+ G: l. C4 ^& v4 \2 A }" @2 F2 h4 [) g' S& I0 B& F9 T' {
if(0 == length)
/ c: D0 }5 W4 D {
7 R7 M4 d0 R3 x) _1 Y // 禁用发送中断) D" x' y/ y! n9 `! X4 b
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);7 u2 k8 L; p! x$ d9 c$ s% ~
}
4 s- D% t- d$ Z+ R2 N$ s }; [' F0 C f6 L3 Y' h$ Y
- a( h- W8 A9 r1 h% y6 w
// 接收中断6 f6 v& p, }# A, Y8 g
if(UART_INTID_RX_DATA == int_id)
6 ^: h$ D. d8 F {
! K* N& C G5 ?- r8 s Z rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);( \" |* X2 a/ s* b+ V
' h) q% y' @9 A2 L
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);3 ?# B: D `( N! @2 o7 B
}
i$ i7 S8 B6 y8 a Q/ O- o3 o3 e4 a* R0 |2 F3 u
// 接收错误8 V0 J$ D" W( Y4 ~$ o$ ^ h
if(UART_INTID_RX_LINE_STAT == int_id)0 z1 Q4 V; w3 i7 R
{5 q) N8 F; N% H) T: y
while(UARTRxErrorGet(SOC_UART_2_REGS))0 T1 `/ h( T# R0 r* b; {
{3 @6 _1 `) W( p+ ?) P! k" U" w
// 从 RBR 读一个字节
5 E+ ^4 M, e/ P- S& I- b UARTCharGetNonBlocking(SOC_UART_2_REGS);% k3 V& l/ H* F
}* j6 W5 @/ X; ?5 W% R
}$ h0 J+ k: h6 U; Y) x7 A% T% W X) P
: [* ^. Z0 ~) j% R/ G h+ u2 r
return;
+ x' t, ^( {- E. c; {* [+ }0 l}7 w+ ?: K; V' b9 q% ]6 l, w8 @
|
|