|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。; |+ B' r; D( j5 s6 y. Y
) S4 N5 v. I* \3 t/ _#include "TL138.h" // 创龙 TL138 开发板相关声明
r- Y; H: R. G$ H. c6 `9 u% }" K5 w7 r4 _, V$ _* l3 [% n+ \% s
#include "hw_types.h" // 宏命令
- i/ W6 q F6 \8 H/ l2 N: ]#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器$ S! F! h2 x% d, r* V P6 `. r: A
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
- I' r0 f! B8 b' A6 ^1 ~8 ]
7 r- s% W |; h2 }- _#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明. d# e/ A0 [" K% h' N; ^" H0 e
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明% O" J* u# r) M- ^) s
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明/ N0 ^; w; j; f
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 {0 U6 s3 X. ]- u8 Q- O I1 p% y7 y" n7 e( a) U
/****************************************************************************/! r( @- V; g5 w3 }6 r. b7 j
/* */' H O0 A4 n& i0 _1 ?
/* 宏定义 */
+ Q, S+ V7 M" J! B/ F w! \/* */7 l e# w8 b. l) G `
/****************************************************************************/7 g+ x8 V6 [/ l p1 {& }: h
// 时钟2 f' ^& @3 }0 V9 g0 u4 W+ f
#define SYSCLK_1_FREQ (456000000)
/ A, Z! q& R5 y/ y. m9 K#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)) [/ I8 ^6 c5 b( \: e0 k5 b, N
#define UART_2_FREQ (SYSCLK_2_FREQ)
: P& {6 h; A( E$ {) q/ p5 a- r8 I( M7 L( m
/****************************************************************************/
3 S, Q4 ?/ q* T e, S8 q5 Q/* */
. K# i" F, z& |' o0 h/* 全局变量 */
v+ T9 v7 C f* b0 F; J) Q/* */( H1 F4 S/ |7 S* H' F9 e
/****************************************************************************/
! @& l& o8 \- n% j2 ]( z" b( v$ ochar txArray[] = "Tronlong UART2 Application......\n\r";+ V& [$ j4 @; q% o, f4 N
- @2 n& y( J& ~/****************************************************************************/
& E8 D; q$ V/ ^+ b2 l/* */
1 S% w; K1 }8 m7 y8 \# k3 i/* 函数声明 */# Q: T. Y& {( J9 j6 t; ]
/* */, ^8 j: {1 K" r" G3 _! r0 a
/****************************************************************************/
" b& S! x2 j: r- Y( S' a4 r// 外设使能配置 Q8 b+ \; F2 D4 }9 i
void PSCInit(void);
* \, ~0 I1 o( \" f! P% x' ~ p3 X+ r" T, A) {$ `
// GPIO 管脚复用配置+ D4 J& b9 [- k4 m5 V3 S# b
void GPIOBankPinMuxSet();
2 G+ k7 k( x. l- i- |' k
# {8 u; ~% u5 C# K// UART 初始化
2 S' x/ \ C' }; ]/ c) ^- Hvoid UARTInit(void);
+ `$ g+ g+ X4 \# L; J// ARM 中断初始化
) Y* E; V! a# J6 z* V- I! P) i) Dvoid InterruptInit(void);
% y- T' W1 t5 ?+ E8 d* i$ j% g7 E// UART 中断初始化6 u& j4 H# B! V$ ^ x ^* V* d# t" J
void UARTInterruptInit();
% _7 I o, d, \5 ^& }; E// UART 中断服务函数
( F! R2 i0 B( x0 b+ p5 }6 U% gvoid UARTIsr(void);
7 }' Z1 ?$ e; `1 J/ i o* J5 O, d* R" t2 Q: ` M7 O
/****************************************************************************/6 E* m8 S P2 u4 i# N% d
/* */
6 ], f. N2 X* S. U. M4 _* f- E/* 主函数 */
3 p6 w/ L+ Z5 i/* */
9 z. U, ^8 ^) }8 A5 H7 Z; H) F n/****************************************************************************/7 H! o2 }4 ^- L' Q) q, y
int main(void)9 p. P) \: Y3 P. B. t
{5 ] `. D5 D2 `! p: t
// 外设使能配置
, }4 a* O5 T, R( O' @: S# n% _ PSCInit();
6 w; a0 S! N; ?8 S0 i! q- P0 B $ P1 h; C0 y2 s- n
// GPIO 管脚复用配置9 ^; s! |9 \: n* J% C% U3 y
GPIOBankPinMuxSet();
* ^' z9 f$ h( ]8 ]7 W+ R7 L3 ?* t4 @ J$ U6 J9 z3 p. h8 d
// ARM 中断初始化
5 f/ C! N- Y4 o$ z. S7 e InterruptInit();
* I7 t$ X& Y; |/ w; x& D, x1 {; u
4 @0 b' c& {# V- M // UART 初始化- `) @+ p1 c% D. U% I% o
UARTInit();8 ^! W/ P+ p7 \" s# @: U. F$ t' i
) l9 X3 j7 V5 _3 I, K
// UART 中断初始化7 ?; x4 Q' ]8 k* b
UARTInterruptInit();
8 `& s, l1 t; \- u7 \- M0 c$ d, M5 ?* ], b2 r V6 v7 t. V
// 主循环
9 g' K7 R' H4 [ for(;;)4 r; @5 N/ {4 _* L% `8 ?2 u
{1 H [9 }0 [4 Y, \. J
" q+ H9 C6 U+ m8 l3 K4 i
}
d& @- C6 \; i+ |0 _+ s* W" o}/ B$ h' W) l4 t
; X7 p8 ~! H) O
/****************************************************************************/
% U. @2 L" G/ W; j% V/* */
- [: r; c4 Y( X3 x! V, ?9 X/* PSC 初始化 */
( K1 w/ S' x! l' \ G+ Y2 e5 i' ]/* */
d# k3 k& K: F/****************************************************************************/- Q% x, Y }3 Y2 z& C0 x% g* s y" o
void PSCInit(void)9 ?% j$ b i& X/ ~$ X! O( [
{
; s3 ]- f. J4 Q2 c& `9 d# ` // 对相应外设模块的使能也可以在 BootLoader 中完成: v1 f! [. k0 O* A0 `1 l6 Z7 N d
// 使能 UART2 模块' S8 D" w1 B5 n3 t$ s2 ?; G2 ^+ d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);+ y) A$ X' i4 M# ?
}9 R$ ?/ R+ Q0 J9 v. j M
6 V; P' [5 H8 _8 P4 M
/****************************************************************************/
) W: o9 Q& C6 w F! d+ j% T! E; ^/* */( I/ d0 q' [; ?( V
/* GPIO 管脚复用配置 */
$ J! e0 `; A! e% P1 y9 T2 y- l/* */
4 J; ]& |0 e x! M0 H: H+ s/****************************************************************************/; R7 L4 s8 B$ D4 N
void GPIOBankPinMuxSet(void)" U) u% G2 e7 A* y. X4 Z
{8 A3 j, K$ w1 k! Y" M3 R( }
// UART2 禁用流控! n8 e; Y( V5 |5 z
UARTPinMuxSetup(2, FALSE);
# J' _4 B4 Y' Y9 l- h}9 x6 j9 [5 z! N- s
' g4 E, ^" V: i9 b
/****************************************************************************/
2 O: O1 r, e/ W6 U" P3 _) v/* */1 n* p. n, r4 Q* j& F
/* ARM 中断初始化 */
) d7 J9 O/ ^ y- r/* */
5 R5 |! p1 Q& }! k, Z- W/****************************************************************************/
' r# \" M L- D( v% p9 pvoid InterruptInit(void)- s3 S" j, }0 {% [
{! y( F3 K: g! @3 Z1 H
// 初始化 ARM 中断控制器
" w+ P" N+ _( B+ z# I2 A7 a9 o IntAINTCInit();5 Q) I1 ^) X3 O0 D( K l1 K
9 T% _9 S+ R! Q' u; e: Y // 使能 IRQ(CPSR)
% ~1 p0 X: r. C& H IntMasterIRQEnable();
) t4 b9 H. }& f$ ?! o& e& V: A3 i: Q: f1 Z- p. E) D
// 使能中断(AINTC GER)
- j* ^8 R* O% f: a4 F8 j IntGlobalEnable();
7 h9 i" D0 |2 J( L% f3 [3 G
' L |1 d# ?. [+ R- f7 ? // 使能中断(AINTC HIER)( V9 y3 ?( |' q) {/ k9 [
IntIRQEnable();
1 k8 L8 z4 z3 e# X8 h/ k n r' _}
/ X5 M0 s% |5 H. ^; |& c- C- w/ R' B' T+ a: @ {
/****************************************************************************/
) W& W. [ V* H/* */# m3 X1 {; _2 P7 Z7 N+ { a
/* UART 初始化 */; D# e' ], Q( u8 Z
/* */
- u( M! n) h g9 ]% [/****************************************************************************/
5 M4 _1 H- n1 mvoid UARTInit(void)% n$ i7 N; ~' h
{7 o, L+ \3 |& f. J, ?+ p, F
// 配置 UART2 参数
* b1 ^0 [6 z% h. }( u+ H // 波特率 115200 数据位 8 停止位 1 无校验位) b4 E6 O+ } v+ r' @
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
, `- d# k. N+ \/ f UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 I( ~$ T, | x, m4 x% e# _; P // 使能 UART2
; y4 o" O+ w8 Y3 R UARTEnable(SOC_UART_2_REGS);- Z2 _% o3 Z/ m: k4 u. i8 `; t2 p
( Q# e9 F* w1 ~ u // 使能接收 / 发送 FIFO
+ W/ Y* s' t+ O) O C UARTFIFOEnable(SOC_UART_2_REGS);
+ c- \5 m% b/ M4 l
8 Y9 L4 {* G6 E/ c0 U // 设置 FIFO 级别
0 q, v1 h) k8 _5 [) Z- t1 p' B UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 b5 L- d# {3 M8 t! ?# T) y} c- _- K/ A5 R5 P9 O9 D/ w4 a+ u
7 d6 J- ~6 K4 [# d/****************************************************************************/
; o/ P8 x# F8 ~, n! ?$ }/* */
* j. e% } ?& w% _8 {! T/ P5 H% Z/* UART 中断初始化 */- F, s7 {( i; k5 _
/* */+ W0 G; Z7 w. Z7 a& f# y
/****************************************************************************/3 ]' [2 X6 j' q: m2 q, e
void UARTInterruptInit(void)* u9 e4 w* T" y7 p7 n- b
{0 R3 p2 h: e7 P+ \$ B
IntRegister(SYS_INT_UARTINT2, UARTIsr);
: u, F4 e0 c4 l% o3 y4 p* b IntChannelSet(SYS_INT_UARTINT2, 2);* H( S. ~& o% u, L
IntSystemEnable(SYS_INT_UARTINT2);2 r2 y" z2 W6 D' E( x! D. L
7 a9 _9 C/ C( k- Y0 n5 c // 使能中断
3 G* Q& e9 b m unsigned int intFlags = 0;' Q d* S7 T9 u9 ?; B& s& \2 T( z# r
intFlags |= (UART_INT_LINE_STAT | \' D+ g/ w" A! n7 L9 U# r! j
UART_INT_TX_EMPTY | \: ?+ J+ S# J5 R% [) b1 |- q+ t
UART_INT_RXDATA_CTI);3 ]' J$ f- Y$ C- `
UARTIntEnable(SOC_UART_2_REGS, intFlags);
- m! D* A/ g8 S, O+ V}2 {; K9 N* ], G4 Z0 @
" X1 ]# g7 `. F) T/****************************************************************************/* ?+ j4 B5 p, ` N
/* */; G$ f; Y9 ` X9 T
/* UART 中断服务函数 */, E3 s' |4 G F9 E |! O
/* */
. u0 B7 n r4 f; B/****************************************************************************/" n5 o. F% }4 E% J* L7 V& f
void UARTIsr()
7 I5 B: f5 X9 N: i4 H2 Y{
. k5 f: ?4 d0 K( `: t! D y# g static unsigned int length = sizeof(txArray);
$ Y/ F K. k' R7 r. M3 ^ static unsigned int count = 0;8 A0 p! H% Z7 o
unsigned char rxData = 0;6 V6 R: S8 ^( z) b; a
unsigned int int_id = 0;4 ]# ?' s2 } ]0 o
) x- q- @% p, G* G, Z // 确定中断源9 m$ B; G( J7 p: M4 g
int_id = UARTIntStatus(SOC_UART_2_REGS);
# H0 h, R! ~5 X" `
- u5 V' }6 z7 i$ m9 [! j // 清除 UART2 系统中断
4 Z) d9 K6 \; q0 D IntSystemStatusClear(SYS_INT_UARTINT2);1 t1 R/ f- `0 y( Q4 D
/ B0 A( p$ F. x0 ?
// 发送中断
" L, P& [* C5 {! B# E, M" `; n0 o if(UART_INTID_TX_EMPTY == int_id)
" ^6 E. E( t P9 h3 V; `0 x" w {
, F t! ?4 J# [! n2 U* q. m8 n if(0 < length), N% W/ `7 q z8 W) ?3 O* e
{
6 r3 x ?: a& s2 \ // 写一个字节到 THR
5 E Y. v/ h9 n) x2 V UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( G. Q* j9 \4 l length--;
- `% R2 t9 N& A0 [" z count++;/ g/ z9 u1 E# {& M! d; t. u. p
}
, L) G6 Z! X4 `4 @1 { if(0 == length)/ w& i) K* [. @! E' r; o
{
% T* W( V3 N% S- O // 禁用发送中断
8 ~0 q+ \& U8 U8 x3 w8 Z4 G5 K UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 Y( T1 l/ S# ~. F
}
- D% e3 V1 \' w# \ }
% U# K5 h% R. B- Z- d9 K5 a; f I4 T
5 u- {, _+ {1 l // 接收中断& p3 ]; z/ y0 ] j: b5 Q+ l9 O
if(UART_INTID_RX_DATA == int_id)
l# x" G! C3 W. U0 {! G# ^ {
4 ?8 P! N0 x( r' Z, d$ v. j rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( d( f6 q7 U) f' _. o
[3 f: Q) v& D) o UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
" l6 n% ]+ I0 c W }7 D0 \, @ L9 n% ~( ^% s
: q0 o1 F& c3 y9 h4 q // 接收错误
( H4 D* z! o0 g+ n0 B1 f+ _4 |# c, W if(UART_INTID_RX_LINE_STAT == int_id)
! C& H% I, G2 b+ m+ V {' b4 M! H9 {3 {5 Q" n5 [
while(UARTRxErrorGet(SOC_UART_2_REGS))
7 Q6 H; M6 s$ z {) k+ \) D( J; P' R9 D& O4 d A
// 从 RBR 读一个字节
2 b6 C+ Z2 T) b6 ~5 ^ UARTCharGetNonBlocking(SOC_UART_2_REGS);8 |% x/ P: r) k1 I2 {+ ?7 \
}
/ b. T+ B% i0 x" V6 y- B( a5 g- R }
+ _4 Z, o8 e# i9 e9 I
+ r3 ~) e5 o6 O, O1 h8 j return;" O0 m! |1 {1 G* o, Y
}( {6 j0 o/ i5 y
|
|