版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
利用ISE14.7中的软核Microblaze来研究中断机制
8 I( H3 o: x T; B0 A# l; m9 O6 R本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的; e' ]) g2 g6 o% \
6 r3 A7 C# z c) |2 i7 k
第一步:建立一个GPIO实例。- g7 u' K- Z' s+ W" S
第二步:初始化这个GPIO实例。
8 y, ^ c2 g1 K7 d第三步:建立一个中断实例。' k, R2 h# }/ `: F0 b
第四步:初始化这个中断实例。0 h3 p1 f2 S5 v2 w
第五步:建立一个中断处理程序。, B5 T) V7 @: s: ~. O! g8 b# q. q2 A
第六步:利用XIntc_Connect来邦定这个中断处理程序。
8 [' D. N& y: S第七步:使能XINTC中断MER IER 3 u0 v$ ~0 ?$ T( B2 Z6 ]
第八步:使能XGPIO中断IER GIE- J" k. T: n6 b5 J+ x9 L- j
完成3 T1 w7 W7 {. t- G3 M# s; [
5 [2 ^, u8 j J1 z( F
9 @# u/ Q* q$ }4 j1 j
! D2 M8 m" L8 C# L5 P7 e5 r, b( P
) a0 ~5 H- q) u9 U5 w& e
1 M. B; b+ j3 s* E( c5 a! G2 x2 i$ V3 V* W4 i8 T7 W
+ v5 V/ b: g8 b9 z
( f+ }) F1 l6 v& [# z0 r; f+ n7 e' X# P9 _6 o
' F" V+ I( G% K. o& }! y7 o
9 I- m$ b. ]3 d
8 M0 g& J2 z: a3 e0 x6 W1 Z$ N源码:
+ ]# c% F3 h4 g! H! ^0 E# E4 p! U. p5 T6 f0 J+ E% V- c
#include <stdio.h>
2 p h5 `# b' N0 x! r& @#include "platform.h"( B8 w( v4 `5 H
#include "xparameters.h"
; O' a5 ^' m2 u: t' j#include "xgpio.h"
. F) h) p5 |, w4 ~. \# j#include "xintc.h"3 Q$ V! j/ p' p* F5 c
#include "xil_exception.h"6 j5 r, J4 f7 j6 S
0 m& I% |/ ]! N* E; u#define CH1 13 h# z' B9 m2 u6 F$ W( l
C# ]1 I- j7 }+ _XGpio LED;! A' |' r. C: [. W% W, l- X: A U, x
XGpio SW;: R' J0 g1 [8 D+ o2 G$ Q, M% K3 l+ m, C2 A
XGpio KEY;
) ^2 A4 M7 K3 {6 T# \1 }
- B+ ~) H9 m2 F6 Z! X: G$ RXIntc Intc;
$ R& _* R+ d, o } L0 p& y1 Z: N) b3 v7 g1 _( y
void SwHandler(void *CallbackRef)
1 g( P# p8 Y! n$ L- U g8 y{
0 X5 B y4 P3 h4 k4 p1 L
0 Y! i, M( |7 j" j6 k& j XGpio *GpioPtr = (XGpio *)CallbackRef;
5 J) H ?7 g ? xil_printf("Switch Interrupt!\r\n");
" T6 Q; \# F' U: j7 M // Clear the Interrupt
: ~0 P% H# @' [; k XGpio_InterruptClear(GpioPtr, 1);1 |5 e( w: _* R- p
8 \+ `4 x. k' r}
$ ~8 o4 L) {) _. H; D; _' _% c- Q ]' q5 P! y( I! O5 x
1 w" g2 N c5 N( Rvoid KeyHandler(void *CallbackRef)) j0 H1 d# U3 m: O4 w8 l$ r
{
" I; y3 U0 [; `& e) i
+ a8 t s0 k3 u0 p! i' n9 ^3 V6 w
+ f7 ]6 e. e+ N/ w# v2 n8 b XGpio *GpioPtr = (XGpio *)CallbackRef;' _1 v* m+ R4 K
xil_printf("Push_Button Interrupt!\r\n");7 ?! ~+ a; A- e! Y7 e Z/ k4 ~& j, M
// Clear the Interrupt
0 ?: k9 r6 q. ?% d0 B: X5 G9 T0 d- \ XGpio_InterruptClear(GpioPtr, 1);
9 u" N' v+ z% W) E2 q2 \
4 m# H1 W5 x& {$ ~$ u/ T; e}
( T! ^) H2 r! k8 k" T9 ]. P
( K. `" d5 Z' _4 w' I& F' ~. z) Q# y
1 `9 _9 Q* ?, ?$ W
+ o0 i" D9 @+ Dvoid print(char *str);: t W7 w0 N6 h! l7 `! P7 q+ }6 t
: l+ R: u+ A/ Y, |int main()
9 s; Y6 q6 }8 p0 x* [! t+ A' y5 Z{9 G- ]9 V ~% I
init_platform();( M a7 O, S: b' G( S* f) O
, [* q' l! N' K5 N: v: ] G- t& c9 T
XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
6 y1 C6 E9 w2 [% P XGpio_Initialize(&SW, XPAR_DIP_SWITCHES_DEVICE_ID);
3 |/ S& A: E# k- p XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
- [/ _2 ]. r b% K7 ^: J+ ?* W. z' R( `0 q' ?
XGpio_SetDataDirection(&LED, CH1, 0); {. C5 Z( ^. ~' p2 h% Z
XGpio_SetDataDirection(&SW, CH1, 1);) R& y: I8 X9 }
XGpio_SetDataDirection(&KEY, CH1, 1);
# t; f# S% w* N( X- E! ]+ ^1 @
% P N9 V* {. V: h2 X8 m+ c: Y XGpio_DiscreteWrite(&LED, CH1, 0xff); //all clear LEDS to off
; u( |% Y; ?2 N& u! C. l7 J3 s6 t# K0 D
XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);4 Y6 U# p6 s4 {/ B
0 J, P& k+ \* _5 F XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
& [4 @( @; y, p0 |8 | u8 b* z (XInterruptHandler)SwHandler,9 s3 B0 d5 @4 f* _6 T
(void *)&SW);7 A; ~8 x& f8 p! q3 `& l
! X W6 k, J! X/ N" f+ W6 I3 v$ X, ]
XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,) |' c3 `* i1 F6 t* L1 c- a
(XInterruptHandler)KeyHandler,
5 G. U2 h( O4 U2 f3 R (void *)&KEY);
. Q: w2 g5 ]* ^
. B; r; Y- v: Y/ K7 H XIntc_Start(&Intc, XIN_REAL_MODE); //set MER enable IRQ to CPU
4 r; q" ]: [8 k; ~9 N2 \0 @1 h% n
) R% }) W! k2 G1 } XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
2 M& d8 |# m' U+ i, d O5 v XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
3 L1 p7 R& s% g/ P
! A4 i5 _+ o8 m; f: b. i7 v Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
7 i" x ^3 R6 M' Q( a* `; R (Xil_ExceptionHandler)XIntc_InterruptHandler,' u4 W0 P2 D5 s# _* D$ |. h! V% K
&Intc);
3 b" o' s, h8 L3 A
: l+ E4 f) p3 c2 [ Xil_ExceptionEnable();+ v/ a# g" k* W' ~7 z& \
& ^6 F* a r. Q$ s1 q' e0 I
XGpio_InterruptEnable(&KEY, CH1);
/ Q A8 y1 k' b5 U XGpio_InterruptGlobalEnable(&KEY);0 m1 k* y2 _# x6 Q
. v7 @; t9 t3 t1 ] XGpio_InterruptEnable(&SW, CH1);# e+ O7 B' K0 i, X5 o5 z% S
XGpio_InterruptGlobalEnable(&SW);4 t3 }$ l$ W7 ^
( I8 M7 s4 _0 p% v. E/ o- E7 m print("Hello World\n\r");0 }- R; k9 L& L7 @/ P
* x' P9 I$ n( H& R& S
- {, w. k. Z' N8 h while(1)0 `; R8 }; ~; @: K2 i. s
{
4 u8 O! S7 Y* d5 n: \2 ?7 u7 z- w# U/ }' n; |5 O* f. w: z4 n
0 f" p; G) ]5 H. A _% H. R T; E. G( Z H9 J! _
}
9 b! `, P T9 x8 Y
9 d' G- i# ~# u; Z1 o
- V0 L* Q* d# G' c- k return 0;- T1 L' o$ c. W5 j$ `3 N# o
}6 `- D$ [+ h' ], s2 S( P1 a. z
) Y+ W! _$ c# \2 x/ e |
|