|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。" Z, M8 a8 P# U! {
0 c. D" ^4 g1 s& Q& E#include "TL138.h" // 创龙 TL138 开发板相关声明! K- n6 R2 ~2 x+ F( }5 v9 H
0 _/ {. B7 t" ^* G; ~' l
#include "hw_types.h" // 宏命令
/ ]% f! c: `, d# m; l. Q/ s#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
& g o3 }8 G) ]" C#include "soc_OMAPL138.h" // OMAPL138 外设寄存器* h# p* n9 o/ O! f/ b) m# E& l# t
7 w3 i7 |, ~9 D& L; ^
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
+ n9 H" s& R7 Z8 `; H#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明+ z& I: K7 U' S7 Q/ H4 ?( f
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明4 C- |, O* P) s
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义% `8 _) t& F. n$ l4 B5 Z
$ }' M' }0 O. X4 i( b- X b& b/****************************************************************************/
# p: E0 [6 S. ^8 N. o3 y2 Z! u! ]/* */ I8 w) K% } P% s: S
/* 宏定义 */
7 T' R: [' {$ n! q( \& z/* */
6 P b4 I) v$ c2 ^3 z/****************************************************************************/
4 ~1 X# f6 r: `* Z$ @& ?// 时钟, ?3 X# V& D$ ?
#define SYSCLK_1_FREQ (456000000)
; @1 r) |" m* v, Q0 p% ]* G#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
, ]- M* p3 o, Y2 B" _#define UART_2_FREQ (SYSCLK_2_FREQ)
1 J2 E% f! t( f, m1 W) X( I. d. F' X
/****************************************************************************/
; Q6 E S- Z9 F ~- d- X" V/* */9 T8 Y3 B' U' B
/* 全局变量 */+ B6 c8 X I2 B8 D+ }- \! t4 u1 m
/* */
! Q& g0 D* }1 _. I/****************************************************************************/
* {- M2 y) B6 lchar txArray[] = "Tronlong UART2 Application......\n\r";( ~) n. m' }5 X! x
5 f' s% u, P0 c8 D
/****************************************************************************/; @, h- Y- ] r
/* */; v: h c+ H( R" T4 c/ K, @* G
/* 函数声明 */
$ f% O3 c; f' j8 F8 Z/* */' V* H8 x. b1 y4 ^: W
/****************************************************************************/
W4 o W$ {" ]( |, F( j: L8 \; g. j5 @// 外设使能配置
9 n. w4 |) Q' g+ O: O- M6 k$ Z% Tvoid PSCInit(void);4 B$ N! W% H3 z8 i* ?) |
" x) J; Y# N$ J. u! {2 N3 A% S// GPIO 管脚复用配置
5 v& S @/ [9 n" O/ ivoid GPIOBankPinMuxSet();. {5 k; ]/ r7 J' l1 u b" W1 ~
' y }. Y& \1 I8 ]
// UART 初始化
3 |9 A4 z1 c- V- S6 x. m# j, dvoid UARTInit(void);
/ A4 |2 P. R9 `* Z% @$ q d$ m+ _/ X// ARM 中断初始化
, J) e$ U% V9 V. V* y/ x+ Kvoid InterruptInit(void);3 @. L5 M/ y1 l! V" J0 Q/ ^6 p- p0 I
// UART 中断初始化
/ o; {" b6 ?/ X* \void UARTInterruptInit();
( b7 f. h, E6 {' l3 [" r// UART 中断服务函数
. G! b& y T# ~1 C+ ]# r A3 {void UARTIsr(void);
, \+ r y; J1 b+ c2 f
1 b, l: |! Z# [3 ?/ H4 J/****************************************************************************/
! r7 `; m. z; K' N2 s$ S* ]/* */% X6 C7 A3 N" U- C, O9 H
/* 主函数 */
" o; U# ~; w: N/* */) Z& y, a; T4 u
/****************************************************************************// v% _& G2 @ |1 E
int main(void)
8 d5 Z& c$ m K{9 S- g3 A1 i3 L. \
// 外设使能配置* Z! D H) R# }4 }
PSCInit();
+ L7 y7 s7 t: @& t ( z( }6 Y1 h1 {/ w, S
// GPIO 管脚复用配置6 o+ ]( w/ o& Z
GPIOBankPinMuxSet();
, S0 C7 A2 f3 s0 ^/ Z, |/ p
: [* M3 R" f/ g9 f1 l$ D6 u0 N // ARM 中断初始化
" P. Z6 H/ x: X ^) m& J6 U' U- f( Q InterruptInit();& V3 W7 l9 @7 d7 C* P. j" ]
3 C( S9 A% {. y. @1 s/ m // UART 初始化
* G `4 \0 w F2 g UARTInit();' E: K0 a! b5 |- `. z! X
^; c" G) |, k2 N; `8 c // UART 中断初始化2 |7 X% H g X5 Y
UARTInterruptInit();0 Y& B7 ?0 `* w0 ?# c9 e; t f
# m6 d* k. j5 I0 M/ u7 w% l% {( \
// 主循环
( p$ e* f8 o, }% x+ s1 s) H for(;;)
* X/ `' ^1 l. f2 D. q: ? {
! r4 O$ K4 M5 U/ @* _" V$ E/ h! e) s' T4 v9 x6 i
}# j, {, Z% _2 m+ C9 E% ~1 {
}
( O$ Y0 M" p* V# k
: ] Q5 u. G# @/ w/****************************************************************************/ r, X4 R& \6 u0 f! |1 F/ X
/* */1 n, z0 \1 T. ?; S6 e
/* PSC 初始化 */
+ G6 x. w4 n8 B) S/* */
9 j0 z& a5 I9 X& r/****************************************************************************/$ [7 g6 j' h' w$ d1 |
void PSCInit(void)% ]! j2 D) X; m: H6 d3 I
{7 R7 I& s) P. a% Y
// 对相应外设模块的使能也可以在 BootLoader 中完成: s, T7 Q" l R1 g, [8 a* E; e
// 使能 UART2 模块
; b7 p# r% a* o PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* ^3 @5 ?( c; S. N
}
% T3 F, R# f' x9 J: e7 k9 X' y5 @. j* y0 D. }% b$ t6 a
/****************************************************************************/
5 ]# w" E2 |3 X) i8 M+ X. d* v/* */" h! W: _3 [) r! |5 x7 G5 c
/* GPIO 管脚复用配置 */' B* ^# p; c3 X5 N/ G! Q
/* */
6 R) B) v6 c' D+ @' P/****************************************************************************/
. s4 s* H# T: x% \" G# l6 Tvoid GPIOBankPinMuxSet(void)8 I- o4 q1 k) j: C: h3 Z5 M
{
5 x1 q" q% b9 [1 y) J // UART2 禁用流控5 m- \, t0 i4 V8 }- E0 s
UARTPinMuxSetup(2, FALSE);, T1 \# b" l& @# e9 D9 a' {. b( _
}
7 W ^1 c c- ?% m3 l9 ?6 C! d9 c
, M6 H" S- Y) Q# C( u/ x/****************************************************************************/7 w0 X* ^9 E( U! c. G) X7 o y
/* */
* A, H. _! A: k4 C5 z% O8 B/* ARM 中断初始化 */+ N8 [2 A/ U+ K; m$ K& ?( J% H
/* */
- W0 y3 o) o& Q( A/****************************************************************************/9 l- h& l l. b& e8 q8 Z; e
void InterruptInit(void)3 H0 T7 R. G% L$ N4 D+ ^, a$ i
{
9 u( q+ e* r" n+ Y1 c1 ]9 { // 初始化 ARM 中断控制器
. F0 j, s* ` c, e, P IntAINTCInit();1 ^# v" s2 U- |- Z# E
( `8 t6 _2 K7 z$ Y // 使能 IRQ(CPSR)# G z( R/ j @7 Y6 N/ q: @; V
IntMasterIRQEnable();/ z. C* I+ C( l& p
9 e* c1 j! _" E* f8 [6 L
// 使能中断(AINTC GER)& b+ l4 m9 z2 G' T4 c& g3 y( y
IntGlobalEnable();
0 o! x8 _ \5 C3 ~+ g I% }4 {; h# |9 C, q( {
// 使能中断(AINTC HIER)/ G- O) U( i O1 }' W4 O5 a
IntIRQEnable();
* a2 B3 @6 Y& O" G' r1 W/ d$ L}4 i/ r7 R& \. z. J
8 u; s3 W7 U9 n- s8 g
/****************************************************************************/8 T; _, k7 B7 J' ]% I
/* */
6 z& r0 ~' v. r3 j/* UART 初始化 */2 _0 S# N5 j% D7 o% J) g' X/ s# [
/* */
. t2 j" O# R: l/****************************************************************************/3 @4 n# b e3 H& Q% B" J
void UARTInit(void)$ Y# e }: n* y
{! q6 d, F' ^2 m
// 配置 UART2 参数
" o7 }" p# _: S // 波特率 115200 数据位 8 停止位 1 无校验位
* n$ `; |+ O6 c8 y f- G9 Q UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
6 J9 T! ^* J0 M3 ` UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% T6 l7 n7 k! O7 Z- ?. G
// 使能 UART2! ^$ M ?$ k* M6 v0 D
UARTEnable(SOC_UART_2_REGS);; y# M) C' Y3 t
+ }* b% i; O1 I$ Q
// 使能接收 / 发送 FIFO, @7 i' g8 B: U2 {) {8 P3 C
UARTFIFOEnable(SOC_UART_2_REGS);1 B" ]* h2 H9 l- h6 E' ~% A9 G
/ y- w; H+ E( Z( s2 a // 设置 FIFO 级别
n F( R7 c+ J0 W$ |# u8 V0 N3 X+ [ UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
- C" w8 |! U( A Z4 r}! Y) X% W N5 A; g
1 u4 h9 f4 r% e* T8 l' y& H+ C3 U/****************************************************************************/, ]7 J, t( I+ `- A, V
/* */ g, l$ `& J' W4 ?7 B$ R) ]
/* UART 中断初始化 */, r8 w3 h5 \: w9 L9 d
/* *// [( H1 T) C4 ^% R
/****************************************************************************/
! j) D% u, a5 xvoid UARTInterruptInit(void)6 K% b* e9 W: x. ^* x7 R6 w1 D
{" A* y/ _) {! T0 K! _
IntRegister(SYS_INT_UARTINT2, UARTIsr);& \8 B! d' I, W. k
IntChannelSet(SYS_INT_UARTINT2, 2);: P; z) {# r2 D) Y8 ^9 X( W
IntSystemEnable(SYS_INT_UARTINT2);# W0 u* S" E X# f& s* _
- _" @' D$ ]' B @2 k0 Y' t/ S( s // 使能中断( [. l+ t/ j( t8 L1 V8 r7 `
unsigned int intFlags = 0;
0 p) w' P+ G* l% N9 M intFlags |= (UART_INT_LINE_STAT | \. j$ g; d* i8 }% E$ ~
UART_INT_TX_EMPTY | \5 e/ e* f" e- y
UART_INT_RXDATA_CTI);: D- c: D- q7 h( N, s
UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ E& t/ H2 j$ `/ z% a}1 H. X- q4 @& H
7 x9 y* O/ e f) G9 {' F' d
/****************************************************************************/: c6 `6 d$ v1 z
/* */
$ j( @. S; }/ Y9 B8 Z: X4 N& Q' d( X1 j/* UART 中断服务函数 */& M# D M# S2 p a% y* t) ^) }6 g
/* */
) x; l$ K2 ?! L0 c1 D. H' {4 j/****************************************************************************/7 ?% d0 N1 x) f; C/ E# M" H
void UARTIsr()
: w9 r$ ^# u8 G2 }{. Y& P, x/ z* p* M/ S+ a# Y" P
static unsigned int length = sizeof(txArray);
3 e0 i, _8 w5 W+ z3 r0 e static unsigned int count = 0;
, i5 J7 y; d; D, q+ } unsigned char rxData = 0;
2 O3 m: n# z" m1 R ? ] unsigned int int_id = 0;
6 H- U! o6 S2 _$ ~" C9 _1 G4 J* J% k& J/ j8 `
// 确定中断源+ A1 a6 |$ [# U& L
int_id = UARTIntStatus(SOC_UART_2_REGS);
1 P" u3 g" K) A- Z, r, Z) d
* [+ a3 d! n7 v' M& {3 y4 J // 清除 UART2 系统中断1 C) b1 U2 u; f6 C" U/ X% x ^
IntSystemStatusClear(SYS_INT_UARTINT2);4 {+ J. ?; S+ p! C) o. H
) f, d* ` T4 Q2 a5 {; o, w
// 发送中断2 i3 Q, p. U% Q# }! b) ]
if(UART_INTID_TX_EMPTY == int_id)+ W, S" e) F. R# J
{) o- x, y8 P* r
if(0 < length)% ]8 N- Y! g0 A, B8 D
{$ `- U1 K- H2 p& A& d/ z [
// 写一个字节到 THR- m" I, X8 G( y E* O5 X
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);2 i. g% P7 _- M! e
length--;
9 [8 J. {2 e- ? count++;6 A" K5 c/ I0 r/ y, P- e
}# \3 K! ]- y( B3 _
if(0 == length)
$ @% E$ S( z" U: M* w1 ] {
/ k, I! C z9 a, B3 W& E // 禁用发送中断& ? O! T4 f/ p' C+ H
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);; v+ j7 \ U3 c! Q
}! B% G y1 r& P C
}
; S9 c: O% E2 I7 Y: B5 ?" G3 s4 g+ O3 B! R; U/ e% F% Y
// 接收中断. w8 I3 N; [$ r8 M
if(UART_INTID_RX_DATA == int_id)
- B4 Z+ S' ~" j {# P: L) o4 b4 q/ m, ?5 p
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( o& Y. y7 n1 f$ N" D, Y
0 o( c9 C& j9 q1 ]" L UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
. A- d/ k- c5 B }! d* ?/ G8 D6 L' B1 ^) ]
2 C. X* J( w. y' d" G- f
// 接收错误9 x0 y- k; {& s
if(UART_INTID_RX_LINE_STAT == int_id)
/ `3 r2 A+ x8 U" ? {
5 l2 _ v3 _* |% P0 {' q while(UARTRxErrorGet(SOC_UART_2_REGS))9 d! d* ]$ Z4 ~
{ n" E4 C$ G& j7 Z5 m$ a
// 从 RBR 读一个字节
& E; ~, `& x& @( s3 G UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 Z5 o7 h* F: E$ M4 E( t( D }: X1 Z1 }0 j7 V' c* g* X3 N
}
2 k. S+ `8 \0 m9 O) M& {; S/ F 6 q' r0 N- Y1 g! ]8 y* l0 T# n
return;
2 L' }5 a( \4 V' Z}
4 t1 V" s9 G3 S9 U |
|