一乐电子

一乐电子百科

 找回密码
 立即注册

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑
8 ]0 T4 |$ I- v0 v5 z4 u; C5 v. L% B# }. @9 M  X
#include <stdio.h>
& |* `" q  I  b+ X( o#include "platform.h"
+ g6 ?" Y" k5 f$ G, {#include "xparameters.h", Y. ?: ?$ S. i- g
#include "xgpio.h"
4 b" T, c/ G! }2 `" Y+ J% l#include "xintc.h"1 z2 K1 e2 S2 k* s7 M* h: O& W
#include "xtmrctr.h"* N) ]9 L' v0 Q: n  r8 x
#include "xil_exception.h"7 A7 G! d/ D. _9 ~4 v& V' B
2 C* C0 n# X# }+ H# Y
#define CH1 17 f8 ?5 Q  ?8 s! c
( A. `' u) k+ U8 I) ]
XGpio LED;, W( s0 }  p+ t% m6 N
XGpio SW;
+ I4 `, {1 V  g1 m: A, y/ F4 Z' sXGpio KEY;4 @+ C: I5 @/ T3 q
XIntc Intc;
1 d3 d  f$ }2 @" {5 E9 O4 o
' V) D" U1 }& n! z: du8 count;% \' p% u& k+ p! C8 X! M3 I1 c

: [" K& H5 h; @0 j, z1 U
1 W0 H; U/ V4 J/************************** interrupt handler process****************************/
) ?$ i( x' S" T+ L2 c$ Qvoid timer_int_handler(void *CallBackRef)1 B0 ?& K5 `$ _- i# s) t9 ^" y
{
- o& h' p/ b  e  unsigned int csr;5 b' N4 g. @4 U9 I
  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register/ S$ M( t3 H0 r& z
  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;
1 p$ T2 f- C4 ^0 j7 U: t2 k7 j7 ?  E7 S9 _" w5 X
  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication
% S" [  Q% `: X1 K$ _4 }* u}" p  f& k+ F; o

' v) _+ h& H5 t5 M
+ x3 k. J$ r/ s9 L" m
' W: g) y4 r% o0 `
0 L$ r8 ?2 l5 j# T' Z  hvoid SwHandler(void *CallbackRef)" J6 s2 [+ D& T; P
{. t- ?' ^9 L) N% H/ b: e

* C- f- k; H' ?1 b' S    XGpio *GpioPtr = (XGpio *)CallbackRef;+ `  ^9 \5 s- `+ ]- N
    xil_printf("Switch Interrupt!\r\n");
# L6 B) ~9 V2 G* }    // Clear the Interrupt
8 p! k% ^7 p( _( ]9 O. E8 Q    XGpio_InterruptClear(GpioPtr, 1);
0 s: p3 t6 J" t
& l  i. t4 t" k; T9 h}
/ ]8 v, w- n: H6 Y4 ^, J0 l/ j' |7 c3 ^
2 X* a; |  Q7 E
void KeyHandler(void *CallbackRef)
. }  M# E7 u. y{
7 K+ Z6 J2 L( E6 O9 ]
; z1 _: P- ?1 \, i2 X1 E' Y" ^9 k& G, v- W5 @' T
    XGpio *GpioPtr = (XGpio *)CallbackRef;. x' t2 D2 i* }" w& Q) H7 J
    xil_printf("Push_Button Interrupt!\r\n");1 S/ G9 [, B, ?5 O
    // Clear the Interrupt
* ^3 O0 Y- t5 G1 s- u    XGpio_InterruptClear(GpioPtr, 1);
1 V) j6 L8 \* U- x. K# F5 a+ P4 S/ q3 @, W
}1 ^# P# H1 W: ]# W  _5 q
& e2 d# \6 ?" F: G4 D2 C0 a: I
5 c; k. b# [, u

- I  [$ i0 C0 l5 m, o& v# P' m5 o" F" c$ y& b

% ~! t4 {( ?6 V, Kvoid print(char *str);! A$ E  G. a+ y  b- W" i" O9 z" U

$ M* s7 l3 I# F) {9 Q0 v- cint main()2 E3 u6 B! P9 P6 p# [6 J+ f8 g
{
" m3 c: p3 ?3 `1 C) x9 b7 j: j    init_platform();
+ k6 H2 o  a& F* s  G1 O
- ?7 l0 e3 |1 e- V; s& J0 I* S    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);! U; ~( p% g& M/ W) z
    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);& r, i2 F- L3 b/ a9 r
    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);/ `0 Z; q5 y  x/ }( A2 i6 h  y

0 v& i: k! q! h2 Q2 s1 d! b8 J    XGpio_SetDataDirection(&LED, CH1, 0);* c( \2 _) }+ v( G3 J
    XGpio_SetDataDirection(&SW,  CH1, 1);
% \' G3 Y$ ^, _3 V; b# W( {    XGpio_SetDataDirection(&KEY, CH1, 1);
* _1 K/ o3 p9 w1 t; q# t, t8 W- L  L9 F& B, E, ?
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off3 a5 h! \! c. o0 E. \9 v1 _
4 }& T5 g! D* e- h$ D" Q! E) v$ t
    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);
2 s5 [% y& _9 @( S$ I6 b9 X. l, b( Y1 N  V5 _6 @; Z" N* E
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR," ?, X, v+ d% z" d3 S$ {
                          (XInterruptHandler)SwHandler,7 T0 X( y8 i6 r( u& U  ]4 L: ^
                          (void *)&SW);
, `' P% L) i+ ^* n, R( i3 U9 h% y
2 K( U3 Z, I, j    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
: S2 ^5 l4 X- Z0 x" p                          (XInterruptHandler)KeyHandler,
' X8 l+ }4 h# S$ U- a# u                          (void *)&KEY);- X3 q. ^3 z  A

- j* {  _3 W% g! c
; y$ n6 ^) O! }8 N# ?: g' j    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process
- N" @3 n. {" j! P4 r                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,
7 W0 _- D9 A& G8 x, `! c# U                         (XInterruptHandler) timer_int_handler,3 g% R) Z, y1 U. ]: `4 z
                         (void *)XPAR_AXI_TIMER_0_BASEADDR);
' _0 G8 n' X% e* _0 J" _9 d  H8 h0 ~7 F) ]) j7 m
    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);
8 E, j# ~& n# ?7 v- o; L. L  y% z    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);/ V  @* ~3 }& D* b! o' B( Y

' _" [! ^% E1 G    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,: G  }! h0 A+ W* U0 n
                                XTC_CSR_ENABLE_TMR_MASK |
8 a7 H% [% z9 k) @/ L; M                                XTC_CSR_ENABLE_INT_MASK |
# ~! X- i& f  K$ r$ e/ {1 E                                XTC_CSR_AUTO_RELOAD_MASK |) z9 O3 p8 W( I+ j
                                XTC_CSR_DOWN_COUNT_MASK);. B' P+ B: G4 R: q: q
. `4 ]' }/ k5 y

" `# b8 @+ ^' A. o; i7 L7 C    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU- E7 Q8 n6 d& r3 I' q6 p
6 Q" V+ B% ^# Q% D
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
/ K3 s6 F' U- b; r7 E    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt; [- Y: n& E6 q$ |3 g

% L- r( k. Z" A6 o; o# r    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
0 `5 n' Z$ a3 t$ @                (Xil_ExceptionHandler)XIntc_InterruptHandler,
% a1 e3 O- Z/ _+ X/ K                &Intc);2 V: V1 k( V/ k1 Z5 A( d. O
2 P, S7 C3 p* y' H1 a
    Xil_ExceptionEnable();5 r1 o, O+ z9 ?: z8 H8 l
+ F" u% b9 }+ n) K, Z- i; e
    XGpio_InterruptEnable(&KEY, CH1);
) i) l% F, V' |  ^+ J    XGpio_InterruptGlobalEnable(&KEY);
" u/ h8 A' r; Y
* C% z# h/ [1 g$ f3 m( q. h, T    XGpio_InterruptEnable(&SW, CH1);
+ K- x0 S  G  }  W$ d# j9 P2 q    XGpio_InterruptGlobalEnable(&SW);
% A0 Q+ y  e4 t. W) Z
: y, V+ C5 [' [, a/ T( I: a) z, ?/ `% e    print("Hello World\n\r");. r# e% c1 F5 d8 b0 a6 f1 I' }
1 i3 |: z9 }' o, w# F4 L

5 F% B3 W' d5 n: \3 Z, o    while(1)
- v+ a7 m+ v( B7 Y+ P7 A    {% ^0 t- n+ }0 z" p6 B1 R6 d% k. w

; f# k6 t9 n& t* {# n$ f8 Z+ J
5 a- }6 ]$ L+ I1 F) c4 C
/ [) |/ t; b7 I/ ?8 i/ E0 @* l    }; d; ?$ `/ n1 g* {. W9 `  K: z& [
9 o4 Y) Y2 F% x& l: ]
( I3 k  g2 u  n9 f" o$ l2 I% e1 ?1 v( ?
    return 0;
' D/ r* [' z; z9 D5 x8 S4 E" \}
7 `+ ?$ v$ V) a: |9 h
. C: f9 N7 T7 s1 E9 H这个模式直接操作地址比建立一个实体来操作会快好多
; @7 V, Z5 ?% B% i
8 B2 H) x* k# Z+ O" J! J
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();" J- @, z# w+ G
代替( n2 Q1 \7 j; t  c/ E0 _7 |: C4 d- Q
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
; G6 a( }6 y: [. {; h0 S                (Xil_ExceptionHandler)XIntc_InterruptHandler,; c, V% b0 U0 g" ~
                &Intc);% z0 `) Q$ ]9 I3 O/ w( p

+ f& k+ H0 Y& w# E: t3 I* m9 L9 {    Xil_ExceptionEnable();
 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠6 ]* l/ ^  I& E0 O. j
XTmrCtr_Config XTmrCtr_ConfigTable[]=
# c0 Z3 D# F5 F{' v, R3 U  n2 p3 |  A. Z4 b5 y; ~* X
{  _/ g) [% j# \& V  I- O8 p7 q
  XPAR_AXI_TIMER_0_DIVEICE_ID,# K  b' w1 W, i6 u; t
  XPAR_AXI_TIMER_0_BASSADDR' R9 U5 ]; L" H! \5 w" N/ u
},
1 T. ^/ W4 P$ |+ F& H5 r {/ Z0 p0 {) {4 b4 q* j0 y
   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,
% W0 o) P! M  E; u1 ^) t- ~4 {   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了5 E0 f  r8 g& P9 P
}
2 e' ^5 [4 H; \$ }, R9 L; |};$ x- K0 ~1 t7 l1 _7 V
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2019-10-19 23:09 , Processed in 0.034172 second(s), 19 queries , Gzip On.

Powered by yleee

© 2001-2019 一乐电子

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