一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 6283|回复: 3

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑
( C5 v. O5 `* s9 Q7 p/ k9 Q. {. c  R3 X. y' ^2 N
#include <stdio.h>/ ?% i0 I7 y" L
#include "platform.h"
4 ?! j- G# m  Q1 j#include "xparameters.h"# L, }6 F$ V# ^# \3 @/ w
#include "xgpio.h"
/ W  T6 ^. s4 D% N" |( A#include "xintc.h"
1 u3 q8 ], t- E! C! }0 u3 t) A#include "xtmrctr.h"1 n, m3 c1 Y0 F
#include "xil_exception.h"
$ u7 l9 c# L# }: a) v
% b1 b) q! @8 q6 u#define CH1 12 L9 a8 C! C8 c0 ]

; U/ Z7 U* R& Q$ d" ?, I. [6 x+ T# tXGpio LED;1 w) q2 V; }4 m0 W. B$ h3 z
XGpio SW;% j4 M9 ~* z6 l) F- O( t) Q/ S& b/ g
XGpio KEY;
) d  d' }0 e7 p# ~XIntc Intc;- v( @8 U% c6 C2 x, a" ^
3 E0 `( Z& P; l9 G  M+ u) Z
u8 count;# ^2 c" j/ k: W! O% W$ M

; [- L+ S0 D4 [( n! n0 J$ X8 k6 N& C' o& Q" J
/************************** interrupt handler process****************************// ^7 \. B6 D( t* z; B- v( g
void timer_int_handler(void *CallBackRef)
; t- C5 O/ b' j$ Y" z- R{& s: h  K- ]/ o: f! ~4 I; J! q) W9 r
  unsigned int csr;
6 w/ E/ s4 L6 V* D1 P+ M# t$ K9 k  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register+ G+ t& r5 Q+ m! g
  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;
( l2 z) E+ G% X- q6 w0 \3 O" ]' b8 [' n! R
  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication
: _" C* ^' r/ x+ J) T( r}
! z* ^) N6 U( g: S
1 ^) u0 z7 X8 V: t6 C/ p; ^
1 C- P( e7 A1 T% W4 Y, h. S4 x1 |" ~+ c) Q2 n4 t/ H. x

6 v. f! W( l7 C7 \, evoid SwHandler(void *CallbackRef)
+ R6 P% p) b) _, u: s{% W' n3 M& u2 E! q: _- K

) j' ]$ r9 h. P9 m# ?& U    XGpio *GpioPtr = (XGpio *)CallbackRef;! }8 _" S6 S: f: |4 ~6 h. @& a
    xil_printf("Switch Interrupt!\r\n");8 C7 y+ R. K0 h- ~4 c, L
    // Clear the Interrupt8 ?3 x$ H6 y4 _+ g8 n1 c
    XGpio_InterruptClear(GpioPtr, 1);
' D8 H9 b! M, O% s5 r) @# e  X/ @! G! N3 n/ T; u7 L
}
0 S- [0 A& k" I9 ^
# w. }! k. a+ J: ]( Z$ z8 y
) P7 m0 B+ }8 M- b: ]8 G: m  b! [void KeyHandler(void *CallbackRef)
- o/ R7 |. [1 I0 M: r" Z{* P6 P2 [2 q0 a* f( D

: _0 X! m. X4 {2 }
4 a6 u; o0 \9 {, w6 l4 b+ R; C    XGpio *GpioPtr = (XGpio *)CallbackRef;) I; a: v, ?' F9 H  G
    xil_printf("Push_Button Interrupt!\r\n");$ y9 d2 x. Z  j' ~+ x
    // Clear the Interrupt
: o. O% ~2 \/ U* w# A    XGpio_InterruptClear(GpioPtr, 1);
7 k7 g' ?% t+ B
+ B3 b. {4 N( g' b}. s# v: o5 n  o  U! G2 F5 R! ]' c* o

" S) A9 U8 g" l7 i2 `
5 x: v& ?) V0 C8 A2 C" m- w6 j) Q0 N- v' @
" z3 J3 |& c& S) w
1 U" E( d% k* Y( _" w/ q
void print(char *str);
; K/ n4 f2 t# b$ J6 c7 t  g5 q) w8 P/ A5 n% }  r& ?
int main()4 g/ Q5 z/ d- e" E; [& C
{( e( {5 F$ L- Q7 ^+ W2 A
    init_platform();" L1 Y+ k& S, X5 x

: O! C4 W% |  E8 ^! o    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);% ]% r. C9 q; f  n" U
    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);& f9 \5 F# N. P# F( P7 x% z5 p! y
    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
/ W2 X% G7 W5 x6 |6 a# F" Y- b( j
( B) ]0 T7 I5 q2 @    XGpio_SetDataDirection(&LED, CH1, 0);2 P2 U- j9 E. H: O
    XGpio_SetDataDirection(&SW,  CH1, 1);- h: S: |4 O6 p- v; D3 `
    XGpio_SetDataDirection(&KEY, CH1, 1);6 |9 F$ E) c# e' ]. i% ?
, ]1 ]: W8 O+ e9 R
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off
9 c1 S/ R& |. p7 q
3 E7 {3 `# g. c9 [! Z( f* I    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);
( K9 I7 C# L. W7 L6 Q  c/ P- ^" X8 o
1 E: d% Q' K' H! h6 S3 n    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,1 H5 n, v1 v# }2 E
                          (XInterruptHandler)SwHandler,2 z1 Y/ t+ w' J( n
                          (void *)&SW);" w( L. A! e. D; d* `; m4 a
( z2 \5 v8 Z! ?$ F1 o, B
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
$ L* o9 Q) U4 b3 R2 L+ K                          (XInterruptHandler)KeyHandler,
1 s! o+ \* ~) z; Z& q                          (void *)&KEY);
+ ^& J" M$ T- u& b6 V
: ]* Y8 y" A$ \$ n
. N5 h" j$ i, }( t" Z    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process6 C! i: ~! G5 k+ X  Y; k9 r$ y
                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,
( u' z3 J+ H! E                         (XInterruptHandler) timer_int_handler,
; Z  ?5 [# m7 C( c( u/ c/ w# R& S                         (void *)XPAR_AXI_TIMER_0_BASEADDR);' m; |& u2 a/ ^: m

  A4 P# w6 }0 a/ [: r1 Q    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);! y" |  {, y/ u% S
    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
( m: @* u% Y) y* F3 n+ i) e8 j9 @& J" V% @2 d
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,
4 }: g/ ~4 y, a                                XTC_CSR_ENABLE_TMR_MASK |
$ C2 _2 e& L- l  E                                XTC_CSR_ENABLE_INT_MASK |( s6 g, j! e% v4 e: N! O
                                XTC_CSR_AUTO_RELOAD_MASK |
: ?! ^" e$ {" w7 o6 Z                                XTC_CSR_DOWN_COUNT_MASK);
0 {# ~+ B1 O# x! }7 ^3 m1 l
0 g6 O# H/ r. A, `' ~3 [1 j5 Z+ }# j* {
    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU7 Q5 f' d) t4 |' `# N1 ^" ~# w
( m: O& C% z- G
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
1 t. R$ L& j' u7 E6 s    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt  X+ ^- h* g( ?, l* A
4 a" m2 A" V7 z7 ?
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
7 f3 I+ \' Z- W3 z% E, U* P- B                (Xil_ExceptionHandler)XIntc_InterruptHandler,6 }# U8 y' Y6 B! U
                &Intc);3 F: {  }5 z6 m; @
* Y# |, d3 D8 l/ _8 }. E
    Xil_ExceptionEnable();. N( k  n' q0 D1 b1 e% R: y' M" W
' j- k8 K; v3 O7 f1 N
    XGpio_InterruptEnable(&KEY, CH1);
  T$ N2 m2 l; L& {& a$ C' }: E    XGpio_InterruptGlobalEnable(&KEY);% V/ |6 M0 u: O4 f& f" U

$ @1 w& V( @5 j3 N    XGpio_InterruptEnable(&SW, CH1);
8 g  M9 Q. M0 w( A, ~" i+ g2 q    XGpio_InterruptGlobalEnable(&SW);
# F! F0 \4 f  @5 n( N
' I3 B% H, L5 N    print("Hello World\n\r");+ m7 ?. z3 [3 D$ e
! n+ ~: J! W: d+ ?( e+ W

8 a8 ~* a* k/ |3 o    while(1)
6 e( y. l5 c/ X( J- n    {
! \; _# D/ R7 _: i2 e; t6 q0 o' m# e8 S( p) q' E: [
- r! {: V1 F+ z) Z4 A' V$ {+ o2 L

$ E8 }5 {/ C! `1 x6 A7 U& J: M# t    }
# Q" r0 @' ~4 f8 L+ A9 F' W
! O/ C) j& @; j( n) N$ ?" u& m1 W4 q% V! h- J  @4 b2 c
    return 0;
, |6 b/ ~5 h7 _. e}+ z0 l* u; v. T* c$ |0 y; n

5 `* D( @7 y3 B; }这个模式直接操作地址比建立一个实体来操作会快好多$ V7 G' Z. o7 o" X. w. |/ a4 o

+ e. E7 O$ q$ ^- R1 f6 e9 @
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
回复

使用道具 举报

 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();
" X2 K. X2 w/ a0 m% j$ `4 J) o8 R代替  r8 w& i1 e& m- n- y* P7 ~% U! o
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
! S7 f, F" e; g& [& n& [6 J$ u                (Xil_ExceptionHandler)XIntc_InterruptHandler,3 r! _' N: x& G2 \6 p* L" q
                &Intc);. ^0 d) ]- d4 J

1 Y0 C7 B% G  C7 s4 w    Xil_ExceptionEnable();
回复

使用道具 举报

 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠
$ X2 x: K$ h4 X; LXTmrCtr_Config XTmrCtr_ConfigTable[]=8 _' {. Z6 t$ X6 {0 A* ~% q( P8 M
{* P" W' \- F/ O5 i" g' q% L- J
{
& e- R0 f& W7 |1 E; |/ l  XPAR_AXI_TIMER_0_DIVEICE_ID,% l- T& c5 _5 z
  XPAR_AXI_TIMER_0_BASSADDR
) y$ O8 e. \" I" r0 Z8 d5 D },8 T! r8 S5 U( P& a/ Q; e
{
; S( x, |* K  K& `# V' T. M* s   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,
/ p1 c0 U& O2 }6 ~   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了5 w) v! x0 L4 Y. y# Y$ K8 d  F
}
' E+ ^6 H( K, d};5 w6 w% P% e% n4 @- b% H
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-4-17 16:26 , Processed in 0.031240 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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