一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

Microblaze Timer计数中断

[复制链接]
发表于 2019-10-6 16:45 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-10-6 17:12 编辑
  v( O, f8 ]9 h+ C2 q0 o6 q0 n6 b
#include <stdio.h>
5 X5 o6 p6 W# O7 H9 `( w#include "platform.h"
8 [, N; Y' r: I* P3 D3 u& V#include "xparameters.h"
* ^& C5 f+ V# s! S/ |#include "xgpio.h"& J; ^+ `8 i$ ?" i) z
#include "xintc.h"7 ^7 k  z: {4 U$ |" e
#include "xtmrctr.h"* h$ a, Q/ U0 D2 f
#include "xil_exception.h"
" y. s8 F7 E% s  h! S! ^- o. \( i, ^
#define CH1 1
; O' F, A7 d* k5 l2 \
7 U$ w  }" i# {" Q" dXGpio LED;: m! _/ U# u% |5 X
XGpio SW;
' Y: T/ p% r. l: v( f' dXGpio KEY;# M- R, K: \4 E' N3 E
XIntc Intc;
: N% o! H1 E+ m8 l; [1 r$ \! d- Z2 n7 a( T5 Z! t! {$ d  p4 R
u8 count;
! u$ @6 N$ A( o5 P+ V8 {6 Q: V" o$ V- ?! B0 }# C$ M2 q

! Q2 u) k6 l+ t  [" l$ {% r1 n1 P9 f/************************** interrupt handler process****************************/
$ j/ |* f7 v% |2 Y: e/ Z% r. z- \void timer_int_handler(void *CallBackRef)
6 a0 G4 Y* G- m/ Z6 v# u" W) r$ E8 F( v{  J8 n+ W; S( V; T' i5 n3 d
  unsigned int csr;' u# }5 e, u* |' W
  csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register
  W" E4 ~( Q2 ?# H  if(csr &XTC_CSR_INT_OCCURED_MASK)count++;6 C, r' W+ ^0 S( i, |& p

3 g  I# e6 z+ E# a. k/ p  XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication1 b5 p' }+ n: _  j3 C
}# ~/ b% k4 q8 S% H- h: y  k3 j9 F! K
8 |3 G4 i; H3 ]9 d+ z5 R+ M9 k% F
1 q! `  O1 U  W4 K

5 e4 {& H, K% C% ^. r" b) |& m% A( q/ q: {  O: @  U5 ^$ N
void SwHandler(void *CallbackRef)
) U  Y+ s) D! Z, W8 `{; {+ C& E) s2 P9 @! ^2 `* l

' g* z7 n) n- t4 s, S: g4 d/ X    XGpio *GpioPtr = (XGpio *)CallbackRef;
/ j: \$ Q8 W! V/ A+ w' H5 U9 Q    xil_printf("Switch Interrupt!\r\n");
. F1 N( E2 V' J    // Clear the Interrupt* h1 q' Q* Y2 ]
    XGpio_InterruptClear(GpioPtr, 1);( E1 ]. b; Z6 [  Y3 i: R  \& x
0 y. U' u* o% l/ u! ?
}
, n9 A: ]/ X' @7 X9 Z6 K! j. l4 F3 {9 J

5 \2 M; o* {* D, A; P: G- jvoid KeyHandler(void *CallbackRef)* j2 G' [+ L$ l0 A0 z) k
{6 r2 P4 _& M7 N- X

* S- I$ P8 N& f  a" f! y/ @' u0 L" M6 S4 H' g9 ^
    XGpio *GpioPtr = (XGpio *)CallbackRef;8 ~8 H# F6 k& Y
    xil_printf("Push_Button Interrupt!\r\n");8 n5 _$ `1 ~8 X$ T( N
    // Clear the Interrupt" H' a4 K' s8 u8 b; D. }' R. e
    XGpio_InterruptClear(GpioPtr, 1);
, G/ T! Y- Z* ~5 i% i, w8 E( {9 d# X1 f1 T6 {, V' Y& f
}
( W, j" p- O4 C0 ]3 q- h$ O* u3 l$ m: x' K+ r9 F9 p

/ m) R( q+ g8 _4 C1 q$ D: l/ \" U" ~, Q( C6 |& i) y; y

9 v, g# y% \8 \4 v: {! Z0 o
# A- G& V+ N* N# Ovoid print(char *str);
9 ~6 O! f6 \0 y: K& B6 v8 I8 w, r+ A3 R- Q$ `
int main()
  x3 S: ~5 r7 q% I7 v7 V) S, e{
2 Q% A  W% t" X* T4 u' D% i+ u    init_platform();
0 j/ H6 S0 M6 `2 l) l9 W, n! Z4 m9 u& _1 o3 X+ i8 s0 E2 G; K- V
    XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);6 a+ `8 P3 r( S
    XGpio_Initialize(&SW,  XPAR_DIP_SWITCHES_DEVICE_ID);5 l0 p, B' Z$ I& a& }5 w
    XGpio_Initialize(&KEY, XPAR_PUSH_BUTTONS_DEVICE_ID);0 o" E$ ?* B/ w& ~# M+ ^& @
( g+ h. D& }2 G) T' q5 M. H& z" q
    XGpio_SetDataDirection(&LED, CH1, 0);
1 d9 S& L; K' s! w* z    XGpio_SetDataDirection(&SW,  CH1, 1);
5 C" j% ^" E5 _0 `    XGpio_SetDataDirection(&KEY, CH1, 1);
0 N0 S! W; @& K6 \; O, }* @; ~" U" P0 r8 i( e
    XGpio_DiscreteWrite(&LED, CH1, 0xff);  //all clear LEDS to off
$ ?$ @' t7 h; M: \' \" e0 \' ?! }( j) G* B, E" h# _% v! g$ U( C: \8 l
    XIntc_Initialize(&Intc, XPAR_INTC_0_DEVICE_ID);$ w5 D% h+ B7 v1 a. H! a& u1 r

' A- w( \: S$ r. Q/ v# D4 S    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_DIP_SWITCHES_IP2INTC_IRPT_INTR,9 Y, ~$ z! Z, D
                          (XInterruptHandler)SwHandler,
0 W& V1 C. j% T3 G$ {                          (void *)&SW);
+ c2 L$ B) p' P/ d3 i: u% Z5 l5 M
" Y5 I$ s$ w4 ]1 O6 V6 g    XIntc_Connect(&Intc, XPAR_MICROBLAZE_0_INTC_PUSH_BUTTONS_IP2INTC_IRPT_INTR,
: a, y# R: j' U: c                          (XInterruptHandler)KeyHandler,( i; l* d- U! g7 E* g$ `0 c7 M
                          (void *)&KEY);
) h4 z7 {) {5 t& o# B3 Q
0 m0 n* e! z! \1 K5 e- c: l" p/ z) v( N" `! R
    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, //register timer0 interrupt and handler process3 Q# a) `# S& D
                                  XPAR_MICROBLAZE_0_INTC_AXI_TIMER_0_INTERRUPT_INTR,1 n" ]6 I9 ?; U" y
                         (XInterruptHandler) timer_int_handler,. U# k. D" U! B: {& V0 p9 B
                         (void *)XPAR_AXI_TIMER_0_BASEADDR);. g1 @) g3 Y7 E
# H2 ^/ f2 u- Y0 C5 C# J1 ]$ S
    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR,0,50000000);
  y& Q8 c& s% K. f    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
2 n6 s! Y. U- U3 e1 u
2 \& A# x( O- A. A    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0," J% @+ c# `, n
                                XTC_CSR_ENABLE_TMR_MASK |; i( h, k! I1 T" y
                                XTC_CSR_ENABLE_INT_MASK |
  R; s% t4 d, f8 m1 D0 r                                XTC_CSR_AUTO_RELOAD_MASK |
+ G) c6 `0 l% T* k" z8 D& y                                XTC_CSR_DOWN_COUNT_MASK);
/ ]" E  ]/ l7 o9 \' Y. B7 r+ w; ?  A. _; m

4 j9 L* `0 g2 ~' L6 q3 Y  j: b    XIntc_Start(&Intc, XIN_REAL_MODE); //set MER  enable IRQ to CPU' N1 D# n2 ^/ J& x# J
! j9 P, R* k( i! D) d. w
    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_2_VEC_ID); //set IER for push_buttons enable interrupt
/ z9 O* G+ j% [' t  l1 N$ ~    XIntc_Enable(&Intc, XPAR_INTC_0_GPIO_0_VEC_ID); //set IER for switches enable interrupt
: }% ~' j2 J5 e: j' J
' U0 O) M- i& ?, [7 G    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,# S' h; a/ e$ j, m$ Q7 W* U
                (Xil_ExceptionHandler)XIntc_InterruptHandler,$ s* p9 F  @  z3 x
                &Intc);
" w$ r3 P! X( f; W, j$ x4 [0 e& X2 |" a) A/ K: o
    Xil_ExceptionEnable();
) W) m' K- n# N" j9 \+ Y' p* {; [2 ?' d; {4 Z; @
    XGpio_InterruptEnable(&KEY, CH1);
( N" f6 n  V* j2 j8 p* f3 C    XGpio_InterruptGlobalEnable(&KEY);
1 g. J" q) o0 N6 R3 E0 K0 N' v) N  i3 u
    XGpio_InterruptEnable(&SW, CH1);
% W- b7 H2 |5 z, Q& \+ V: Z& ]    XGpio_InterruptGlobalEnable(&SW);
  S$ U. ?1 k0 f* E' g
$ u. l  d$ W, y& r. _: w    print("Hello World\n\r");
! c/ Y8 \9 ]% w3 o1 n2 \
$ g* S2 p) f: T/ n7 x( l! m/ x( f% K8 L- S$ ~9 E2 g: _9 b* X
    while(1)
  q/ Z  @4 w- @9 O  X* e5 F5 V    {
. v6 h7 {2 x% r! t+ \, b. B: m1 Q5 G; B/ I: {) F1 ?- f7 H

% n6 E7 [% J7 V# t+ `4 j( D$ m" m; Z
    }# Q! S* m! N4 v! ~. c" s2 |1 I+ m

; z. Y( d: @' D+ s% K/ V
2 k. f* ~& B/ I; [5 C0 E! y    return 0;5 J1 n" s9 v) K  s
}
$ d8 M9 d3 _1 y2 d: L( d: D; I
% i4 `0 Y; u* ?5 r7 `这个模式直接操作地址比建立一个实体来操作会快好多6 L7 Z" |; X4 K  l1 T4 ~1 @" b0 l
8 F! U+ E2 B6 z6 \2 D
 楼主| 发表于 2019-10-6 16:47 | 显示全部楼层
因为CPU时钟为100MHZ所以计数器要达到50000000  5千万才能有1秒左右的计数
 楼主| 发表于 2019-10-6 16:49 | 显示全部楼层
microblaze_enable_interrupts();
* Y- d- V- V! ]7 e代替
' e! g. _& K' l    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,, r; _3 W4 n% q8 D! ^$ C
                (Xil_ExceptionHandler)XIntc_InterruptHandler,0 s" G- g/ l! f
                &Intc);; _" k* _: l. c! ^; [

: \; R" u+ O5 _9 T% _# W8 n    Xil_ExceptionEnable();
 楼主| 发表于 2019-10-6 17:20 | 显示全部楼层
xilinx 的microblaze 有两个TIME 一个是time0 和 time1 它是靠, U  a8 [; w6 ]: H: e6 j# Y
XTmrCtr_Config XTmrCtr_ConfigTable[]=
- Q) e: _; `( r* d+ M1 z: G{
& K8 n% P# {3 }- M {
7 C# O) i- h2 I* _. r) K  XPAR_AXI_TIMER_0_DIVEICE_ID,
" N9 Z, I2 \3 k% {& |% N, M& ~  XPAR_AXI_TIMER_0_BASSADDR
  |' m$ G- A. G2 j, S& E },
4 J4 c+ E. t1 J1 c2 t/ @ {
6 b- J' U! _% c9 d) N5 S9 b   XPAR_AXI_TIMER_1_DIVEICE_ID,   //如果硬件enable 了两个就会有两个初始化的数组,( b  a# S. X3 O+ n; B* s7 Q+ Y$ @- q
   XPAR_AXI_TIMER_1_BASSADDR     //如果只有一个那么只有上面一个数组了
4 r0 C2 L" z) F+ n1 \' r }; \3 n/ E) D- U9 _7 k$ i! ?
};7 I* `* B+ e! B

本版积分规则

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

GMT+8, 2024-3-29 14:50 , Processed in 0.046051 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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