找回密码
 注册
关于网站域名变更的通知
查看: 587|回复: 1
打印 上一主题 下一主题

microblaze定时器不能产生中断怎么办?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-20 15:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
microblaze定时器不能产生中断怎么办?
3 \/ ^" U: G6 ^# n6 }4 s8 x; @6 g+ u# Y9 P0 i
按照官方帮助文档上的教程写的,调试时定时器确实溢出了,但没有执行中断处理函数。在XPS中BUS InteRFace界面下,microblaze_0下的INTERRUPT 为 NO Connection。
4 m: j2 W- x7 P/***************************** Include Files *********************************/
* b4 a+ ^) E8 i! A, G6 E#include "xparameters.h"3 i# G- f" M9 o8 V: C2 g6 I) G5 o8 \
#include "xtmrctr.h"
, `- R* P9 [% }0 `2 e#include "xil_exception.h"% s1 V) C9 X9 _7 P$ N) Q
#include "xgpio.h"# t9 ~( _( S( _8 E, X5 \5 W
: |+ ^+ s  A$ X( {6 c! V
#include "xintc.h"
% Z" e2 I; X5 a# S# C# s# t) g#include <stdio.h>
* W! e% Y3 K- Y7 X5 M0 ?9 D/************************** Constant Definitions *****************************/
7 b* E8 b! Q1 ], m9 b0 |/ q#define P1_ID XPAR_GPIO_1_DEVICE_ID/ E/ o4 {* }% \3 V6 V3 T' p
#define P1_DIRECTION 0x00   /*P1八个端口的方向*/2 g5 }; \* t- q( F
#define P1_ID  XPAR_P1_BUS_DEVICE_ID
$ m+ g: q5 _# z, t#define LED_CHANNEL 1         //我们在用BSB添加GPIO时用的是1号通道
& v& b% u, y/ ~' R, f7 Z4 P#define INTC_DEVICE_ID                XPAR_INTC_0_DEVICE_ID//中断控制器ID
2 R* |  Y. ^+ {% b' Z0 N#define TMRCTR_DEVICE_ID        XPAR_XPS_TIMER_0_DEVICE_ID //定时器设备ID* a# u& c3 s4 N" I3 M5 M
#define TMRCTR_INTERRUPT_ID        XPAR_INTC_0_TMRCTR_0_VEC_ID  //定时器中断向量
. j8 P# _% b' K7 P) d) Y#define TIMER_CNTR_0         0 //每个设备中有两个定时计数器,我们用的是定时/计数器0
% S4 J* ~% r& O, Y+ x3 z#define INTC                XIntc, ]% [8 h9 w! ?6 R1 n+ n
#define INTC_HANDLER        XIntc_InterruptHandler
6 H$ ~4 U) X/ r0 K* B4 u  \! q% F" y9 r
#define RESET_VALUE         0x0001   //16位定时器,50M的时钟
$ H; `2 k  v& y; C5 E# o  T" ^/************************** Function Prototypes ******************************/5 e2 E/ R1 w: e5 b
/ M# z/ m0 I" A- }" M4 ?
int TmrCtrIntrExample(INTC* IntcInstancePtr, XTmrCtr* InstancePtr, u16 DeviceId,, w% z. N' m' L  \# o
                u16 IntrId, u8 TmrCtrNumber);
% `  t- b% l: Q* {9 t* g, g! A//把定时器连接到中断控制器上,开启中断
. P4 A/ P8 b6 m, }1 @static int TmrCtrSetupIntrSystem(INTC* IntcInstancePtr, XTmrCtr* InstancePtr,5 ^2 f% R" w! x. x1 Q
                u16 DeviceId, u16 IntrId, u8 TmrCtrNumber);. D% m4 m3 b( X8 b% b* ]
//中断处理函数9 m7 [$ B! ~7 t* k; W3 o5 s
void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber);" N& _8 g& i: v8 v) X& k+ s0 U5 O
void TmrCtrDisableIntr(INTC* IntcInstancePtr, u16 IntrId);- a3 ~9 R0 v& R* t+ `9 l' w- s$ J5 G
/************************** Variable Definitions *****************************/3 P- Y! v3 C0 \9 T8 e
XGpio P1;. `  |7 G* P  n" ~% Q! h
INTC InterruptController; /* 中断控制器的实例 */: c/ ]" {4 ]3 i) t2 }6 [- v
XTmrCtr TimerCounterInst; /*定时计数器的实例*/
" B2 ^2 ]' C+ O& K- g/ nvolatile int TimerExpired; //溢出次数
. ]8 ?% n  \8 h4 g! B" ~9 A$ _1 Nint main(void) {8 ]7 n+ O5 q) x% O
        int Status;% R' b! }6 P; v5 S+ h
        //初始化P1: c, n% {6 o( Q) ~
        Status = XGpio_Initialize(&P1, P1_ID);
, N& {# e, z& K+ V/ D7 ^' \/ c        if (Status != XST_SUCCESS) {' i+ T0 Z9 J  H& }
                return XST_FAILURE;
' N' X9 C# T# F4 p        }
. Q) q( N5 O9 g        XGpio_SetDataDirection(&P1, LED_CHANNEL, P1_DIRECTION);
, I8 g* U9 F. _3 m        XGpio_DiscreteWrite(&P1, LED_CHANNEL, 0xaa);% w* g9 V; X% w8 p' T, [

, z( E% g8 ]/ q  p        Status = TmrCtrIntrExample(&InterruptController, &TimerCounterInst,$ I; T- g+ |9 \
                        TMRCTR_DEVICE_ID, TMRCTR_INTERRUPT_ID, TIMER_CNTR_0);2 Y/ ~; U) `/ m/ G* O
        if (Status != XST_SUCCESS) {
  _7 [$ ?% P$ U/ z+ J5 `7 S                return XST_FAILURE;
$ h' M- k8 H' ~+ {/ r# w$ Y. A. D        }% K' {! M! ]2 y* j' z/ W
        return XST_SUCCESS;) Z" p5 Z' R  ?4 f; _, f# p
}
6 E/ m/ n, A/ y' Y; V: i, `int TmrCtrIntrExample(INTC* IntcInstancePtr, XTmrCtr* TmrCtrInstancePtr,2 X; q- M9 Y7 q
                u16 DeviceId, u16 IntrId, u8 TmrCtrNumber) {
) T& I% v5 h+ c# z7 }" H: j4 ]        int Status;* I; h8 E9 a7 I
        int LastTimerExpired = 0;
: c: g0 m( \3 m4 e        int temp=0;
& g- w1 b; C/ {        Status = XTmrCtr_Initialize(TmrCtrInstancePtr, DeviceId);
5 u( K4 f. L7 p7 x5 M+ A: P        if (Status != XST_SUCCESS) {
. n8 _* B* n3 E4 z3 h                return XST_FAILURE;3 U/ h$ W) P  m5 e. e
        }
' p' k  ?  t4 H( s5 S        Status = XTmrCtr_SelfTest(TmrCtrInstancePtr, TmrCtrNumber);& i; W7 n, p1 Z0 }" B
        if (Status != XST_SUCCESS) {
' G/ }4 l& b4 w" }; I) J                return XST_FAILURE;3 b- Z& `, y8 E- m  Z
        }  D5 v0 R2 a+ `6 I4 v, c
        Status = TmrCtrSetupIntrSystem(IntcInstancePtr, TmrCtrInstancePtr, DeviceId,
% k& r5 g; V0 ?  v4 E                        IntrId, TmrCtrNumber);
2 I+ B  ]) Y) `( [        if (Status != XST_SUCCESS) {2 m$ g6 i: p# {/ P. ]# ?0 [
                return XST_FAILURE;
7 s1 x9 _4 s5 s( j        }7 a! C# x/ u! w& R* A
        XTmrCtr_SetHandler(TmrCtrInstancePtr, TimerCounterHandler,6 f: L+ Z$ o* k% b5 s! X
                        TmrCtrInstancePtr);4 ~  j% P  \& q& ]8 p
        XTmrCtr_SetOptions(TmrCtrInstancePtr, TmrCtrNumber,0 j! I  b: T2 e6 n7 t
                        XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION);
4 A( Z' D7 p; `        XTmrCtr_SetResetValue(TmrCtrInstancePtr, TmrCtrNumber, RESET_VALUE);% I: d3 `, {5 Y; L
        XTmrCtr_Start(TmrCtrInstancePtr, TmrCtrNumber);9 q  a4 _, E7 i! a' ]- K
        while (1) {
& S* m5 J1 @/ e8 C1 ~4 `                while (TimerExpired == LastTimerExpired) {6 b: {& [6 O# f: v3 `3 d7 B& u5 s
                        temp=XTmrCtr_IsExpired(TmrCtrInstancePtr, TmrCtrNumber);, l5 R8 ~9 M: `$ l( |
                }
9 _( l8 I# C8 Z7 U2 b$ q. ~                LastTimerExpired = TimerExpired;! E1 X8 L- M% b) u  v" T
                if (TimerExpired == 3) {7 P$ @" M7 y: z1 X! L9 S4 N8 v
                        XTmrCtr_Stop(TmrCtrInstancePtr, TmrCtrNumber);7 G/ Z5 q7 ^. A; x4 V
                        break;$ J$ J1 H. u4 `9 U2 ]( F
                }6 G$ u/ J! A% N# T6 R+ }# F9 {
        }( I8 ]1 Y! C) P- q8 X) y7 s/ b

1 R7 J: o. b' ^, C7 N9 C        TmrCtrDisableIntr(IntcInstancePtr, DeviceId);
) y. S6 d& H6 x8 ^1 v        return XST_SUCCESS;
+ Z7 q* h; f2 T' i1 W}9 @, w( J7 o' T
void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber) {' \: D$ i, J& n7 o! ]6 C: u# Z
        XTmrCtr *InstancePtr = (XTmrCtr *) CallBackRef;$ j: {; [* L: R8 f
        XGpio_DiscreteWrite(&P1, LED_CHANNEL, 0xff);
% A' P3 J: v# _2 p6 F/ N! X        if (XTmrCtr_IsExpired(InstancePtr, TmrCtrNumber)) {
5 e( P% B1 a% g. n( C" N9 u                TimerExpired++;4 \. G" e8 Q5 N8 {% t
                if (TimerExpired == 1000) {+ h% R, z0 r7 |- ?
                        XTmrCtr_SetOptions(InstancePtr, TmrCtrNumber, 0);
. A' q' W* F& {" b0 p7 F( A                }
8 z( d1 M9 G# o( ?; c        }
- P: U1 @0 v1 ^3 I6 u! F% K) m}
' s0 [$ l/ R% m: m. I9 [* O" Z" q; X$ S  @) N% J  H
static int TmrCtrSetupIntrSystem(INTC* IntcInstancePtr,
/ M& v" j& T9 r1 y' V0 _, H+ E                XTmrCtr* TmrCtrInstancePtr, u16 DeviceId, u16 IntrId, u8 TmrCtrNumber) {( v- R2 w) @/ p* l7 L7 M3 w
        int Status;
" F( G# K  r7 f/ d7 b
% x: D) [0 a- @$ M& _        Status = XIntc_Initialize(IntcInstancePtr, INTC_DEVICE_ID);; A; J- O8 c( B8 L' J8 q; w
        if (Status != XST_SUCCESS) {
7 S% c0 _9 f" [4 g                return XST_FAILURE;4 [3 f# A- k) ?
        }, t% Q3 b" e+ t6 g. x9 X8 t: i# h
        Status = XIntc_Connect(IntcInstancePtr, IntrId,
; D9 [2 Z: T/ U6 l9 {                        (XInterruptHandler) XTmrCtr_InterruptHandler,
  c0 Q9 e- X# f" ^/ O8 I                        (void *) TmrCtrInstancePtr);8 V( e# L( P7 ~" o
        if (Status != XST_SUCCESS) {' O; m+ C. r) o8 Y. ^0 Y5 [' }3 _+ I
                return XST_FAILURE;1 P' ~  P4 ]+ ~, B3 [
        }
/ |' C9 y9 }# {/ w/ l! \5 `, R6 V        Status = XIntc_Start(IntcInstancePtr, XIN_REAL_MODE);
0 X) N8 t3 B4 E8 N6 ~3 z+ D3 W        if (Status != XST_SUCCESS) {
% S% K2 M- w6 o  J* T4 L                return XST_FAILURE;5 U' T7 A9 q! v: o0 P% z
        }
. z. G7 J- p. I! S        XIntc_Enable(IntcInstancePtr, IntrId);  t: c; i+ ?, q; @1 G# M
+ `$ u. _- m( P5 u9 d+ m
        Xil_ExceptionInit();
. w. v1 h, r: p% k        Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
- S' R' p2 p2 S$ ?1 V                        (Xil_ExceptionHandler) INTC_HANDLER, IntcInstancePtr);
& t3 N# R# U7 i! [, n        Xil_ExceptionEnable();$ n5 A# l$ D0 O2 N2 j) f1 B+ b$ J
        return XST_SUCCESS;
) h% ]3 _  M+ H, q! u& z}
) p4 ^; H; Z% E/ @* x- J/ E4 S+ ovoid TmrCtrDisableIntr(INTC* IntcInstancePtr, u16 IntrId)" @6 l7 i. k+ l4 w  a2 o) o4 [6 `$ q4 F
{9 ?2 n& E/ I9 \' p8 A$ }
        XIntc_Disable(IntcInstancePtr, IntrId);% ]& \9 N& I: v. f, s& j$ L
        return;
5 }/ v$ P6 I; m}
: y) G$ O3 \. \2 F7 e  p1 A1 ^: D1 w# w( N
请教大神,非常感谢!( ^' e0 @% Z& A" U# k
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-18 20:44 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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