|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ K/ q$ Q4 N; A+ K
N9 t$ k L# E0 f5 V7 M- f#include "TL138.h" // 创龙 TL138 开发板相关声明
# Y k t; o9 R. @& ?# I/ O2 R5 y9 C$ f' E7 \) H* N4 o3 s
#include "hw_types.h" // 宏命令
: x0 z3 T4 B4 J2 `7 A/ R/ f- n& O#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
2 C) P6 T( N9 w3 P1 \ k% R#include "soc_OMAPL138.h" // OMAPL138 外设寄存器* `& V8 _" ]: D( y1 d
5 o% X' C: _. U3 I! L#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
/ R5 R! K, _( P- y+ w) J* @2 O#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
% g5 B7 m2 e) K* |. {#include "uart.h" // 通用异步串口宏及设备抽象层函数声明 `0 c) k! n% f- r" g
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义# N h3 o, c! i T, h9 M+ Z' n
3 K- D$ l$ ?; m0 n ~ b
/****************************************************************************/
. y4 F( J8 _& j8 F1 l/* */7 {: z4 p5 i5 k% m0 o+ W# N
/* 宏定义 */3 e- ]$ h! N) n6 [' }/ q
/* */
' f5 @* R# |+ m: [/ r; _( K/****************************************************************************/
! d, e$ B4 a: R( d// 时钟
d r1 r" F Q9 `. |" E#define SYSCLK_1_FREQ (456000000)
( G; J6 J& |6 Q7 c- a#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
' m: n, X2 Y! Z3 i7 A#define UART_2_FREQ (SYSCLK_2_FREQ)
* Q& L% l/ m# e9 B9 ?/ S4 h k" F2 I
/****************************************************************************/
* ~ x5 V( X0 W/ w+ j/ S/ S' k/* */6 y' w) n% {0 v: A8 \) i2 u
/* 全局变量 */ i( s2 L) z! p5 p; P. k, I
/* */3 U5 B1 D, n% S6 J6 d$ |; x5 O
/****************************************************************************/
+ M6 \ D5 d) j2 `. ochar txArray[] = "Tronlong UART2 Application......\n\r"; j7 B# J4 z# Q3 }/ O
, D3 G- i! U7 M& [
/****************************************************************************/
. a% g6 T# `8 @" V+ m; x/* */
" E; f( H: w! |8 d A% B+ d! W/* 函数声明 */
/ a9 C" _1 R5 u5 w+ F/* */7 q9 C0 u( I# c% b6 T6 _
/****************************************************************************/
9 J$ R. u( _7 Q' ~3 h0 z// 外设使能配置; [/ U, C8 ~& o( V
void PSCInit(void);
) q: Z; r; E. C# J" e9 U
; T' L/ v$ w( O// GPIO 管脚复用配置
1 x/ U/ O7 n- ~void GPIOBankPinMuxSet();
4 L' J6 V* A2 G. f0 f% `, a5 U/ u6 G
// UART 初始化
) S0 ]0 L7 B) hvoid UARTInit(void);) x! K2 u0 o5 O L# _2 w, H- A6 D% h
// ARM 中断初始化
% Y' c4 g# T+ H$ m( g! r {void InterruptInit(void);8 B& c7 p1 g* x. H2 ^: Q4 P! s* s
// UART 中断初始化
7 l0 b4 Y9 F4 \9 z# P) m; Z6 y. Rvoid UARTInterruptInit();1 P$ b% N# {2 x' F( \
// UART 中断服务函数
1 C2 G$ N; r. k6 Y4 X; D8 ivoid UARTIsr(void);# _) _' q5 O3 \. F3 ^/ q3 j/ e
" H, A( v* Q- P* b9 ?/****************************************************************************/
5 K( m7 i+ i% G8 z/* */
( p; t8 }* d6 m" B. E K/ q" a/* 主函数 */0 L( s5 Y6 ?, Y& X
/* */
; t( X' ~8 R5 C. p/****************************************************************************/6 U. _* q3 s z! _: r Y" l
int main(void)% o6 k! `: V, P- J
{4 C3 Y. `5 V; _! r: A
// 外设使能配置; N/ i7 R; J0 ?; U
PSCInit();! R- F2 J6 Q1 ~* N( B! x Y+ d; b
# @$ x, M% T0 J9 L' b // GPIO 管脚复用配置
8 o5 j: s7 h# u! Y/ E GPIOBankPinMuxSet();
6 C) o( e8 r9 B0 R q" q
* Y& o+ u. K) j! b' D* a // ARM 中断初始化& L3 x9 d A1 Z/ b6 V r0 `! y
InterruptInit();
' G/ r0 }$ S: i' ~0 ?9 F" M) X$ h5 v3 H5 R0 l: f& Q: k
// UART 初始化
q" s8 D+ b1 w6 i, k/ U6 S, V; S, b, G) @ UARTInit();
L5 z5 w/ t! o+ W: z+ A
# x# K: `; w, ]" n5 Q // UART 中断初始化7 y4 b0 @3 i1 _6 E, q
UARTInterruptInit();
4 y: Q4 K& V& P6 _ n+ P* x$ C7 v" W, y6 ~5 N
// 主循环5 \3 ?2 B$ @' N* ?& Y$ ?3 x
for(;;)
5 g7 M; S1 m( Y M& H2 T {+ _7 D* N5 r( M; \" K- ~4 m
( H# X0 a. ~. l
}: X0 e6 {# L+ i* k- W$ q9 z$ h& e& X
}
7 Q: d" c5 T! b. C1 G- {5 q7 u9 Q8 S) t! t/ f
/****************************************************************************/: e2 ~0 r6 l! M* ?0 X/ w
/* */$ ^8 _* O. \+ I1 H5 I: c( X! [1 n! s
/* PSC 初始化 */) N( ]* ~9 n) B) g& M
/* */
2 Q ]( I T$ f K/****************************************************************************/
0 m5 b$ t, b2 m$ r* T" hvoid PSCInit(void)
6 K6 t6 b9 f8 w0 l{
' a b- S$ I8 o. C // 对相应外设模块的使能也可以在 BootLoader 中完成# {, Z: E( L, Z8 }7 @% ]
// 使能 UART2 模块
+ J/ @* H; H. {+ @- b; Z& y PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 `" ^% y; q, A9 k, M% c2 u# Q; P
}
& W- `5 s) u* S! F( Z5 P5 h2 c
/ E, y j$ q' d/****************************************************************************/
( R' ]5 R0 R$ J! M$ C, h/* */8 E$ `/ |; p5 T( P4 J0 O
/* GPIO 管脚复用配置 */
$ I0 [3 g7 Q6 d8 [- }3 M/* */
% L$ W. }% Q% q0 ~& i7 x/****************************************************************************/
+ N9 s. I3 e% nvoid GPIOBankPinMuxSet(void)
; s" Z2 ?3 f# R+ z{
% E1 ?/ e; y* | l- T // UART2 禁用流控8 @& g j! d8 I" P' L, N
UARTPinMuxSetup(2, FALSE);( `. \: h! {) O4 W- \
}1 e6 k- F6 D$ U* T" L
# A& \1 l* W7 R& v
/****************************************************************************/9 x# M* w/ S! W, N, W# m
/* */
. _( R4 B' m: }- V/* ARM 中断初始化 */2 o8 K* _+ o; B" p7 A, b; N u
/* */' }$ V/ h: q$ ?1 k5 r/ G5 b
/****************************************************************************/$ r2 e; k A$ U: T$ n
void InterruptInit(void)
. U. R2 h9 v6 v/ ], v{
" }* b1 n% C1 G" b // 初始化 ARM 中断控制器0 n0 [7 c; U/ C" Z! u( N
IntAINTCInit();+ e# Q' m% k e. U+ w
, Z/ P) P) A) V& k" `4 Y
// 使能 IRQ(CPSR)
" Q) Y, w+ M7 x- G$ p$ l: g IntMasterIRQEnable();3 h& x2 K& \8 w: j3 R+ V4 t
& `" M, C0 P+ f // 使能中断(AINTC GER)
s# N9 W# W& F" u; }" B4 c IntGlobalEnable();
- H; S3 I& }' B/ Q0 E2 t" L1 W& o! d" i s" g' W
// 使能中断(AINTC HIER)$ H( m7 i/ J- F# Z4 l e
IntIRQEnable();
2 m8 S9 Z6 M! r: ~0 Y3 T1 H* Y}
F* ]! ^, n4 N
6 L& M# b5 J7 r3 v& U |& k: X/****************************************************************************/4 |. G' K1 v# d, V3 N
/* */6 Z. V! G/ Z; ^( i9 o+ V+ G
/* UART 初始化 */
6 A/ G H j* j( R/* */6 F# V& R2 Z& Y% F/ N/ g1 J+ W- {
/****************************************************************************/4 ~3 ~3 C8 i' B/ l
void UARTInit(void)
, c: [9 O) E& v' G" p{: w( w4 h: v' V( t! i0 i
// 配置 UART2 参数
) k, Y5 j8 B3 z // 波特率 115200 数据位 8 停止位 1 无校验位
) u) [& m1 n* V: i G5 o UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,6 v' K' R2 b+ T1 p0 a" J
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 }9 @5 h4 Z- t9 K7 }1 V" j // 使能 UART26 S1 ?: R/ Z0 t8 v$ _7 |# [
UARTEnable(SOC_UART_2_REGS);" h7 p" E8 P7 B" U4 i: |! e& p
" L) n, @4 w) k% ^) U3 w5 s: X
// 使能接收 / 发送 FIFO6 y P) N) P, \$ W
UARTFIFOEnable(SOC_UART_2_REGS);
8 ]$ D1 ?; q/ t! d' t% s
8 Z, x* Q7 [. T3 j* | // 设置 FIFO 级别. S) a4 q; s" O! L9 J. b, X
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
2 b# ?9 [* Q. [# y2 \5 n( p/ u}) _' C. U1 a3 @
" ?4 V/ W% O1 {/****************************************************************************/
0 e6 ]9 t& a0 y( w/* */
1 Z+ B. @% R1 ?- |3 C4 X/* UART 中断初始化 */
$ K' Q2 t% K3 Z% \/* */
. L# O; g$ `- v. E' [+ E+ d/****************************************************************************/- b: t9 z3 t, J* \! Y' B! T+ T5 h
void UARTInterruptInit(void)6 n) y t# F9 ^! @: G9 U
{
% h3 |$ ^8 b, ~7 ~. m; u IntRegister(SYS_INT_UARTINT2, UARTIsr);
, y" q0 k/ }& b3 c1 V IntChannelSet(SYS_INT_UARTINT2, 2);
, I; a. h% e. H; Z9 v IntSystemEnable(SYS_INT_UARTINT2);
/ ~: q- N4 ~- J, P4 S
2 X' ^* O/ g5 m: T. ]1 C8 U // 使能中断
o. a( {* z' P$ f! Y) f unsigned int intFlags = 0;
' `! Q9 T' D: ] S; i intFlags |= (UART_INT_LINE_STAT | \
/ {: P. }2 j6 V/ A! `5 X+ _ UART_INT_TX_EMPTY | \' ^" r2 p* M$ x- y7 u( e+ {9 q6 V
UART_INT_RXDATA_CTI);
$ O, R' n, a/ e& K# A( W UARTIntEnable(SOC_UART_2_REGS, intFlags);
( ~4 x- O h: [) Z `}
6 l/ N+ `" R8 p' T: F( @) M, X# E+ j' f, B6 K+ f# Q- C' x
/****************************************************************************/' R! \- W7 {: t, e/ H9 A
/* */+ l% }) E$ x7 `2 a- n, u3 E
/* UART 中断服务函数 */5 ?1 m2 }( {( W0 ^4 E. k/ J7 t
/* */, b8 g2 e. W( U& P
/****************************************************************************/
" b- a5 u, ~, Q. C6 ^void UARTIsr()$ `5 w- m- {" H
{ H) @+ H1 A; Y/ |$ N2 c6 u
static unsigned int length = sizeof(txArray);, N9 W6 }/ \7 q2 b
static unsigned int count = 0;
7 e/ b* l4 n7 d1 Z. ^' u2 a6 b unsigned char rxData = 0;1 F) |( Q. C5 j( p9 q1 w6 l' Y
unsigned int int_id = 0;
2 I+ c( ~0 a, I" V8 ~; @, B7 M: \4 z5 A# p. |
// 确定中断源
3 ?7 [9 j2 }1 t7 @, g& \% T int_id = UARTIntStatus(SOC_UART_2_REGS);
4 z+ u: d5 I) D# e4 W% _% Y7 B
9 U0 _* D4 I" V) Y" r+ Z. Q; H* l // 清除 UART2 系统中断
; R/ L2 Q7 T$ H9 d" A/ b8 L5 A IntSystemStatusClear(SYS_INT_UARTINT2);
$ s! K$ P. r/ r L) S, o- [( E+ Z+ j9 c5 ~3 T$ U
// 发送中断8 W6 W# V5 ]& Q$ Y7 o, Y
if(UART_INTID_TX_EMPTY == int_id)
* P9 V% k% }: U {
) |0 t, H+ _- J2 f' s! x V9 @/ u if(0 < length)
( b8 F! p, x) w' m2 Y) M {
u9 b4 I. _+ h' X1 {6 D3 Z+ N // 写一个字节到 THR
8 D/ x) V$ I$ _- A* [ {% y UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! Y$ F+ A9 \% }& L! m/ n9 v length--;
& c& {* m2 N t, Y* @- q/ d, W count++;
8 p( S" ]+ |# `5 o }
* [8 A9 i$ F& v" h. w if(0 == length)/ ?. g! N G% U, d' C* }
{
; W4 R' D6 r$ \. w' ^) k // 禁用发送中断
! g* b- M5 m% u ]+ w5 I UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);1 F- P+ M) n. q9 \
}& c0 K& a9 q0 k8 s1 L
}( E$ e7 x, ]# c( k) n0 r; B V/ B( _
2 K$ O' A" ]( j* G+ } J1 {2 G
// 接收中断
/ x; Y6 P+ g8 X% P! g1 D if(UART_INTID_RX_DATA == int_id)
# z' [9 D4 c: ~1 T2 \* ] {
* t+ F0 q* g2 |& m$ \/ H2 W rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* s+ `4 A; f/ i0 |$ ~: v& s
, b7 V2 d4 H4 l- _4 ` UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
0 [% F, s# \& t6 { }
/ V) A8 q5 H, Q3 ?9 f/ d4 B4 o% O; P9 C; e
// 接收错误
3 i5 t$ n: @, k: ` I3 w if(UART_INTID_RX_LINE_STAT == int_id)
& J, H$ u$ a7 S; S8 _ {* g* }# {- Q% M) h$ p
while(UARTRxErrorGet(SOC_UART_2_REGS)) T% ^, d' h1 Q, u1 K
{
4 f! { S) g) [/ ^ // 从 RBR 读一个字节( F, {5 W5 `) l" y$ f& s y# J, s
UARTCharGetNonBlocking(SOC_UART_2_REGS);
; Y1 D% x" ~( k4 E }
( L( h: r( s5 G) h2 B: k }
, ~1 ^+ }: \! k# V6 K+ b+ S 1 `, ?/ N2 p6 F H% w2 C
return;
+ a! w* u; j( ?1 r}
H: Z3 r# i7 y. l. ?) y- ]% E1 a |
|