一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4386|回复: 0

microblaze 中断控制原理

[复制链接]
发表于 2019-10-2 16:26 | 显示全部楼层 |阅读模式
利用ISE14.7中的软核Microblaze来研究中断机制
8 I( H3 o: x  T; B0 A# l; m9 O6 R本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的; e' ]) g2 g6 o% \
6 r3 A7 C# z  c) |2 i7 k
第一步:建立一个GPIO实例。- g7 u' K- Z' s+ W" S
第二步:初始化这个GPIO实例。
8 y, ^  c2 g1 K7 d第三步:建立一个中断实例。' k, R2 h# }/ `: F0 b
第四步:初始化这个中断实例。0 h3 p1 f2 S5 v2 w
第五步:建立一个中断处理程序。, B5 T) V7 @: s: ~. O! g8 b# q. q2 A
第六步:利用XIntc_Connect来邦定这个中断处理程序。
8 [' D. N& y: S第七步:使能XINTC中断MER IER 3 u0 v$ ~0 ?$ T( B2 Z6 ]
第八步:使能XGPIO中断IER GIE- J" k. T: n6 b5 J+ x9 L- j
完成3 T1 w7 W7 {. t- G3 M# s; [
5 [2 ^, u8 j  J1 z( F
9 @# u/ Q* q$ }4 j1 j
! D2 M8 m" L8 C# L5 P7 e5 r, b( P

) a0 ~5 H- q) u9 U5 w& e
1 M. B; b+ j3 s* E( c5 a! G2 x2 i$ V3 V* W4 i8 T7 W

+ v5 V/ b: g8 b9 z
( f+ }) F1 l6 v& [# z0 r; f+ n7 e' X# P9 _6 o

' F" V+ I( G% K. o& }! y7 o
9 I- m$ b. ]3 d
8 M0 g& J2 z: a3 e0 x6 W1 Z$ N源码:
+ ]# c% F3 h4 g! H! ^0 E# E4 p! U. p5 T6 f0 J+ E% V- c
#include <stdio.h>
2 p  h5 `# b' N0 x! r& @#include "platform.h"( B8 w( v4 `5 H
#include "xparameters.h"
; O' a5 ^' m2 u: t' j#include "xgpio.h"
. F) h) p5 |, w4 ~. \# j#include "xintc.h"3 Q$ V! j/ p' p* F5 c
#include "xil_exception.h"6 j5 r, J4 f7 j6 S

0 m& I% |/ ]! N* E; u#define CH1 13 h# z' B9 m2 u6 F$ W( l

  C# ]1 I- j7 }+ _XGpio LED;! A' |' r. C: [. W% W, l- X: A  U, x
XGpio SW;: R' J0 g1 [8 D+ o2 G$ Q, M% K3 l+ m, C2 A
XGpio KEY;
) ^2 A4 M7 K3 {6 T# \1 }
- B+ ~) H9 m2 F6 Z! X: G$ RXIntc Intc;
$ R& _* R+ d, o  }  L0 p& y1 Z: N) b3 v7 g1 _( y
void SwHandler(void *CallbackRef)
1 g( P# p8 Y! n$ L- U  g8 y{
0 X5 B  y4 P3 h4 k4 p1 L
0 Y! i, M( |7 j" j6 k& j    XGpio *GpioPtr = (XGpio *)CallbackRef;
5 J) H  ?7 g  ?    xil_printf("Switch Interrupt!\r\n");
" T6 Q; \# F' U: j7 M    // Clear the Interrupt
: ~0 P% H# @' [; k    XGpio_InterruptClear(GpioPtr, 1);1 |5 e( w: _* R- p

8 \+ `4 x. k' r}
$ ~8 o4 L) {) _. H; D; _' _% c- Q  ]' q5 P! y( I! O5 x

1 w" g2 N  c5 N( Rvoid KeyHandler(void *CallbackRef)) j0 H1 d# U3 m: O4 w8 l$ r
{
" I; y3 U0 [; `& e) i
+ a8 t  s0 k3 u0 p! i' n9 ^3 V6 w
+ f7 ]6 e. e+ N/ w# v2 n8 b    XGpio *GpioPtr = (XGpio *)CallbackRef;' _1 v* m+ R4 K
    xil_printf("Push_Button Interrupt!\r\n");7 ?! ~+ a; A- e! Y7 e  Z/ k4 ~& j, M
    // Clear the Interrupt
0 ?: k9 r6 q. ?% d0 B: X5 G9 T0 d- \    XGpio_InterruptClear(GpioPtr, 1);
9 u" N' v+ z% W) E2 q2 \
4 m# H1 W5 x& {$ ~$ u/ T; e}
( T! ^) H2 r! k8 k" T9 ]. P
( K. `" d5 Z' _4 w' I& F' ~. z) Q# y
1 `9 _9 Q* ?, ?$ W
+ o0 i" D9 @+ Dvoid print(char *str);: t  W7 w0 N6 h! l7 `! P7 q+ }6 t

: l+ R: u+ A/ Y, |int main()
9 s; Y6 q6 }8 p0 x* [! t+ A' y5 Z{9 G- ]9 V  ~% I
    init_platform();( M  a7 O, S: b' G( S* f) O
, [* q' l! N' K5 N: v: ]  G- t& c9 T
    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
6 y1 C6 E9 w2 [% P    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
3 |/ S& A: E# k- p    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
- [/ _2 ]. r  b% K7 ^: J+ ?* W. z' R( `0 q' ?
    XGpio_SetDataDirection(&LED, CH1, 0);  {. C5 Z( ^. ~' p2 h% Z
    XGpio_SetDataDirection(&SW,  CH1, 1);) R& y: I8 X9 }
    XGpio_SetDataDirection(&KEY, CH1, 1);
# t; f# S% w* N( X- E! ]+ ^1 @
% P  N9 V* {. V: h2 X8 m+ c: Y    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off
; u( |% Y; ?2 N& u! C. l7 J3 s6 t# K0 D
    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);4 Y6 U# p6 s4 {/ B

0 J, P& k+ \* _5 F    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
& [4 @( @; y, p0 |8 |  u8 b* z                          (XInterruptHandler)SwHandler,9 s3 B0 d5 @4 f* _6 T
                          (void *)&SW);7 A; ~8 x& f8 p! q3 `& l
! X  W6 k, J! X/ N" f+ W6 I3 v$ X, ]
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,) |' c3 `* i1 F6 t* L1 c- a
                          (XInterruptHandler)KeyHandler,
5 G. U2 h( O4 U2 f3 R                          (void *)&KEY);
. Q: w2 g5 ]* ^
. B; r; Y- v: Y/ K7 H    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU
4 r; q" ]: [8 k; ~9 N2 \0 @1 h% n
) R% }) W! k2 G1 }    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
2 M& d8 |# m' U+ i, d  O5 v    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
3 L1 p7 R& s% g/ P
! A4 i5 _+ o8 m; f: b. i7 v    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
7 i" x  ^3 R6 M' Q( a* `; R                (Xil_ExceptionHandler)XIntc_InterruptHandler,' u4 W0 P2 D5 s# _* D$ |. h! V% K
                &Intc);
3 b" o' s, h8 L3 A
: l+ E4 f) p3 c2 [    Xil_ExceptionEnable();+ v/ a# g" k* W' ~7 z& \
& ^6 F* a  r. Q$ s1 q' e0 I
    XGpio_InterruptEnable(&KEY, CH1);
/ Q  A8 y1 k' b5 U    XGpio_InterruptGlobalEnable(&KEY);0 m1 k* y2 _# x6 Q

. v7 @; t9 t3 t1 ]    XGpio_InterruptEnable(&SW, CH1);# e+ O7 B' K0 i, X5 o5 z% S
    XGpio_InterruptGlobalEnable(&SW);4 t3 }$ l$ W7 ^

( I8 M7 s4 _0 p% v. E/ o- E7 m    print("Hello World\n\r");0 }- R; k9 L& L7 @/ P

* x' P9 I$ n( H& R& S
- {, w. k. Z' N8 h    while(1)0 `; R8 }; ~; @: K2 i. s
    {
4 u8 O! S7 Y* d5 n: \2 ?7 u7 z- w# U/ }' n; |5 O* f. w: z4 n

0 f" p; G) ]5 H. A  _% H. R  T; E. G( Z  H9 J! _
    }
9 b! `, P  T9 x8 Y
9 d' G- i# ~# u; Z1 o
- V0 L* Q* d# G' c- k    return 0;- T1 L' o$ c. W5 j$ `3 N# o
}6 `- D$ [+ h' ], s2 S( P1 a. z

) Y+ W! _$ c# \2 x/ e

本版积分规则

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

GMT+8, 2025-8-20 09:04 , Processed in 0.031459 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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