|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
% Y$ _, L& K) g% I. V3 _! ?8 E8 @- R: I
#include "TL138.h" // 创龙 TL138 开发板相关声明
/ r Y$ q4 _" w% x. y2 o- m/ m7 [7 Y/ k& Y2 \
#include "hw_types.h" // 宏命令
9 F2 _/ w) x% [( U7 C3 Y& s$ C#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器1 |& z! u3 A5 v# c
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
2 U0 r7 M! P8 x$ y/ p& O) y: Q' q4 s8 z1 \$ t
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
& g2 x8 o" t9 |% g! }, p' D#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
1 {+ K" H) L& k A8 ^, [3 q- W#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
0 [$ q4 Q" L% o+ U' G#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; ?1 k% H5 u& v7 ]: m& P5 B0 U+ x5 s
/****************************************************************************/
" n- O H" ~& s2 l% M" F( g/* */$ I3 @; ~" y+ [- A
/* 宏定义 */
* }8 T- {) G4 L; E; |/* */) `" n5 w+ v' O: k# X* t
/****************************************************************************/
" x; d8 A" V% K. h$ S- g) }// 时钟' X+ e7 O( [- h3 y V- N
#define SYSCLK_1_FREQ (456000000)* b: Q- D8 p" M9 \3 L/ u
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
. x: t% G' \- x! x# P7 m W#define UART_2_FREQ (SYSCLK_2_FREQ)
& _( i2 R9 g( z/ h' F i$ E& c+ Q0 ?7 W: c
/****************************************************************************/
3 G5 @- s8 m, B3 q/* */; J* Y" r! Z: ~# h1 X6 P
/* 全局变量 */
N) f. a! X3 H F/* */3 J$ ?; B) z; x2 A z$ i: u% t/ Y
/****************************************************************************/* S2 z! Z7 a% t1 V
char txArray[] = "Tronlong UART2 Application......\n\r";
9 y6 A' X- ]; a0 z7 `" l- N# _$ @# v- T% z c
/****************************************************************************/
' j8 c5 J( s; {& C. F. s! {% p8 e# J/* */
; u( g$ C7 ~9 t) h6 o. x# _1 a/* 函数声明 */
4 |7 b G$ x4 |/* */
5 y+ s4 p+ U! B/****************************************************************************/
/ n7 Q1 T# r. H& j* J. D) I// 外设使能配置
% p) U* g/ A3 F+ z- [- Xvoid PSCInit(void);
) V' ?0 ?, K/ `# Y- q+ ~ s% R: M5 c/ B5 I
// GPIO 管脚复用配置+ g+ _- [0 I2 b: A$ ]' h# a
void GPIOBankPinMuxSet();- F" n9 |3 {' q2 X. e
, J2 o+ }! v6 k2 M* D0 ^; z// UART 初始化2 I1 F2 @) q0 _. W! M
void UARTInit(void);; I0 g2 Q8 l& s
// ARM 中断初始化
R$ ]( Y; M xvoid InterruptInit(void);1 P5 @4 a# ]# [+ Q# v: D
// UART 中断初始化
- n+ G! B3 t2 i7 ~void UARTInterruptInit();
) w) R% C! P" ~% F: D7 g// UART 中断服务函数: {3 [2 R& s/ h
void UARTIsr(void);
/ @: F% v) S8 z6 q0 T. T! z2 s, m3 r* n8 {6 V
/****************************************************************************/
. t; y3 l" [9 V& T& I) A- q) M/* */ j5 t2 Q" i( f d5 [9 [2 r
/* 主函数 */
% i x! }1 [& p2 m5 n& T! U/* */' n$ w0 G4 N( l+ G
/****************************************************************************/0 N$ ?- S6 g% e- j, _- j+ @# R
int main(void) h) f, R2 O9 ?" w
{
/ |- [+ i+ h+ P# L: h- s, Y // 外设使能配置
. m6 m: `, P7 Q PSCInit();
. F8 {' v! Z i2 l5 U ( n/ F$ V7 d, F4 X
// GPIO 管脚复用配置. j8 Y' f/ E0 X g
GPIOBankPinMuxSet();
7 {9 t' f5 t7 a* ]$ A% ~3 u& e# H4 x2 W/ T4 z+ }
// ARM 中断初始化
, X" J+ U+ ~7 W9 ?/ \ InterruptInit();
7 h' q# ]7 Z$ m0 H( I7 V
6 i$ [. i1 D# R% v. q+ S8 q* l // UART 初始化* P8 r' j+ C7 t. c$ |+ Z6 c* E
UARTInit();
/ T! n* X- I* y
2 x+ N* T% p8 A& t$ I4 `9 O3 L // UART 中断初始化
: N q" a, g& c' \) B UARTInterruptInit();
$ F7 M7 w$ b$ f& r$ P8 I+ P+ D ?4 d) `1 x2 i
// 主循环
# C2 g8 n' K8 w; h$ |& a- [ for(;;)( U6 T) X$ @. [1 I6 s; u0 k
{+ U. y, U; w" D) @1 T5 w
0 O5 d: v# \ Z. W) y
}- V& W! t0 x6 E" D7 G- ^; A
}
2 w. W8 T1 t" ~ f
7 Z' ~. J2 N% Y: d* e/****************************************************************************/+ X) i# {# f5 b: ^
/* */
' I+ C8 j3 F( K% Q! \( i0 j/* PSC 初始化 */
3 X: F" @2 `+ d9 \/* */
& U8 e$ c9 e. a9 `$ a0 i' S8 o6 i/****************************************************************************/, q) H& K# w5 J- \2 T. a
void PSCInit(void)
; d! D; @5 N' @7 S! H{
( d+ D( K! J$ \1 u. {1 J // 对相应外设模块的使能也可以在 BootLoader 中完成1 L% u1 L7 W$ L& @5 l H* l
// 使能 UART2 模块
0 r$ P+ L; }+ Y$ I PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE); ?7 ?6 [4 u& E! o& _
}8 z, R* L8 r% G( Y: T2 ^
6 M% ?% o+ r- s* t5 P5 f( E7 {& [
/****************************************************************************/
3 p( S+ @/ |) y. s/* */
, }/ i! X7 {) X( s( ]8 x/* GPIO 管脚复用配置 */
* L2 x% W- P# [7 V/* */' [ Q( `7 x0 h7 B4 K) [+ i+ R$ f
/****************************************************************************/! x- C1 h0 m: a$ s4 e$ w
void GPIOBankPinMuxSet(void)% M. }, O+ k6 O; E
{& @5 I3 G& ^3 W3 g9 q
// UART2 禁用流控
& l( Q# T6 M5 C- x! L# A UARTPinMuxSetup(2, FALSE);
2 t- s/ i, e( \4 S}
$ @9 Y- N' q8 D* S5 j0 P* K
N p- o4 E4 O, ^2 h/****************************************************************************/
4 `9 S+ M. D/ Z6 [1 E& D/* */
& Z. N' _' K# ^' R/* ARM 中断初始化 */
- j3 ~$ W2 M f" L/* */( S; @- t* f I0 a
/****************************************************************************/5 q3 r c9 ?% r3 R% a- T7 @7 V
void InterruptInit(void); X. G( u6 ~% D: U
{
# m( K# p' Q% H! j: ^2 y // 初始化 ARM 中断控制器
+ y, H$ O8 H8 h2 {: P4 B$ R s IntAINTCInit();; k. F5 j9 D0 n6 L4 @: X/ q1 V
" N) C I* a+ G) T
// 使能 IRQ(CPSR)
+ i' V7 N* n7 Q; D4 N1 V; w IntMasterIRQEnable();
0 B/ V7 L7 z( V/ d+ r1 \* U* c1 g% {0 y* G1 B& v8 k' U
// 使能中断(AINTC GER)
9 F$ T8 o/ A# H5 }& T4 K IntGlobalEnable();3 T: W. o7 J# W# x* V
# _0 E. U) _- z2 O- c/ T // 使能中断(AINTC HIER)
+ m% d; w2 a5 h9 W' y5 R. } IntIRQEnable();% b& A9 w- x, Y) ^ h7 ^/ R
}
4 ?6 |- ]6 t2 c8 M9 y1 R
2 X1 R0 o; s2 U; x/****************************************************************************/# `+ M7 q! i% e6 k. c$ f
/* */9 n: f& q7 @8 Z/ x, t
/* UART 初始化 */. Y( k4 ~0 L! X' R7 K
/* */
( v+ l8 i+ E+ | |! }2 \1 a/****************************************************************************/
! o9 ^' d* I1 d7 Rvoid UARTInit(void)
( X, n/ C: b$ a; |; x' o3 G" u! ]{& {# }! q1 E% t& y/ t) s( q$ D. i
// 配置 UART2 参数
$ y' R! a1 h( b7 Z' V$ W! ^ i2 q6 E // 波特率 115200 数据位 8 停止位 1 无校验位: Q2 e( D! k% Y) Q2 p, u: Q
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
- |* B' M p+ A# H UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ Z. s* w" \- |
// 使能 UART2
) W/ X; K0 g( \' l3 y& Y UARTEnable(SOC_UART_2_REGS);! m( l% C* E4 z9 n) Q% @
, f5 q" F8 q' t+ F; v. \ // 使能接收 / 发送 FIFO a6 u: d" k( }
UARTFIFOEnable(SOC_UART_2_REGS);- h" l/ W; i% c% q$ ?- c: T0 p
' H ?% V3 j; s" h( L J // 设置 FIFO 级别
4 u+ J% t7 l" o+ a* Q) S0 G7 Y2 V9 K UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 V% q1 y( S( ?! W! Q}
! W+ E. Y& b* t& d0 g' ?4 o6 m+ @1 J; s7 h, x
/****************************************************************************/, p: v' q* R- H5 U6 c/ u9 F
/* */
4 P8 V* \0 `2 M4 X n: }) q; J. M/* UART 中断初始化 */
! H% y+ C) Z3 }1 Z7 f K/* */
0 O) c d" _/ o6 o/ ?. i/****************************************************************************/$ x8 V& i: s( {
void UARTInterruptInit(void)/ o2 {0 n% {" }1 D% m5 D% R
{ j$ @) g, R: E9 ?1 s( \' D- f
IntRegister(SYS_INT_UARTINT2, UARTIsr);
2 j: y5 `, D( M; X; x IntChannelSet(SYS_INT_UARTINT2, 2);3 Y, W+ L, V0 Z. B+ }
IntSystemEnable(SYS_INT_UARTINT2);# F; W5 [# |/ L* d& v; |1 o
4 k. f& C+ E. Q, u$ S/ A5 d0 x& i
// 使能中断
/ h8 ^4 q' k: @8 R5 o unsigned int intFlags = 0;
K7 G% M; R ~" [' v intFlags |= (UART_INT_LINE_STAT | \" f8 O7 A. {3 ?/ ?% {
UART_INT_TX_EMPTY | \
9 U K) a4 m4 P" U6 c* `4 Y UART_INT_RXDATA_CTI);
4 J' T1 y1 g% E" n8 [4 o3 W; p UARTIntEnable(SOC_UART_2_REGS, intFlags);
c3 `! ?! ~3 R- b}
4 V" L& j# {4 B" t2 h; B. i0 A$ H8 K5 {9 F5 I( W
/****************************************************************************/
9 ~" }1 a0 ~4 a3 Z h% w/* */7 k9 z. J6 E) |! m0 [3 [
/* UART 中断服务函数 */
9 l ~/ a3 w" Z1 `$ D/* */! s2 ?) `, b1 Y8 z
/****************************************************************************/0 T4 {$ W8 h$ @8 r
void UARTIsr()1 Q8 a0 k! \ E) N" v7 Q- t4 `
{
% H( M# Z5 {0 e8 M* { j. A! E static unsigned int length = sizeof(txArray);
) P% M0 R+ n; `! T static unsigned int count = 0;
+ L1 B& O9 c4 s unsigned char rxData = 0;9 ]: ?1 Z/ [- a5 x2 A
unsigned int int_id = 0;
) l u j3 P- A6 J% ~
) ]6 J% H1 m+ ^ // 确定中断源6 b+ O9 D: d$ d" T$ l4 M" y" [
int_id = UARTIntStatus(SOC_UART_2_REGS);
' h. B! ?0 B0 Y6 O( F) w. c- Y
. p2 U; p R2 ` // 清除 UART2 系统中断- b6 r+ p; m3 v6 @, \
IntSystemStatusClear(SYS_INT_UARTINT2);
) N& M4 Y' ^' E. I- D: ^3 N- `& @6 f. e: Z9 s
// 发送中断
. f- H: \# k3 q& r. ]& ~ if(UART_INTID_TX_EMPTY == int_id)8 b, G/ s& C6 q! m: r# G5 Y& V
{
& u* q* z! i0 p$ E; x if(0 < length)
) P7 L4 g* @4 ~1 [/ R" ~ {
/ D# m x, {3 L+ q' k/ o // 写一个字节到 THR: n) |* w8 L; Z* K/ i$ a, N$ x
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- r" h5 c( {& {- S6 I4 L
length--;2 n5 v f: ^' ?& K" p4 Z
count++;
2 V" w/ E: P ]8 ]2 B" G, x }3 g: ^$ B, c7 \$ N. r
if(0 == length)* I! {7 V, L% D2 K8 V" W0 o
{
8 J0 D5 N6 G. G0 ^# I // 禁用发送中断
8 M$ g9 L' W1 o/ q UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 _+ A5 e) q! U
}
- I0 Q+ u% ^5 h s4 ?8 Q7 C! x3 |4 v }
! w2 b/ s( q; ?4 r( S1 J+ o' s( v( F; H/ p
// 接收中断
* e" e4 X; ^# _ x4 ?" _9 h if(UART_INTID_RX_DATA == int_id)
5 z" U }4 X- W4 o% a* y0 O {2 q+ j, {4 X0 r
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
# m% D5 r P. E8 I; }$ {0 c, i% T5 c4 [! I' m/ `, O1 i# p
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) v$ O% j7 S @6 ?, y }& ~. W0 j6 w0 ?# a0 X' E+ M, M
1 X2 e9 V) q4 m( f" Q. [2 u // 接收错误: g) b" S6 I/ m; f0 {1 k( g
if(UART_INTID_RX_LINE_STAT == int_id)7 Q1 K. }. z+ R, u$ v# l; F% @" G
{' x1 \2 a r/ \& d
while(UARTRxErrorGet(SOC_UART_2_REGS))# v+ d1 k4 W2 K/ x
{, e7 `1 |" v( k; I% Z
// 从 RBR 读一个字节2 ~" t1 L/ ], ]2 o) q2 Y5 W
UARTCharGetNonBlocking(SOC_UART_2_REGS);; |6 `! S3 [3 i- y) M4 x6 u/ \4 C
}
- m0 K5 S" y: r# F) o }
& t1 q% j% Q/ [5 E" C6 N8 w; U
1 p/ \2 C1 W: m3 x7 q: m9 G& p return;
6 d$ k: e) e& l/ Y) ?' d}7 N; y$ y6 N! o2 l5 d% Y+ O3 }3 Y% o
|
|