一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 5290|回复: 3
收起左侧

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑 ; N5 s  e; Y  e# c# R& Q0 z
" F: A1 _, U/ e! y2 a0 J: U
#include <stdio.h>5 x. ]7 ^! {; @" R# @: l8 P
#include "platform.h") m  _- i% q- |# g2 N  M" W
#include "xparameters.h"
. g" |8 A- B3 G. ^; J#include "xgpio.h"  X7 r5 B% m, l" F) l; B
#include "xintc.h"
5 ]+ ^8 w. e( V* I/ j* l#include "xtmrctr.h"
6 M( Y3 F% [9 y#include "xil_exception.h"
3 X: \# P/ X8 Z' E2 F
% Z% u. E6 P  W8 f5 I: V  U#define CH1 1
" g" p% T# g% |! k- C0 b: `
5 q3 c' d0 s9 U# }  E( s, C+ bXGpio LED;
5 [+ @$ {' Q- qXGpio SW;; H* a0 m5 O4 f) b. T2 Z2 D/ z# {
XGpio KEY;" W+ G$ R! p4 `# z  u
XIntc Intc;, o4 C5 J2 U& D/ W7 M. o
$ k/ ~! u) i, _, ~. V: l/ ]* R, z3 P7 E
u8 count;
7 S3 M9 ^( h6 S7 }6 C
$ a5 h( ?5 n' A" O# A$ N0 A. ~) j  ], G# J
( ~4 h% u, h0 `! k! |/************************** interrupt handler process****************************/
" D% \# L" j  z! W) Zvoid timer_int_handler(void *CallBackRef)$ F3 E) b$ l- ~
{- U( ]7 V0 k6 Z8 m7 }8 z
  unsigned int csr;9 W& o& h  S: S: s( g. b+ y% B
  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register' ]- }2 I# Q! T  j4 F3 o" M# P: D
  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;
. {0 N7 l% Y" c' s( D- w- n  g
5 i0 z% @: C6 L- U# `  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication( y) ]4 G' `; e. h3 B, x
}
  A7 r8 d" R8 T  Z  `" \
! w, Z  k. Z# w/ n' S' n" G4 E% W6 ?  A
# k3 `1 [! c1 j1 T& D

$ v! r+ b, V; }4 \void SwHandler(void *CallbackRef)
. W( J# i* x0 R' {( t2 ~2 x. N{
! X" R4 c; p$ d4 }
% n% t/ z. A9 P  C: X    XGpio *GpioPtr = (XGpio *)CallbackRef;- @+ z' J8 s0 N* y8 S3 o6 J
    xil_printf("Switch Interrupt!\r\n");& f- O- o  f4 [/ b* o
    // Clear the Interrupt5 j! b0 I! f* P0 O2 e) ]
    XGpio_InterruptClear(GpioPtr, 1);, [7 Z5 E2 U7 x& }0 E# J* T* n

0 j: X0 d! w; e}
( r7 |( Y: {+ s0 q% s0 ?/ `
( @# Y0 T( _% ^6 r1 E6 b& T7 P% d. y, e7 [
void KeyHandler(void *CallbackRef)! n. z3 e5 O1 v$ h
{+ o% n8 }, Q9 X7 w$ ]
, v  ^  m  l# `- w

8 `: U! Q- O" g8 z  ]7 d$ I4 y    XGpio *GpioPtr = (XGpio *)CallbackRef;  w. z" a( @0 f* T$ v' s
    xil_printf("Push_Button Interrupt!\r\n");, y* @: z. p& t$ p+ n; b
    // Clear the Interrupt9 L, d0 C! d# i8 _
    XGpio_InterruptClear(GpioPtr, 1);
8 p  x7 e$ d! p4 v% Q" K3 Z: {* |* S% \/ T
}
3 M  ?5 n# N6 Q6 Q7 {9 J+ O6 m, F/ P4 R  Y9 B, g

  `" R9 J. I* J" m; N* K) T7 e% u
: H, u3 R5 E% z6 W: h0 w

4 K" Z  |, f) K/ \2 L+ Vvoid print(char *str);
0 l  l8 R. x. ]: ?
& S5 W( g. V: J5 oint main()' N6 f2 N2 |$ r0 y; H& J
{
3 X) i/ @2 n8 e" I* B1 P* |    init_platform();9 `9 z9 w% a) V& b" q5 _
6 S) x( z9 ~6 X& ]: s$ l
    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
) L) z. q9 }  {, i/ S& T    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);+ B( O' @, q" A# s/ W4 @
    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
3 I8 B9 ~! p5 X4 H5 W: M! U
5 R, i* e# u% F: p2 ?    XGpio_SetDataDirection(&LED, CH1, 0);7 C) [! {3 y8 O; V. ?" k( ~
    XGpio_SetDataDirection(&SW,  CH1, 1);1 [) _- p2 z9 [& T
    XGpio_SetDataDirection(&KEY, CH1, 1);
+ r$ P  q3 k) v$ h4 x* F$ S3 g- `$ ~, [2 ^# Z
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off+ X- s, Q  K( O4 F7 N

5 \. Q9 A% |3 A' T1 s' q! y    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);, f: o; d  z( y3 @4 N3 |

8 L8 h% k5 z' q* P4 b. i, q9 A7 Z    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
# c# a. C1 a& E& J5 O                          (XInterruptHandler)SwHandler,  \, e$ N" \+ {' x; l
                          (void *)&SW);
1 H3 y: ]" R- j% |  f! T7 q8 f& y: P' f9 P: l, s6 a
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
" a1 ~! a: I3 I# w; |. z                          (XInterruptHandler)KeyHandler,
, N, G5 _4 J5 m( T3 M) ?6 k* k                          (void *)&KEY);
/ _" q. N/ k8 `& I+ }/ c
4 o- K: }& |1 @5 `  S: u1 ^* P( I& [; H+ Z4 n7 `3 G
    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process
  r" M; `1 r  K& N  n                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,
6 R1 V, g8 U, L* `1 S! `4 u$ r                         (XInterruptHandler) timer_int_handler,! x& L( z0 j1 j( X. M" w2 n
                         (void *)XPAR_AXI_TIMER_0_BASEADDR);) d4 v1 r; c4 p; A: i7 I5 ?
4 Y7 H# e( T; f
    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);% ?+ h' a0 ?' q" y/ E, Y
    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
3 Z- `/ p3 j4 r- l. g: q+ k+ t4 C8 i1 N- E# A+ X! n
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,% Y) z! X; C9 |& l
                                XTC_CSR_ENABLE_TMR_MASK |: r+ u" j; [( v2 a+ |+ L' `
                                XTC_CSR_ENABLE_INT_MASK |
- X6 v4 R/ p9 c7 N# \* o/ ^                                XTC_CSR_AUTO_RELOAD_MASK |8 o4 `' U# r$ s/ a
                                XTC_CSR_DOWN_COUNT_MASK);
4 d% Y& \( R) `
9 q. Z) h1 m7 s5 r+ B& R. f3 E% A4 O- N
    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU
* B, I5 T! L# y0 N
8 D* ^* d8 z" o3 v( b; z! P    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt) j7 A0 f, `' H0 G/ Z
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
/ q3 S3 b8 b& m
: e" O* X! f; |7 P/ Q7 W    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
5 L' b2 O5 _2 O& k0 `                (Xil_ExceptionHandler)XIntc_InterruptHandler,
& l8 l# J' \2 f0 Y% a4 K                &Intc);
) T- T. o" b: U- x2 C, o9 G7 q$ ^% p" Y0 o- |
    Xil_ExceptionEnable();: H( J% V, w+ }( L) c

7 Y# X! _: c/ Q/ H5 a    XGpio_InterruptEnable(&KEY, CH1);
. x) ~9 Z4 Z2 ^# V* ^6 q$ z    XGpio_InterruptGlobalEnable(&KEY);
5 h! o  A- h2 {) [  J4 c
) d5 w) Q% _- |. Z    XGpio_InterruptEnable(&SW, CH1);3 T: h: Z6 }4 {, Q
    XGpio_InterruptGlobalEnable(&SW);
) w3 E" \, `& E8 L* W4 {& U
( [2 O& }- ~. C. ~* T+ V) E6 y    print("Hello World\n\r");, K& c! O; P3 G1 Y4 C" b1 n3 e# Y! D. p# a

8 Y9 E( `# ^5 E( n! f+ }# R; J$ i& |: \0 `6 e. R* o
    while(1)
8 @. u2 Z) s+ ?6 X4 c/ x0 x    {- q$ g" |' P/ q: w: K

% i1 |% g: G1 s: K  s6 \3 q5 L5 o1 d
5 x8 e! ?$ \% t% r$ A: }9 W
    }
$ M5 a5 a6 I9 i7 `! F9 a
% @# Y: N/ ~1 k  ^/ {4 [) W- t# I/ f- g
, }  B1 v0 c. g+ R    return 0;" g0 ~' ?' _5 [# H4 z
}  E# o+ X1 d) S, i
+ J8 N- e& _- B) Q5 ^
这个模式直接操作地址比建立一个实体来操作会快好多
8 F3 ?1 \- Q/ l* e: `3 E; R4 s; U$ ]9 D3 Q% @8 X
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();
! P4 E- K2 C7 H' Y( j5 P) I代替
, ?: b5 r" |9 i; b- t7 V/ m: m" y    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,; n) {% `6 _- j5 d4 Z
                (Xil_ExceptionHandler)XIntc_InterruptHandler,
9 L- B/ |& F/ n# D8 t+ F! E* e                &Intc);
4 Q  f+ @# u' X# Z; o' b" }* n3 Q+ D) [& ~: v
    Xil_ExceptionEnable();
 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠
) n, D4 Z3 W6 k; s+ \# K& ]XTmrCtr_Config XTmrCtr_ConfigTable[]=
! p, w% a8 D6 R9 G( U$ w{& _6 ?# [! H6 V& Q
{& @5 R# g* O1 }; H& N1 g& ?9 s
  XPAR_AXI_TIMER_0_DIVEICE_ID,& W5 t" F0 O6 v$ |+ ^3 V
  XPAR_AXI_TIMER_0_BASSADDR
6 W+ V; A9 q3 i% T$ W' L },
: x$ q; f% L. E) ?  W: R {% A& x, `% E% Y
   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,
/ _" x' @( `' ]3 y   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了6 p. g. T% z% M
}+ ]9 U) ?$ U7 b; G* a
};
  @) d0 t, Z; j- s" g

本版积分规则

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

GMT+8, 2025-4-28 05:26 , Processed in 0.046044 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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