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三种中断的实例(含代码)的更多相关文章

  1. iOS中图片动画的三种模式及基本的代码实现

    -(void)play { //第一种图片动画模式 头尾方式 //头尾方式 [UIView beginAnimations:nil context:nil];//动画开始 [UIView setAni ...

  2. AutoLayout的三种设置方式之——NSLayoutConstraint代码篇

    AutoLayout是从IOS 6开始苹果引入来取代autoresizing的新的布局技术,该技术有三种设置方式,等下我来为大家一一叙述一下. 在说三种设置方式前,我们先简单的说一下autolayou ...

  3. JS创建事件的三种方式(实例)

    1.普通的定义方式 <input type="button" name="Button" value="确定" onclick=&qu ...

  4. java三种适配器模式详解与代码实现

    zhaoyu   取消关注   2 人赞同了该文章 1. 适配器模式定义: 适配器模式是一种结构型设计模式,通过一个适配器类把具有不同方法功能的两个类A和B组合起来,使得这个适配器类同时具有两个类的不 ...

  5. UART、I2C、SPI三种协议对比

    学嵌入式需要打好基础 下面我们来学习下计算机原理里的3种常见总线协议及原理 协议:对等实体之间交换数据或通信所必须遵守规则或标准的集合 1.UART(Universal Asynchronous Re ...

  6. spring事务的三种配置应用实例

    0.项目结构 具体代码见:https://github.com/xkzhangsan/spring-transaction-practice.git,包括创建表sql在内. 1.编程式事务使用Data ...

  7. 三种调用WCF服务的代码

    wsHttpBinding,Massage UserName认证 static void Main(string[] args) { //使用服务引用方式生成的Client调用服务,使用自动生成的配置 ...

  8. WCF实例管理的三种方式

    很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间. Wcf框架提供了三种创建wcf实例的方式. WCF服务对象实例化基础 在普通的WCF请求和相应过程中,将 ...

  9. map遍历的三种基础用法

    java中遍历MAP的几种方法 Java代码 Map<String,String> map=new HashMap<String,String>();    map.put(& ...

随机推荐

  1. 针对某p社游戏某整合包的研究

    软件分析 垃圾re手 最近在玩群星 创意工坊里面下载了整合包 进群下载排序文件后竟然发现要付费() 28R够吃一顿好的 马上来分析一下这个软件 这是一个四版整合包的mod安装器 其中樱花远征和新星纪元 ...

  2. STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率

    前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...

  3. MyBatis缓存Cache包

    Mybatis默认使用了一级缓存为数据查询提供效率,其底层数据结构为PerpetualCache.同时MyBatis不止实现了PerpetualCache,还有其他实现提供其他功能,如下: 可以从UM ...

  4. python爬虫:爬虫的简单介绍及requests模块的简单使用

    python爬虫:爬虫的简单介绍及requests模块的简单使用 一点点的建议: (学习爬虫前建议先去了解一下前端的知识,不要求很熟悉,差不多入门即可学习爬虫,如果有不了解的,我也会补充个一些小知识. ...

  5. 在 .NET 平台使用 ReflectionDynamicObject 优化反射调用代码

    基于封装的原则,API 的设计者会将部分成员(属性.字段.方法等)隐藏以保证健壮性.但总有需要直接访问这些私有成员的情况. 为了访问一个类型的私有成员,除了更改 API 设计还有就是使用反射技术: p ...

  6. Clickhouse - Replication机制

    Clickhouse - Replication机制 1. Replication引擎族 Replication仅对于MergeTree引擎族提供支持, 两者是正交的: ReplicatedMerge ...

  7. Html实现背景科技流星雨效果

    <!doctype html><html><head><meta charset="utf-8" /><title>流星 ...

  8. k8s dashboard 安装和证书更新

    1.k8s 搭建   参见https://blog.51cto.com/lizhenliang/2325770 [root@VM_0_48_centos ~]# kubectl get cs NAME ...

  9. python刷剑指offer(21-40)(一刷)

    21.输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  10. (六)目标检测算法之YOLO

    系列文章链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...