版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
利用ISE14.7中的软核Microblaze来研究中断机制
; N5 w4 ~6 c- K E* R1 `5 H本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的
: t# \" [; w* @7 c: Z
6 b6 g5 D5 e8 o7 Z0 a9 q第一步:建立一个GPIO实例。
0 Q& W. q9 k2 `3 `- m第二步:初始化这个GPIO实例。3 t$ t) {( z/ g" f- [/ x/ @
第三步:建立一个中断实例。/ B5 M% X4 v5 p% J
第四步:初始化这个中断实例。+ ~) F( `; d& ~( e
第五步:建立一个中断处理程序。% \2 M* {7 L! w: Z
第六步:利用XIntc_Connect来邦定这个中断处理程序。6 W. `0 u& g+ Y
第七步:使能XINTC中断MER IER - X7 d N7 f& B1 l) v% u
第八步:使能XGPIO中断IER GIE
6 |3 Y0 ?8 ]6 m4 c E- H r/ \0 F完成; X+ O- H8 U" y# v3 X, F7 C
- A3 O# N F6 C6 B& q6 R' [
7 k2 X F* V% k2 n
; O9 Y2 |, R6 o- O! g$ O
# \5 E. @% ? P9 K; o; K5 Q6 w! i6 ], }5 A7 k; ?5 S- {# x
9 F9 S* s2 g) b0 f3 f ?, [' }
2 K* C5 \! d5 a- t1 l
' G. O+ d$ P7 k
, W9 K& j5 M" e, v* y5 n, v& v" K4 [- C! P4 N' G
4 U* v6 U' X% ]' [5 p' v d1 N7 I1 h. r- j8 n* u
源码:7 R% w, m; g8 B6 k9 ]( y
' a4 [) r: W" Z: s
#include <stdio.h>3 f, R6 @8 x4 d- o$ H/ u+ p a/ ^" B
#include "platform.h"% @7 q; m* q6 E. x: r
#include "xparameters.h"2 Z2 @. B% D: C$ N; r: {. \) h
#include "xgpio.h". P6 O$ ~* x2 X: I# B
#include "xintc.h", x0 X) Y8 [9 b9 c" \3 G1 b! ?2 t
#include "xil_exception.h"+ X9 |3 w. s# K
7 O7 s* D& a" C l2 x#define CH1 1* L2 i" J$ d3 \! G8 P% q+ d
5 C" q: j9 h$ S1 M9 ]
XGpio LED;, h* V. H ]( f4 ]( E9 T B
XGpio SW;
+ t7 g1 U) B- D2 w9 ^XGpio KEY;
- r5 n: J. H! `8 A9 e" J1 E3 W* \3 h9 K8 f
XIntc Intc;
( O; P/ `8 l) `8 @# m6 ~5 i( i. w5 ~7 b5 ]' i$ [1 S
void SwHandler(void *CallbackRef); D5 R7 ]6 |$ l ]
{
( B) j( O* E- U4 v* Y/ k+ P' R
3 ?& t" H' M- p d( q XGpio *GpioPtr = (XGpio *)CallbackRef;
6 R' H- X$ y; Q" [' N xil_printf("Switch Interrupt!\r\n");9 ]: Q9 t& Q: v5 }) j6 u' S
// Clear the Interrupt& F. Q# O+ p, y9 F+ O
XGpio_InterruptClear(GpioPtr, 1);
3 X2 @: \. G( ? q" W. d4 B. l4 E3 r4 `) s0 b( C
}' s9 k% ^- e9 g3 \+ t$ [% \
5 r, L* f' e* T6 L* P6 P
1 T0 D0 s4 N# }$ N! G3 E( {+ _- v B
void KeyHandler(void *CallbackRef) a8 D" p6 y% P7 M: x
{& _+ E) u9 q% g l! k4 P
& A5 P, y: n" C/ R; o
4 k, _$ i+ I: ^9 f XGpio *GpioPtr = (XGpio *)CallbackRef;0 a5 b2 _: B( T, y& G
xil_printf("Push_Button Interrupt!\r\n");1 r* d' x! Z4 Z
// Clear the Interrupt6 w* |7 B4 w" R6 q& \9 X+ } T& Y
XGpio_InterruptClear(GpioPtr, 1);
) C0 K* M ]1 s# @4 v
0 C' f {" H5 ?. j5 u/ M- A}
: p; v0 v- O$ Q F0 A( W6 m' e9 r! u2 S B- v9 j, I7 m7 Y
! L+ c* ~4 o/ s* K% j( x& z) z
9 B$ w1 B( {2 Q9 `( [
void print(char *str);
1 e4 Y! h3 D/ ]- U% y# K
6 s, z7 x: J. @/ f! T0 n2 Sint main()
& H5 C- n2 h' c' ?! t# {$ Z/ y{" `7 X! B2 @6 _0 ?
init_platform();
! w j4 e) d- X+ x/ A
|& W6 n* v2 \$ t$ d XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);/ r7 {4 X j5 f+ k9 G$ c/ |
XGpio_Initialize(&SW, XPAR_DIP_SWITCHES_DEVICE_ID);
0 k4 j* M, J9 B! J1 W+ i XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);7 @3 o* u( t7 `: Z2 @+ C
) s o8 A5 ~) }2 w6 B, v
XGpio_SetDataDirection(&LED, CH1, 0);
k+ b. a+ A* {1 h1 C XGpio_SetDataDirection(&SW, CH1, 1);! A2 W3 }, M0 I n* W& o4 G I
XGpio_SetDataDirection(&KEY, CH1, 1);4 E; R: r/ B* Z$ } e# [
3 v7 l* N* c7 K( X' O" l
XGpio_DiscreteWrite(&LED, CH1, 0xff); //all clear LEDS to off3 m2 G4 J5 x' F n
3 d$ \0 Q7 Z6 Q
XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);
' s$ [* F' v. r$ P' h# i4 O X* o% f `/ u
XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,* Z0 }' C& \+ P2 R6 P% W
(XInterruptHandler)SwHandler,/ I) Y. U6 {2 [! Y2 R* B" V5 P
(void *)&SW);- e- g( \/ s% B
$ O. G3 m3 U: S" y7 e5 D0 d8 J6 `- ]$ r
XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,# d; o3 w, f# t% E: O9 ~, e% N
(XInterruptHandler)KeyHandler,
: s, g6 q4 `9 I: \: a% w4 m8 a (void *)&KEY);
2 K4 d9 ^( w( M$ A Q
5 ]! B1 ~3 \/ Y XIntc_Start(&Intc, XIN_REAL_MODE); //set MER enable IRQ to CPU
2 h2 q6 k9 R, c0 K" G/ o" P- T/ U! ]1 r/ n& Q( [
XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
$ T* y9 @, D# H" ~+ z1 _- V* M XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt' q! B- o r) C: p
; @+ Y- f. Q4 }. p( b Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,- ^6 C% @% }4 c! h* |
(Xil_ExceptionHandler)XIntc_InterruptHandler,4 e5 |* D9 F8 v# a7 f4 O2 ^6 M3 U
&Intc);0 k' r2 H5 v, X4 p$ |" v( a5 I+ o
5 G2 V, \* }1 v0 j
Xil_ExceptionEnable();
2 q; A- v2 v4 V4 o9 J* I
$ x0 E1 Z G! B2 b9 O XGpio_InterruptEnable(&KEY, CH1); D @; @8 O9 [9 G5 F% Y* i
XGpio_InterruptGlobalEnable(&KEY);3 B, F+ i. E, U; S: }2 d+ T& x
# V0 |& L" X3 g8 h1 n# F T
XGpio_InterruptEnable(&SW, CH1);0 Y' A& X- T2 Q
XGpio_InterruptGlobalEnable(&SW);
# O: [ E9 U, D& {; ~
0 ?% N0 `# X* I/ q5 A/ @ print("Hello World\n\r");
, p6 U% i5 I+ q9 C5 N) h6 S# S) v1 A" H4 U! T& i: s$ y3 n
+ c2 }) j# h& R* H" H1 P& i, ~% a1 n6 l& A while(1)% A* i/ {0 g% [3 p8 P6 v
{' U8 [" {' [" b/ ]! ^, ~
: u$ u$ O# E" t! I
' ^8 P/ I/ F$ \2 f( l0 I5 S* s# B1 H: \9 G: R2 s
}9 ^, A* F: f' B4 @: \! s
1 @0 v5 v u( `0 ?# d# f& G) a2 y4 j7 l" P
return 0;
9 B* L0 ?# d$ |}( E- U+ I+ J* C! N
" p+ u+ S% r8 C, A) w2 M
|
|