一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 5674|回复: 3

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑
1 f! I1 s4 M0 j' \) x' W) s6 k/ B1 X. a& Y& e: |. c
#include <stdio.h>6 W4 z, ~3 O. C4 ?! i! ]
#include "platform.h"
4 l' i4 T7 G1 d+ Z* f0 U8 Q+ h#include "xparameters.h"
: _3 Q, W% o# g- [- j#include "xgpio.h"$ X4 i' l) \2 _
#include "xintc.h"1 a3 C  Q- P; C, P3 C7 i
#include "xtmrctr.h"
- J' i) V/ j9 I* e: S: \$ x#include "xil_exception.h"( f% f/ E0 I2 S5 K+ X
7 P: _' L; Q* U0 z  M& p" q6 m0 R
#define CH1 1* w/ ^# G# z% l3 T% C: a1 x
# h+ R- U! c3 d$ Q! s& G" |
XGpio LED;' M, l& s9 k* n6 n2 J* F/ P! d4 F
XGpio SW;& E: L, Z' R" y5 x0 Z
XGpio KEY;3 j) V! E  Z' I
XIntc Intc;9 i3 ?9 W. w1 x, R; T

0 w4 f! \- Z% y, nu8 count;: R0 A/ f: D$ [$ q2 Q4 F

3 c& v6 O8 N$ B: c7 d  @. g3 \- O( Q! w+ T4 R
/************************** interrupt handler process****************************/
9 [. c/ S' T% ?5 s5 G$ A$ v; Pvoid timer_int_handler(void *CallBackRef)
1 a4 R( w# u8 e+ {$ z{  E8 h+ j2 }: f1 y) q
  unsigned int csr;2 ^- d) n, a- [
  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register
2 r! M$ i7 F- e% Y# t4 W  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;
/ Q2 N( a# _3 P2 M' W4 K: ^+ |6 ^+ _  [  \9 @4 B( ~, ^5 L% B/ @5 a
  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication
5 o. O- ?& f% Y% ^}
" E" k4 h0 ~7 W$ ]- _1 R: V* F" W' ?* K; g& i- _8 F5 `2 b

" e2 i$ }" `8 J% S3 x  V$ y
1 f& h1 g4 @3 d$ Y1 M' f1 H, b1 q4 B& b  ?
void SwHandler(void *CallbackRef)
! f& X( O: R+ @3 j/ w, m1 i3 U6 i{& B- R/ ?7 l4 d. D

6 h! d9 E7 F8 Q# s: `    XGpio *GpioPtr = (XGpio *)CallbackRef;# R: |( E4 v. D. m: I# v
    xil_printf("Switch Interrupt!\r\n");) t5 D5 Y% \' _4 H& y9 J
    // Clear the Interrupt
$ Q) Z8 k. S7 @$ o3 T# G2 q: d# p- V( }    XGpio_InterruptClear(GpioPtr, 1);2 b1 e- F4 f( t4 a. @
3 K' ~6 z" }% U3 g  N+ Q
}
7 k* M" }1 I4 P# Q) _6 G) {+ u" J3 o! p: y% t% m' ]

5 f4 q/ N$ @+ ~void KeyHandler(void *CallbackRef)% Y* ?# {7 m# q) `9 C
{8 s5 g6 _$ D' Z8 d# r5 P9 x1 M

/ n2 q% i. ?' q  L! l
0 S2 {# j4 s, k- F0 G% \- R) t    XGpio *GpioPtr = (XGpio *)CallbackRef;
# g& B& J5 y% Y, p    xil_printf("Push_Button Interrupt!\r\n");5 I5 e# c% l0 b4 ?
    // Clear the Interrupt
  w# D5 J& n- a4 a& b4 A$ W9 l  J    XGpio_InterruptClear(GpioPtr, 1);
% G& `( A+ `% Z' C
, H0 N( ^6 }- H$ B( K4 c) g4 X) e( A}, n  V5 b6 l' I! E# x3 V7 @, C0 f

" W" p: D# L; z7 W7 f! H3 a; ^- i5 c& [3 i% l/ B6 T

( K6 j2 P  l9 q3 z& v7 j
' g3 O) Z. d8 L) r& C* z; ]2 |3 N0 Z" C; s
void print(char *str);
- W0 M0 \# N4 I/ F1 Y8 e' n8 W
0 m+ k3 g0 Y3 p2 |int main()$ X+ [9 c+ a8 Q  ^( N% c$ D
{) `5 T. F  l( O; s
    init_platform();* ]* D# ~- k( s& q

% [) L2 P+ X* x  g- J# K9 C8 F+ @    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);, W! N7 i' w+ P, r% U: |* Y1 u
    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);$ s' ]! p  }! `! g
    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);/ g4 Z) h9 p# t3 e$ t: c
' T7 Z, h$ |" C! q$ ^7 [
    XGpio_SetDataDirection(&LED, CH1, 0);  s$ x7 o& Z( J9 N( U, r9 b
    XGpio_SetDataDirection(&SW,  CH1, 1);0 [/ I# E( \6 N0 ~& [/ r
    XGpio_SetDataDirection(&KEY, CH1, 1);7 q( N: m& U) V8 z% r  O$ V
+ ]6 \) v3 t2 L
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off
! p9 l, b# V' H; `
! q9 [1 u' u( K! k    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);+ d  Y  b5 T: P& n9 V& z! }" J" Y
$ E, _) v% n" Z1 |
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,: s+ z$ l0 E( y' W/ l8 v6 P- V0 z7 V# @
                          (XInterruptHandler)SwHandler,
* ?9 R  i8 J8 X                          (void *)&SW);
; {8 ^0 W! n3 i9 e. g
4 H! u5 _* @9 k0 I    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,# _3 r* F2 `$ a2 W* S+ z% h' O; R
                          (XInterruptHandler)KeyHandler,4 C3 c* e$ B) R. T( H# \+ F
                          (void *)&KEY);# N: j, K4 V9 z8 A/ V; C9 n( P' I5 Q

: u) R1 K5 `: @& D0 R3 U1 q+ [
- t) `- R4 Z+ J  x) z1 a" A, w    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process
. \' T* j+ d) |1 d                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,! O7 D$ s5 q4 z5 S" m9 j/ ~
                         (XInterruptHandler) timer_int_handler,
+ i2 S6 i# o1 u) j) T6 Z                         (void *)XPAR_AXI_TIMER_0_BASEADDR);
  ?6 X7 F7 q+ V6 N& B/ S, t2 F( n3 V
    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);
+ G6 P6 h  T. ^% y    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
3 \; N$ M* G) k3 D9 z# n3 i
( u  ?$ j7 m1 J4 @3 @4 h    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,
6 A% q. f! ?- q: E+ [: A                                XTC_CSR_ENABLE_TMR_MASK |
* z9 p7 e; \6 Z% T2 b  w# X# b                                XTC_CSR_ENABLE_INT_MASK |
  g+ W: Z  r4 Z9 `                                XTC_CSR_AUTO_RELOAD_MASK |/ I( O3 q6 `3 s& o+ f
                                XTC_CSR_DOWN_COUNT_MASK);
% K2 j; {# f8 m5 a- ~
+ v% F8 \" f$ g8 C4 m- y7 ]  U; `* Y6 H4 ^) x3 ^+ S* u2 z2 d
    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU
# e6 w6 l  {) l8 Y( V( @* X) v9 y/ Q- s$ y# B' i% E$ l
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
* B& u1 ~* y0 k    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
* J. D; |# w+ p5 \' [, X+ a  l4 K- X/ O, E( H6 L$ U( w7 o4 J
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
$ W* U/ d, t) R                (Xil_ExceptionHandler)XIntc_InterruptHandler,
. Z& |* e) b8 c. d0 @                &Intc);
& P/ K. a8 t& d6 }6 l; x# A% u9 Z- N6 B/ _- o8 Y6 l
    Xil_ExceptionEnable();
. g$ X. i; M% Q0 \8 ~) f* j: _- W6 `, u% ]; \9 m5 l" Q- [& D: T
    XGpio_InterruptEnable(&KEY, CH1);  j: r8 M" Q. k! \  p+ p; y6 \3 n( _
    XGpio_InterruptGlobalEnable(&KEY);
4 c  O: z! f, {) ?4 M3 r( _( W! e6 W' r
    XGpio_InterruptEnable(&SW, CH1);
6 D5 i3 I  B; |( _  q& T: M- F; y    XGpio_InterruptGlobalEnable(&SW);  v' [" H# o8 [
$ B* L# S- h* z; w
    print("Hello World\n\r");
1 N+ j+ z3 U. a. Z
8 V5 b# a% ]3 _( W4 ]+ {" N
, J! K+ z* f* l( r; y    while(1)
7 L8 I$ t3 Q4 N* @$ a  K    {( \1 Q7 r7 v9 h( G( V8 x+ m9 W

. x3 m# Q: i' e' h6 e' |4 a% O. Y3 u0 O4 o+ N3 u

5 r! D6 s" W8 t: u6 ~( G/ c    }
  K! v+ Q; {3 ~4 Z# H
+ r" @2 b* l% E4 w
6 ^  k) N8 k% @    return 0;2 M% s  i3 |0 a0 j1 K$ d
}
+ F; @- M- Y/ m$ K- j# U7 |# S' F$ ]. K: L: y
这个模式直接操作地址比建立一个实体来操作会快好多
( r0 r% x$ t/ {1 ~: m! W: L+ }9 w# A  w7 M8 n
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
回复

使用道具 举报

 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();/ \& g1 s$ q! Q  k1 `+ f3 |
代替
9 L5 Y9 I8 D1 q# X9 `0 g! |    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,: f# i7 A1 B+ N/ @
                (Xil_ExceptionHandler)XIntc_InterruptHandler,/ u' l+ ?6 j$ b5 v
                &Intc);& I& g  G* ^" U. o

3 }3 Z  L1 N3 L$ F, a2 \5 `    Xil_ExceptionEnable();
回复

使用道具 举报

 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠6 T% y5 s1 y7 A
XTmrCtr_Config XTmrCtr_ConfigTable[]=% D+ T, g* S( h+ F- a
{
, F$ l7 X" r  z# A- j {% e6 e7 o% P% o4 ]  c  B! i: B' ?
  XPAR_AXI_TIMER_0_DIVEICE_ID,/ ~& x& k. H( a- R& g8 a
  XPAR_AXI_TIMER_0_BASSADDR- Q% K; M6 ]3 K3 }( l1 ]
},) v$ j$ M( f4 I
{  m3 T/ ~/ _" F' R# B6 C* M3 S" U
   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,5 O7 W2 V( P! {: ^! B
   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了
. D9 a. e: x7 ?- L }
/ g$ E4 ]; `* o( J  t};6 N  D3 n' D& ^( Q8 b
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-8-20 09:00 , Processed in 0.052159 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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