一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4703|回复: 0

microblaze 中断控制原理

[复制链接]
发表于 2019-10-2 16:26 | 显示全部楼层 |阅读模式
利用ISE14.7中的软核Microblaze来研究中断机制
; N5 w4 ~6 c- K  E* R1 `5 H本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的
: t# \" [; w* @7 c: Z
6 b6 g5 D5 e8 o7 Z0 a9 q第一步:建立一个GPIO实例。
0 Q& W. q9 k2 `3 `- m第二步:初始化这个GPIO实例。3 t$ t) {( z/ g" f- [/ x/ @
第三步:建立一个中断实例。/ B5 M% X4 v5 p% J
第四步:初始化这个中断实例。+ ~) F( `; d& ~( e
第五步:建立一个中断处理程序。% \2 M* {7 L! w: Z
第六步:利用XIntc_Connect来邦定这个中断处理程序。6 W. `0 u& g+ Y
第七步:使能XINTC中断MER IER - X7 d  N7 f& B1 l) v% u
第八步:使能XGPIO中断IER GIE
6 |3 Y0 ?8 ]6 m4 c  E- H  r/ \0 F完成; X+ O- H8 U" y# v3 X, F7 C
- A3 O# N  F6 C6 B& q6 R' [

7 k2 X  F* V% k2 n
; O9 Y2 |, R6 o- O! g$ O
# \5 E. @% ?  P9 K; o; K5 Q6 w! i6 ], }5 A7 k; ?5 S- {# x
9 F9 S* s2 g) b0 f3 f  ?, [' }
2 K* C5 \! d5 a- t1 l

' G. O+ d$ P7 k
, W9 K& j5 M" e, v* y5 n, v& v" K4 [- C! P4 N' G

4 U* v6 U' X% ]' [5 p' v  d1 N7 I1 h. r- j8 n* u
源码:7 R% w, m; g8 B6 k9 ]( y
' a4 [) r: W" Z: s
#include <stdio.h>3 f, R6 @8 x4 d- o$ H/ u+ p  a/ ^" B
#include "platform.h"% @7 q; m* q6 E. x: r
#include "xparameters.h"2 Z2 @. B% D: C$ N; r: {. \) h
#include "xgpio.h". P6 O$ ~* x2 X: I# B
#include "xintc.h", x0 X) Y8 [9 b9 c" \3 G1 b! ?2 t
#include "xil_exception.h"+ X9 |3 w. s# K

7 O7 s* D& a" C  l2 x#define CH1 1* L2 i" J$ d3 \! G8 P% q+ d
5 C" q: j9 h$ S1 M9 ]
XGpio LED;, h* V. H  ]( f4 ]( E9 T  B
XGpio SW;
+ t7 g1 U) B- D2 w9 ^XGpio KEY;
- r5 n: J. H! `8 A9 e" J1 E3 W* \3 h9 K8 f
XIntc Intc;
( O; P/ `8 l) `8 @# m6 ~5 i( i. w5 ~7 b5 ]' i$ [1 S
void SwHandler(void *CallbackRef); D5 R7 ]6 |$ l  ]
{
( B) j( O* E- U4 v* Y/ k+ P' R
3 ?& t" H' M- p  d( q    XGpio *GpioPtr = (XGpio *)CallbackRef;
6 R' H- X$ y; Q" [' N    xil_printf("Switch Interrupt!\r\n");9 ]: Q9 t& Q: v5 }) j6 u' S
    // Clear the Interrupt& F. Q# O+ p, y9 F+ O
    XGpio_InterruptClear(GpioPtr, 1);
3 X2 @: \. G( ?  q" W. d4 B. l4 E3 r4 `) s0 b( C
}' s9 k% ^- e9 g3 \+ t$ [% \
5 r, L* f' e* T6 L* P6 P
1 T0 D0 s4 N# }$ N! G3 E( {+ _- v  B
void KeyHandler(void *CallbackRef)  a8 D" p6 y% P7 M: x
{& _+ E) u9 q% g  l! k4 P
& A5 P, y: n" C/ R; o

4 k, _$ i+ I: ^9 f    XGpio *GpioPtr = (XGpio *)CallbackRef;0 a5 b2 _: B( T, y& G
    xil_printf("Push_Button Interrupt!\r\n");1 r* d' x! Z4 Z
    // Clear the Interrupt6 w* |7 B4 w" R6 q& \9 X+ }  T& Y
    XGpio_InterruptClear(GpioPtr, 1);
) C0 K* M  ]1 s# @4 v
0 C' f  {" H5 ?. j5 u/ M- A}
: p; v0 v- O$ Q  F0 A( W6 m' e9 r! u2 S  B- v9 j, I7 m7 Y
! L+ c* ~4 o/ s* K% j( x& z) z
9 B$ w1 B( {2 Q9 `( [
void print(char *str);
1 e4 Y! h3 D/ ]- U% y# K
6 s, z7 x: J. @/ f! T0 n2 Sint main()
& H5 C- n2 h' c' ?! t# {$ Z/ y{" `7 X! B2 @6 _0 ?
    init_platform();
! w  j4 e) d- X+ x/ A
  |& W6 n* v2 \$ t$ d    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);/ r7 {4 X  j5 f+ k9 G$ c/ |
    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
0 k4 j* M, J9 B! J1 W+ i    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);7 @3 o* u( t7 `: Z2 @+ C
) s  o8 A5 ~) }2 w6 B, v
    XGpio_SetDataDirection(&LED, CH1, 0);
  k+ b. a+ A* {1 h1 C    XGpio_SetDataDirection(&SW,  CH1, 1);! A2 W3 }, M0 I  n* W& o4 G  I
    XGpio_SetDataDirection(&KEY, CH1, 1);4 E; R: r/ B* Z$ }  e# [
3 v7 l* N* c7 K( X' O" l
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off3 m2 G4 J5 x' F  n
3 d$ \0 Q7 Z6 Q
    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);
' s$ [* F' v. r$ P' h# i4 O  X* o% f  `/ u
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,* Z0 }' C& \+ P2 R6 P% W
                          (XInterruptHandler)SwHandler,/ I) Y. U6 {2 [! Y2 R* B" V5 P
                          (void *)&SW);- e- g( \/ s% B
$ O. G3 m3 U: S" y7 e5 D0 d8 J6 `- ]$ r
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,# d; o3 w, f# t% E: O9 ~, e% N
                          (XInterruptHandler)KeyHandler,
: s, g6 q4 `9 I: \: a% w4 m8 a                          (void *)&KEY);
2 K4 d9 ^( w( M$ A  Q
5 ]! B1 ~3 \/ Y    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU
2 h2 q6 k9 R, c0 K" G/ o" P- T/ U! ]1 r/ n& Q( [
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
$ T* y9 @, D# H" ~+ z1 _- V* M    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt' q! B- o  r) C: p

; @+ Y- f. Q4 }. p( b    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,- ^6 C% @% }4 c! h* |
                (Xil_ExceptionHandler)XIntc_InterruptHandler,4 e5 |* D9 F8 v# a7 f4 O2 ^6 M3 U
                &Intc);0 k' r2 H5 v, X4 p$ |" v( a5 I+ o
5 G2 V, \* }1 v0 j
    Xil_ExceptionEnable();
2 q; A- v2 v4 V4 o9 J* I
$ x0 E1 Z  G! B2 b9 O    XGpio_InterruptEnable(&KEY, CH1);  D  @; @8 O9 [9 G5 F% Y* i
    XGpio_InterruptGlobalEnable(&KEY);3 B, F+ i. E, U; S: }2 d+ T& x
# V0 |& L" X3 g8 h1 n# F  T
    XGpio_InterruptEnable(&SW, CH1);0 Y' A& X- T2 Q
    XGpio_InterruptGlobalEnable(&SW);
# O: [  E9 U, D& {; ~
0 ?% N0 `# X* I/ q5 A/ @    print("Hello World\n\r");
, p6 U% i5 I+ q9 C5 N) h6 S# S) v1 A" H4 U! T& i: s$ y3 n

+ c2 }) j# h& R* H" H1 P& i, ~% a1 n6 l& A    while(1)% A* i/ {0 g% [3 p8 P6 v
    {' U8 [" {' [" b/ ]! ^, ~

: u$ u$ O# E" t! I
' ^8 P/ I/ F$ \2 f( l0 I5 S* s# B1 H: \9 G: R2 s
    }9 ^, A* F: f' B4 @: \! s

1 @0 v5 v  u( `0 ?# d# f& G) a2 y4 j7 l" P
    return 0;
9 B* L0 ?# d$ |}( E- U+ I+ J* C! N
" p+ u+ S% r8 C, A) w2 M

本版积分规则

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

GMT+8, 2026-1-11 17:23 , Processed in 0.032183 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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