|
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
|
|