|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: W! z1 N1 Y" s( I, Q! `
4 J/ ~/ ]7 G. C" z ^% Y! D' p: p#include "TL138.h" // 创龙 TL138 开发板相关声明- V- K* B( y9 p: F4 x" n8 L
) @1 W1 O3 }, w' ~- l3 s
#include "hw_types.h" // 宏命令) V- h' }* M) f
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器/ ?6 c) X0 @, h; B3 p, w
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
4 U! H; }7 {9 D: ~8 f* W* m7 N7 Q% K/ {/ e8 x6 _" E
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
# t4 k. h( Y$ S2 A" a( j3 B#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明7 l! F/ G( ?+ A' C N
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
! u" W/ m1 S1 b& U( S#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ ^8 u. y( z. s7 m, C( J& V) k8 N3 h" ]
2 L- O) {2 x4 z) \, c/****************************************************************************/
7 ]+ S: A0 x/ f$ [- R/* */
9 C7 w8 n+ a1 q: t* d5 P/* 宏定义 */6 z7 ?$ s# C! S5 j% p: ~
/* */" ^' r* \# r1 o
/****************************************************************************/
u$ a: W# R$ ^2 r6 ?" Q0 H// 时钟* \; }+ h! |+ D7 S
#define SYSCLK_1_FREQ (456000000)6 m5 J+ n4 h2 S' J" w5 g' `
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
! o7 Y) F& _! u1 l8 B#define UART_2_FREQ (SYSCLK_2_FREQ)9 @* z5 `; P5 B3 n
) b+ r) H0 ]" F ]$ D# G/****************************************************************************/
0 k! |) ]( O( F2 o/* */5 j2 M* A u/ U* e; X+ A
/* 全局变量 */5 K' _/ A) |2 ~; N4 U
/* */- b- [' q) O- H& F4 D1 B1 R
/****************************************************************************/
5 `1 E( {# m$ C2 q) P8 g( Ichar txArray[] = "Tronlong UART2 Application......\n\r";+ ^; r1 O! j5 K, V3 ?8 e7 V
8 _3 R- r$ `2 C& k: p: b' Z/****************************************************************************/
1 v% D5 ^& x' J- X4 F/* */
& W- w- C( s6 T9 i0 Q) L/* 函数声明 */) U# R& `. M; H& Z* l& b
/* */1 ]9 W& }1 N& `
/****************************************************************************/
% d2 o7 \1 V! U$ @// 外设使能配置
# C y& I* w8 bvoid PSCInit(void);# g6 L, f0 p: A3 o* z
1 F, x9 d2 `$ F# g$ K
// GPIO 管脚复用配置% L6 t0 {5 n s0 ]4 O
void GPIOBankPinMuxSet();0 U* e3 S$ y% R; N* ~/ H
`# H% ?9 b7 v0 N- x* W
// UART 初始化, V7 ~4 w2 s& m" @# d
void UARTInit(void);
: n& E6 W& u4 y$ O$ F, t+ o) i0 z// ARM 中断初始化
5 L; _4 d" Y) U( rvoid InterruptInit(void);' H; @- l+ k& J* X+ D$ @
// UART 中断初始化
& j& z0 j: E' _9 E) ^, U2 ?" Evoid UARTInterruptInit();1 ]/ l' K9 x1 |: B
// UART 中断服务函数( G9 t$ C- q1 D1 L5 D! D
void UARTIsr(void);
! ?* \2 \1 z+ _$ K7 A) |% o! m0 @6 h- {# T- m* r l0 w3 O
/****************************************************************************/
* J4 M8 h2 |$ ~2 g+ m/* */
- l: x$ U4 H7 Z' ?/* 主函数 */, @- l( n" R# ~ L4 o8 x
/* */
% R" ]0 ?: [6 b$ _% Y/****************************************************************************/
% b/ c0 A' E1 Z& n( u$ x3 g1 zint main(void); C( ` C/ [" M8 L# a
{
9 J1 \( F. `) t0 A( S1 N // 外设使能配置
) G. e' t! e& Y3 {& F _ PSCInit();4 @! q$ h( Y" i& E3 d* c d
( G$ g& t, U8 N& y3 X // GPIO 管脚复用配置
1 r* o' k" c% M: x; r4 H' q GPIOBankPinMuxSet();' n/ o( O2 _' o+ v' V/ Q& x4 H! L" n
; m- _8 ?8 K6 J: b/ Z) R' j, b3 e( n // ARM 中断初始化- R6 R# q5 g/ e
InterruptInit();
3 ~& k# p$ J7 \0 u& W( p2 U4 N+ F) {3 I2 V1 f, N% C: g* b
// UART 初始化
, ?, Y+ F* W6 q% F g: t; U2 N UARTInit();
# N/ f3 d- T) S# p+ F7 `/ x0 K5 A1 ?- H
// UART 中断初始化
' a6 z8 A. T8 j0 w UARTInterruptInit();
: s) x) N- V$ k4 T2 U5 v. y% `% k7 o
// 主循环
?! d! j1 H$ D# [9 i for(;;) m% U7 N e! O: [. Y
{
4 G: f0 g5 W3 x+ ^- t% I- e1 n! T
" a2 L+ S* `) j9 @( m# Q }, x6 b+ B# A3 {& U
}
4 r( P" E3 ~ ?, ? B( A1 }7 x4 s: W A
/****************************************************************************/6 P$ }, g- a! X' C8 Y8 s6 G+ R
/* */$ A) W6 S0 x/ A# D. J; y
/* PSC 初始化 */+ C8 v/ p3 s9 Z. m8 z S' F5 Z
/* */. s/ O7 ^% N# V" W% l$ |' @) r
/****************************************************************************/
* a$ k5 W1 q8 n& Z6 Y6 i3 xvoid PSCInit(void)
- I4 H% y) `9 R6 ^3 v, F9 j{
& X% U3 p7 L) ~2 I // 对相应外设模块的使能也可以在 BootLoader 中完成
+ E& K* [% \2 i u$ v0 _- ~ // 使能 UART2 模块 X4 l0 C- M1 l1 B2 N6 s
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);2 C+ V0 w2 s0 J- M ^, O* h9 l
}1 q! G$ \4 ?$ \8 s# E2 N
0 }9 W* e) y. P, F) p! [$ n
/****************************************************************************/ S) [! H! Q0 I7 D, {
/* */! J9 ~9 i; y. S! F/ S! `1 w8 w
/* GPIO 管脚复用配置 */' A1 n, D3 r6 o6 O) A% G
/* */& {7 N& x; X* R* g/ M
/****************************************************************************/
( x3 Q: d, n# J) k+ \3 ? jvoid GPIOBankPinMuxSet(void)6 }) C' h& @5 b3 {& I
{
* w [* a4 C% w z( Q // UART2 禁用流控3 _& Q7 @: c: Z2 a6 w
UARTPinMuxSetup(2, FALSE);9 I& t; E+ p. r' E( R# u
}
' m) ~' M* n8 U) C( B9 ^/ ^' p- E+ R/ u# f1 L
/****************************************************************************/
0 O3 A/ h3 b5 N! I P! T/ J. o* p5 W/* */* Z& R7 U* \* ]" G# X' `
/* ARM 中断初始化 */ a$ Q) }. x$ M) t2 G; U3 v: e
/* */$ A8 @( D) Z; q3 T6 i5 ]
/****************************************************************************/
: o0 A. y# q0 N1 S/ K0 gvoid InterruptInit(void)
1 l* S( b3 w# c3 G& w5 j( `{
! z5 o- e/ [; x8 s, S( A/ Q m' t // 初始化 ARM 中断控制器! H8 U2 ]' Q; M) i
IntAINTCInit();
8 x' s) d1 B F+ r) H5 ~4 ]' T1 c* w" H
// 使能 IRQ(CPSR)
5 Z# }; m( X3 p- Z- U( C, a/ l IntMasterIRQEnable();. m; A5 Y. O3 V9 a2 s6 t
( l3 G7 D- V& v5 H# W7 q- V
// 使能中断(AINTC GER)/ H# s, j2 y: G+ p l+ J3 i- b
IntGlobalEnable();
1 {- L6 `1 t4 S$ r# c0 L/ e& a1 G% @# }1 ?& @# O$ f4 Q, N2 @8 W
// 使能中断(AINTC HIER)
; s% V/ B! O3 U% M% V' F+ S; H IntIRQEnable();
7 l( Z$ `8 i- Y) U3 c5 I}, m- v. R# x( ?5 N
. `1 \% p* b+ g" T# K* s
/****************************************************************************/! G: N' h$ ^ M* _) A# E, Z& r
/* */, I% z0 f: _% D" k0 y
/* UART 初始化 */
2 F! `7 o6 {6 d+ T9 O A/* */: f5 c' g( B5 A: _0 }1 V) e' u
/****************************************************************************/
7 k% C. H- U6 i; L6 Hvoid UARTInit(void)
" i5 K4 h q+ v$ c3 k{
! j$ q3 T! J- K# n // 配置 UART2 参数1 P1 ?) B0 E' H( m% q- v
// 波特率 115200 数据位 8 停止位 1 无校验位# h: s+ u2 h( P" n
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
1 O/ a) Q' M: s- t) S! O UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' K1 g/ t& V9 \; |. \1 l
// 使能 UART2! E' F* V! R! G$ S% Q, S/ H2 O. }
UARTEnable(SOC_UART_2_REGS);# z8 H: j3 o& W9 |5 h
7 _6 ?) i3 _3 b4 } // 使能接收 / 发送 FIFO
: q+ z, j* H1 V+ i& u UARTFIFOEnable(SOC_UART_2_REGS);
' E0 |6 ` V( `$ k4 m
# K7 V3 n9 l1 z2 P // 设置 FIFO 级别
, B% \+ C: V% r9 C UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
0 P/ |/ F5 p. u- G}
0 b' _& v( `: x! a% Q
/ A, w) q' P8 O9 G& |+ Z/****************************************************************************/
' \7 ]; H# `% |/* */2 s7 X9 F, d$ g5 y. N
/* UART 中断初始化 */0 J& r r1 c0 H8 _) L5 d# a
/* */
3 \9 |$ ^- [* N4 @6 ?% ~/****************************************************************************/
, s- H2 A4 b4 a+ D; z) M0 p9 N6 g) Mvoid UARTInterruptInit(void)
9 Z% @. y+ X2 d. u0 B, `{
. ]: e: v0 M) S( U* ~8 Y7 s IntRegister(SYS_INT_UARTINT2, UARTIsr);
K1 ?6 J! X* z! K4 u2 @+ J; E IntChannelSet(SYS_INT_UARTINT2, 2);
* }: _' t0 e5 E3 z4 e- K# F4 m IntSystemEnable(SYS_INT_UARTINT2);, d! t# ]& j" Z3 P0 I* i1 [& E8 t
- v) g2 Q& D: R% x; K // 使能中断2 f; K7 Q( V' A9 u( X$ z: B
unsigned int intFlags = 0;
! t: G% I7 ^; C0 B intFlags |= (UART_INT_LINE_STAT | \
l0 U! g0 p( V* S UART_INT_TX_EMPTY | \
% o1 Y7 w+ `0 t3 Y! R UART_INT_RXDATA_CTI);
2 ?2 W. K: S: i, n1 E' {, m UARTIntEnable(SOC_UART_2_REGS, intFlags);
6 b8 a1 p- U6 N+ `6 Z% O. c}9 t, q6 T) r( E4 \
& D I Z# m, `, H `3 [5 C
/****************************************************************************/" s" S: C9 z8 O% u
/* */& y$ S; k% N, _% q- v
/* UART 中断服务函数 */
* A2 a# k- ~ K) {# S/* */
L n$ ?- P" S2 j4 H+ h! T/****************************************************************************/6 e0 a! D" M* p; |, u- y( @
void UARTIsr()
' ^. ]+ m. i7 v6 \{% E# e B; \ z9 v) p( \ f
static unsigned int length = sizeof(txArray);9 l' X1 X+ e+ b+ r+ z3 D
static unsigned int count = 0;9 i# r$ @, C9 H% S+ y" @- E
unsigned char rxData = 0;0 K' D, l- ~8 a
unsigned int int_id = 0;
. @0 X [" B; d' ~ Y6 {8 U: J+ o: s
. l5 b5 R5 f) Y- Z$ D3 a3 t) y* @ // 确定中断源
+ Z& P3 n% U3 \8 S) x9 r. i int_id = UARTIntStatus(SOC_UART_2_REGS);
3 X* w6 K; Q7 X; l% ^; ?
% [3 L [$ n# p: I% x // 清除 UART2 系统中断/ y$ b8 w& u0 g' p' A' M, l
IntSystemStatusClear(SYS_INT_UARTINT2);
) l5 z$ z1 R# u* X' @: Y
& j: o, k" i5 w+ [) h6 w // 发送中断, t' I6 r- M2 d
if(UART_INTID_TX_EMPTY == int_id)
+ D4 y+ o+ W" A! [- _ {
9 a q0 q* b' h# Q5 ^' D3 B { if(0 < length)- X8 A$ K4 N }& I( C( h; P. e
{
; o+ E8 Q/ G7 Y9 | // 写一个字节到 THR9 g% ?: q8 n: h, V) X Y
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
. r9 K: M. r" }) b length--;9 n- N* `: E1 |2 w# Z
count++;% d, d3 \$ G/ D0 I, d
}& h8 @4 C- r K0 v" G5 q
if(0 == length)! I6 ]9 i4 X! ]- @0 F- g3 Q
{
3 c) c6 i* L3 q( G // 禁用发送中断+ f' N$ N+ h; O$ }% H
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* n+ D7 j, y( |- y9 [
}
' O- O- `" f* O# p( g }
4 R, B9 H0 O4 ^% t" H& o* y6 X( m
& h; A1 t( o* E% A$ \- }0 d4 u g# w // 接收中断0 E9 g* c! n2 N& z0 K, U+ B
if(UART_INTID_RX_DATA == int_id)3 N4 F( R& v" _- I
{
6 h" i D0 N3 b5 G) M5 z8 N) u5 _/ l rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
: d) f" s0 Y/ w# P( G, w) R! o: `1 B. Z4 k
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);) U P: Q Q4 g1 B& g, l. ]
}
" }& G5 [. ~# J" w
* m9 I! v% L% O% @2 b* B( [ // 接收错误
- D2 i1 V8 w/ m+ _ if(UART_INTID_RX_LINE_STAT == int_id)
, y6 d2 p5 e; p p { \9 q4 i$ O2 ?" \3 r
while(UARTRxErrorGet(SOC_UART_2_REGS))
; e7 [! M! w. |0 U5 V0 K& b* ~( E. J4 E {1 L. i' O7 g+ J2 f
// 从 RBR 读一个字节& T- X5 R6 ? Z c; G: u' U
UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 p' U' N, `- Y- d- H! R }
& C2 I) ^+ ^% T( m" h }; k1 c& X. ^* R3 H" D! E
# F! j8 {, p7 t1 V' Y; J0 Y! `# x r1 w
return;
% a# ?6 y/ [ J- u! Q}, Z- `8 I, N4 U8 F+ E
|
|