ZYNQ SGI、PPI、SPI三种中断的实例(含代码)
ZYNQ中断分为3类:
- SGI(Software Generated Interrupts)软件中断
- PPI(Private Peripheral Interrupts)私有外设中断
- SPI(Shared Peripheral Interrupts)共享外设中断
1、SGI软件中断
16个,中断号:0—15。通过向ICDSGIR寄存器写入SGI中断号、CPU ID,来产生一个软件中断;通过读ICCIAR寄存器或者向ICDICPR寄存器相应的比特位写1,可以清除中断。所有的SGI为边沿触发。
2、PPI私有外设中断
每个CPU(CPU0、CPU1)连接5个私有中断,中断号:27—31。ICDICFR1为PPIs的优先级及触发条件控制寄存器,是只读的,因而PPIs的触发条件也不可更改。需要注意到的是,PL部分的快速响应中断FIQ(fast interrupt)信号与普通中断IRQ(interrupt)需要被送往中断控制器中,所以即便ICDICFR1规定IRQ与FIQ的响应等级为low level,但是他们的在PS与PL接口的响应等级仍是high。
3、SPI共享外设中断
中断号:32-95。由PS和PL上的各种I/O控制器和存储器控制器产生,如GPIO、DMA、定时器等模块的中断信号,这些中断信号会被路由到CPU。PS的外设产生的SPI中断也会路由到PL上。
中断发生时执行的中断函数:
static void XXXIntrHandler(void *CallBackRef)
以下代码会汇总,不可直接使用:
XScuGic xScuGic;//XScuGic 驱动程序实例数据。用户需要为系统中的每个intc设备分配一个这种类型的变量。然后,该类型变量的指针被传递给驱动程序API函数。
XScuTimer_Config *ConfigPtr;
XUartPs_Config *XUartPs_Config_uart1;
XScuGic_Config *XScuGic_Config_ps;
//PPI 私有定时器初始化
ConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);
Status = XScuTimer_CfgInitialize(&TimerInstance, ConfigPtr,
ConfigPtr->BaseAddr);
//PPI 私有定时器设置
Status = XScuTimer_SelfTest(&TimerInstance);
/** Set for 1 milli seconds timeout.*/
TimerLoadValue = (XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ/2) / 1000;
XScuTimer_LoadTimer( &TimerInstance, TimerLoadValue );
XScuTimer_EnableAutoReload(&TimerInstance);
//0、中断外设初始化
//若中断外设只有一个,该中断外设的初始化,不管用哪几种中断、多少个中断;该初始化只执行一次!!!!!!!!
XScuGic *IntcInstancePtr = &xScuGic; /* Instance of the Interrupt Controller */
XScuGic_Config *IntcConfig;
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,
IntcConfig->CpuBaseAddress);
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
(Xil_ExceptionHandler)XScuGic_DeviceInterruptHandler,
(void *)INTC_DEVICE_ID);
//1、PPI 私有定时器中断设置 方法1
XScuGic_RegisterHandler(INTC_BASE_ADDR, TIMER_IRPT_INTR,
(Xil_ExceptionHandler)timer_callback,
(void *)&TimerInstance);
XScuGic_EnableIntr(INTC_DIST_BASE_ADDR, TIMER_IRPT_INTR);
XScuTimer_EnableInterrupt(&TimerInstance);
XScuTimer_Start(&TimerInstance);
//1、PPI 私有定时器中断设置 方法2
XScuGic_Connect(GicInstancePtr, TimerIntrId,
(Xil_ExceptionHandler)TimerIntrHandler,//set up the timer interrupt
(void *)TimerInstancePtr);
XScuGic_Enable(GicInstancePtr, TimerIntrId);//enable the interrupt for the Timer at GIC
XScuTimer_EnableInterrupt(&TimerInstance);
XScuTimer_Start(&TimerInstance);
//2、SPI 开关设为中断
status = XScuGic_Connect(&INTCInst,SW1_INT_ID,
(Xil_ExceptionHandler)SW_intr_Handler,(void *)1);
IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);
XScuGic_Enable(&INTCInst, SW1_INT_ID);
//3、SGI 软件中断
status = XScuGic_Connect(&ScuGic,
CPU0_SW_INTR(Xil_ExceptionHandler)cpu0IntrHandler,
&ScuGic);
XScuGic_Enable(&ScuGic,CPU0_SW_INTR);
//
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ); //等于Xil_ExceptionEnable();
各种使能函数汇总:
//各个中断的使能
XScuGic_EnableIntr(INTC_DIST_BASE_ADDR, TIMER_IRPT_INTR);//等于XScuGic_Enable();
XScuGic_Enable(&INTCInst, SW1_INT_ID);
XScuGic_Enable(&ScuGic, CPU0_SW_INTR);
//单个外设的使能
XScuTimer_EnableInterrupt(&TimerInstance);
//中断总外设的使能
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ); //等于Xil_ExceptionEnable();
Xil_ExceptionEnable();
网上找到了下面三个极简的例子,可以很好的帮助学习基础。
一、SGI 中断实例:
基于ZYNQ的中断的使用(1)
使用中断号:13、14。SGI实验的中断号可在范围内自定义。
二、PPI 中断实例:
S02_CH08_ ZYNQ 定时器中断实验
使用中断号:29。PPI实验的中断号可在xparameters_ps.h查找。
/* Private Peripheral Interrupts (PPI) */
#define XPS_GLOBAL_TMR_INT_ID 27 /* SCU Global Timer interrupt */
#define XPS_FIQ_INT_ID 28 /* FIQ from FPGA fabric */
#define XPS_SCU_TMR_INT_ID 29 /* SCU Private Timer interrupt */
#define XPS_SCU_WDT_INT_ID 30 /* SCU Private WDT interrupt */
#define XPS_IRQ_INT_ID 31 /* IRQ from FPGA fabric */
三、SPI 中断实例:
S02_CH07_ ZYNQ PL中断请求
使用中断号:61、62。SPI实验的中断号由PL设计决定。


ZYNQ SGI、PPI、SPI三种中断的实例(含代码)的更多相关文章
- iOS中图片动画的三种模式及基本的代码实现
-(void)play { //第一种图片动画模式 头尾方式 //头尾方式 [UIView beginAnimations:nil context:nil];//动画开始 [UIView setAni ...
- AutoLayout的三种设置方式之——NSLayoutConstraint代码篇
AutoLayout是从IOS 6开始苹果引入来取代autoresizing的新的布局技术,该技术有三种设置方式,等下我来为大家一一叙述一下. 在说三种设置方式前,我们先简单的说一下autolayou ...
- JS创建事件的三种方式(实例)
1.普通的定义方式 <input type="button" name="Button" value="确定" onclick=&qu ...
- java三种适配器模式详解与代码实现
zhaoyu 取消关注 2 人赞同了该文章 1. 适配器模式定义: 适配器模式是一种结构型设计模式,通过一个适配器类把具有不同方法功能的两个类A和B组合起来,使得这个适配器类同时具有两个类的不 ...
- UART、I2C、SPI三种协议对比
学嵌入式需要打好基础 下面我们来学习下计算机原理里的3种常见总线协议及原理 协议:对等实体之间交换数据或通信所必须遵守规则或标准的集合 1.UART(Universal Asynchronous Re ...
- spring事务的三种配置应用实例
0.项目结构 具体代码见:https://github.com/xkzhangsan/spring-transaction-practice.git,包括创建表sql在内. 1.编程式事务使用Data ...
- 三种调用WCF服务的代码
wsHttpBinding,Massage UserName认证 static void Main(string[] args) { //使用服务引用方式生成的Client调用服务,使用自动生成的配置 ...
- WCF实例管理的三种方式
很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间. Wcf框架提供了三种创建wcf实例的方式. WCF服务对象实例化基础 在普通的WCF请求和相应过程中,将 ...
- map遍历的三种基础用法
java中遍历MAP的几种方法 Java代码 Map<String,String> map=new HashMap<String,String>(); map.put(& ...
随机推荐
- opencv笔记--SURF
SURF(Speeded-Up Robust Features) 是对 SIFT 得改进,相对于 SIFT,SURF 利用积分图像与盒函数模拟 DoG,提升了计算速度:同时,使用了一种不用于 SIFT ...
- 如何强制关闭Win10自动更新
今天我向往常一样打开了电脑,在工作时突然感觉CPU风扇嗡嗡的响电脑开始变得极慢内存也开始上涨,我意识到不妙了,Windows10 又开始在后台给我搞事情了,由于我的电脑安装有开机还原功能,所以每次开机 ...
- Dubbo SPI机制之三Adaptive自适应功能
JDK标准中SPI机制的一个问题就是其一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源:扩展点加载失败,其他扩展点都用不了了.Dubbo是如何解决该问题动态的选 ...
- [Golang]一些书城项目中出现错误的原因和解决办法(三)
跟着B站尚硅谷的GoWeb教程写书城项目,整理一下自己写的时候出现的错误和解决办法. 错误五:订单管理界面无法显示订单内容. 解决办法:我是直接把 day06 里的 order 文件夹粘贴过来了,or ...
- 生产环境想要对某个Pod排错、数据恢复、故障复盘有什么办法?
生产环境想要对某个Pod排错.数据恢复.故障复盘有什么办法? k8s考点灵魂拷问9连击之5 考点之简单描述一下k8s副本集ReplicaSet有什么作用? 考点之为什么ReplicaSet将取代Rep ...
- 批量自动化配置Dell服务器idrac管理口IP
背景说明 工作中经常会遇到一次上几十台.几百台服务器的情况 每当到这个时候小伙伴们拿台笔记本和一根网线,一台服务器.一台服务器的去修改idrac IP 为了节约这个工作量,利用dell的racadm工 ...
- windows 应用商店常用软件
QuickLook 这个应用可以让你,用空格键查看几乎任何文件的信息. 例如快速查看图片,播放视频,阅读 PDF 等等,支持的格式多到吓人. Python 没错,就是那个非常火的编程语言,Pytho ...
- Docker学习笔记(详细)
目录 01 介绍 02 Docker安装 03 Docker常用命令 04 Docker镜像 05 Docker容器数据卷 06 Dockerfile解析 Dockerfile构建过程解析 Docke ...
- MySQL Community Server安装
MySQL Community Server安装 下载地址:https://dev.mysql.com/downloads/mysql/,zip安装,解压缩之后其实就可以用了,但是要进行配置. 1,解 ...
- MapReduce中一次reduce方法的调用中key的值不断变化
简单一句话总结就是:ReduceContextImpl类的RawKeyValueIterator input迭代器对象里面存储中着key-value对的元素, 以及一个只存储value的迭代器,然后每 ...