版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
利用ISE14.7中的软核Microblaze来研究中断机制
) q' q4 I- D4 [2 X. O9 g7 p8 r本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的
' q" \9 `% I( k2 x7 n5 _
; p% n: [6 u* t- _9 a第一步:建立一个GPIO实例。: q+ I | c% e, ]* O
第二步:初始化这个GPIO实例。
3 u; f8 z5 g3 o% o第三步:建立一个中断实例。
v* A6 s& i6 _. @第四步:初始化这个中断实例。
6 W% M7 o" i, X& b第五步:建立一个中断处理程序。
# f+ P. }( Q1 ^. v第六步:利用XIntc_Connect来邦定这个中断处理程序。
* N; @# d) j \: v2 J第七步:使能XINTC中断MER IER 4 f2 o% F& ?0 {5 X4 G( j
第八步:使能XGPIO中断IER GIE; Q3 M5 d7 K; ]; z6 c5 \
完成/ A, F" U% \& D+ B F& U+ v
, G) M' z! S& p, F' E5 A
3 G, Q' N( {9 d( p* R7 T Z5 _$ {5 _7 @0 X) O' s7 G
# P7 o% ]6 a+ N6 p6 d4 r4 O
! J. |8 p& a' Z4 ?5 a2 c
8 j O7 p6 {; E* P: O0 n$ c( x2 V! |" u: o
+ R- |: j( {5 N
# h7 {" H( P, [! P
& y U& Z F. O7 D; V* f% t5 w6 d8 {( n- x5 L _
% c6 j9 q9 q D) {6 }' n6 Q
源码:
) l G% m. i# w& v4 ^. s& F( P" t8 V
* e$ n) W: g* c0 [# A#include <stdio.h>7 \% n# a" c/ ?8 e; b) {1 V# F# M7 p
#include "platform.h"9 J* `7 K& H& k0 v$ O/ L5 i
#include "xparameters.h"; Z8 ^& g5 d$ S4 B
#include "xgpio.h"
/ J/ b7 |3 k1 D3 s, q& k* u, d#include "xintc.h"' K2 e) v- \: d' h
#include "xil_exception.h"
0 R4 r5 C8 J2 p7 b- }2 u- f
& j0 X' u1 h1 {! j! _) J#define CH1 1) _0 C: R- R* b- q( i
9 k) w4 S0 d# b1 r5 G5 ~+ k1 GXGpio LED;: v8 i3 P2 T) ?9 c3 b* h
XGpio SW;! h& _1 U8 d' V2 o( [, s
XGpio KEY;& w, O7 X8 K9 e8 G3 F
! k5 r8 ?" c2 E8 Q
XIntc Intc;' Q' z" G. ? ?
# `' a( l4 p8 J; v* Q* uvoid SwHandler(void *CallbackRef)# g9 i; K8 o0 P
{4 g" W) j$ w; m* F; ?$ N
3 g; u, M7 O6 m/ @: |- i( e* l
XGpio *GpioPtr = (XGpio *)CallbackRef;9 N0 B9 S' O9 T2 M0 E' ~
xil_printf("Switch Interrupt!\r\n");) P4 \0 U) r' @5 t X; `
// Clear the Interrupt" v4 V4 f4 [* g' d# c5 `
XGpio_InterruptClear(GpioPtr, 1); C" a4 |/ |+ R* a
7 J; q* I! \6 A- m4 v}) Q8 M3 Z& d- j5 ~4 k
, c5 m% [) ?: V, K3 e% P/ d; n$ B6 W q! k/ u: o' w( o, w
void KeyHandler(void *CallbackRef)4 c( t4 P% S3 A2 j) [
{) Q# R+ c- S3 l, R4 W' l2 |
" w, [& _" S' ]3 g3 e) s8 U7 v/ p& y% k& [' k
XGpio *GpioPtr = (XGpio *)CallbackRef;; N' @) b2 X( B
xil_printf("Push_Button Interrupt!\r\n");9 Y& t4 a. Q1 e( b
// Clear the Interrupt& Q7 K# E2 y$ ~" f9 k1 H
XGpio_InterruptClear(GpioPtr, 1);" }3 U, {9 e T# t1 M7 p4 }! j
& D( X, O8 _' b& R( i. G}) y$ N# Q7 l5 ?7 {3 U
7 O1 s# z% `; `) r+ U9 f @0 ]8 U/ [8 K+ Q* h- b
7 D1 O' v* p3 S2 d4 t/ b% Fvoid print(char *str);
9 U5 ], O8 {% ?! x# D. A, B' F6 ?6 l) m+ G4 l6 N/ b& w
int main()/ I" H; I: W, w8 s& k
{( R8 C. x) c9 V$ e: Z' a- I4 i
init_platform();: M3 r, ]% h: J
/ v7 R' A! R- b5 i XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);# I( R6 C/ u. y$ Z
XGpio_Initialize(&SW, XPAR_DIP_SWITCHES_DEVICE_ID);
( N* `$ B3 b8 { XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
3 b8 } C" ~% D- Z- p z8 g! _' i, A& T
XGpio_SetDataDirection(&LED, CH1, 0);+ V% M! e' \, b2 ?5 k' W* M, d9 d
XGpio_SetDataDirection(&SW, CH1, 1);# N' _* h# {1 }+ Y
XGpio_SetDataDirection(&KEY, CH1, 1);
' e3 g4 s! ^+ J* |, ]4 y6 {5 j
* d, V: U1 W6 v. s" v2 W XGpio_DiscreteWrite(&LED, CH1, 0xff); //all clear LEDS to off. R4 K3 Z- ]0 b& h5 w' }1 ?
2 O9 ~) n# v, q- F3 K$ ~) k XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);" E& l6 P, R8 V
1 S" v+ @! Q, V. B
XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,7 v/ X6 g ? r8 o6 t5 i% A
(XInterruptHandler)SwHandler,+ r9 d4 v" f$ O$ C
(void *)&SW);
$ F$ d& \, R! i) w8 Q: y& N3 {! r! D- }' X. L
XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,5 u4 r: \* A7 e- x [( q3 `8 B
(XInterruptHandler)KeyHandler,
# h, _8 _5 l" c$ y* x. B (void *)&KEY);6 r! ?/ R; j( [0 ~( F1 y4 m
3 R: F, C, f3 @ XIntc_Start(&Intc, XIN_REAL_MODE); //set MER enable IRQ to CPU( q: l4 {: K% ]6 o# Y3 s# \
: ]3 Z. o6 U& M9 C9 T XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
9 ~0 E5 G2 x* b$ w XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
+ `4 P) {+ H# H1 G" W
& h7 ^0 b: D& c/ A/ E Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
t$ _1 @( h* @1 r- Z) e+ ^ (Xil_ExceptionHandler)XIntc_InterruptHandler,
, K! ]" M7 r0 U, p* d0 u &Intc);
7 L+ z2 N' I: b, }8 e! l" p& Y
5 Y( H& l! I2 z5 D7 h/ j7 \: v Xil_ExceptionEnable();
2 S* c- D/ [3 `' G5 J2 S" f% R4 j" s4 ^5 g4 v8 a& ~6 w
XGpio_InterruptEnable(&KEY, CH1);# [+ S( Q3 m! R& L# V2 m5 E$ L: l: U: C+ a
XGpio_InterruptGlobalEnable(&KEY);) J* w0 t3 J$ x! H
) H7 t( l" |7 @* ?6 n/ s, U }: v XGpio_InterruptEnable(&SW, CH1);
! `8 `0 L! D% F$ m" ]3 X. _5 o XGpio_InterruptGlobalEnable(&SW);& c7 ?0 B1 R' W$ p8 l! O- ]2 h& U
_9 s1 J# g6 @
print("Hello World\n\r");
. o+ {' M0 G" Q1 B+ k2 `& v1 F& v- I' R& {
# d G, l1 d) U% E6 o while(1)
& a5 y# S l7 T9 m1 \' H$ i0 x8 S {
0 O0 F1 E8 X1 q9 [. k' O, x6 g; {* s
/ z/ o5 E, O2 ?( F
9 Y- ^7 u' N1 h" A' u& k; A }* T! O+ i1 D% w' @$ l
. R8 ]/ ] |/ @% y$ i1 D2 [" B+ S* h; w0 |
return 0;; k- J5 J: E# W0 L) F; ]
}
# J2 {' _, s: a
: R. V+ c% _' w' k2 ^ |
|