一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4385|回复: 0

microblaze 中断控制原理

[复制链接]
发表于 2019-10-2 16:26 | 显示全部楼层 |阅读模式
利用ISE14.7中的软核Microblaze来研究中断机制
) q' q4 I- D4 [2 X. O9 g7 p8 r本人采用spartan6平台,7系列是vivado支持的,但价格贵好多,但是次要开发过程都是差不多的
' q" \9 `% I( k2 x7 n5 _
; p% n: [6 u* t- _9 a第一步:建立一个GPIO实例。: q+ I  |  c% e, ]* O
第二步:初始化这个GPIO实例。
3 u; f8 z5 g3 o% o第三步:建立一个中断实例。
  v* A6 s& i6 _. @第四步:初始化这个中断实例。
6 W% M7 o" i, X& b第五步:建立一个中断处理程序。
# f+ P. }( Q1 ^. v第六步:利用XIntc_Connect来邦定这个中断处理程序。
* N; @# d) j  \: v2 J第七步:使能XINTC中断MER IER 4 f2 o% F& ?0 {5 X4 G( j
第八步:使能XGPIO中断IER GIE; Q3 M5 d7 K; ]; z6 c5 \
完成/ A, F" U% \& D+ B  F& U+ v

, G) M' z! S& p, F' E5 A
3 G, Q' N( {9 d( p* R7 T  Z5 _$ {5 _7 @0 X) O' s7 G

# P7 o% ]6 a+ N6 p6 d4 r4 O
! J. |8 p& a' Z4 ?5 a2 c
8 j  O7 p6 {; E* P: O0 n$ c( x2 V! |" u: o
+ R- |: j( {5 N

# h7 {" H( P, [! P
& y  U& Z  F. O7 D; V* f% t5 w6 d8 {( n- x5 L  _
% c6 j9 q9 q  D) {6 }' n6 Q
源码:
) l  G% m. i# w& v4 ^. s& F( P" t8 V
* e$ n) W: g* c0 [# A#include <stdio.h>7 \% n# a" c/ ?8 e; b) {1 V# F# M7 p
#include "platform.h"9 J* `7 K& H& k0 v$ O/ L5 i
#include "xparameters.h"; Z8 ^& g5 d$ S4 B
#include "xgpio.h"
/ J/ b7 |3 k1 D3 s, q& k* u, d#include "xintc.h"' K2 e) v- \: d' h
#include "xil_exception.h"
0 R4 r5 C8 J2 p7 b- }2 u- f
& j0 X' u1 h1 {! j! _) J#define CH1 1) _0 C: R- R* b- q( i

9 k) w4 S0 d# b1 r5 G5 ~+ k1 GXGpio LED;: v8 i3 P2 T) ?9 c3 b* h
XGpio SW;! h& _1 U8 d' V2 o( [, s
XGpio KEY;& w, O7 X8 K9 e8 G3 F
! k5 r8 ?" c2 E8 Q
XIntc Intc;' Q' z" G. ?  ?

# `' a( l4 p8 J; v* Q* uvoid SwHandler(void *CallbackRef)# g9 i; K8 o0 P
{4 g" W) j$ w; m* F; ?$ N
3 g; u, M7 O6 m/ @: |- i( e* l
    XGpio *GpioPtr = (XGpio *)CallbackRef;9 N0 B9 S' O9 T2 M0 E' ~
    xil_printf("Switch Interrupt!\r\n");) P4 \0 U) r' @5 t  X; `
    // Clear the Interrupt" v4 V4 f4 [* g' d# c5 `
    XGpio_InterruptClear(GpioPtr, 1);  C" a4 |/ |+ R* a

7 J; q* I! \6 A- m4 v}) Q8 M3 Z& d- j5 ~4 k

, c5 m% [) ?: V, K3 e% P/ d; n$ B6 W  q! k/ u: o' w( o, w
void KeyHandler(void *CallbackRef)4 c( t4 P% S3 A2 j) [
{) Q# R+ c- S3 l, R4 W' l2 |

" w, [& _" S' ]3 g3 e) s8 U7 v/ p& y% k& [' k
    XGpio *GpioPtr = (XGpio *)CallbackRef;; N' @) b2 X( B
    xil_printf("Push_Button Interrupt!\r\n");9 Y& t4 a. Q1 e( b
    // Clear the Interrupt& Q7 K# E2 y$ ~" f9 k1 H
    XGpio_InterruptClear(GpioPtr, 1);" }3 U, {9 e  T# t1 M7 p4 }! j

& D( X, O8 _' b& R( i. G}) y$ N# Q7 l5 ?7 {3 U

7 O1 s# z% `; `) r+ U9 f  @0 ]8 U/ [8 K+ Q* h- b

7 D1 O' v* p3 S2 d4 t/ b% Fvoid print(char *str);
9 U5 ], O8 {% ?! x# D. A, B' F6 ?6 l) m+ G4 l6 N/ b& w
int main()/ I" H; I: W, w8 s& k
{( R8 C. x) c9 V$ e: Z' a- I4 i
    init_platform();: M3 r, ]% h: J

/ v7 R' A! R- b5 i    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);# I( R6 C/ u. y$ Z
    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
( N* `$ B3 b8 {    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
3 b8 }  C" ~% D- Z- p  z8 g! _' i, A& T
    XGpio_SetDataDirection(&LED, CH1, 0);+ V% M! e' \, b2 ?5 k' W* M, d9 d
    XGpio_SetDataDirection(&SW,  CH1, 1);# N' _* h# {1 }+ Y
    XGpio_SetDataDirection(&KEY, CH1, 1);
' e3 g4 s! ^+ J* |, ]4 y6 {5 j
* d, V: U1 W6 v. s" v2 W    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off. R4 K3 Z- ]0 b& h5 w' }1 ?

2 O9 ~) n# v, q- F3 K$ ~) k    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);" E& l6 P, R8 V
1 S" v+ @! Q, V. B
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,7 v/ X6 g  ?  r8 o6 t5 i% A
                          (XInterruptHandler)SwHandler,+ r9 d4 v" f$ O$ C
                          (void *)&SW);
$ F$ d& \, R! i) w8 Q: y& N3 {! r! D- }' X. L
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,5 u4 r: \* A7 e- x  [( q3 `8 B
                          (XInterruptHandler)KeyHandler,
# h, _8 _5 l" c$ y* x. B                          (void *)&KEY);6 r! ?/ R; j( [0 ~( F1 y4 m

3 R: F, C, f3 @    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU( q: l4 {: K% ]6 o# Y3 s# \

: ]3 Z. o6 U& M9 C9 T    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
9 ~0 E5 G2 x* b$ w    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
+ `4 P) {+ H# H1 G" W
& h7 ^0 b: D& c/ A/ E    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  t$ _1 @( h* @1 r- Z) e+ ^                (Xil_ExceptionHandler)XIntc_InterruptHandler,
, K! ]" M7 r0 U, p* d0 u                &Intc);
7 L+ z2 N' I: b, }8 e! l" p& Y
5 Y( H& l! I2 z5 D7 h/ j7 \: v    Xil_ExceptionEnable();
2 S* c- D/ [3 `' G5 J2 S" f% R4 j" s4 ^5 g4 v8 a& ~6 w
    XGpio_InterruptEnable(&KEY, CH1);# [+ S( Q3 m! R& L# V2 m5 E$ L: l: U: C+ a
    XGpio_InterruptGlobalEnable(&KEY);) J* w0 t3 J$ x! H

) H7 t( l" |7 @* ?6 n/ s, U  }: v    XGpio_InterruptEnable(&SW, CH1);
! `8 `0 L! D% F$ m" ]3 X. _5 o    XGpio_InterruptGlobalEnable(&SW);& c7 ?0 B1 R' W$ p8 l! O- ]2 h& U
  _9 s1 J# g6 @
    print("Hello World\n\r");
. o+ {' M0 G" Q1 B+ k2 `& v1 F& v- I' R& {

# d  G, l1 d) U% E6 o    while(1)
& a5 y# S  l7 T9 m1 \' H$ i0 x8 S    {
0 O0 F1 E8 X1 q9 [. k' O, x6 g; {* s

/ z/ o5 E, O2 ?( F
9 Y- ^7 u' N1 h" A' u& k; A    }* T! O+ i1 D% w' @$ l

. R8 ]/ ]  |/ @% y$ i1 D2 [" B+ S* h; w0 |
    return 0;; k- J5 J: E# W0 L) F; ]
}
# J2 {' _, s: a
: R. V+ c% _' w' k2 ^

本版积分规则

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

GMT+8, 2025-8-20 09:00 , Processed in 0.057630 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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