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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
microblaze定时器不能产生中断怎么办?
" r. W( b" f( q+ p$ w# @8 R$ j4 k6 X( B+ n
按照官方帮助文档上的教程写的,调试时定时器确实溢出了,但没有执行中断处理函数。在XPS中BUS InteRFace界面下,microblaze_0下的INTERRUPT 为 NO Connection。& }% M# j1 j" N; Y" w+ C
/***************************** Include Files *********************************/2 Y2 n8 g8 p% p, F) D
#include "xparameters.h"; l  P5 ]) G7 l/ m
#include "xtmrctr.h"
  n2 K4 D. J  q( l* a( C, P#include "xil_exception.h", J2 i1 S6 R) R6 K: U3 Y
#include "xgpio.h"
' o7 x& X; G+ h- c3 G; d# o0 V" p9 h1 s
#include "xintc.h"1 P4 c( e# g5 X, ^& H' e
#include <stdio.h>+ s" p, m7 K. q8 z1 h
/************************** Constant Definitions *****************************/
- i3 s6 O$ O: k7 {#define P1_ID XPAR_GPIO_1_DEVICE_ID7 j8 X& ^4 F, P$ H
#define P1_DIRECTION 0x00   /*P1八个端口的方向*/
5 d" i5 W( B& K#define P1_ID  XPAR_P1_BUS_DEVICE_ID5 j! E# u8 ?, S: U1 T# ~! b
#define LED_CHANNEL 1         //我们在用BSB添加GPIO时用的是1号通道/ D0 I, t. e9 `6 G4 D; k5 O- ]9 k8 P
#define INTC_DEVICE_ID                XPAR_INTC_0_DEVICE_ID//中断控制器ID
9 s. |& L& v% ?% D0 [4 q0 [# y#define TMRCTR_DEVICE_ID        XPAR_XPS_TIMER_0_DEVICE_ID //定时器设备ID
$ P+ V" g) v9 R, u% j  c  z#define TMRCTR_INTERRUPT_ID        XPAR_INTC_0_TMRCTR_0_VEC_ID  //定时器中断向量( _$ x: Q% M3 e) \, i% d  m
#define TIMER_CNTR_0         0 //每个设备中有两个定时计数器,我们用的是定时/计数器07 S% C# K8 O( i# W+ i6 u: D- c# \
#define INTC                XIntc
& c9 |6 J1 p. ?#define INTC_HANDLER        XIntc_InterruptHandler
+ M! \0 @) a9 {/ ]
# j3 u9 E/ n6 W1 G1 _- {#define RESET_VALUE         0x0001   //16位定时器,50M的时钟# }3 b# h; k, l% ?# F  O! x1 b7 G4 M
/************************** Function Prototypes ******************************/5 k9 o; r5 @# O0 x$ b
" Y, ]  r1 ~5 M) m
int TmrCtrIntrExample(INTC* IntcInstancePtr, XTmrCtr* InstancePtr, u16 DeviceId,3 U; }0 ~- c% H! Z1 h0 V
                u16 IntrId, u8 TmrCtrNumber);
5 W8 I& H- Z! i2 Q//把定时器连接到中断控制器上,开启中断3 }8 |) `, `5 \. c8 W0 ]) j( t' f
static int TmrCtrSetupIntrSystem(INTC* IntcInstancePtr, XTmrCtr* InstancePtr,
' Y6 g+ r+ q# p0 z) j8 l, A' l                u16 DeviceId, u16 IntrId, u8 TmrCtrNumber);( M* F+ r" r7 Z. h) L
//中断处理函数) O4 o5 B! h1 ]/ q( I! H
void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber);: ]8 @6 J) k( S
void TmrCtrDisableIntr(INTC* IntcInstancePtr, u16 IntrId);6 m3 Y6 I. Z# q- U7 \, ]4 q
/************************** Variable Definitions *****************************/2 h3 w) ]% k8 \6 s: a
XGpio P1;
9 z- X! U+ S* X& L8 {# B# oINTC InterruptController; /* 中断控制器的实例 */  Q& r: X0 ]& C/ n+ ~
XTmrCtr TimerCounterInst; /*定时计数器的实例*/
1 M6 Q  [' u- X) @% wvolatile int TimerExpired; //溢出次数+ i* [3 C% c9 T
int main(void) {- g2 m; j% B: ?& _3 \- y
        int Status;
; x; \2 j/ L( h8 G        //初始化P11 _. ]3 Z& q1 P$ c7 \" k# G
        Status = XGpio_Initialize(&P1, P1_ID);  L5 I3 N& t5 C  I
        if (Status != XST_SUCCESS) {
% [( w, c8 i2 Q0 f* u6 p                return XST_FAILURE;$ `# u. A" {; n+ {7 H: U
        }' ]6 {3 J" W1 Z
        XGpio_SetDataDirection(&P1, LED_CHANNEL, P1_DIRECTION);
4 O. @9 B! C+ s: M        XGpio_DiscreteWrite(&P1, LED_CHANNEL, 0xaa);; s+ G, k" D3 l' N9 c3 L. d0 C
, _/ t0 H7 a1 i8 d
        Status = TmrCtrIntrExample(&InterruptController, &TimerCounterInst,
* V. D  ~9 w0 h; C5 D                        TMRCTR_DEVICE_ID, TMRCTR_INTERRUPT_ID, TIMER_CNTR_0);# @; g0 E' V7 \
        if (Status != XST_SUCCESS) {+ c/ Z; J3 [+ H# b' t+ {% M' h
                return XST_FAILURE;8 K0 ^6 Z" n0 Q. O- w. ]3 }
        }
5 N$ U& |& p. O# {6 U; a0 h        return XST_SUCCESS;& U0 `3 n: P0 `7 r# _7 F- m$ m2 P
}
( t# h+ B) |. w2 z3 }4 @5 a5 {int TmrCtrIntrExample(INTC* IntcInstancePtr, XTmrCtr* TmrCtrInstancePtr,! B, C1 G/ k" F& k: F
                u16 DeviceId, u16 IntrId, u8 TmrCtrNumber) {
$ W5 X1 d( O) K& Y8 |        int Status;0 n9 [2 W3 z+ ?! f/ L
        int LastTimerExpired = 0;
/ X" I3 k! X; @+ x) i6 Q        int temp=0;
8 b! j# H/ Z& i8 L9 @' Q        Status = XTmrCtr_Initialize(TmrCtrInstancePtr, DeviceId);
# `$ `5 L. o% @' [) a" m  i        if (Status != XST_SUCCESS) {
) ~3 i9 |& [& ^3 S                return XST_FAILURE;3 v1 x( {7 K9 U# Q3 J
        }2 A) S* [  ~! y& N
        Status = XTmrCtr_SelfTest(TmrCtrInstancePtr, TmrCtrNumber);2 n7 V5 x( _& R/ G2 A) C$ n
        if (Status != XST_SUCCESS) {
0 G) X! V# a6 m, |& M! ?7 H+ K                return XST_FAILURE;
+ Y* l6 Y: I/ d+ v        }
* v: I# Q; _& T* ^! }! N        Status = TmrCtrSetupIntrSystem(IntcInstancePtr, TmrCtrInstancePtr, DeviceId,
( u+ |9 g8 d- @7 U& V8 I; z                        IntrId, TmrCtrNumber);
8 b- j9 k% d3 l2 T% o        if (Status != XST_SUCCESS) {3 e4 ~" u" d0 F  I) ]
                return XST_FAILURE;
, J) a! T1 I* Z        }
  w9 H4 I+ d! I' @        XTmrCtr_SetHandler(TmrCtrInstancePtr, TimerCounterHandler,
; D; t  u1 m! |* a2 e# i2 m' m                        TmrCtrInstancePtr);
9 w) j' G1 K% a( K7 p3 J/ Z0 r        XTmrCtr_SetOptions(TmrCtrInstancePtr, TmrCtrNumber,5 }# D" U! z; O0 ?0 P/ i
                        XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION);3 h1 p$ P* h6 z- B/ L4 n
        XTmrCtr_SetResetValue(TmrCtrInstancePtr, TmrCtrNumber, RESET_VALUE);& g3 H. @% P% H6 `5 N
        XTmrCtr_Start(TmrCtrInstancePtr, TmrCtrNumber);
( c5 X4 c7 A8 B$ S. T        while (1) {
( p" c5 {* N, l8 C2 f- ]9 W                while (TimerExpired == LastTimerExpired) {
  X, O) y  T0 `7 X5 p8 x, P  m                        temp=XTmrCtr_IsExpired(TmrCtrInstancePtr, TmrCtrNumber);5 O" E) D8 |8 ]2 X6 k
                }) y( O4 S  r0 ~& B4 ]6 |$ H
                LastTimerExpired = TimerExpired;, D- ^$ J- G; R( N* T* `
                if (TimerExpired == 3) {
- {: I2 w: C/ A                        XTmrCtr_Stop(TmrCtrInstancePtr, TmrCtrNumber);
& c! D, p, }8 n, h" G                        break;
4 \" r& t" W, N0 k6 V& j: H                }
6 u; V+ K7 m% p2 q, \% B        }1 V6 i( c4 k$ G3 H- z4 j

- @% u1 W/ b2 X! d& N7 O5 o1 ~6 {        TmrCtrDisableIntr(IntcInstancePtr, DeviceId);  Z3 [8 ?% M3 L- s* z  E
        return XST_SUCCESS;
" c; Z9 R, u# K8 O}9 `/ u, ~4 O  _1 j1 n+ D
void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber) {
$ E0 o% E8 J/ `        XTmrCtr *InstancePtr = (XTmrCtr *) CallBackRef;: l/ b7 Q6 z5 x
        XGpio_DiscreteWrite(&P1, LED_CHANNEL, 0xff);6 v9 I$ Q' T: F: g7 e+ j
        if (XTmrCtr_IsExpired(InstancePtr, TmrCtrNumber)) {
# B3 a8 }0 w; V6 f- D                TimerExpired++;
  H0 T: r3 @- `& R' {                if (TimerExpired == 1000) {
; K6 H7 c% r$ y6 `! p( a9 \                        XTmrCtr_SetOptions(InstancePtr, TmrCtrNumber, 0);' o$ p( u( I' E3 N6 p- E/ b5 V. {
                }5 T! N% i) `- p1 M6 D
        }+ S+ F3 d& L% P. W" k# E
}% {0 H" T( Z6 g' R! J' k' l/ W8 Q

2 f$ p( o" `9 ystatic int TmrCtrSetupIntrSystem(INTC* IntcInstancePtr,& ^/ U9 Y' k8 {' M7 i
                XTmrCtr* TmrCtrInstancePtr, u16 DeviceId, u16 IntrId, u8 TmrCtrNumber) {
; e6 i6 d' S2 _: d0 `9 B( r2 a/ b        int Status;
4 Z) h) {. C5 E, E
$ N) d4 s6 w/ J4 N' P8 O        Status = XIntc_Initialize(IntcInstancePtr, INTC_DEVICE_ID);0 B* N# j% @5 l3 Z  o
        if (Status != XST_SUCCESS) {9 p) U/ x2 H4 v+ |; g& l
                return XST_FAILURE;' T3 {& g: u' h3 ^' P) b& C: W! O
        }
0 A% A. ~0 E- N7 x6 h0 b        Status = XIntc_Connect(IntcInstancePtr, IntrId,4 D* j4 J+ U+ x
                        (XInterruptHandler) XTmrCtr_InterruptHandler,
/ e, c. q. w. q; f                        (void *) TmrCtrInstancePtr);
8 ?2 {+ [# ?* Z        if (Status != XST_SUCCESS) {
$ n: E. V. q5 E- ~  U( F" o7 p                return XST_FAILURE;
8 m! y3 Y' X, X        }
3 v) @$ {4 ~5 ~4 m. H( R        Status = XIntc_Start(IntcInstancePtr, XIN_REAL_MODE);
$ q. @4 ^8 T  z8 y, l5 |0 H) X: w        if (Status != XST_SUCCESS) {! x: ~& \# K- I! N9 m
                return XST_FAILURE;
5 q5 s, X; N' k6 G        }9 P# ?* u: L& \
        XIntc_Enable(IntcInstancePtr, IntrId);
8 q+ `. F. X3 @$ R2 d$ y4 B9 D" {& B
4 ?1 c, c9 j3 d) R% L+ \+ h" q        Xil_ExceptionInit();
7 S7 _: G  Z+ n- r0 L6 k$ D        Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,5 _# c9 h3 E0 H2 {. x3 T5 W2 |
                        (Xil_ExceptionHandler) INTC_HANDLER, IntcInstancePtr);
; a+ P2 @5 g& f$ W  |$ z9 u        Xil_ExceptionEnable();
, s2 B* Y+ G# N+ _" x        return XST_SUCCESS;
! c4 U0 O1 z7 b1 O7 J+ @8 C}
1 m  i# h8 G6 ?- Svoid TmrCtrDisableIntr(INTC* IntcInstancePtr, u16 IntrId)5 ]2 }4 @3 F9 }  c
{
7 R# R/ p/ V" T2 z# s        XIntc_Disable(IntcInstancePtr, IntrId);8 s1 N4 V2 [8 y3 F7 j
        return;# z) b3 r3 b0 Z# ~2 q. L: E3 ^
}
" z2 N0 i: r0 v4 J/ ~
) m. X! m% [6 Z请教大神,非常感谢!
4 A4 Y% W. Q9 F
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-13 08:22 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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