一乐电子

一乐电子百科

 找回密码
 立即注册

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

microblaze 中断控制原理

[复制链接]

版主

Rank: 7Rank: 7Rank: 7

主题
276
帖子
1366
一乐金币
5111
精华
0
阅读权限
200
注册时间
2008-11-22
最后登录
2020-5-16
发表于 2019-10-2 16:26 | 显示全部楼层 |阅读模式
利用ISE14.7中的软核Microblaze来研究中断机制
' l' M  u& X- z* l9 F本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的4 d' {1 N* q5 E2 x9 d# H5 N* N7 g2 u

, x, t, c; a1 m3 p1 P6 z8 O第一步:建立一个GPIO实例。
: U3 s- a) h) ^2 F/ H第二步:初始化这个GPIO实例。
8 R+ f: Z8 M, [7 {3 I' B% `  B第三步:建立一个中断实例。2 j! @2 H; o4 L# P' U" F5 B& I) R
第四步:初始化这个中断实例。# \) g% J+ K1 T
第五步:建立一个中断处理程序。% f0 t0 T% ?& A  S) m
第六步:利用XIntc_Connect来邦定这个中断处理程序。( k: `' A, r: B
第七步:使能XINTC中断MER IER " O5 x' r3 B! S- P5 O  N  a8 E0 F* \
第八步:使能XGPIO中断IER GIE9 X' t+ X) ]7 z. ^) G
完成
$ \, Z. |- P6 ?8 o1 S
4 O* |. q* F+ q2 @+ ~& a8 J
# |& D* e  v1 \  n/ S0 [! A
) m' V4 s0 L  Y) L( G; l: z1 n" d! F3 t2 [1 {
: v  @- w0 E4 \! C: w$ O; s
/ k! d) N1 ^4 s, q/ L

( Y7 c+ f% v9 U) \% Y, n/ p$ ~8 x1 w, e' d) d% _1 g

. @. D- o/ x, X3 h9 U7 T1 Z
& H' I. h# w" t. q0 p  D7 Q- V# w  d- ]' @' L2 `
+ F3 K2 ^: S2 ]0 e3 G% i1 f
源码:- F7 m/ I; Q2 Z$ T: i/ Y+ ?& `: n
: A; o$ n' Q% ^3 t' H
#include <stdio.h>3 \- R& p  n: W8 n9 A7 o
#include "platform.h"
# ?3 M, S  [: `* P& Q( Z#include "xparameters.h"+ g6 F; D* ^" k; f3 y' C# N
#include "xgpio.h"4 o% Q1 [: d+ R' ^1 W! t; V
#include "xintc.h"
. p/ D: Z0 B  r) r#include "xil_exception.h"
$ v5 @/ r* }$ B0 A' Y3 V. e0 e9 w0 H, |% P$ T( J" r
#define CH1 1/ G4 r! Z0 k. o3 E

; `. q' A$ @1 J. w1 UXGpio LED;
% c$ O: A9 X9 J  \6 g' F( aXGpio SW;
6 H$ c. X- E2 ?XGpio KEY;5 t1 ]8 Z! m9 _+ b
: |& d, K- a/ g# {
XIntc Intc;, n8 {1 U8 z+ Q+ T3 I2 D
& {3 Q' r3 w4 t( @9 B# b' ?( z+ @5 s
void SwHandler(void *CallbackRef)
5 b' i. ?- F4 C  ?{8 I7 z& U5 [+ P' Y" z; v  ?2 @
3 |* X/ B  \6 W
    XGpio *GpioPtr = (XGpio *)CallbackRef;$ W, m! }7 S( K3 d% `* V. ]+ k
    xil_printf("Switch Interrupt!\r\n");. n- f7 q$ a# |. Q8 R1 p! g
    // Clear the Interrupt
1 ~7 x3 `' b  S; I! @  j    XGpio_InterruptClear(GpioPtr, 1);
1 P- B7 E+ W7 y
) h5 o& x/ V) q1 L. s+ e}
$ u* {8 }/ r2 N5 X. `" @! e& W( L" C+ A3 Q% \  Y( a0 x: W

8 b: u$ P  @& f/ }7 f7 |& uvoid KeyHandler(void *CallbackRef)4 ?  o# N9 F4 [/ z, u, R8 X
{( Z) N9 o0 u4 [
" u8 S( M/ Z- q0 d

8 P# ^1 @( V, y' k    XGpio *GpioPtr = (XGpio *)CallbackRef;, |. L8 ]# M' R* x
    xil_printf("Push_Button Interrupt!\r\n");) ~) a! o9 j3 L' G# }
    // Clear the Interrupt
1 f+ _* u# C* i, G    XGpio_InterruptClear(GpioPtr, 1);
# }+ W. s" p7 e- B: o
& G+ C' s+ W/ w1 ^6 k. ?6 ~( {- ]}
% T0 J! [9 U3 s1 Y- c  R  g  T! J% V* q9 _) P+ x

0 }- G0 p: u- s  j0 @  c# L$ ^- w. W  w: b- O' e
void print(char *str);; F- m4 d% M5 w3 J% f- ~9 t) Q. Z
) O: u# s/ q$ T4 t
int main()* k% {( t' n/ @. @4 s+ r- F2 O0 k
{
0 P, Q% Q2 V1 o2 L8 W3 o# X    init_platform();
  W3 m1 C3 S& }$ W/ ^% `: ^7 ~- J; {( o
    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
2 q/ j4 s; ~; c8 w+ A+ s5 I    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);0 v/ |/ E$ r, H0 n. ^0 T* g
    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
! V) h% c7 ]( l$ E& T' E
  s/ |$ k+ d* Q  l    XGpio_SetDataDirection(&LED, CH1, 0);
0 ^! h( c, U+ c    XGpio_SetDataDirection(&SW,  CH1, 1);, [# c) J, J7 P: B# r. c' V2 P( b
    XGpio_SetDataDirection(&KEY, CH1, 1);
. F  D# l, F: U( B7 ?' {. J
. W0 F8 d: f  O    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off4 J# I+ Y& g7 a9 j2 Z9 B
& b: w: E) B/ F5 Z
    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);( C& P. y3 w: b+ v8 d
$ p/ C) |9 w% w1 o8 S  V5 T
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,- G! W1 O3 z8 v: b
                          (XInterruptHandler)SwHandler,! I  o4 |0 L; i
                          (void *)&SW);' X3 n; [+ V+ Y

: n2 x8 ~! E: S; x4 O) P    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,9 P1 I/ T6 G5 b" V
                          (XInterruptHandler)KeyHandler,3 g7 f1 U+ X; v4 j$ Y- h2 O, K$ x& h3 _
                          (void *)&KEY);
  q4 D- x  e3 P, T: y$ r9 [
" r3 s! O+ L: a! m4 ?* b+ L    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU  }6 D: n) T# A

& }& @. X  g$ k  t1 j& x+ q' f    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
* N; d, L# @% Z! d9 V( a    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt% {4 n3 S5 `* ~$ H/ t0 M0 v9 ?

& |8 ?5 u7 Q9 C# ~    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
5 M0 G' L2 d" J% y9 ]: b* ]% Y                (Xil_ExceptionHandler)XIntc_InterruptHandler,
: _$ G4 A1 w2 s- K2 R) c6 q                &Intc);
( ^* I: v- P0 _; @, v: R2 Q/ y4 z: c9 l8 ?/ Q: z* l$ j# B. Z! w
    Xil_ExceptionEnable();* [4 r) \; t+ ~9 Y# p5 E+ W8 e  F3 I, e

  O2 ^& i/ O, r7 f. e1 }    XGpio_InterruptEnable(&KEY, CH1);
4 ]9 K% c2 w5 _& ~& m- f/ K    XGpio_InterruptGlobalEnable(&KEY);
/ o8 ?- b5 ~- z. G/ y, ^
# `/ I- }! \, i0 h" O6 Z    XGpio_InterruptEnable(&SW, CH1);7 q/ g4 l2 K2 o
    XGpio_InterruptGlobalEnable(&SW);! ?# C1 |! L* P4 F8 U+ t

" Z5 |5 l0 t9 C0 k, [    print("Hello World\n\r");
' k/ V$ ~% v4 w" N. s/ ]
  }" y% y# j  W) k( J6 e6 O+ h, s- A
    while(1)
; i% G9 m" z3 Z. e7 j/ m/ _    {
& `% F* g4 G, w$ P
; m4 I) Z" k, f5 z+ m& ?4 l7 F6 z$ |5 u, V+ m0 i: T

7 n; Q$ J9 k: J, i8 B( _    }
8 J& i& \, a2 X% o1 I
- w" z, ^& h& W3 H
. r+ N. T# t3 l: h2 D    return 0;
9 ]* u0 q! ~# T3 X3 u. I/ J}4 U4 p# ~3 e% ?$ Z; r  ?

* l, O0 P9 q; b0 A6 I
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2020-5-30 17:41 , Processed in 0.056979 second(s), 28 queries , Gzip On.

Powered by yleee

© 2008-2020 一乐电子

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