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(& ...
随机推荐
- 精简的言语讲述技术人,必须掌握基础性IT知识技能,第一篇
前言 此系列将以精简的言语讲述技术人,必须掌握基础性IT知识技能,请持续关注,希望给大家都是一些精简的干货. 第一部分:必须掌握的设计模式的6大基本原则 23个设计模式,都是从这六大设计模式中演化而来 ...
- 初见Redis
Redis是什么,有什么特点和优势 Redis是一个开源用C语言编写的,基于内存,可以持久化,高性能的key-value数据库,并提供多种语言的API. 它也被称为数据结构服务器,因为值(value) ...
- 关于sys.path.append()
当我们导入一个模块时:import xxx,默认情况下python解析器会搜索当前目录.已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中: >>> import ...
- Solution -「多校联训」排水系统
\(\mathcal{Description}\) Link. 在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...
- MySQL基本数据类型与约束条件
昨日内容回顾 数据存储的演变 # 方向: 朝着更加统一和方便管理 数据库的发展史 # 由本地保存逐步演变为线上保存 数据库的本质 # 本质上就是一款CS架构的软件 """ ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第07章 - 部署kube-controller-manager组件
文章目录 1.7.部署kube-controller-manager 1.7.0.创建kube-controller-manager请求证书 1.7.1.生成kube-controller-manag ...
- [LeetCode]1389. 按既定顺序创建目标数组
给你两个整数数组 nums 和 index.你需要按照以下规则创建目标数组: 目标数组 target 最初为空. 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组 ...
- Burp intruder暴力攻击web口令
实验目的 利用Burp intruder功能爆破出后台登陆密码admin. 实验原理 1)Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫 ...
- [Matlab]求解线性方程组
转自:http://silencethinking.blog.163.com/blog/static/911490562008928105813169/ AX=B或XA=B在MATLAB中,求解线性方 ...
- IP网络主动测评系统——IT运维人员的好帮手
一.前 言 随着计算机网络的普及和快速发展,互联网已经融入到人们的衣食住行等方方面 面,如工作.购物.音视频聊天.视频会议.朋友圈.抖音.在线网游.网络电影 电视等.毫不夸张地说,现如今大部分人的绝大 ...