一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4912|回复: 0

microblaze 中断控制原理

[复制链接]
发表于 2019-10-2 16:26 | 显示全部楼层 |阅读模式
利用ISE14.7中的软核Microblaze来研究中断机制
: ^9 a7 S0 }0 p* [, b+ F本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的9 y9 c) K( y9 K3 |  v# ~2 ]& Y

! |6 b3 E. h1 \第一步:建立一个GPIO实例。
6 y. p0 B" z6 w; ]) O3 `+ R  F第二步:初始化这个GPIO实例。
% F; y2 u* L6 O/ Q0 Q) \第三步:建立一个中断实例。
' R2 M$ |8 E+ c4 U% G$ {* V第四步:初始化这个中断实例。
0 m: C; y+ Q& \第五步:建立一个中断处理程序。; \: A/ B( F7 H% _5 u
第六步:利用XIntc_Connect来邦定这个中断处理程序。. ~" D- ]0 \$ L  X* {6 ?8 A# E
第七步:使能XINTC中断MER IER
: B( }1 l6 B6 t: Z* N第八步:使能XGPIO中断IER GIE+ e! j, C- c1 h7 V4 C
完成
) q3 k' g( b- t1 v$ o1 J8 w" }. `4 f6 V3 T& }5 H

/ {4 q6 v! Z8 h, I" s* _7 g, t
' V, _2 t2 U' q" O: p" o$ s8 f0 E' b8 f1 b
+ u* X( d: C% J! E& D+ U
. K7 K$ z3 {' c7 k. x$ M& \

2 W8 u  U6 E5 i$ g4 T0 {/ ~: Y0 A$ T1 L3 D9 }% ^
) u# [" A9 [' ^8 F. |0 Z" `
% m' z( a1 ]6 a- a% J
4 f9 R( z# d5 F
, M2 t; O7 D) l: ^8 G5 \; v
源码:# A, z1 p$ s/ p7 `) z  v/ f& s+ F& v

% }% T, M! T3 Y8 Z7 J/ M#include <stdio.h>% T7 H8 G" d# v! _- K$ F. h4 X: G
#include "platform.h"
  ^# q2 x+ F4 F% y#include "xparameters.h"# t$ p  L9 u' n
#include "xgpio.h"
* l# v4 N3 z6 j4 h- V2 {% c* {/ s& Z#include "xintc.h"3 K% Q2 }/ K$ A1 y  T
#include "xil_exception.h"
% X! G# @' o6 G* Z" P+ v* z. W; n& u" v. {1 M9 Y) U
#define CH1 1) S3 W( ~: T1 C" i' K7 u

5 [2 j/ i* T( C5 B1 G7 d" v/ C/ g3 eXGpio LED;
; ?/ g% w$ ?! }( I5 DXGpio SW;
4 O1 Q( Z9 P9 f/ y- jXGpio KEY;
6 S& x6 @; R* E+ p* W( q. C
4 l& x  [8 l% Y( J$ ^7 ^3 J* _; eXIntc Intc;
2 o4 g1 h$ O$ x# o  p3 s( p8 `5 V% e. {) [/ w* Z+ z
void SwHandler(void *CallbackRef)3 n" f4 e) p; H  D, K9 [
{9 p$ G- b+ Z% z
, ~7 V$ t% R& u" F: P
    XGpio *GpioPtr = (XGpio *)CallbackRef;# {, I9 ^/ n& Y
    xil_printf("Switch Interrupt!\r\n");6 S1 _% C; s) N- B/ T- l$ Z. I9 A
    // Clear the Interrupt4 ?" j9 J# `& v! D; H
    XGpio_InterruptClear(GpioPtr, 1);
3 O8 u, S- i/ s* X9 H; `- d6 C6 _% L2 a
}
. k- K* N8 D+ ?( N2 x7 O9 S2 `  ]% ?" o" P
5 w* K3 H! p" I8 d1 T+ f
void KeyHandler(void *CallbackRef)
, k8 W) D9 w) G7 H3 q{0 i( J! m) N1 C9 U/ o2 n0 V" j

& m7 l, T2 `/ D& V& ?5 {+ k5 E0 T2 J' [3 c& \; h
    XGpio *GpioPtr = (XGpio *)CallbackRef;5 F, E& Z1 Y# c4 _
    xil_printf("Push_Button Interrupt!\r\n");
# T& F( r2 w6 Q9 }    // Clear the Interrupt
# n5 s+ o9 n. d, g    XGpio_InterruptClear(GpioPtr, 1);
% V: M4 {, w( M, C: y5 ^' Y1 N
) x2 J" n% z* C+ |% Z6 j# I}8 Z6 f2 B" R' i- c, I

6 @1 g' q" N( S9 e" t; ]3 o9 Q; A! ?" u0 G5 j& a8 X) c% y5 f' h/ O
) Q- x- H5 A- Z$ P3 [' H
void print(char *str);$ U- a! ]9 s; M) \+ n, {: j# H& I% P

9 y! \2 B# o" ]7 Z- sint main()/ I3 e' \: }8 ?
{
: l( G8 F! Y) Y1 ^! M    init_platform();7 z" L; C/ U0 _7 z8 m/ e

. x! D  s- c( t; E    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
$ Q& d: X# Z' V  Y3 ]    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
+ v& p/ A/ T1 F% s  j0 f9 V    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);; V+ t; u" u6 c2 {8 g( r
) h: {) Y3 K* s
    XGpio_SetDataDirection(&LED, CH1, 0);
5 w8 J& H4 a# F. ~    XGpio_SetDataDirection(&SW,  CH1, 1);
, ~* h+ i+ [# q, I. w    XGpio_SetDataDirection(&KEY, CH1, 1);
' x) a2 ?. W! g
& @3 g5 |) r- y/ x' `% ^$ \    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off- d" Z* Q; F' A4 o3 X& l, w" M

2 I( K% ^% P' S    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);
  u' c# b9 x% T1 W6 i" w% H! b, W" Y8 c& U$ i
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,) y, z& k. ~2 m& S
                          (XInterruptHandler)SwHandler,0 y! r, _8 x% r6 G, o# j% R
                          (void *)&SW);* x! L, Y0 l: j  y9 M. P; p

/ O5 Z! U8 B1 c4 }# T; @3 a1 v    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
5 `4 P- v; j' u) H  A                          (XInterruptHandler)KeyHandler," l, w* w# V$ ]3 q0 U2 \- O
                          (void *)&KEY);! K1 v4 z# `. i! n/ X3 s* C
, T. S8 u3 s! d
    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU
+ L* Q# C2 b- Y' g
0 Q0 }. H, D7 o' T, s$ o5 N    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt# W: X/ P: `! K$ v* ~5 X1 b$ f
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
# f9 {, n% k) A. j4 H9 ^; J+ ]4 f7 S; L* ^1 Q- U
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,4 t: o4 v. f3 M$ F' H
                (Xil_ExceptionHandler)XIntc_InterruptHandler,
5 u* C9 R5 ?5 Q% m: C2 k                &Intc);
2 G% t5 m# N# ?; \
6 b1 X) ^% N, a$ D1 T" D. q' a    Xil_ExceptionEnable();9 B4 l$ e( }' `; z
( V8 `9 p1 X* v. R4 B: C* R
    XGpio_InterruptEnable(&KEY, CH1);
9 B) Q! D% T  A5 X1 ?( ^" Z    XGpio_InterruptGlobalEnable(&KEY);: g. i. y: N, p* k
8 T! e. Y0 ~7 [4 M; c1 }4 U
    XGpio_InterruptEnable(&SW, CH1);* R2 c, u% \# t' [1 D( L
    XGpio_InterruptGlobalEnable(&SW);5 o4 Y( o5 g7 z3 X2 h6 W
5 A1 G: w" D) _
    print("Hello World\n\r");; o' {- q) V6 o, g/ f( w$ ?

& G+ s+ I. G( z% U- w3 u- [2 j+ N! C+ r( j7 h. [4 K
    while(1)
& `) i, s: z% ]. Z) ^& l    {
$ V* X+ }' y0 W9 D% ?" D5 w% U, c4 D5 o! w* N+ f9 v6 V4 k% I
- U7 C4 f0 l' U* ?, `# p9 X: u

! q+ t; i" e* q  m    }! L6 N+ a( n5 o) P( a5 ]! L

2 \0 s, h$ h$ V( Q2 e/ i
% S" g) M3 O; T1 a. m0 }$ H" w    return 0;
' s6 t: V$ B" k) |- u& b! w}0 N$ P  T. n! |( w
% J; \1 f! ]; F. L; N( q, ^

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-4-17 18:34 , Processed in 0.031965 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表