版主
  
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
利用ISE14.7中的软核Microblaze来研究中断机制; K) F! Y- E, y7 I5 \
本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的
( V) e1 F& t! m7 q9 S5 J- P z* f' l7 p
第一步:建立一个GPIO实例。
+ W6 f6 p# {' D4 w; }4 d! s& R第二步:初始化这个GPIO实例。- Y8 U7 @0 s1 j. G( l
第三步:建立一个中断实例。
2 k. n6 A" w( B) }! D第四步:初始化这个中断实例。
5 j* x4 v" ^- H1 u% P第五步:建立一个中断处理程序。- ]4 [$ r6 ^7 O* B
第六步:利用XIntc_Connect来邦定这个中断处理程序。6 h9 V: d9 \& t) {5 d% F
第七步:使能XINTC中断MER IER
3 j! y* r6 p( \9 Z9 X第八步:使能XGPIO中断IER GIE
" P- R9 f/ w1 Z" N" {完成. V+ E: d! e) G% X6 G+ C
2 f4 \6 m5 C. h v" X& I4 @4 B
% K6 D4 {3 n l. v r0 d/ y4 L3 W
4 d( C- |) y2 q1 y6 H) \; @
# f6 p) p: ?( A9 e9 ~1 P: R
& M+ e; d* E. V. e7 o+ H2 ]8 e2 q
3 Z5 I6 l9 ^$ e- ~/ o& Y2 M
. U& k6 Y3 U4 H- y$ n: Q
' u& m5 E q0 V9 u! \" o0 K( a& C& s3 d, J3 `
$ i) _' j/ i! Y3 u, E; r9 e# }
$ P6 Y$ j5 C( I! G
源码:
p( l. K) \8 {- }- c$ x
7 z3 [" i1 W" W# Z#include <stdio.h>5 ^, c7 j) ~3 |/ K, P5 j
#include "platform.h". x ]: R% G) }4 b9 r" [
#include "xparameters.h"
& W$ D; n- g9 Q9 x#include "xgpio.h"
& n' Y" {5 u' `5 o+ B) ` G8 p2 O#include "xintc.h"' y* J% o) p/ F+ t
#include "xil_exception.h"
+ D* U5 u% M& p; N0 t1 V1 M
- w6 o9 l+ R' [ b/ {' n7 l8 x#define CH1 1" V/ `4 Q8 L" I1 t+ F9 [, f
/ A( X( q! ~# H1 j4 Z& dXGpio LED;
/ ?; n. c* N: b5 K; [, KXGpio SW;
( Q/ I9 ?& ~1 Y+ T% ~+ AXGpio KEY;5 B$ i) y/ ^: o5 T
; P2 K$ k& Q5 r o( VXIntc Intc;# ~+ N# j% a0 c0 `, b
- D1 {0 V7 v) t% v8 `) {1 h; _2 Rvoid SwHandler(void *CallbackRef)7 T- T( }' ]$ u/ X' h6 X# L
{- l4 t' z* H5 V* b4 P% C
' J. p# D, e4 o8 e$ \/ L% \ XGpio *GpioPtr = (XGpio *)CallbackRef;$ k7 O6 Q' V4 ^# ?# n
xil_printf("Switch Interrupt!\r\n");
/ D& W6 S8 r8 U3 m4 h" v4 Y // Clear the Interrupt
. _; P/ O, r( W! D XGpio_InterruptClear(GpioPtr, 1);" y7 f4 O: T0 p/ c
0 z F+ x6 P/ o0 I0 B/ E/ H8 s}: \, j+ V+ d( M2 d: q& X/ v2 c
: P7 h# l. w0 j" F2 f
$ G6 q" I ? J: L6 h' }7 yvoid KeyHandler(void *CallbackRef)' A7 U# l: J" @# o
{
5 R" |' Y0 S; a ~
* Z9 g# i$ X; C- g
1 u' d8 Z; v7 E5 e& A5 x0 B XGpio *GpioPtr = (XGpio *)CallbackRef;
- k: Q8 M/ a. [' C$ t5 C- r xil_printf("Push_Button Interrupt!\r\n");+ e U7 F! B& C- k
// Clear the Interrupt: p% z5 u- n5 b$ J+ _
XGpio_InterruptClear(GpioPtr, 1);( ]. ]" p+ z: d" A8 h5 z9 J/ t
F4 F! Q/ v' K
}
5 l0 E Q8 a0 l. r8 v) ]( Q% _' k8 k( R
0 y8 d$ l3 V8 c- l& B: y9 v2 A6 b$ o; B5 h
void print(char *str);
P: k: g; o' A. }/ L9 U3 P4 h# U$ {9 y
int main()7 ~( s7 E s8 v; D* E# j' j
{
, E2 r4 r. s: M) ^+ U& ]. Q# e n init_platform();" ^9 W2 x- C; u# D, e7 j/ q+ l E
$ ~' B# n2 u. j9 l- ~
XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);- o, }( T$ k3 |
XGpio_Initialize(&SW, XPAR_DIP_SWITCHES_DEVICE_ID);
$ z0 i2 Z) k- L XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
4 }8 U3 V0 E4 I
, k A6 S! E5 G0 x5 a XGpio_SetDataDirection(&LED, CH1, 0);
7 y8 G1 d# g. Z2 _ XGpio_SetDataDirection(&SW, CH1, 1);
$ g9 Q: J: ]# G# R" x0 L& t `! i XGpio_SetDataDirection(&KEY, CH1, 1);
$ b# a3 Y8 y+ X1 e9 y O) g+ ?/ O: v5 D
XGpio_DiscreteWrite(&LED, CH1, 0xff); //all clear LEDS to off- S% m4 `& d/ Y: z
. ]4 l% n0 k4 h" b0 x. P% ^ XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);; Y* ?1 c+ ?2 I! r# o0 h+ v5 S
. d$ U/ \' Z& N6 |
XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
% ` R- u! ~- d( \# E2 G (XInterruptHandler)SwHandler,, z$ ?3 o9 B! y: B9 X }) ]. v, q
(void *)&SW);
" g6 J/ q) L9 i" p
4 s: [+ i8 \$ V& v# P5 d& i XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
: y/ o x, P2 w( L- V& }" n (XInterruptHandler)KeyHandler,
! s: M0 k* z! n: @ (void *)&KEY);
: p! [5 k- `7 G" P# d. T5 z8 i, f: m
XIntc_Start(&Intc, XIN_REAL_MODE); //set MER enable IRQ to CPU
# D0 b5 N S# f+ o x4 Q; V4 J d/ y4 ^+ y5 Q( x0 T
XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
% O3 `! d2 H# d+ S1 I: r1 C XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
5 m2 z: R0 n& E7 s5 [4 C' p( x9 G- t# m1 `; Z" h6 U
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,+ \& b/ n/ F% j+ [- W N5 u
(Xil_ExceptionHandler)XIntc_InterruptHandler,8 d2 T( M* ?/ b
&Intc);0 }. Z3 |* x3 w5 ^4 l* S( G |* m
4 V9 T( {* ]% V, t" N. v3 c Xil_ExceptionEnable();4 _3 D9 ~% J0 i5 `/ N
+ ~4 }- P, L- h& L) |
XGpio_InterruptEnable(&KEY, CH1);
. i' C/ N- c, g, l! J' F# d7 ] XGpio_InterruptGlobalEnable(&KEY);
* P$ h& D: h( R
# H! w8 y4 A9 p8 o" \/ n XGpio_InterruptEnable(&SW, CH1);
: {- Q8 G% Y% P6 \4 v& s XGpio_InterruptGlobalEnable(&SW);5 p/ W2 ~, }, w+ v9 e
& ]& s j& r0 ^4 ?
print("Hello World\n\r");
6 G) C, y& d$ [6 l; K3 F
: n' f- z% b9 }: }. ?" V% }' @/ Y3 X7 c! G) E9 D$ q
while(1)$ s& v( T* ~9 b' [! [2 O7 p( N3 ]$ |; ]
{
# i, O1 f' t4 {4 D5 W Y. A3 @
* ?( c9 |5 I1 N5 y! z* N5 y" l3 @ d+ M% B
/ z, T: n/ o, D: U
}+ i9 U& P) G; g. u; K$ G
7 T/ J1 i+ J/ i! |# p3 }
" Q# I( W. m: X$ V/ x9 u9 z$ j return 0;" J/ t% x9 }" h- n
}" M5 k* r) c1 ~& V4 k8 }. G3 p$ n" x
3 Q8 z5 Q8 |. _. E+ M# A- n( L; \% q |
|