一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 6062|回复: 3

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑
  p; F% U' o+ M2 T  F) |) O& {1 ^) Y8 M
#include <stdio.h>% g' l2 d( R' {, K5 g. o
#include "platform.h"3 Y& m# b( r  F9 s  ~9 E9 e, Z" }
#include "xparameters.h"7 O7 ^6 P# Q' n9 M- ?
#include "xgpio.h"
4 e* V4 i% w, N0 y- D# Y, }#include "xintc.h"
2 O- {2 I) A) t& b* q#include "xtmrctr.h"
5 l; |  F! I8 E$ p5 ]#include "xil_exception.h"6 F% K. X; s5 ~# Z
& e/ Z$ J9 u* q" l
#define CH1 1
, m+ f, f9 G6 t* _+ S* W# l0 o7 [: A( ^; h% {' k) L
XGpio LED;
3 ^. N7 [" B2 |2 N- P( r- d9 i, bXGpio SW;
; O: z8 a9 s1 |, r9 p* k9 \XGpio KEY;
% ~( P* U  Q* G& KXIntc Intc;
, S+ C9 i! \7 w  {/ ]' J* O  _/ C4 E( O+ t
u8 count;( h# |2 E, Z! U5 d  h+ Z. J
( K' C% s$ t. g8 Z7 F. s2 s* l

- ^9 m! P" r/ j" A& g/************************** interrupt handler process****************************/8 P9 g' f" {" o* M' c% b7 i; n0 p
void timer_int_handler(void *CallBackRef)$ W8 m  L! w$ G/ ]) ]) B5 f0 J
{# G) n8 x! B# z- ]) s0 c+ m+ a
  unsigned int csr;0 N. h& S& K( m2 W7 c7 B0 p
  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register# N( M2 b# ~6 G) \9 o5 ^' _" F- V0 Z
  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;
" {( _: h; M: L) n/ Y# O$ d
, E: a6 J+ M, C8 q, U  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication
( Y7 U! |( t; p5 k. ~- m, ^) k( ?}6 X; _6 ]. t" R3 J9 K1 Z1 B; [; ]1 ^
  F/ Y! J3 z5 f$ a
) ?! S0 P+ Q9 W: M) ^
! z9 {4 w  O8 W4 {( |' x8 Z7 q
$ o' I7 ~2 l" {5 y. K. V, M# B0 H
void SwHandler(void *CallbackRef). N: i- u% g0 h- @9 o2 j, i0 N
{
" _: }. O7 ?0 ]. k4 ]; q  _0 M1 J) G7 z& f
    XGpio *GpioPtr = (XGpio *)CallbackRef;
: C4 m  I# i5 [% n5 Z5 k5 ~    xil_printf("Switch Interrupt!\r\n");
5 m4 I2 D! L' S6 ^& z% d2 K# v    // Clear the Interrupt% c7 h' O9 L, e6 v( \2 s
    XGpio_InterruptClear(GpioPtr, 1);9 }/ V/ j2 d9 s
3 S) ~* J, k. ^* J$ q
}& _# E/ k0 ~+ G: J2 x
5 b& T# b5 m4 z* A. W) d/ @; M

: B. T" ^2 I2 K! [. Q/ bvoid KeyHandler(void *CallbackRef), |( C7 ?* A# {
{* m7 m0 ~2 h: N5 ]

7 R2 K" I* U$ O, N3 t6 e: n* }5 w1 g* n6 x* @7 x
    XGpio *GpioPtr = (XGpio *)CallbackRef;
% g; T, {# v/ _( a$ {3 ]    xil_printf("Push_Button Interrupt!\r\n");
3 s$ @0 r) _( i  x" E4 G" w! T    // Clear the Interrupt& c- c" _/ C) @; K
    XGpio_InterruptClear(GpioPtr, 1);
$ M/ |7 r+ G) f+ g
- i2 `+ E. i' B! C* j}
! `- j: E: z5 t0 a" Z! d. S3 a  Q$ v3 R! U  G

6 d1 f4 F- j3 M0 G! n% G1 Q4 |  F' s

  S& }4 a9 O4 r1 s9 e
$ t3 v) i  q+ x$ y% N9 Wvoid print(char *str);- M& n+ X- N+ N+ W
% }6 g/ h6 J0 H7 t% J# W3 P" B
int main()0 Q- x, G2 M7 _9 r
{
2 X0 g6 R0 Z5 b; v    init_platform();5 z/ S$ G. p. ~

( s( c8 B9 \% Z5 l2 \  _# ~6 F2 N    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
" M8 M) ^* m1 ?3 e! R8 ]* l    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);
5 ]& t' T$ c# N# O    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
7 J  Z2 Z: |# d' {+ U* D8 q: b" z" k. ?) D$ @3 K
    XGpio_SetDataDirection(&LED, CH1, 0);
: b9 x6 S* ], }* y1 v    XGpio_SetDataDirection(&SW,  CH1, 1);2 R  C1 c. l- [. u, g# a" [
    XGpio_SetDataDirection(&KEY, CH1, 1);3 _, q& F2 K) A5 o& M
9 |! H! ]7 l* v6 X3 _
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off
7 u9 c( \% S; T( V. I3 O( r3 e1 u3 P- n/ _: q
    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);; K/ N2 D. s, w+ }7 i
+ n$ ^% {2 J9 V2 }! r" U/ a
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
+ L- `0 y0 D+ |3 y6 q                          (XInterruptHandler)SwHandler,! ~: v- u( n( g4 }0 L) D
                          (void *)&SW);; W+ `) z" x7 b& X2 V; I1 w8 s

  \4 K7 y1 `3 A: [* @    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
5 Q( @. X2 Z5 F( u                          (XInterruptHandler)KeyHandler,6 S9 d7 |0 t6 s, X/ O
                          (void *)&KEY);
; t: F7 T6 x1 r- i7 c! ]& K9 O3 v; L& f- c* C1 ?4 b5 i! ]7 I

; t- R, y$ {4 L4 B    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process; m1 M+ H1 x2 p
                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,' n1 \# S2 y; J9 T6 ?" F! Y
                         (XInterruptHandler) timer_int_handler,' e8 X- @! Z$ Y1 {/ d
                         (void *)XPAR_AXI_TIMER_0_BASEADDR);( v) ?- E6 `$ N" z1 L" K- D& B

" W% }7 A( W# \- l    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);
1 }7 f* S' ^* f0 d7 N; E    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
: {4 t) `3 J8 `& r# y' I, H# }" Q1 k+ V$ A5 P
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,
" b( T8 N# o5 B                                XTC_CSR_ENABLE_TMR_MASK |
0 }+ |9 s5 o3 {+ b0 G# _                                XTC_CSR_ENABLE_INT_MASK |: r5 j& H1 @/ `$ z' Z
                                XTC_CSR_AUTO_RELOAD_MASK |' a- y! B2 ~$ p! _/ F3 L/ f% a
                                XTC_CSR_DOWN_COUNT_MASK);8 Q, `- n2 N% E9 H$ j0 L6 j

! e$ a* Z* j8 x  r, U* p" q( t. B! `2 g
    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU3 a* U" B: Y1 u

- r& S' `- s: ^" y  x    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
, f3 y4 ~$ O% J  f+ s    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
' A* z- C+ b/ z# e6 T0 X/ |% [! D) Y
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
7 y" s+ E% c6 W# h5 W                (Xil_ExceptionHandler)XIntc_InterruptHandler,6 b3 M* s- p1 ?' h
                &Intc);
: x8 l; \4 }1 e0 t& S0 R. `# A" ]
/ W. f0 l' \! x* c    Xil_ExceptionEnable();4 ^8 S; o3 H1 n2 {: C5 o  i& L
5 N* |0 ~& b+ Y' `7 m" {
    XGpio_InterruptEnable(&KEY, CH1);, ]! q6 h) j: ^" T8 _- u
    XGpio_InterruptGlobalEnable(&KEY);
5 Q  N) p2 w, y% [
4 e1 m7 A1 @7 V    XGpio_InterruptEnable(&SW, CH1);
* }0 n5 V8 c8 w; q& w    XGpio_InterruptGlobalEnable(&SW);4 e) l  F; m2 w1 h. f
  E: L/ K8 x7 y$ V/ |& i8 H9 Q
    print("Hello World\n\r");
9 f4 L4 `+ x. u# J! A3 d9 b8 M! b5 u4 l
1 Y4 i" r# ^& ~% x6 |& B
    while(1)
! _  r% c( K! e6 \    {
6 i9 }: t8 B- q5 m! u, q' n" C: H+ V& Z2 H$ x
1 s  x6 @! r. _; P3 h5 Q1 M
& t8 o; w$ K# y: n8 @
    }
- r( v, V- x. x4 y$ `
9 V3 S3 f* y5 Q  `; k1 H3 f* c
; E2 d; c1 d$ M9 k    return 0;
* T$ B& S( T% a+ |* i) A, h7 n}- k* D3 K! K3 ]9 g/ J  @
, u* l4 k' _1 U) |
这个模式直接操作地址比建立一个实体来操作会快好多) J* |1 G! E' j5 q8 ^7 M. v+ {

+ X. p6 t1 |7 d% ]0 \  v
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
回复

使用道具 举报

 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();
; c1 N  a, i4 `& z0 w0 [/ S代替
8 j9 K* W0 `3 r3 o" w    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
$ u# T# s# A" r1 d& J& j* ^, ~                (Xil_ExceptionHandler)XIntc_InterruptHandler,7 \, R" x1 Q. r
                &Intc);3 c: k/ _5 [& m) W$ B; s  X
1 S7 `  T! ~  `* n$ p0 ]
    Xil_ExceptionEnable();
回复

使用道具 举报

 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠( w' {+ e5 y4 r  I( l. _
XTmrCtr_Config XTmrCtr_ConfigTable[]=
! u& `. }/ |" H{
. L& G" H2 o1 ~- N; D1 Q+ J+ k {
0 u& K/ n" Z9 `  XPAR_AXI_TIMER_0_DIVEICE_ID,8 y' g$ \1 [5 I( F
  XPAR_AXI_TIMER_0_BASSADDR% B  e- H! @  m4 @3 h. H
},
! L: O* b; Q) x2 V {5 w. Q9 D; K3 f! m
   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,+ N) y, T9 h4 s" q' ]3 E6 T
   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了
9 P- {/ o8 @: F; B5 T }
$ @; V; c. h, V};1 U2 F4 P4 O" o" p
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-1-12 05:23 , Processed in 0.033362 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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