|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。- k$ Y+ t8 a( A$ d6 E
- I: W) V( \+ l; o! M3 x" T: n; N#include "TL138.h" // 创龙 TL138 开发板相关声明( _1 I/ J5 v$ q! @- U* q9 K. O
$ F C3 u( o i' P; z
#include "hw_types.h" // 宏命令
# K( H7 `+ c5 W) j& w; X#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
4 m- v" X) Q( R#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
& a) s+ p$ z. n) Z. v7 T9 J. S7 }/ e' s( ]1 Y
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明) v8 j4 c* G3 z( @! a9 V0 B1 E& ?
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
, \$ H, L# u& E1 |, ^' T! r#include "uart.h" // 通用异步串口宏及设备抽象层函数声明- n5 k3 c% I" @1 D8 W2 G7 B
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义- ~$ U( D( L7 `4 z3 B: v
+ z W. p' |: ]* a+ l% ~
/****************************************************************************/
. v& T' p9 v* ^1 f/* */
( Y" N+ c4 ?6 ?% s& d6 g/* 宏定义 */+ ^/ }* r8 F. u( N
/* */
2 P' s: U6 S0 _0 z$ X# m/****************************************************************************/
# Y$ u/ x* U& j. e9 p' g' E// 时钟! ~. f' Z( I6 O
#define SYSCLK_1_FREQ (456000000)
4 ]/ }8 T( k. W# v2 c#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)+ d9 z' b) q3 j3 i, I. _3 p M+ F
#define UART_2_FREQ (SYSCLK_2_FREQ)
8 Z4 O( x- q' o# b8 w/ R( i
/ I5 ~+ x* Q; t( B. k/****************************************************************************/
1 l; A- a4 s( P% J+ [/* */
5 B. R! }$ Y# g6 u/* 全局变量 */
( m6 Y% v0 O" ?. d4 J4 G+ ]/* */
: m( P5 z1 a: \. b9 w# Z' Z# i. l/****************************************************************************/
* a# ~0 w1 m6 M4 E+ U; B& Bchar txArray[] = "Tronlong UART2 Application......\n\r";
8 R8 m: i: a! ^1 q2 Z! ^5 H1 i/ ?" K4 ~- e) \! |% k
/****************************************************************************/
( |) y5 z% S6 Q) [* q! m+ t/* */; O. v1 h4 P6 l2 J# j
/* 函数声明 */
8 ~- r$ F2 n0 R5 T* D3 s/* */9 Y* {3 k8 s3 e! k$ r6 G3 X6 `! q$ \
/****************************************************************************/& Q) m' F6 a3 X' X1 Q" `8 z
// 外设使能配置
v" [! ~7 B( ?void PSCInit(void);% K/ J( U- Q- g4 R' R
& A; I7 B' O, Z( M$ p1 d// GPIO 管脚复用配置
# ~- N4 d2 B0 x7 [) f/ |void GPIOBankPinMuxSet();
! H M1 B! w8 X5 X- d) y. ~8 G* n& L
// UART 初始化9 i. A- W, ~1 W
void UARTInit(void);4 h7 x7 A( J0 ~8 c
// ARM 中断初始化" S( z/ s0 a8 q" E
void InterruptInit(void);
8 n$ q/ n+ b" }2 D/ u5 u// UART 中断初始化
5 O, H& _4 P( t) O9 T. nvoid UARTInterruptInit();
2 V" R4 j( |( G( b+ i5 b) o// UART 中断服务函数& x4 l3 k6 @8 s3 {9 v
void UARTIsr(void);: h1 y( M' r! F+ E/ O% ?0 {- N4 G" ?
7 W3 V* |- E* K& i/****************************************************************************/, p( v$ B0 v, L, a+ M% C" G0 \$ K
/* */) \# {1 T r% m3 z* Y* O" J
/* 主函数 */
" x7 a+ p5 g8 ]4 {" g8 t; ]/* */2 y# x/ l, o8 e* F& H2 T
/****************************************************************************/% b h5 M. a2 K4 c' p
int main(void)
0 A/ K. v& M& P6 y{4 v0 E% A; \! m6 S, [3 p6 Y1 J
// 外设使能配置
& `% A/ Y/ g y% n9 E PSCInit();
% T" r1 r* r" ~5 Y " C: \4 m: o. N! f4 ]
// GPIO 管脚复用配置
# K. P" ^1 ]# ^( ~) D* q9 T; C GPIOBankPinMuxSet();; p- W: L0 l1 ?- M, L- G
6 l/ [3 ~/ R) R1 c // ARM 中断初始化
1 ~/ M2 a0 n4 x; f" u InterruptInit();4 U% C8 O: v/ M' k+ O! R
5 U n- Q0 _. u8 F+ c& R
// UART 初始化
; U! i" @4 D& C( L" c) G/ Z UARTInit();
7 E- I5 Q; v2 c# B& @) E. b7 h
8 ?. n! t0 ]- H5 K0 D // UART 中断初始化& k# P5 j- l( `' _
UARTInterruptInit();$ s) F4 g/ C1 I
- ]5 u# {3 @8 s4 O& P( |- b8 U // 主循环
9 ^$ w0 V0 P6 i9 W* j2 b for(;;)+ H" ]2 j7 J$ k$ F% d
{
1 x4 p {7 ]% l- v) |" }: o8 c Q( p- ~1 B7 ?9 n
}
5 h5 y- l; `9 M2 @9 D* T8 X* `}/ \ Y Z8 S- d& R8 [( t
( `3 Z1 P, H( x: o- W7 J8 a2 y* G! }. r+ {/****************************************************************************/
# G: n& R9 F& J% x$ l' s p: x: M( j/* */
) |9 L* \" z) ]2 G/* PSC 初始化 */; ]/ o5 ]1 T9 z4 i( d1 N4 [
/* */ w- ?# }7 D e9 @- |# C
/****************************************************************************/( d' y. S* N. Z6 s) s
void PSCInit(void)- U$ T& u: c8 A
{/ w2 O; M) X+ t7 i9 P+ l! W
// 对相应外设模块的使能也可以在 BootLoader 中完成! D; R2 l9 j& w: f( ]5 `' s4 ^ t
// 使能 UART2 模块
4 V& n# H2 B2 G( p, N- w- ? PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, U) t0 c9 |; `
}
6 J7 w5 r, X2 {7 p& P2 k8 Q, [* G1 L
& E; I( p8 P2 a. E/****************************************************************************/
0 H4 c4 c; {2 Q. a9 y/* */6 A+ B9 q; h4 l4 M5 g! v/ Y
/* GPIO 管脚复用配置 */, P+ B/ W; a# b5 v/ p7 K
/* */$ ~7 d" g, G v: D5 g
/****************************************************************************/
; H/ e5 o, b, U+ r! l( Hvoid GPIOBankPinMuxSet(void)
0 [: w# c9 D; w: ~; w4 k{& v/ R/ H5 b) c; E# ^
// UART2 禁用流控8 p1 V$ a6 V1 G- k' `
UARTPinMuxSetup(2, FALSE);
" I3 I. v" x4 {/ d% N" I}5 t! r) P; Q4 l5 n; c8 Q
' @5 l j$ i( \5 E% C/ ]4 [9 K/****************************************************************************/
. C$ u d6 p6 h9 ~/ @7 B2 }3 ]/* */7 N% X+ o* q2 g \
/* ARM 中断初始化 */+ n$ \6 K+ j( W: l# l
/* */2 P& b; {' B# ^& u. r# S
/****************************************************************************/
8 K' d6 B) p8 C2 ~void InterruptInit(void)% @0 x8 P4 V' E$ H% t8 {
{7 P1 Q9 a7 I. T' ?+ D
// 初始化 ARM 中断控制器
. U0 ~( g' b8 G* T IntAINTCInit();9 v3 ~% h+ H0 D- N* f
& M( x0 V* s& q. s- ~. l // 使能 IRQ(CPSR)
+ `1 X' I& q, t) n& W0 j- X IntMasterIRQEnable();7 V2 \* v& ^! m- I$ `: k' i P9 n; e
, |, C# \/ @/ [7 D" ~9 L; ^: ]
// 使能中断(AINTC GER)! w4 i" B4 ~4 Z2 b
IntGlobalEnable();) B/ o5 O7 x8 A
1 e* X7 F5 @# Z9 `- a // 使能中断(AINTC HIER): R7 V; D8 ]( o* d6 ]
IntIRQEnable();; [3 k8 C# y/ q K' z4 f7 i8 J
}
, ~" o* }$ F# A# J6 _8 @* O6 F2 }6 y0 P3 ^
/****************************************************************************/
4 ]# w8 Y% v( g4 j/* */1 ^$ x/ d1 P" K5 U3 g5 U
/* UART 初始化 */0 _" l6 l- L& l
/* */$ p& N5 p1 }* {1 L" D$ L6 |# h
/****************************************************************************/
. h4 _- V3 F6 [4 Xvoid UARTInit(void)
: V& W, J [! k3 \' h! G{! G2 A3 S% }* K2 e8 ?
// 配置 UART2 参数/ X% P: f$ y/ y
// 波特率 115200 数据位 8 停止位 1 无校验位
6 o1 X/ h+ \$ `2 `- N$ T UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 P+ E7 e3 X6 L+ ^ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. Z% s% m) o* g7 n9 N. l // 使能 UART2
( W J! r6 N, B; i ~6 d UARTEnable(SOC_UART_2_REGS);
) c1 A7 Q+ ?/ A* I/ S1 K, `/ t- q( N; E, W1 f! c5 d
// 使能接收 / 发送 FIFO& d0 O% G, q; q
UARTFIFOEnable(SOC_UART_2_REGS);
4 D% W3 ]! \5 E& m
3 N4 u3 o& C+ j& L2 I" V% X7 z* |/ g // 设置 FIFO 级别4 M0 H# i' \9 q: T$ f9 _9 D
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 I2 u8 P: F+ T2 `}
7 e* @% F, _* k, \% |# j9 f9 w/ z5 M5 c5 V* y: `/ t
/****************************************************************************/
% g# T T7 ]8 V8 b8 E/* */
/ o6 ?: [3 f% a' L e5 ]1 I& r/* UART 中断初始化 */# W- M* ]: h: T, `5 ~8 W
/* */
- b' A' A: C6 b( ]/****************************************************************************/2 y+ ]: m* g# k% t
void UARTInterruptInit(void), i& _, V6 X* a6 {, f# w( L
{
2 h1 q5 ~. x8 [8 ]( H0 T IntRegister(SYS_INT_UARTINT2, UARTIsr);8 U+ B {, j L* ]! i1 E5 P# x- j
IntChannelSet(SYS_INT_UARTINT2, 2);
' @& s' `0 j/ Y IntSystemEnable(SYS_INT_UARTINT2);
: p6 Q1 f3 [6 `0 ?- n2 V5 e3 s1 Y$ n" j5 R
// 使能中断7 c8 F7 Y) Z. a
unsigned int intFlags = 0;6 m x' @1 g- U
intFlags |= (UART_INT_LINE_STAT | \
. V& K) m/ \" |& @- e- y8 ?: | UART_INT_TX_EMPTY | \- l* Z* c/ k4 Q/ `. l
UART_INT_RXDATA_CTI);
7 N; V: v- t. M' K UARTIntEnable(SOC_UART_2_REGS, intFlags);2 h- Q. ?$ A2 z h/ U8 T
}
O$ g* W' {2 ^, |4 z) @5 k
" Q8 ~) e- c$ r( T# Q. T/****************************************************************************/
* f5 ]# |" I, E' [" b/* */
5 z- a \0 q9 _" x: I6 C/* UART 中断服务函数 */& G# z) o6 }- p6 @0 ^
/* */+ a2 `2 c% l. {! v$ l0 y
/****************************************************************************/
! i4 j0 {& T5 m4 v5 Ivoid UARTIsr()" ]0 n1 x4 @; X+ r
{4 v2 Q6 q& j6 q0 o
static unsigned int length = sizeof(txArray);+ ^$ I2 @: M+ S+ K6 @
static unsigned int count = 0;% K) T% a5 z8 P- J. g. T9 K7 v
unsigned char rxData = 0;0 f1 A* q" T+ v! v `, A4 D- [2 k
unsigned int int_id = 0;
3 H: @2 K" S9 [' h9 S" G1 m# _! a; F
// 确定中断源2 Q M# `3 P% l3 W. d/ ~$ h$ b) j
int_id = UARTIntStatus(SOC_UART_2_REGS);- ?1 P6 V' l% g$ d' E" W8 u
2 ~ k! h5 w Z/ J; W2 s
// 清除 UART2 系统中断) k6 D' V5 A0 {/ v8 H: E* x
IntSystemStatusClear(SYS_INT_UARTINT2);2 [" F' L' C1 j, V
; C% ?# E) A2 Q$ M1 K6 w5 ~
// 发送中断* p3 Y+ S6 \. f. w
if(UART_INTID_TX_EMPTY == int_id)
$ c! l% I. }2 e$ I# x9 d' ? {& h2 s8 D9 r9 o( n
if(0 < length)- Y9 u6 @' O! D4 a8 G; z0 E; `: D
{
: n! U/ `0 K7 [: R8 v1 x U1 l // 写一个字节到 THR
0 `" }. v- E J( V3 M8 `0 t UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);# e4 i' P: d0 X% H8 a8 q; f, f
length--; ?8 Q8 |# _6 l8 W" @( o# g
count++;0 F0 k1 N$ G/ C1 n# r$ [
}
i# C5 g) z; c5 Z% @1 ^7 _ if(0 == length)
9 y8 u7 ^3 M4 Z {% c8 X1 u. U! }6 O1 ~ z
// 禁用发送中断* A: Y4 A8 J/ O3 b! E5 n
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 X0 H) i# k( Z6 f
}
3 j9 b8 h. o# A3 I2 M }6 m. C7 K/ \% k% v7 \ W* L' w
5 p$ M8 A: T2 D' Y8 V // 接收中断" i: [# G* u# z) U
if(UART_INTID_RX_DATA == int_id)6 Q' O5 }* |! f* ?7 ~+ R) ?* z
{
# }# h+ i7 Q2 h' w& b9 _5 F* |8 L rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);5 Y) }: m9 ?: G6 p5 j9 }% A
4 J0 y; P) o/ h
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
0 g) |' E6 P6 \, |& A, l! W }
9 u& J3 k* @. l- [- L- O- t1 ^: i9 y: B; @
// 接收错误
4 e/ A# y4 `" { if(UART_INTID_RX_LINE_STAT == int_id)
: x6 S, V& b: p# m& \9 ^ {
5 N" E* T1 w7 K3 g while(UARTRxErrorGet(SOC_UART_2_REGS))7 t1 |; P# L y
{
) s) g1 \5 J( [. d // 从 RBR 读一个字节
- }; I ~4 k H: i, d6 `$ _ UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ Q! \4 ~- Q$ l) V) x1 f7 a! L, x }4 o( c8 S; i5 N4 s7 T4 j
}
8 q3 W& y) I: I 3 D" N' M/ u* f. q
return; w' b5 _( F: |+ G9 H* o
}3 ?( M5 T2 I# M% Y
|
|