一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

microblaze 中断控制原理

[复制链接]
发表于 2019-10-2 16:26 | 显示全部楼层 |阅读模式
利用ISE14.7中的软核Microblaze来研究中断机制; K) F! Y- E, y7 I5 \
本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的
( V) e1 F& t! m7 q9 S5 J- P  z* f' l7 p
第一步:建立一个GPIO实例。
+ W6 f6 p# {' D4 w; }4 d! s& R第二步:初始化这个GPIO实例。- Y8 U7 @0 s1 j. G( l
第三步:建立一个中断实例。
2 k. n6 A" w( B) }! D第四步:初始化这个中断实例。
5 j* x4 v" ^- H1 u% P第五步:建立一个中断处理程序。- ]4 [$ r6 ^7 O* B
第六步:利用XIntc_Connect来邦定这个中断处理程序。6 h9 V: d9 \& t) {5 d% F
第七步:使能XINTC中断MER IER
3 j! y* r6 p( \9 Z9 X第八步:使能XGPIO中断IER GIE
" P- R9 f/ w1 Z" N" {完成. V+ E: d! e) G% X6 G+ C

2 f4 \6 m5 C. h  v" X& I4 @4 B
% K6 D4 {3 n  l. v  r0 d/ y4 L3 W
4 d( C- |) y2 q1 y6 H) \; @
# f6 p) p: ?( A9 e9 ~1 P: R
& M+ e; d* E. V. e7 o+ H2 ]8 e2 q
3 Z5 I6 l9 ^$ e- ~/ o& Y2 M

. U& k6 Y3 U4 H- y$ n: Q
' u& m5 E  q0 V9 u! \" o0 K( a& C& s3 d, J3 `
$ i) _' j/ i! Y3 u, E; r9 e# }
$ P6 Y$ j5 C( I! G
源码:
  p( l. K) \8 {- }- c$ x
7 z3 [" i1 W" W# Z#include <stdio.h>5 ^, c7 j) ~3 |/ K, P5 j
#include "platform.h". x  ]: R% G) }4 b9 r" [
#include "xparameters.h"
& W$ D; n- g9 Q9 x#include "xgpio.h"
& n' Y" {5 u' `5 o+ B) `  G8 p2 O#include "xintc.h"' y* J% o) p/ F+ t
#include "xil_exception.h"
+ D* U5 u% M& p; N0 t1 V1 M
- w6 o9 l+ R' [  b/ {' n7 l8 x#define CH1 1" V/ `4 Q8 L" I1 t+ F9 [, f

/ A( X( q! ~# H1 j4 Z& dXGpio LED;
/ ?; n. c* N: b5 K; [, KXGpio SW;
( Q/ I9 ?& ~1 Y+ T% ~+ AXGpio KEY;5 B$ i) y/ ^: o5 T

; P2 K$ k& Q5 r  o( VXIntc Intc;# ~+ N# j% a0 c0 `, b

- D1 {0 V7 v) t% v8 `) {1 h; _2 Rvoid SwHandler(void *CallbackRef)7 T- T( }' ]$ u/ X' h6 X# L
{- l4 t' z* H5 V* b4 P% C

' J. p# D, e4 o8 e$ \/ L% \    XGpio *GpioPtr = (XGpio *)CallbackRef;$ k7 O6 Q' V4 ^# ?# n
    xil_printf("Switch Interrupt!\r\n");
/ D& W6 S8 r8 U3 m4 h" v4 Y    // Clear the Interrupt
. _; P/ O, r( W! D    XGpio_InterruptClear(GpioPtr, 1);" y7 f4 O: T0 p/ c

0 z  F+ x6 P/ o0 I0 B/ E/ H8 s}: \, j+ V+ d( M2 d: q& X/ v2 c
: P7 h# l. w0 j" F2 f

$ G6 q" I  ?  J: L6 h' }7 yvoid KeyHandler(void *CallbackRef)' A7 U# l: J" @# o
{
5 R" |' Y0 S; a  ~
* Z9 g# i$ X; C- g
1 u' d8 Z; v7 E5 e& A5 x0 B    XGpio *GpioPtr = (XGpio *)CallbackRef;
- k: Q8 M/ a. [' C$ t5 C- r    xil_printf("Push_Button Interrupt!\r\n");+ e  U7 F! B& C- k
    // Clear the Interrupt: p% z5 u- n5 b$ J+ _
    XGpio_InterruptClear(GpioPtr, 1);( ]. ]" p+ z: d" A8 h5 z9 J/ t
  F4 F! Q/ v' K
}
5 l0 E  Q8 a0 l. r8 v) ]( Q% _' k8 k( R

0 y8 d$ l3 V8 c- l& B: y9 v2 A6 b$ o; B5 h
void print(char *str);
  P: k: g; o' A. }/ L9 U3 P4 h# U$ {9 y
int main()7 ~( s7 E  s8 v; D* E# j' j
{
, E2 r4 r. s: M) ^+ U& ]. Q# e  n    init_platform();" ^9 W2 x- C; u# D, e7 j/ q+ l  E
$ ~' B# n2 u. j9 l- ~
    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);- o, }( T$ k3 |
    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
$ z0 i2 Z) k- L    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
4 }8 U3 V0 E4 I
, k  A6 S! E5 G0 x5 a    XGpio_SetDataDirection(&LED, CH1, 0);
7 y8 G1 d# g. Z2 _    XGpio_SetDataDirection(&SW,  CH1, 1);
$ g9 Q: J: ]# G# R" x0 L& t  `! i    XGpio_SetDataDirection(&KEY, CH1, 1);
$ b# a3 Y8 y+ X1 e9 y  O) g+ ?/ O: v5 D
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off- S% m4 `& d/ Y: z

. ]4 l% n0 k4 h" b0 x. P% ^    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);; Y* ?1 c+ ?2 I! r# o0 h+ v5 S
. d$ U/ \' Z& N6 |
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
% `  R- u! ~- d( \# E2 G                          (XInterruptHandler)SwHandler,, z$ ?3 o9 B! y: B9 X  }) ]. v, q
                          (void *)&SW);
" g6 J/ q) L9 i" p
4 s: [+ i8 \$ V& v# P5 d& i    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
: y/ o  x, P2 w( L- V& }" n                          (XInterruptHandler)KeyHandler,
! s: M0 k* z! n: @                          (void *)&KEY);
: p! [5 k- `7 G" P# d. T5 z8 i, f: m
    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU
# D0 b5 N  S# f+ o  x4 Q; V4 J  d/ y4 ^+ y5 Q( x0 T
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
% O3 `! d2 H# d+ S1 I: r1 C    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
5 m2 z: R0 n& E7 s5 [4 C' p( x9 G- t# m1 `; Z" h6 U
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,+ \& b/ n/ F% j+ [- W  N5 u
                (Xil_ExceptionHandler)XIntc_InterruptHandler,8 d2 T( M* ?/ b
                &Intc);0 }. Z3 |* x3 w5 ^4 l* S( G  |* m

4 V9 T( {* ]% V, t" N. v3 c    Xil_ExceptionEnable();4 _3 D9 ~% J0 i5 `/ N
+ ~4 }- P, L- h& L) |
    XGpio_InterruptEnable(&KEY, CH1);
. i' C/ N- c, g, l! J' F# d7 ]    XGpio_InterruptGlobalEnable(&KEY);
* P$ h& D: h( R
# H! w8 y4 A9 p8 o" \/ n    XGpio_InterruptEnable(&SW, CH1);
: {- Q8 G% Y% P6 \4 v& s    XGpio_InterruptGlobalEnable(&SW);5 p/ W2 ~, }, w+ v9 e
& ]& s  j& r0 ^4 ?
    print("Hello World\n\r");
6 G) C, y& d$ [6 l; K3 F
: n' f- z% b9 }: }. ?" V% }' @/ Y3 X7 c! G) E9 D$ q
    while(1)$ s& v( T* ~9 b' [! [2 O7 p( N3 ]$ |; ]
    {
# i, O1 f' t4 {4 D5 W  Y. A3 @
* ?( c9 |5 I1 N5 y! z* N5 y" l3 @  d+ M% B
/ z, T: n/ o, D: U
    }+ i9 U& P) G; g. u; K$ G
7 T/ J1 i+ J/ i! |# p3 }

" Q# I( W. m: X$ V/ x9 u9 z$ j    return 0;" J/ t% x9 }" h- n
}" M5 k* r) c1 ~& V4 k8 }. G3 p$ n" x

3 Q8 z5 Q8 |. _. E+ M# A- n( L; \% q

本版积分规则

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

GMT+8, 2025-4-28 05:23 , Processed in 0.047908 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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