79.ZYNQ内部私有定时器中断

上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断。每个一秒中断一次,在中断函数里计数加1,通过串口打印输出。

*本文所使用的开发板是Miz702(兼容zedboard) 
PC 开发环境版本:Vivado 2015.2 Xilinx SDK 2015.2*

中断原理

中断对于保证任务的实时性非常必要,在ZYNQ里集成了中断控制器GIC(Generic Interrupt Controller).GIC可以接受I/O外设中断IOP和PL中断,将这些中断发给CPU。 
中断体系结构框图图下: 

软件中断(SGI)

SGI通过写ICDSGIR寄存器产生SGI.

共享中断SPI

通过PS和PL内各种I/O和存储器控制器产生。

私有中断(PPI)

包含:全局定时器,私有看门狗定时器,私有定时器以及来自PL的FIQ/IRQ。本文主要介绍PPI,其它的请参考官方手册ug585_Zynq_7000_TRM.pdf。 
ZYNQ每个CPU链接5个私有外设中断,所有中断的触发类型都是固定不变的。并且来自PL的快速中断信号FIQ和中断信号IRQ反向,然后送到中断控制器因此尽管在ICDICFR1寄存器内反应的他们是低电平触发,但是PS-PL接口中为高电平触发。如图所示: 

私有定时器

zynq中每个ARM core都有自己的私有定时器,私有定时器的工作频率为CPU的一半,比如Miz702或者zedboard的ARM工作频率为666MHZ,则私有定时器的频率为333MHz. 
私有定时器的特性如下: 
(1)32为计数器,达到零时产生一个中断 
(2)8位预分频计数器,可以更好的控制中断周期 
(3)可配置一次性或者自动重加载模式 
(4)定时器时间可以通过下式计算: 
定时时间 = [(预分频器的值 + 1) (加载值 + 1)]/定时器频率

搭建硬件系统工程:

配置ZYNQ PS

把ZYNQ配置为只保留UART1,然后点击OK如图所示 

点击Run Connection Automation,取消掉Apply Board Preset,如图 

最终的框图很简洁,如图: 

建立软件工程

建立一个Hello World工程 
把Helloworld.c的代码修改如下:

 1 #include <stdio.h>
 2 #include "platform.h"
 3 #include "xadcps.h"
 4
 5 #include "xil_types.h"
 6 #include "Xscugic.h"
 7 #include "Xil_exception.h"
 8 #include "xscutimer.h"
 9
10 //timer info
11 #define TIMER_DEVICE_ID     XPAR_XSCUTIMER_0_DEVICE_ID
12 #define INTC_DEVICE_ID      XPAR_SCUGIC_SINGLE_DEVICE_ID
13 #define TIMER_IRPT_INTR     XPAR_SCUTIMER_INTR
14
15 //#define TIMER_LOAD_VALUE  0x0FFFFFFF
16 #define TIMER_LOAD_VALUE    0x13D92D3F
17
18 static XAdcPs  XADCMonInst; //XADC
19 static XScuGic Intc; //GIC
20 static XScuTimer Timer;//timer
21
22 static void SetupInterruptSystem(XScuGic *GicInstancePtr,
23         XScuTimer *TimerInstancePtr, u16 TimerIntrId);
24
25 static void TimerIntrHandler(void *CallBackRef);
26
27 int main()
28 {
29      XScuTimer_Config *TMRConfigPtr;     //timer config
30      printf("------------START-------------\n");
31      init_platform();
32      //
33      //私有定时器初始化
34      TMRConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);
35      XScuTimer_CfgInitialize(&Timer, TMRConfigPtr,TMRConfigPtr->BaseAddr);
36      XScuTimer_SelfTest(&Timer);
37      //加载计数周期,私有定时器的时钟为CPU的一般,为333MHZ,如果计数1S,加载值为1sx(333x1000x1000)(1/s)-1=0x13D92D3F
38      XScuTimer_LoadTimer(&Timer, TIMER_LOAD_VALUE);
39      //自动装载
40      XScuTimer_EnableAutoReload(&Timer);
41      //启动定时器
42      XScuTimer_Start(&Timer);
43
44
45      //set up the interrupts
46      SetupInterruptSystem(&Intc,&Timer,TIMER_IRPT_INTR);
47
48      while(1){
49      }
50
51      return 0;
52 }
53
54 void SetupInterruptSystem(XScuGic *GicInstancePtr,
55         XScuTimer *TimerInstancePtr, u16 TimerIntrId)
56 {
57
58         XScuGic_Config *IntcConfig; //GIC config
59         Xil_ExceptionInit();
60         //initialise the GIC
61         IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
62         XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,
63                         IntcConfig->CpuBaseAddress);
64         //connect to the hardware
65         Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
66                     (Xil_ExceptionHandler)XScuGic_InterruptHandler,
67                     GicInstancePtr);
68         //set up the timer interrupt
69         XScuGic_Connect(GicInstancePtr, TimerIntrId,
70                         (Xil_ExceptionHandler)TimerIntrHandler,
71                         (void *)TimerInstancePtr);
72         //enable the interrupt for the Timer at GIC
73         XScuGic_Enable(GicInstancePtr, TimerIntrId);
74         //enable interrupt on the timer
75         XScuTimer_EnableInterrupt(TimerInstancePtr);
76         // Enable interrupts in the Processor.
77         Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
78     }
79
80 static void TimerIntrHandler(void *CallBackRef)
81 {
82
83     static int sec = 0;   //计数
84     XScuTimer *TimerInstancePtr = (XScuTimer *) CallBackRef;
85     XScuTimer_ClearInterruptStatus(TimerInstancePtr);
86     sec++;
87     printf(" %d Second\n\r",sec);  //每秒打印输出一次
88
89 }

上电测试

可以看到串口终端每秒输出一次,并且值加1递增

时间: 2024-10-18 19:08:35

79.ZYNQ内部私有定时器中断的相关文章

SylixOS Zynq平台私有中断绑定

1. 概述 本篇主要介绍在Zynq平台编写中断相关的驱动程序时,涉及CPU私有中断的相关绑定办法. 2. 私有中断简介 私有中断是多核CPU上特有的中断,私有中断只能被其所有者核心获取和响应,不会被其他核发现.常见的私有中断有全局定时器,私有看门狗定时器,私有定时器等,Zynq平台上还有来自PL的FIQ\IRQ. 3. 私有中断的绑定方法 3.1      常规共享中断绑定 Zynq平台使用的是GIC通用中断框架,常规的共享中断绑定和普通的中断绑定没有区别,在SylixOS上直接调用API_In

Arduino101学习笔记(十二)&mdash;&mdash; 101定时器中断

一.API 1.开定时器中断 //********************************************************************************************* //函数名称:CurieTimerOne.start(int timerPeriodUsec, userCallBack) //输入参数:timerPeriodUsec:: 多少微妙产生中断 // userCallBack : 中断函数 //函数返回:无 //函数功能:开定时器

定时器中断各个寄存器含义

中断寄存器,定时器/计数器相关寄存器本身或者相关位用来做初始化,中断函数的内容主要是体现发生中断后所需要的操作(在中断函数内写代码). 1.中断允许寄存器IE 图1.中断寄存器IE 中断寄存器用来设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H~AFH,该寄存器运行位寻址,即可对该寄存器的每一位进行单独操作.单片机复位时IE全部被清零.下面列举各位的在不同状态下的具体含义: EA-------全局中断允许位 EA = 1,打开全局中断控制,

测试STM32F4中断向量表移到内部RAM对中断响应速度的影响

测试环境:STM32F407 168MHz,IAR 7.4,优化级别low 测试方法:第一个信号是TIM比较器的输出,同时产生比较器中断.中断服务程序里第一句就立即拉高一个GPIO,示波器查两个信号的延迟大致了解中断响应速度. 中断向量表在Flash,中断服务程序在Flash,延迟约155ns: 中断向量表在内部RAM,中断服务程序在Flash,少了约20ns 中断向量表在内部RAM,中断服务程序在内部RAM,看起来没多大区别: 说明:这个测试方法中断响应延时并不准确,因为GPIO拉高至少要两条

stm32通用定时器中断问题

在使用stm32的通用定时器定时中断的时候,发现定时器在完成初始化配置后,定时器UIF位会立刻置位,导致在使能中断后,程序会立刻进入定时器中断. 如果设计代码时不希望定时器配置完成后,立刻进入中断,可以在定时器配置完成后,立刻清除UIF标志位(TIMx->SR &= 0xFFFE) ,再使能定时器更新中断.比如用库函数这么写: TIM_ClearITPendingBit(TIM4, TIM_IT_Update  ); TIM_ITConfig(TIM4,TIM_IT_Update,ENABL

用定时器中断,单片机中断处理时间大于定时器定时时间会怎样?

如果是不同的中断类型是可以根据优先级嵌套,如果是同一中断类型(如题), 有三种结果:1.马上进入新的中断处理(中断嵌套) 2.等待中断处理完再进入新的中断处理 3.出错. 单片机中断处理时间大于定时器定时时间,在下次中断时间到时,因为中断是同一类型.同一优先级,所以不会马上进入新的中断处理. 而是在本次中断处理结束后,单片机又马上进入新的定时器中断函数,主函数中的语句可能会没有机会运行下去,会影响后面中断的实时性.所以答案为2. 如果为了避免中断嵌套(同一优先级不会发生),在中断处理中人为的在进

奶爸业余单片机学习之:定时器中断的使用方法——进入中断TF0(TF1)值硬件自动重置

/*============定时器中断的使用方法—---TF0(TF1)值硬件重置法======== 第一:打开总中断第二:打开定时器 中断第三:设置特殊功能寄存器TMOD,配置好工作模式. 第四:设置计数寄存器TH0和TL0的初值. 第五:设置TCON,通过TR0置1来让定时器开始计数.*/ //LED由三极管及73HC138控制//用定时器0实现亮与灭之间的1秒延时 # include <reg52.h> sbit led2 = P0^0; sbit addr0 = P1^0;sbit a

STC10F10XE定时器中断输出10KHz的方波程序

//咱做硬件的也动手做点测试程序,为了测试新做的电机驱动板,找了个51的板子当10K信号发生器测试IGBT开关延时时间. #include <STC_NEW_8051.H>#include<intrins.h>#define uchar unsigned char//这个T0定时器中断程序网上找的,改了下定义和计数器值,移植到STC10F10XE上.sbit OUT=P2^7; //定义OUT输出端口 /*--------------------------------------

STM32 Timer (2) 定时器中断代码框架

3. 代码框架 3.1 分频系数的计算 x1/x2 /N(预分频) APB1时钟------->F(CK_PSC)--------------->CK_CNT 如果APB1的分频系数为1, CK_INT的倍频系数就是x1 如果APB1的分频系数不为1, CK_INT的倍频系数就是x2   STM32F1(MHz) STM32F4(MHz) STM32F7(MHz) SYSCLK 72 168 216 AHB 72 168 216 APB1 (AHB/4) 18 42 54 CK_INT(x1/