一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 6476|回复: 3

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑 ; }  }+ `. o% \1 Z2 z
& r. n8 M' g' {- B/ ]
#include <stdio.h>3 S0 {* j& [) L9 N0 b* u
#include "platform.h"9 A# y- m$ P' o& A$ C
#include "xparameters.h"! F4 U# M: L3 T( j4 X
#include "xgpio.h"
' ]- t* N. ]1 `' z#include "xintc.h": `2 g- a4 V' o: l9 X
#include "xtmrctr.h"' I9 V9 T. J" y2 h, l
#include "xil_exception.h"; v# k2 A* D# p' k3 b, W; d

6 F6 L8 z  \( `, g* s#define CH1 1! x7 t( e8 X2 z# [' \# w5 Z

- W- f4 d2 j+ s7 i4 }$ m! ~XGpio LED;3 w9 T; s. E% b( Z2 J
XGpio SW;4 v5 n+ V: n, Y6 b# ~( G
XGpio KEY;/ c" R1 T! `3 A5 Y$ z+ J' {
XIntc Intc;, [. Z6 Z* v8 }  I4 ]

9 m" {3 s7 g- C- K: ^. [6 D; hu8 count;
3 J; X. h9 E! e* i
2 Y2 {0 Q6 G, \$ {: s. [) F6 \" Z) a( d
/************************** interrupt handler process****************************/' B% H; G6 r& Q& j1 d/ v
void timer_int_handler(void *CallBackRef)
4 W9 g0 r* F" M- A) p{
  X2 Z1 y1 Y( @% n! S  unsigned int csr;, t6 G- H2 s; Q2 g& Y
  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register
0 {: v9 O, a# @  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;
+ k6 S( M9 q- z* ]  f
' h9 G, ~. E% B# P8 }6 y  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication
* K" q& ]  q$ W: z  x' a4 a}  ]! p4 F* O* H; j

; X1 |5 O" H7 a5 p6 \: O
, M: n# o8 V; {, n5 ?( L
/ j4 C& j( Z2 Z' w) o
* p1 I0 o; P+ ~0 Uvoid SwHandler(void *CallbackRef)+ |' B: ^% h0 ]
{# q2 ^& t( H* r5 R

. ]- ^$ ~% ?7 D. X5 L    XGpio *GpioPtr = (XGpio *)CallbackRef;' |8 F  V+ m, v) J( e0 K6 V8 G: l5 b+ C9 a
    xil_printf("Switch Interrupt!\r\n");
& Y& h) j* V' _$ h    // Clear the Interrupt3 T! H' I$ l1 H
    XGpio_InterruptClear(GpioPtr, 1);9 ]9 m, `1 M8 A6 w# x
  M) P, i- m& O6 V4 F" N
}
$ [( v/ B* x4 m) D8 N! i# v- Y; U3 I) g/ q7 L

6 A7 s- e( m5 J. bvoid KeyHandler(void *CallbackRef)
+ ^! \4 n3 ]1 m3 g3 I0 A{! T2 ]7 B. I5 a: a; ^+ @

/ a% A) e, @4 e& @2 l9 @& p* u# e. A7 z; W* C  D
    XGpio *GpioPtr = (XGpio *)CallbackRef;
- X' `! `! \. q4 y' V    xil_printf("Push_Button Interrupt!\r\n");1 z2 ?* Y( }. v8 E; p
    // Clear the Interrupt" O: b4 X2 t5 V$ L; d! N4 O
    XGpio_InterruptClear(GpioPtr, 1);
# o) ]/ X0 c5 L( F6 _& g
. I* P6 p7 f, d1 t+ G}$ b1 Q& g7 G$ E; E
# n! W. [3 N/ X) Q; Q: M3 w1 j

1 ^+ J; W9 G: e& L8 e. g2 e* p: [1 I! S+ y& ]

* Q8 W# ~/ X3 ^. W% q# @  h
- [+ v. a0 R+ V1 _  M. xvoid print(char *str);! X- M" x! B, g& n$ K: ~, L
# i+ x) }; Q. D( }' y
int main()
" }! {$ K5 l1 X: T8 w) b& y{
/ W% `& c+ ^; T, d( k    init_platform();: o, G, s8 e3 U: X2 j

* E$ H  _: B: x( R    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
* P9 ~0 X, [) |1 Y7 F( j% g0 ?    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
! D/ p0 |0 j; M7 Z, z$ n8 [    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);. L) N$ K! f( [/ m9 K( h4 j
7 w# y+ B' j. u. o
    XGpio_SetDataDirection(&LED, CH1, 0);& V  ~7 {0 H2 X. g" N$ }+ P4 z
    XGpio_SetDataDirection(&SW,  CH1, 1);, Y% _& _! \, S- F
    XGpio_SetDataDirection(&KEY, CH1, 1);
! \- F# ^% G2 Y) X4 A" {) K5 l0 Y# Q% ]5 g; g0 Z1 R% d# n
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off) d! ]% {8 }3 }* `

( C2 L& m& m6 j4 P    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);: N, C. W+ J9 L. e( ^; d7 p; h, W3 f
3 {! R! E3 i/ l5 }2 }+ O- {$ v$ C
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
8 |$ s! x& }/ {                          (XInterruptHandler)SwHandler,
9 q& |4 m# B5 i. I9 G. ^3 W                          (void *)&SW);1 G+ l/ x6 `5 m- X% A2 c  G# j
/ Q& w/ j6 ?' U7 T
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
( s% b( R. L- x* f& M                          (XInterruptHandler)KeyHandler,
  q6 z' b3 k; y- I& w" _  b                          (void *)&KEY);/ p  X) {, z4 M. c

+ N' N& x) q) R1 K
$ b4 ^6 I! A9 K, k2 w3 J    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process( M* J& F0 T$ C/ z  x' v0 P
                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,, s/ C8 x" a. o$ X: u) v( T: T- b5 B
                         (XInterruptHandler) timer_int_handler,/ R5 O; J9 k) f7 X( r- [* d
                         (void *)XPAR_AXI_TIMER_0_BASEADDR);
$ M2 M; q4 g- I( c$ j. ?! F% K
  p% N$ H6 o1 [4 y" k8 |- c; X    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);" o. V- P. d' U& C1 l
    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
: R, b8 l$ u# a+ k2 F" d: I4 v$ ~8 C+ Z+ d0 a# V
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,4 g$ p; k8 [5 Y
                                XTC_CSR_ENABLE_TMR_MASK |
$ R0 Z; V! X& C- N7 S1 T                                XTC_CSR_ENABLE_INT_MASK |' [& `  {! ^. q: O8 H
                                XTC_CSR_AUTO_RELOAD_MASK |) V' l" |: s1 o
                                XTC_CSR_DOWN_COUNT_MASK);6 F. z: ^1 Y" b5 f! _

+ o5 I/ c, ~4 b2 g. @' x% z2 f  e8 c( R
    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU" D6 a' e' m& }0 h

3 N, X/ A) Y5 E1 e    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
2 _+ g" A% j8 V$ m    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
5 e. f0 y2 ]! Q% Z3 u, Q8 f* r: T2 G7 H5 ]7 h, \2 }
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
" i8 b- x5 k4 a# s/ ?                (Xil_ExceptionHandler)XIntc_InterruptHandler,
5 B' Q7 Y. O' {: z/ `6 S5 t7 _- b                &Intc);
$ T1 w' W. L& K: Q0 V
! D* F. Y, ^% ~1 ~  d1 }    Xil_ExceptionEnable();; O, L# _2 m5 z0 R. z$ |
+ R0 J7 G9 M$ D6 W+ `8 m/ \$ V
    XGpio_InterruptEnable(&KEY, CH1);
2 N9 f% l; x/ w" [* P; _6 s1 z# D    XGpio_InterruptGlobalEnable(&KEY);: G7 A% l1 E* p! I2 C* Z6 [! X2 K
' ^2 e" O# r, E' r0 X& S
    XGpio_InterruptEnable(&SW, CH1);
( R% D9 O4 Z& W2 C    XGpio_InterruptGlobalEnable(&SW);& w' F( H+ N( o0 ~* p8 N# E
3 F# z4 B$ M; }
    print("Hello World\n\r");
/ F5 @: K* l7 N9 y/ A. e0 }/ Q2 d1 Y! e

# Z/ D4 _! P* P' B9 U" l    while(1)' W* ^& m! Q0 @4 ?! S9 E* }+ }
    {
6 n# [' d" A; i; i1 h8 d; k- l) x- c2 e2 Q" u( l6 U3 D

: F% d% C0 N2 y7 v: ]1 v( \# `# X3 t8 y' k/ Q0 y
    }
! m! v1 e+ ?- ~; K
" a( V3 J% I" A) y. }+ _, p. W' w' f( |6 f: a
    return 0;/ O* Z3 Q6 U; O" D9 I* Y
}
  e- G* t3 K9 U4 m8 g; o" _) [
8 e  x& f2 x' J. r# Q1 r6 j8 x2 u% o这个模式直接操作地址比建立一个实体来操作会快好多0 S8 @2 I5 G' M, u1 K! t0 E0 S

( p+ ?+ h! x2 v, {/ v. ?
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
回复

使用道具 举报

 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();
* V+ D1 s5 a7 R( h3 J" H1 f) Q# L代替) e. E  M; `+ }2 a4 }. v1 f+ s
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
. [8 w( w2 K$ w5 k2 n" P- E                (Xil_ExceptionHandler)XIntc_InterruptHandler,
, G! `, B! a7 n, @- k                &Intc);# X4 t# c, V7 w  M3 C6 D/ R# b* s

, j6 u: I' ]2 [0 T    Xil_ExceptionEnable();
回复

使用道具 举报

 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠
9 _% S3 z$ E5 s9 X) W2 y  `  pXTmrCtr_Config XTmrCtr_ConfigTable[]=
# e  q  Z  u7 G* Q8 T. j{' O7 w0 p1 ?; p) x% ?# ~5 d# m) K
{
% g& C- |/ @- y5 A/ U) H7 ~- O& h! n  XPAR_AXI_TIMER_0_DIVEICE_ID,
: y( L1 H! D# b9 O# n  XPAR_AXI_TIMER_0_BASSADDR2 L" V8 {, l: `- E% l
},
+ _  x- r" h2 \ {
8 ^2 c  d$ `/ |- k1 \/ F% y   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,9 U, J- i* @: S+ B
   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了* g& r7 V  F& d2 I, c
}
0 t4 \" B4 v; m6 ]};
4 ^; u, g) I/ J1 Y2 A6 d( P& z
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-7-13 06:39 , Processed in 0.032423 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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