学会Zynq(8)PL中断示例(SPI)

您所在的位置:网站首页 spi接收中断如何触发 学会Zynq(8)PL中断示例(SPI)

学会Zynq(8)PL中断示例(SPI)

2024-07-15 20:45| 来源: 网络整理| 查看: 265

PL中断 双核Zynq中共有20个PL到PS的中断。IRQF[15:0]是16个共享外设中断(SPI),可配选择上升沿触发或高电平触发,中断号为61-68和84-91。

另外还有4个私有外设中断(PPI)IRQF2P[19:16],每个CPU都有一个来自PL的FIQ(快速中断)和IRQ,其中断敏感类型固定。

本文体会Zynq中PL到PS的SPI的使用方法。若设置为电平敏感,PL必须提供在中断被确认后将其清除掉的机制。若设置为上升沿敏感,PL必须提供足够宽的脉冲,让GIC能够捕获。

硬件平台搭建 本例中将连接到PL部分的两个按键作为中断请求源,从PL部分路由到PS的中断接口。设置Zynq7处理系统,Interrupts中启用PL到PS的中断,选择IRQ_F2P[15:0],启用SPI。下面4个是PPI。

配置DDR和MIO电平,启用UART,设计程序根据按键中断串口打印相应信息。配置完成后白板中的Zynq7 IP会出现IQR_F2P管脚,但位宽只有[0:0]。我们把中断源以总线的形式连接到这个管脚后,运行Validate Design有效性检查,会自动更新位宽。

将多路信号拼接为总线可以用Concat IP核实现。这个IP可以设置端口数目和每个端口上的位宽,设为Auto可以完成自动检测。In0在输出总线的低位,In[Number of Ports - 1]在输出总线的高位。

硬件连接如下图所示。由于使用了PL部分的管脚,要添加XDC约束文件,将sw0和sw1绑定到按键管脚。生成bit流文件后,将硬件平台导出到SDK中。

SDK程序设计 新建工程,依次添加源文件并编写代码。init.h文件代码如下: #include #include "xscugic.h" #include "xil_exception.h"

//--------------------------------------------------------- // 参数定义 //--------------------------------------------------------- #define SW1_INT_ID 61 //按键PL中断1 #define SW2_INT_ID 62 //按键PL中断2 #define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID //中断设备 #define INT_TYPE_RISING_EDGE 0x03 //上升沿敏感 #define INT_TYPE_HIGHLEVEL 0x01 //高电平敏感 #define INT_TYPE_MASK 0x03 #define INT_CFG0_OFFSET 0x00000C00

//--------------------------------------------------------- // 函数声明 //--------------------------------------------------------- void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType); int IntcInitFunction(u16 DeviceId);

init.c文件的代码如下: #include "init.h"

static XScuGic INTCInst;

//--------------------------------------------------------- // 中断处理程序 //--------------------------------------------------------- static void SW_intr_Handler(void *param) { int sw_id = (int)param; printf("SW%d int\n\r", sw_id); //根据中断请求源打印相关信息 }

//--------------------------------------------------------- // 中断敏感类型设置函数 //--------------------------------------------------------- void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType) { int mask;

intType &= INT_TYPE_MASK; mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET+(intId/16)*4); mask &= ~(INT_TYPE_MASK



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3