一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑
! v/ r4 n; L% y" w( ^* C! F% y& F% z; F" u
#include <stdio.h>
1 H% H6 o" R5 q6 z, ^# y1 ]. p! Q#include "platform.h"
7 C4 e% p( Z6 l" {#include "xparameters.h"7 h, |( w8 Z; f  o7 o: [
#include "xgpio.h"
& l( I. A# z* m" ]4 z1 `#include "xintc.h"
" t; H, O2 X9 P#include "xtmrctr.h"
) V1 R" B7 [0 _+ ?6 A#include "xil_exception.h"
. r$ k5 I* M" D6 q0 ~" j% C% D7 y2 R: e# y6 V# Z+ x" t5 _2 b1 n
#define CH1 1
4 d: o- }. y. H7 w7 w- T
3 ^2 i1 a+ `. P6 S) E7 j& s, vXGpio LED;6 M6 V* _6 e7 r9 w8 R8 P
XGpio SW;
( t# u/ L+ w4 E3 _+ d1 D8 r  nXGpio KEY;' }9 o0 P. m6 f' S# q# u' T- ]
XIntc Intc;5 ?8 r3 {: `# }& l
2 h, ?) |% R) _+ _" K2 A3 s  D/ S& U
u8 count;
6 N( f$ y7 {8 D9 X
' k. ]3 t7 U+ G+ P1 j! [0 y" _# g  x" H# G- u
/************************** interrupt handler process****************************/
. M' ^2 H5 I6 K1 d/ pvoid timer_int_handler(void *CallBackRef)7 R. `- @! p( S5 v9 y
{( o1 ]  s4 L5 M5 ]+ a& W3 O) o
  unsigned int csr;
' b- G$ g6 R) G5 x, G  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register* W# f4 i" H; a+ S5 n+ v
  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;( Q% n. X5 F& ^# g2 J9 `% q9 |
( w; t: S, W. \; s& N. y: t) V
  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication
( O' p9 b4 R+ X) E! _$ n! c}% E( R; \% g! ]/ e7 l9 Y
  ]1 ]  [- O# `/ M) b$ g6 M5 O
& J1 s' l/ g, j9 ~

  N4 w9 ]) r" ?3 [( f6 t  q0 j
5 Q% s3 ~7 V; P7 ^2 Bvoid SwHandler(void *CallbackRef)9 B) D/ q2 P* e
{8 c. ]; C# c: _3 E! Y; J4 m
" H: I& Q5 }! k# b1 Z: w
    XGpio *GpioPtr = (XGpio *)CallbackRef;5 ]! n2 G+ X( \5 _
    xil_printf("Switch Interrupt!\r\n");! V+ X4 v4 v1 L" ]$ F- U0 R% D
    // Clear the Interrupt) d; C! t( s; }
    XGpio_InterruptClear(GpioPtr, 1);% S% r4 q, Y% `0 W" B

# b# u+ f( h% d$ U1 F# I}
4 |4 Q4 C% r3 {1 ?5 U% e, I
8 J) S4 i( i7 l# W( R3 C7 Q
, U- B- [% f2 Avoid KeyHandler(void *CallbackRef)$ F3 S' Z& Q% Y6 a8 E  a9 T" P% Y
{
( b( q- P- ]! q/ L2 W, j
8 ?6 \( [' s% l4 [! U# B3 t, h- e6 _3 z
    XGpio *GpioPtr = (XGpio *)CallbackRef;
( _5 M% F4 N' A) g( j    xil_printf("Push_Button Interrupt!\r\n");
2 c/ h9 o0 Z; M, ?* n( T. g9 }; f    // Clear the Interrupt
8 d! ]9 Z, M$ ?( ]# ^    XGpio_InterruptClear(GpioPtr, 1);  L9 q+ j4 G$ ^7 [" n6 z* {# C0 g
* V" j, Q5 r* [! H
}
5 y- [: g1 I0 r! Q% K! o* q2 c. @3 e; w. w/ O5 ~) x

, W# R5 j2 x" r) @
+ p$ T8 F: v* h7 H$ U4 q+ ^
  a' G+ ?# ?  w, b# Q
5 T7 {( R4 V) T; s' `& lvoid print(char *str);
" ^1 I& b( N* g8 u& X% \4 g( Q% S: T" m# C  Q, q% w
int main(): F- A" C; w) f. o2 ^) X6 h$ y! F
{
" \9 R+ {9 w# \3 R" |    init_platform();5 d  w+ c% c. W4 {

/ f# ^* u% s' w9 l    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);; {  w* \( K& X- w& X
    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);% `$ K7 K( s! K- Q. k+ j9 {5 x
    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);
( H# E. _: z9 _& e4 ?9 I: P/ r2 \0 T* `" r& j7 c
    XGpio_SetDataDirection(&LED, CH1, 0);2 x# }% R) `: h
    XGpio_SetDataDirection(&SW,  CH1, 1);# d, g7 ?1 ]( e6 a8 c7 x
    XGpio_SetDataDirection(&KEY, CH1, 1);
; D1 ?2 d% c! I, s" K# d" n
8 \! l4 |7 V/ ]9 ?2 y# J% d5 V3 X% Q    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off+ j) c* ]1 R5 a
9 _9 Y: s* e, w& w7 g3 M0 C
    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);( W, w3 F. h" [0 j, |
& I2 L9 ^7 x2 e9 o: {0 G- @6 @
    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,
% T9 D) O; N! [% a8 S$ R                          (XInterruptHandler)SwHandler,8 X! t/ ~; R2 N) R
                          (void *)&SW);& j* l5 y7 v  i% B3 _% _* s1 Z8 q

; R/ l, X7 r0 f; f# _( s    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
# I+ j+ ?9 _8 t& u                          (XInterruptHandler)KeyHandler,2 @, o1 l5 X9 l: ~& b5 k
                          (void *)&KEY);
/ @: g( O; z4 f; G0 f1 ?9 y" a2 Q9 v# w: S

2 Z) `2 I+ w( z    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process
* H  X3 z. \( F! _/ r6 k                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,
7 L+ I. z  L- C1 k                         (XInterruptHandler) timer_int_handler,. @6 _, X/ _1 i, v+ v3 h
                         (void *)XPAR_AXI_TIMER_0_BASEADDR);
5 e+ j; x$ }# h- @0 C- B+ d) _, w; @
    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);
2 \  t' q6 F* G+ y- `    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
9 B  P( z: F, ]. A5 M; c0 N5 M$ e+ y
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,1 ^$ l6 l7 h! i& f( N
                                XTC_CSR_ENABLE_TMR_MASK |
. a; h0 @$ A3 g                                XTC_CSR_ENABLE_INT_MASK |
+ O3 ~7 f3 ?' B" B2 @# _, {3 o2 u5 M                                XTC_CSR_AUTO_RELOAD_MASK |8 N( G/ |% F* K8 S* L3 K- _. k
                                XTC_CSR_DOWN_COUNT_MASK);% b  U, p; v$ K  T. f

, S' l7 Y8 P- {* g! E: L" {9 ]( I
& i. _/ j4 F- c& ]$ p    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU
  g# R+ ]# o( {/ d! C
( ?8 G; C! Y# f9 w/ Z& n    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt4 p, i* g9 D, ?
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt4 r: ?' Y' t% `; m: k

( v$ B5 A% m7 Z: ~3 c9 S    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,. W$ \9 H+ f  c! D2 I& v! J  ]7 d
                (Xil_ExceptionHandler)XIntc_InterruptHandler,7 F4 `- A! P* O
                &Intc);. x( i) k: }. {* b9 h( U
% D% ~) W4 X& U" J4 \
    Xil_ExceptionEnable();
; |- s( g4 G: U$ K9 Z. R( K, x* x; s/ U
    XGpio_InterruptEnable(&KEY, CH1);5 E8 g3 c3 n  w; N3 W
    XGpio_InterruptGlobalEnable(&KEY);. ^7 T8 Y4 O$ d
* o* {6 f2 T% Y5 P; s
    XGpio_InterruptEnable(&SW, CH1);
6 B% x) R# v4 S3 F2 H" t    XGpio_InterruptGlobalEnable(&SW);
0 v2 W; z3 M8 c  K7 M7 j/ J% c
9 d* ]* |$ Q2 ^1 s# C: A8 c# v& F    print("Hello World\n\r");
8 A" B. D/ \) f" M, P, N
# V; h( y& z4 f. l( h
% S4 y0 T5 |( H3 C- J    while(1)- T* W5 Y4 Z* V/ n  K
    {1 S/ K! z2 B5 c3 g$ U: i! y8 b
7 p7 U' b# G2 ^3 ^+ G  ?" K( P4 s

, ?& G& k* P9 v3 T
3 c( d- m4 m7 X, _    }( M( O9 _, g5 S) @# E

+ \' s% M% I9 m$ i" ]% e! H& k3 ^1 S" b' p+ ?
    return 0;
2 g/ S  h# B% s6 G) Y}0 B9 P) x  ~' F9 w* C  V  @' {) E( f8 |

: ]- z3 |) E, x) U3 J这个模式直接操作地址比建立一个实体来操作会快好多& P9 r5 F3 D6 Z
  u' i8 a5 X' k# E
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();2 h& h- p* j9 w
代替9 {% \0 N# z; _' S
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,+ S! F( ?9 u9 Z& K. ]
                (Xil_ExceptionHandler)XIntc_InterruptHandler,
- r& a4 ?$ G, K                &Intc);5 u! B( _9 p; u
2 f6 N: P* U! T# P% |3 z
    Xil_ExceptionEnable();
 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠$ R; g5 B, l5 l; Q+ N
XTmrCtr_Config XTmrCtr_ConfigTable[]=
& Q2 \  D) N0 o0 W{+ Y, f+ h2 p2 D) H
{% `1 S+ L0 y' m* z6 ?: H$ @7 {: f
  XPAR_AXI_TIMER_0_DIVEICE_ID,! [$ K! P8 K# q4 t7 z) J* ?! z) M
  XPAR_AXI_TIMER_0_BASSADDR9 U2 w0 D0 G+ S1 V6 s9 N
},
. \9 N1 Y! M" g, W% O5 D {# k2 q# P( l. x( \9 ^  {; X/ b
   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,. H1 ?9 g; R0 b; L# L) P
   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了
: q1 D* r9 g& B, o+ o" r5 o0 `* l }6 `8 G$ U) i2 K$ D2 [0 ?, f5 I
};
0 s; r6 E9 J9 A4 D4 O5 {. O

本版积分规则

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

GMT+8, 2024-5-5 10:25 , Processed in 0.051886 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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