一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

microblaze 中断控制原理

[复制链接]
发表于 2019-10-2 16:26 | 显示全部楼层 |阅读模式
利用ISE14.7中的软核Microblaze来研究中断机制, g2 ?2 {1 i9 s8 L' E! Z
本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的9 Z0 b+ k* e" R

6 p: C- B6 |! q7 U$ I6 n+ f3 D第一步:建立一个GPIO实例。3 J2 X: g$ i7 s* C' B$ y
第二步:初始化这个GPIO实例。
* Z; e2 m; G, K5 f! N& b( l第三步:建立一个中断实例。
2 P: m( w! ?& r  F7 }8 c第四步:初始化这个中断实例。$ O$ l0 ]4 r7 I/ v/ ^( R# B
第五步:建立一个中断处理程序。8 H2 V  [# ~0 p$ F
第六步:利用XIntc_Connect来邦定这个中断处理程序。
6 ^' M# _2 @* M9 Q- |第七步:使能XINTC中断MER IER " ]2 S+ O% s6 @% M) h
第八步:使能XGPIO中断IER GIE
/ m7 M3 D6 E: f; H完成
  O3 J  h* J2 A  V7 w, e: l: ?: {3 K% e; r

) S* F) I9 a1 y" X1 t6 ?% \( O* }* j# r" s: D4 {* L
5 ~% z7 p  Q# s0 D/ a; i: j9 U' ]4 J
; l( m7 J5 v& [$ L
) j$ `4 Z2 C" _2 F, f1 b
, U; H; m0 j# }* U5 T2 v% \

8 b% M3 `5 b9 U+ v2 z: i! ~9 f% e4 m* ~: U

5 M+ E3 j5 I& c
5 p0 Z0 r8 ^9 X% v. ]5 `; L+ R6 S; u3 t
源码:# o" h" S+ [8 D6 F/ a4 b

& K! g+ P- s% @- b4 ]- _% K#include <stdio.h>
" R+ o. [+ M( x' z: Z* l. e+ O& D#include "platform.h", h1 A5 d% b; t* h2 ~& h
#include "xparameters.h"
( y, A  l7 @8 ~#include "xgpio.h"" u( O$ @" P0 k& a
#include "xintc.h"' v! V" V& N5 G% S4 w  [3 G
#include "xil_exception.h"& U; W9 R" ]( p' }
( G/ C1 ?  ^: o! v
#define CH1 1& u6 {3 y% N# `; l3 l$ p8 X) i
3 u. W( }" [4 @+ d& b
XGpio LED;1 w" j- P! ?- y% S8 ?
XGpio SW;
4 C, _7 e3 D$ W4 C9 }* d8 m& ^  t$ W. dXGpio KEY;
; o5 L( `4 W- a5 ]" n2 u9 \% m* V9 y
/ p* e( d3 G0 q. Q0 RXIntc Intc;
) N* m/ N; y/ K2 m8 X2 S. j  J& i/ f2 L" T
void SwHandler(void *CallbackRef)
4 ?0 d# x5 _, T$ n7 w4 O{
( Q8 x. S2 J4 \5 z6 m# X* n- y9 _( o$ Y
    XGpio *GpioPtr = (XGpio *)CallbackRef;/ s% ^+ h  C$ N, w" i8 \1 J3 A
    xil_printf("Switch Interrupt!\r\n");
% M" F1 {3 S; v" k! ]/ A1 t    // Clear the Interrupt+ u: B# r9 [  s# q( v! H: v8 i4 K5 c
    XGpio_InterruptClear(GpioPtr, 1);
( R: U% v  H% E% H" W; {
9 i' B0 o+ n- s, I9 a}3 y4 E9 l: I: ?  X- z7 N& o' w

5 ]$ n: j: g! [' D; W7 L7 M$ V; H; R  M- p; b% Z" ]
void KeyHandler(void *CallbackRef)0 f/ a: A7 g5 z7 K
{
) j# U3 J' o8 R  `  z) N8 `
. g" z) u1 _& T/ \, K( R# F9 C: t1 j' l9 R* _* a! R
    XGpio *GpioPtr = (XGpio *)CallbackRef;# _- A7 z# Q, b3 U4 V& A2 n
    xil_printf("Push_Button Interrupt!\r\n");
  F) n% I8 Q( P9 d    // Clear the Interrupt
: X) L4 a" K1 W5 ?2 ]! b    XGpio_InterruptClear(GpioPtr, 1);
* J$ ?) c2 I5 s. X+ X* ?& H, \
. S' e1 e# E" L! u}
- T6 `) p7 b7 U, H
' J2 i, B  y; S- I! F2 @$ E3 D" q5 z4 ]& _
/ a# D. W5 X3 p+ X' S( f
void print(char *str);
1 Z3 u5 Y/ v/ r& V0 L
4 C/ ?. i: `0 ]* _0 [" b4 Lint main()
& i4 \0 J+ @2 i% ^: v# e' b% s3 G{
. E0 F/ d' u0 ~& v' }/ ~: \  y    init_platform();
9 [( b% |( k3 i4 \1 B" F+ P  O" ^6 Y8 t$ n
    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
" |9 ~# \: X! z" k$ q    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
2 D: c( Y0 g0 q1 C& B    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
! r, ~+ j$ H- G5 a+ [& p, i: C$ a2 l8 S) Q
    XGpio_SetDataDirection(&LED, CH1, 0);
+ _. N- G" F; Z% c$ g1 Y    XGpio_SetDataDirection(&SW,  CH1, 1);. Y6 Z) S& b! p2 X; O+ `5 x, b
    XGpio_SetDataDirection(&KEY, CH1, 1);
' y5 F) Q( V. F$ u( [
7 K- z+ g, b# W" `) _$ T/ A2 a    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off
) f# H. {* m. a0 G1 B8 h, u, y
% W9 I* r& o/ c3 [( D) l/ a    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);
) c6 i* M+ X% R* }8 W- D5 f- t" }% [) _4 R. L# H
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,. d, y$ H1 F7 w1 A; c: y' Q
                          (XInterruptHandler)SwHandler,% l. I: {% l/ G0 [8 L
                          (void *)&SW);
# D, _  L( G# G+ g+ \
) y+ t; O' a; @& ~" S8 {    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
2 E3 c  V' F! c: O( o                          (XInterruptHandler)KeyHandler,
, O$ C9 h* q4 P3 \9 t! \. t& o                          (void *)&KEY);6 ]3 f& n3 O& k, l
8 P$ v) P% p2 m4 u5 e; I' r" Z
    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU; d+ f( _" v- d; c/ B
+ v! m! Q- I# O/ e
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt' @+ J$ B/ `2 f+ j& l
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
2 X) ~: E* R0 S# j  L2 x3 D# o% ^6 X& \$ \3 y# X
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
. c6 x5 d5 C2 |2 E" J" _. r1 m% y                (Xil_ExceptionHandler)XIntc_InterruptHandler,
' {3 Z5 f" ]$ Z/ ^1 U                &Intc);5 e+ Y7 s; N! X9 Z% [

, ?* A' A# M. U7 A  W+ U    Xil_ExceptionEnable();/ E/ s& ?7 _6 ^! p! O" O/ @/ E
$ H* X- x. F: y$ [
    XGpio_InterruptEnable(&KEY, CH1);
5 G/ ]0 b; n/ S/ w    XGpio_InterruptGlobalEnable(&KEY);8 }. m- Z# l' y4 R& R& E
7 k9 W; e# |- H; G/ O1 ?- t
    XGpio_InterruptEnable(&SW, CH1);
: H2 C9 J& }$ f% o% r+ N6 H    XGpio_InterruptGlobalEnable(&SW);4 a0 W6 d6 r7 b. Z6 _% S) _

: U9 _& U- T  P! Z4 v. Y    print("Hello World\n\r");
/ ]* m+ i/ k5 q) S( e. i+ {# ?/ f8 u
1 g; j- [! S  W5 j; E7 Q  W
* j. K5 J# s8 [; i    while(1)
- a+ {! t  I" D/ g% D    {2 B  o" V, T8 n) V+ w; j

# C4 i8 ~; A+ t6 y# V3 R/ P( l/ I! y! y

. }- T; a2 ]1 o3 E: H6 Z    }
1 m+ ~# U: l. x* p) }& p6 s( Z  {9 K4 v
- e# f' c9 p  B* V
    return 0;
6 V) J6 b  ?$ T/ W! }" s& p+ }3 z}1 ?7 H# U$ ]) R% O
  [: i0 `. H$ a8 p

本版积分规则

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

GMT+8, 2024-5-5 16:29 , Processed in 0.050103 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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