一乐电子

一乐电子百科

 找回密码
 立即注册

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 974|回复: 0
收起左侧

microblaze 中断控制原理

[复制链接]
发表于 2019-10-2 16:26 | 显示全部楼层 |阅读模式
利用ISE14.7中的软核Microblaze来研究中断机制# }( p# @% [3 z0 Z0 D
本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的
9 }8 Y6 `- K' k8 b3 F1 s
9 V) Y9 ]4 v2 p' d3 C+ P& J第一步:建立一个GPIO实例。
1 E4 w! j! `: Y$ k第二步:初始化这个GPIO实例。
3 U* K/ v. \* S8 u7 d& g9 V第三步:建立一个中断实例。, ]0 p) o, s' E* G
第四步:初始化这个中断实例。0 {# _3 w% a1 D2 Y, m& o3 b
第五步:建立一个中断处理程序。/ @* A1 _- [# h; `' |  t. l
第六步:利用XIntc_Connect来邦定这个中断处理程序。' p: R5 I0 e) s3 m3 l$ m
第七步:使能XINTC中断MER IER
4 s+ u9 H. d  ]. X第八步:使能XGPIO中断IER GIE; ?2 s. j9 f/ Z3 w
完成
2 b' D3 Z  g# O7 Q
1 M, m; E* Q* T" D* i
" h: T, j2 Y4 a* w1 T7 |* L8 z8 Z% s) f, C6 {

) @) N* |4 \( ^# a# n- d" n3 e: w- W5 _

" ?6 g, \0 z& O6 }/ ^9 X, f3 f$ ?8 ?

' e1 `. O7 e0 \; Q* U' H4 I7 U$ g/ V# W% u
3 [. c1 a  M' e+ F( Z: C
' E0 }  I' g4 l+ M
- r# g, k0 A0 `! Q) R% m' t8 H
源码:' d0 l5 h# `  N. v  A: g8 W2 o
- {3 A& _; r0 u
#include <stdio.h>! z9 o8 u- g" c* l: v
#include "platform.h"# M6 o8 p4 o$ F* I( r9 x+ m8 A  a
#include "xparameters.h"
% m# X0 O0 `" ^& W  B#include "xgpio.h"
- E2 J2 i. m7 \#include "xintc.h"9 @) h; }4 P" N0 B+ n6 n
#include "xil_exception.h"
5 Q5 ?; i. c8 V0 O* s" j7 A( O
2 ^; Y' K# a0 x. A. k#define CH1 1, m1 k0 T; q1 K1 E

# f( R$ w3 T! N4 Y* P0 T' tXGpio LED;
( K/ D' i- j2 X% p$ k" ]XGpio SW;! Q/ `/ ~8 e% Y3 S8 D/ a
XGpio KEY;
+ w7 L- N2 {% k# a0 K- \7 C$ ?* D. g% Z; h8 E9 u
XIntc Intc;
: c& @* I/ t/ \" T9 K( o! P
* g0 ?+ e6 O. C4 X, u, v0 R, R& P/ B& cvoid SwHandler(void *CallbackRef)
8 w$ D* a: l( P! h6 E' a! l{9 f  A5 K$ B, H6 x5 W$ U

  P1 ]: v+ g! y: a    XGpio *GpioPtr = (XGpio *)CallbackRef;
3 Q% P6 A3 L, b& ]    xil_printf("Switch Interrupt!\r\n");
$ N" L7 h+ N1 b+ |% E& _    // Clear the Interrupt
  y" b5 f) i( Y  s/ @6 a# G    XGpio_InterruptClear(GpioPtr, 1);$ l  R0 j& }9 B- K. {8 e* y2 Z9 f1 |: ~

1 x9 R1 B* T$ m, b5 S4 n+ u}+ A: [0 E6 K" u- H8 e% ]# Y

9 d: X+ b& G0 y
3 \7 @0 I1 \2 E; u5 Cvoid KeyHandler(void *CallbackRef). y/ J5 P: E# k$ G
{9 C; r- s0 b# g8 D  B+ B
4 x; c* ?$ d0 U0 w) G" g
8 Q6 b/ P0 \4 N6 p2 I
    XGpio *GpioPtr = (XGpio *)CallbackRef;
7 ^: V/ {; o( a! t. A    xil_printf("Push_Button Interrupt!\r\n");2 E) z1 Z4 I* g5 m
    // Clear the Interrupt
' Q) I, O# s& y0 J. N/ D    XGpio_InterruptClear(GpioPtr, 1);
/ ?6 C) x) T. g% z: ~
1 H% J6 |6 H  O) T. J3 E% f}
2 w& H* k5 O' E1 Z& N* E8 [5 ~7 `
4 J" I, F9 I& L+ K% P+ Q2 w3 M# T
* v* I$ F: B& ]% E0 V& [3 Z. L; k2 G  e
void print(char *str);8 \' k" i, K# S/ f
% R8 y# [% m$ r# F0 ]& d2 w5 ^/ s
int main()
2 }4 v8 j: m; _/ O2 @6 |- Z( G{: A6 c9 w# b" z; ^
    init_platform();
9 z' x5 n1 b6 m! ~, Y2 g9 t3 ]; q) i$ o) v8 U& ]7 ]! i; Z, v# h
    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
8 n) N& f( ^) f    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
; f8 Z, t: q+ D( B, m    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);3 G% |) l; b0 W' D

$ e' e0 |! ~# G% r    XGpio_SetDataDirection(&LED, CH1, 0);0 w' g0 n6 L; ^( B) }
    XGpio_SetDataDirection(&SW,  CH1, 1);
- F/ D: a+ i3 t. e    XGpio_SetDataDirection(&KEY, CH1, 1);& q$ w7 J2 W0 @: L: l- c
  B6 k3 P$ X2 r6 t* t
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off
4 J3 C8 v+ u) o. V/ s! F8 S6 l) V" D' G0 c* r  j$ {
    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);. u' b$ N! h4 _' i6 g- x* s
: M* g5 S$ l( q2 n' Q+ y7 _+ w
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,: i4 u. N& s" n3 Z
                          (XInterruptHandler)SwHandler,; r  P1 }3 z. _+ }9 x7 ?3 F
                          (void *)&SW);! ?' k" Y. N- H6 |( N$ z
$ e( e3 p. X8 @$ c! v, o! [
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,5 Y6 J, \& p- z- v7 [
                          (XInterruptHandler)KeyHandler,) X4 D1 u+ q0 ?5 D$ X" q6 O& \7 F
                          (void *)&KEY);
% J, F( b% T0 P1 a# C9 i
3 A: Y1 f8 M' R8 z    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU* F' B  T' w! p3 b  @/ {! x

# d: B- r6 p5 @    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt) ]; }! ~% F9 l& F* L! L  B( [
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt  T2 \$ Z- Q. y8 [: C' k
) G5 V3 y# g' F+ A& J
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
4 n  |- x6 _. \7 K+ o9 B% Y                (Xil_ExceptionHandler)XIntc_InterruptHandler,6 t! x- P& l& m. d" L
                &Intc);+ C6 w8 Z$ H5 Y( G, p
6 @- O1 y, l% o" M' e, w- ^4 X! `2 ?- k+ J
    Xil_ExceptionEnable();
1 M# I' g% D5 ^' [0 h. e# t+ C, O% n
    XGpio_InterruptEnable(&KEY, CH1);
& W& N% r: j2 d9 i- N$ p    XGpio_InterruptGlobalEnable(&KEY);) V/ w  n% U4 G' I
! ^6 K3 a: N( W% @: S- d6 {( V$ J
    XGpio_InterruptEnable(&SW, CH1);
* M2 K! ~4 i" N7 |& m    XGpio_InterruptGlobalEnable(&SW);) k1 W  p! t0 S. \) \# z! Q( I5 c4 k. K# y
, K& z1 L4 [+ h9 v
    print("Hello World\n\r");
5 W& F* S6 H6 b! S8 J2 ^! k5 `8 @: w+ L( a9 f
( r6 [" Q( Y8 Q' l2 m
    while(1)
3 w5 V5 ?7 b( g0 G& [    {" _3 h$ k% \+ n. z4 ]* J. R
. P2 [1 u: f- o' h

" y8 R, U  I4 y, V+ @) c2 h' y0 C- D9 ?: y2 g" K+ B7 y
    }
" p( U/ ]9 D! i/ K, w
$ @1 b( ~7 n3 @- A/ m) E$ D: G8 w1 Y& g" i
    return 0;
* z/ a' ?0 x) a$ ~( c}. ~' O5 J- w) w% |

% x% |& Z2 n& m8 u3 i7 R
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2019-10-19 23:57 , Processed in 0.036640 second(s), 19 queries , Gzip On.

Powered by yleee

© 2001-2019 一乐电子

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