一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑 7 v" d5 o, N$ G0 X- n) S- o
6 z% A. O/ n+ o- X
#include <stdio.h>
% ^3 w. D" M# d. [, x; h0 B#include "platform.h"! b  ]& w( }& U3 j
#include "xparameters.h"
, o) E2 X+ k6 q2 j* E: I# f/ v#include "xgpio.h"0 F" O8 c" n  v! n
#include "xintc.h"
4 D, a, n& G$ L# P+ y! M! _2 d#include "xtmrctr.h"
. o8 e1 }7 e+ r% S+ E#include "xil_exception.h"
6 w' f  v; W, D8 i
7 h( R2 U7 _+ j& N. \4 P#define CH1 1
: E) N5 @4 C. w$ l" }
6 s( [" r  ^+ t3 u) u; q8 UXGpio LED;4 z- P) f! F8 W+ T8 S0 p: Q
XGpio SW;
: E+ L$ R5 M- c9 K0 v: U* L6 kXGpio KEY;
$ A1 f; k1 |; a; B' hXIntc Intc;* C0 J! u$ a8 {6 b- J/ R

: D9 ?, ?/ S( v% i4 Vu8 count;) R8 g% `! D. d1 ]! M' w; f

1 X. R* r7 G. H7 v
( T! X3 U* ]# M* d* ?/ M/************************** interrupt handler process****************************/
- _: b) R' `: e+ cvoid timer_int_handler(void *CallBackRef)
1 i4 m/ \6 b9 C: S2 z# q1 y4 [{
0 R# J- ?3 s% i9 x0 J% \  unsigned int csr;+ r# U5 S' n1 e( w) X3 Z! t
  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register
& _% W  w6 |3 E0 V8 L  A  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;; ~* B9 m4 N3 I; t

/ G* }8 q, |4 M) U' n  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication; n) ^; M2 I# r, N
}
8 J4 v2 }2 M+ S3 P3 }- \7 ~: C+ X& c( e, Q9 y  \) O

" X" n6 _! |+ _0 f: ]  Q/ N- ~% m- ?; P( x% d7 O

0 z% @( W& F1 _4 _6 nvoid SwHandler(void *CallbackRef)6 |. t4 K& s! B) D# m# P7 f2 T6 I) _
{
  T7 G- B9 f" L/ B& K9 B2 B; T  D8 c+ T
    XGpio *GpioPtr = (XGpio *)CallbackRef;: v% S/ t+ @4 l5 J( W% R
    xil_printf("Switch Interrupt!\r\n");: H6 P0 t8 \0 b
    // Clear the Interrupt' a) [+ z6 D( {, ~) i" O' ^; H
    XGpio_InterruptClear(GpioPtr, 1);
% L. q" H0 t8 t$ U/ t# O$ q6 h! k. C/ w+ G5 p7 `3 U
}
7 j- U9 L. z) @" T- |+ v' F" }" P9 m; r# |% a% S6 ]; H

* V: Y( \% Q9 H, _1 ]+ k+ F# x6 Hvoid KeyHandler(void *CallbackRef)
9 {, Y% N$ q! i9 A- s6 [{
$ M% ?; M/ E1 U! M/ C
+ V* t' L1 R7 b0 Y0 R6 p
* \, h+ i# [1 o5 e1 A9 {    XGpio *GpioPtr = (XGpio *)CallbackRef;" w+ T0 s1 D  E
    xil_printf("Push_Button Interrupt!\r\n");6 D1 M  u! ^' Q) J
    // Clear the Interrupt: o, [& V& |5 }$ |* ?
    XGpio_InterruptClear(GpioPtr, 1);
6 ~: r8 z  F; a2 }; ^8 ^% z- ?, [6 v5 C$ v; y& ], v5 n3 f6 K+ ~3 Z  `
}
" q7 f1 ]$ J- [0 h' c
1 K7 R! ^: R/ \3 y* O* _
4 S6 w: s1 X  e+ C( h
4 {2 c6 e# S8 b% r. p" K% }- [2 {
1 O/ b& C$ }: d( \
: ^4 Y) W) D* w" m* M# v2 e( pvoid print(char *str);
! l8 z; C: w5 Z1 [* V
. w8 T1 @7 m/ b1 X1 Q: hint main()
* F2 r, O# J0 e+ \+ p' d. M{2 x# n; x) J! B% v' @0 n8 z9 t/ b
    init_platform();$ Q. O0 {8 z5 s2 X: C; l
% K( D2 @1 _' l* x7 E2 ?
    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
7 K+ b9 x* h6 e; e+ z& m6 Z; b    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);7 x% {) h+ O0 H) A, h
    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
2 t+ q# y4 N$ I7 w; Y" i* K# w9 z5 L
5 ~3 G8 O! {. u0 ^    XGpio_SetDataDirection(&LED, CH1, 0);
" d; v3 g4 Q& g2 n, g% h. ~5 [    XGpio_SetDataDirection(&SW,  CH1, 1);
: x$ T  N4 ~7 t& e! n% H2 O    XGpio_SetDataDirection(&KEY, CH1, 1);5 f- s: `. r- \
1 F. G/ j$ J: v1 y
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off# }9 Y8 j: h% m% W

/ l7 E2 u# U4 s6 B3 J( G' x    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);8 C: F; ?, M3 G/ R/ H1 f
7 P7 I$ \4 e7 L0 N# r5 B8 {
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
7 f4 k* L3 v5 |& N+ T! D                          (XInterruptHandler)SwHandler,
5 Y% o, |2 S; N+ x' j. `  r                          (void *)&SW);
- s0 T1 ?' C6 i9 c, c0 q4 ]* s3 W9 Y  `4 R* S& _# n4 j6 M, j5 O/ r
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
; s8 C8 v4 m, Y+ S0 E4 N0 b                          (XInterruptHandler)KeyHandler,
, i3 d6 H/ c1 h. }                          (void *)&KEY);
1 l' o' w$ m4 I: a6 T: {! D% F" F6 H, S1 p+ U% ^! T3 C0 z2 j
* O2 k/ i$ O! q# B  [' K  B
    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process
- Z/ b' b" W2 V2 d6 N2 w  J                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,
5 o9 `' q2 k" J/ Q  a% S                         (XInterruptHandler) timer_int_handler,
, B1 c& n+ v/ p& l" W                         (void *)XPAR_AXI_TIMER_0_BASEADDR);" l2 B1 ?' z9 a% P' d2 ~4 G

+ D$ K$ W* b9 T0 l    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);
8 _1 z: O/ d! O6 J: H, s3 g* P- x    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
+ v5 l6 n; b! K* C' t* |5 w  A5 C" E& `4 l+ w
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,  `0 T' W5 M0 B& q1 y$ j
                                XTC_CSR_ENABLE_TMR_MASK |
4 _& l" ^7 P7 X* q* k                                XTC_CSR_ENABLE_INT_MASK |+ r% f6 g3 p3 ?. W' Y( ^# P
                                XTC_CSR_AUTO_RELOAD_MASK |
  U5 D1 b% p5 J1 X! M                                XTC_CSR_DOWN_COUNT_MASK);& a3 o2 m# _# X' x% H

3 H4 m5 Z! s, P" F( k' _* ~
2 O  C6 g+ T  _& W. K* p0 `! A    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU3 m. D! f5 ^  [) G5 ?

# P6 I% N* G0 F! d) ?' a9 P: P    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt, G# v! A5 F% H) h1 N
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
+ S$ }9 a- o3 e  f3 W4 y% T' H# n; J: \3 e8 V4 d" N  Z0 \9 p6 S
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
0 v4 }3 L) s. G$ j5 e! c  i                (Xil_ExceptionHandler)XIntc_InterruptHandler,
! R, h' H: h) L                &Intc);$ u6 ^0 x+ E. O
+ {  y! l: M+ J7 A% y# |' `
    Xil_ExceptionEnable();2 X5 X, p8 _- @2 M, V+ T
4 t/ A2 E8 h1 G# U1 l1 l
    XGpio_InterruptEnable(&KEY, CH1);
4 D; N( r& Z/ U' w( g# e* W4 r    XGpio_InterruptGlobalEnable(&KEY);
" @. V- e2 A8 U7 X6 S1 ^; c' g' z. H! K+ c+ _
    XGpio_InterruptEnable(&SW, CH1);
, I& L+ ^- f+ j9 ?+ g3 P    XGpio_InterruptGlobalEnable(&SW);
+ w3 `9 X3 E0 [+ e! o9 T. N  o' ^* i* A( R8 t1 d
    print("Hello World\n\r");
5 H0 Q" o4 d5 y1 _: L! q2 K3 G6 G8 n1 t, {5 b$ K) I6 h3 |% N; k
# ^2 X7 t. s1 \" A9 m, }
    while(1): }$ ]4 j7 Y  t8 V
    {2 C3 b5 A6 {" v3 S

; R# ?1 ~! Z6 A  Z/ N
# r: S; }; {+ r  M8 a& O6 @
6 z& X& C; a6 d% G- w9 H    }
( |' }4 t# `) [. a5 l2 ^1 \2 n( l$ u
; L2 ~" Y- Y$ m6 \# t
    return 0;
- ^) M, z  u1 I6 q0 c; n}0 y2 X4 `5 N6 \: y1 k/ F; S) {
# f+ }  I0 o) Y* K$ P
这个模式直接操作地址比建立一个实体来操作会快好多6 B1 O) W! V8 ^! ~; @) V
8 g/ T& `+ \! Y3 v8 m2 O
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();
/ \9 n; p4 @# l8 F. b9 k, }代替: n5 q- K5 s3 q8 k2 ]9 C, o
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
2 h: x4 J  m/ X+ Y4 L. h                (Xil_ExceptionHandler)XIntc_InterruptHandler,
4 p8 R1 L- k0 [8 @% g8 ^                &Intc);
- ?# `+ j: d  j3 h& l8 N
. f3 E. T% U" S- @7 b1 k! L    Xil_ExceptionEnable();
 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠
7 |+ p3 c: W" I" ~* Q7 {2 S8 Y' LXTmrCtr_Config XTmrCtr_ConfigTable[]=
8 r$ ?% z% T% `- L' X{# F1 A1 i  d, }7 I0 L, G7 u* q
{
% m" m  J' ^: |5 U  XPAR_AXI_TIMER_0_DIVEICE_ID,; p& d# W* ?( f& r2 Y- b
  XPAR_AXI_TIMER_0_BASSADDR" ]! H' J4 m" _" {4 Z+ t1 E( C
},
' ]2 l/ c3 {9 o {
6 d: Z& B- S: A' G   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,
5 @7 Q9 m2 r9 q* |8 F   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了
: f! @, s+ Z: _( B }
& A( \( D& ~# D4 W7 B6 ]};
0 o) P, `. s" Y, s+ V

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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