版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
利用ISE14.7中的软核Microblaze来研究中断机制
" Y6 [3 @& w$ V本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的% `9 t4 ^2 B$ `+ Q7 K6 W
* w; ^$ j5 f, a; V; f5 W& D) A. S! T( ~( u
第一步:建立一个GPIO实例。! H; ] l) \5 @' W+ I! U
第二步:初始化这个GPIO实例。
7 z! t+ J3 p) B" d H2 s第三步:建立一个中断实例。
# ^# ]2 K. d0 v+ t. l, ~第四步:初始化这个中断实例。9 @* m5 U ~& ~$ R% Q
第五步:建立一个中断处理程序。6 U1 S- S; X; N% M
第六步:利用XIntc_Connect来邦定这个中断处理程序。+ w9 J, P; `* W* `7 ~0 C
第七步:使能XINTC中断MER IER : x0 A" q- L- p
第八步:使能XGPIO中断IER GIE
% q9 U' x) |% C+ V: g3 M6 Q完成
) q+ G4 s) k! P4 _7 N% a" Q/ p4 U+ P! i
/ z" p% S7 |: g3 C8 v
' M H6 B+ x7 a4 K8 y
! |) n/ ]1 |* F7 P
5 ]1 F' o$ E/ c! i
% a# p- R% o3 o$ X, K
2 c( }7 n: C( n, ?
9 |# c. g, ^2 T, A
% c5 s# h: W9 v& g* I9 \6 d f H! b5 n, Y+ _
, C. a& w9 m% M4 J N3 q
" w" y# Z; i! }6 m5 T! _' B源码:9 U3 _2 V5 w) B) m) X3 h! ~( ]! j
1 |: M- ^, a+ L" q( J; K2 h#include <stdio.h>$ s2 b) E" O+ r+ O5 Z$ i
#include "platform.h"0 K3 N: }( R6 L1 G
#include "xparameters.h"
* {( A2 g& J% K9 \* n7 p `" ]#include "xgpio.h"
( {# o( @% k! \+ c$ n8 u#include "xintc.h"
5 b/ e- Y: a8 `9 o: G/ t. t#include "xil_exception.h"2 S: X5 V% q: Y/ D' u- M1 F. E, }
4 t, {4 F$ ^& P- @: h
#define CH1 1
* {1 L* l( W& e6 K) f/ K h: W; Y2 R# Y7 q1 C7 G1 N
XGpio LED;3 Z" b7 [. f6 O$ | L
XGpio SW;- K5 Z# t/ r4 X5 ?( V
XGpio KEY;
2 W% u5 r+ r# |1 C K
' I; `/ D7 e8 v: j# CXIntc Intc;* z0 `5 [$ @' M* D9 R
/ h( C9 R* {. e$ s# d% x
void SwHandler(void *CallbackRef)! {7 Y4 e) _# p+ Q1 U
{1 \, \1 D& P5 J0 }0 `: |
: U) S! b% d$ U9 c
XGpio *GpioPtr = (XGpio *)CallbackRef;9 m& d" \. s, `8 p( d8 W5 q# T
xil_printf("Switch Interrupt!\r\n");
4 H G' A3 o# W' d4 d" N6 g! \ // Clear the Interrupt1 z5 k6 p8 b0 r' {8 U& c: Q' ]- I
XGpio_InterruptClear(GpioPtr, 1);+ n n" `/ e* s" u
; j7 v. o' O7 ?
}
6 G0 D8 v' o, R$ M0 J: D3 i- U& B! r' h' _" h; a8 g* p, C
& s3 l, X; H; B8 H3 B
void KeyHandler(void *CallbackRef)) B/ W5 w' k) y- g
{
" ~, w( U, O6 M7 w2 }3 h( j7 ?: ^. S# X9 g9 c9 p/ M+ |
3 i, r4 f+ y0 o+ ?7 J; L& n XGpio *GpioPtr = (XGpio *)CallbackRef;
# ^0 Q8 L" _+ p4 ^) f+ I: { xil_printf("Push_Button Interrupt!\r\n");
5 B7 }" Q( |$ p( }) Y3 X/ Y( r6 H W // Clear the Interrupt3 {* A$ R. Y M) o
XGpio_InterruptClear(GpioPtr, 1);
; f% m4 v' w6 @# g1 R1 G" Q
9 y& |* k% h7 K5 H}: \+ T. P. R. ~8 r& Y* \
+ B# ?- T# y0 h& m$ z3 K' A
& K) k; M% H) ]
( M y1 [$ X% t: ]4 Q$ L: Y% m* _& yvoid print(char *str);) d( \2 b8 S$ W
8 z8 o) n2 R( C8 c) p
int main()4 \2 O# ~% N+ l; ]. B' E
{
" I% t5 N/ W. K- X. e( T init_platform();
% x3 q1 h4 _* |+ J# K5 C/ e
# v( X$ V$ K' ~9 ` XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);; p# C$ F, P) e" f6 n/ j
XGpio_Initialize(&SW, XPAR_DIP_SWITCHES_DEVICE_ID);) H/ A" M ^* U0 v
XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);/ i) `8 s' I p. L1 N
& \, z9 _9 y, l9 H
XGpio_SetDataDirection(&LED, CH1, 0);
% }/ B5 H1 u s: d XGpio_SetDataDirection(&SW, CH1, 1);2 e' t4 m: N8 n& t& |4 j6 N+ P" S5 R
XGpio_SetDataDirection(&KEY, CH1, 1);9 v w! J& ?/ C% Y7 p
% k; V3 i, S, E- j
XGpio_DiscreteWrite(&LED, CH1, 0xff); //all clear LEDS to off: \6 J0 F4 {" j) z" R3 i) O: H
) I* N% d- @/ n) o& J
XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);& |% d" F' u. I* c/ c! q0 Z5 d6 p/ h1 H
* m4 g1 D0 v, D J5 u6 F* y8 e XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
! S; P$ p, B) y2 I Q4 l2 I (XInterruptHandler)SwHandler,: ^8 Q0 _2 P2 J; C
(void *)&SW);; v. ~# h0 b- Z' }9 Q
& v* c( _9 U/ w- `: ], M XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
7 ^" ]8 v' p; x1 z6 B (XInterruptHandler)KeyHandler,
- Z( f$ T2 _. N8 H& C4 n1 D- F (void *)&KEY);
' B( ?1 v3 U9 B0 r- F( ]( z( t$ C$ q; {0 O% ]9 ]
XIntc_Start(&Intc, XIN_REAL_MODE); //set MER enable IRQ to CPU+ |1 g/ L7 i5 u& ]# X, \
) S" c/ t4 R1 G) i" ` XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
; L% D: t5 }0 a; U3 k% Z XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt0 B w) \2 M3 C/ h5 R3 P
" ?1 |1 n( C1 k( B8 Z) h* D
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
( o" L0 Y. [0 R (Xil_ExceptionHandler)XIntc_InterruptHandler,- j4 V9 ?% X* b; p( q
&Intc);
9 _& Y' O; G1 J: ^+ r( U( m1 [6 L
Xil_ExceptionEnable();" s6 B" S D# X' A( {% g
& L# m$ p6 x v& [: j( u XGpio_InterruptEnable(&KEY, CH1);$ p$ ~; K$ v l* w9 G; j; o& q
XGpio_InterruptGlobalEnable(&KEY);
! t. [" k! ^9 i1 r* V" u9 D. d/ A" _8 C7 |. q1 X1 b1 y
XGpio_InterruptEnable(&SW, CH1);" [1 |& y- |6 @9 B
XGpio_InterruptGlobalEnable(&SW);
* F1 [# o5 G8 m0 G5 D
. K, ?- u( Q' D7 m# l# N6 h print("Hello World\n\r");
( _% r) x, t# F0 H0 M: C7 b
1 \9 j, G+ j; l' j# N( z
) G' P' n% v4 X while(1)
) G# b; L4 a7 J3 v3 T7 T! @ {9 `( [' e3 f/ H: G6 f
' }5 Y9 A0 N/ _" W2 {) v
v: ?0 e- u- ~; [3 Y- I9 y
) m- Y! ~7 U- J+ D7 ?4 Y6 U! {7 d }
, ^& t- l; f; ?, q4 a {0 g- p y2 P- ^3 E7 _/ O
# }/ `; D' a- l+ _/ H4 R: A+ [
return 0;- v% C0 e5 @4 {' D$ ^6 J
}
9 c; `+ c p' E0 N) [: t- }& `! T: |0 y; I) l
|
|