• axi_gpio是PL端gpio(FPGA资源搭建的软核),ps7_gpio是ps端gpio(硬核)。打开Documentation的示例Examples,可知第二个是关于中断的示例。导入示例import examples对照并结合上一个中断实验代码zynq开发系列4:MIO按键中断控制LED来编写
  • 用到了AXI GPIO导入头文件,根据mss文件描述axi_gpio叫做gpio故导入文件xgpio.h。ps端gpio叫做gpiops故导入文件xgpiops.h
  • 导入AXI GPIO的器件ID,点开定义 XPAR_GPIO_0_DEVICE_ID 在xparameters.h中看出是对AXI_GPIO的定义,粘贴进源文件为了和PS端代码区分修改定义为 AXI_GPIO_ID
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID // PS GPIO 器件ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID // 中断控制器 器件ID
#define AXI_GPIO_ID     XPAR_GPIO_0_DEVICE_ID //AXI GPIO 器件ID
  • 中断信号是PL到PS端的一个中断,在ug585 ch7 Interrupts 7.2.3 Shared Peripheral Interrupts (SPI) 查看中断号(zynq核中同样可以查看)。来自PL的中断共16个,分成两部分[63:61]和[91:84],使用一个中断ID为61。
  • 在示例程序中查看定义,跳转到宏定义数值为61
  • AXI GPIO有两个通道,用到了一个通道定义为1。添加宏定义即可以使用通道1的端口。
//AXI GPIO 通道1
#define GPIO_CHANNEL1       1
  • 添加实例名称 XGpio AXI_Gpio;
  • 仿照对PS端GPIO进行初始化,对AXI GPIO进行初始化,在xgpio.h头文件查找需要的函数声明,找到 XGpio_Initialize() 点进去查看函数定义。LookupConfig和CfgInitialize被封装进XGpio_Initialize(),直接调用Initialize即可。
// 配置PS端器件GPIO并初始化
ConfigPtr= XGpioPs_LookupConfig(GPIO_DEVICE_ID);
XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);// 对AXI GPIO进行初始化
XGpio_Initialize(&AXI_Gpio, AXI_GPIO_ID);
  • PS GPIO设置为输出并打开输出使能,这部分代码不用修改,接着参考pg144配置AXI GPIO。第一个首先设置数据输入和输出方向,第二个打开全局中断和通道中断,初始化部分就算完成了。

  • 在xgpio.h头文件找到 XGpio_SetDataDirection() 函数用来设置数据输入和输出方向(注释:给GPIO独立通道设置输入和输出方向)。第三个参数DirectionMask32位,对应GPIO每一位信号的输入和输出。最低位为输入设置为1化作十六进制为0x00000001(对32位数据需要8个十六位数据来表示,一个十六位数据对应4位,如果最高位设置为1前4位为1000转换为十六进制为0x80000000)。

  • 打开全局中断 XGpio_InterruptGlobalEnable() 和 打开通道中断对应的信号 XGpio_InterruptEnable()。Mask同样为32位,每一位对应着一路信号,设置为1对应着打开中断的使能。

// 对AXI GPIO进行配置
XGpio_SetDataDirection(&AXI_Gpio, GPIO_CHANNEL1, 0x00000001); // 设置为输出
XGpio_InterruptGlobalEnable(&AXI_Gpio);         // 打开全局中断使能
XGpio_InterruptEnable(&AXI_Gpio, 0x00000001);   // 打开通道信号对应的使能

  • 设置中断系统,完成最后一步获取中断并读取数据
  • 修改设置中断系统的参数,把第二个参数xgpiops改为xgpio void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio * AXI_Gpio, u16 AXI_GpioIntrId); 函数里参数名字也跟着修改,初始化xscugic的部分保持不变
  • 去实例函数找如何设置,发现一个 XScuGic_SetPriorityTriggerType() 函数。根据触发类型为高有效电平敏感型设置Trigger为01,优先级保持与实例程序一致。
// 0xA0: 中断源的优先级 0x1: 中断类型为高有效电平敏感型
XScuGic_SetPriorityTriggerType(GicInstancePtr, AXI_GpioIntrId, 0xA0, 0x1);
  • 修改完成设置中断系统函数
void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio * AXI_Gpio,u16 AXI_GpioIntrId)
{// 查找GIC器件配置信息,并进行初始化IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(GicInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);// 初始化ARM处理器异常句柄Xil_ExceptionInit();// 来给 IRQ 异常注册处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) XScuGic_InterruptHandler,GicInstancePtr);// 使能处理器的中断Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);// 关联中断处理函数XScuGic_Connect(GicInstancePtr, AXI_GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)AXI_Gpio);// 为AXI GPIO器件使能中断XScuGic_Enable(GicInstancePtr, AXI_GpioIntrId);// 0xA0: 中断源的优先级 0x1: 中断类型为高有效电平敏感型XScuGic_SetPriorityTriggerType(GicInstancePtr, AXI_GpioIntrId, 0xA0, 0x1);// 打开AXI GPIO IP的中断使能XGpio_InterruptGlobalEnable(AXI_Gpio);      // 打开全局中断使能XGpio_InterruptEnable(AXI_Gpio, 0x00000001); // 打开通道信号对应的使能
}

  • 修改中断服务函数IntrHandler(),将关闭PS GPIO中断修改为关闭AXI GPIO中断
XGpio_InterruptDisable(&AXI_Gpio, 0x00000001);
  • 修改主函数,将PS GPIO的清除中断状态修改为AXI GPIO的清除中断状态,在xgpio.h找到类似的函数定义XGpio_InterruptClear()
XGpio_InterruptClear(&AXI_Gpio, 0x00000001);
  • 整体程序框架结构可以看实验四 zynq开发系列4:MIO按键中断控制LED

  • 打印两次中断因为按下按键电平改变一次,释放按键电平改变一次。判断当前按键的值,如果按下时才改变LED的值。调用 XGpio_DiscreteRead() 函数,可以读取指定GPIO通道的独立状态。

// 判断当前按键的状态,如果按键按下,就改变LED状态
if(XGpio_DiscreteRead(&AXI_Gpio,GPIO_CHANNEL1) == 1)led_value = ~led_value;
  • 整体文件
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xgpio.h"#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID // PS GPIO 器件ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID // 中断控制器 器件ID
#define AXI_GPIO_ID     XPAR_GPIO_0_DEVICE_ID //AXI GPIO 器件ID
// AXI GPIO的中断号 61
#define AXI_GPIO_INTERRUPT_ID   XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR// 核心板上PS端LED
#define MIO0_LED 7
//AXI GPIO 通道1
#define GPIO_CHANNEL1       1XGpioPs_Config * ConfigPtr;
XScuGic_Config * IntcConfig;XGpioPs Gpio;
XScuGic Intc;
XGpio AXI_Gpio;void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio * AXI_Gpio, u16 AXI_GpioIntrId);
void IntrHandler();u32 key_press = 0;int main() {u32 led_value = 0;printf("AXI GPIO INTERRUPT TEST.\n\r");// 配置PS端器件GPIO并初始化ConfigPtr= XGpioPs_LookupConfig(GPIO_DEVICE_ID);XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);// 对AXI GPIO进行初始化XGpio_Initialize(&AXI_Gpio, AXI_GPIO_ID);// 把PS GPIO设置为输出并打开输出使能XGpioPs_SetDirectionPin(&Gpio, MIO0_LED, 1);XGpioPs_SetOutputEnablePin(&Gpio, MIO0_LED, 1);// 对AXI GPIO进行配置XGpio_SetDataDirection(&AXI_Gpio, GPIO_CHANNEL1, 0x00000001); // 设置为输出XGpio_InterruptGlobalEnable(&AXI_Gpio);      // 打开全局中断使能XGpio_InterruptEnable(&AXI_Gpio, 0x00000001);    // 打开通道信号对应的使能// 设置中断系统SetupInterruptSystem(&Intc, &AXI_Gpio, AXI_GPIO_INTERRUPT_ID);XGpioPs_WritePin(&Gpio, MIO0_LED, led_value);while(1){if(key_press) {// 判断当前按键的状态,如果按键按下,就改变LED状态if(XGpio_DiscreteRead(&AXI_Gpio,GPIO_CHANNEL1) == 1)led_value = ~led_value;key_press = 0;// 清除之前的中断状态XGpio_InterruptClear(&AXI_Gpio, 0x00000001);// 将led_value的值写入LEDXGpioPs_WritePin(&Gpio, MIO0_LED, led_value);// 延时消抖usleep(200000);// 重新打开通道1的中断使能XGpio_InterruptEnable(&AXI_Gpio, 0x00000001);}}return 0;
}void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio * AXI_Gpio,u16 AXI_GpioIntrId)
{// 查找GIC器件配置信息,并进行初始化IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(GicInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);// 初始化ARM处理器异常句柄Xil_ExceptionInit();// 来给 IRQ 异常注册处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) XScuGic_InterruptHandler,GicInstancePtr);// 使能处理器的中断Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);// 关联中断处理函数XScuGic_Connect(GicInstancePtr, AXI_GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)AXI_Gpio);// 为AXI GPIO器件使能中断XScuGic_Enable(GicInstancePtr, AXI_GpioIntrId);// 0xA0: 中断源的优先级 0x1: 中断类型为高有效电平敏感型XScuGic_SetPriorityTriggerType(GicInstancePtr, AXI_GpioIntrId, 0xA0, 0x1);// 打开AXI GPIO IP的中断使能XGpio_InterruptGlobalEnable(AXI_Gpio);      // 打开全局中断使能XGpio_InterruptEnable(AXI_Gpio, 0x00000001); // 打开通道信号对应的使能
}void IntrHandler(){printf("interrupt detected!\n\r");key_press = 1;// 关闭通道1中断使能信号XGpio_InterruptDisable(&AXI_Gpio, 0x00000001);
}

zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED(SDK开发详解)相关推荐

  1. zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED

    在pg144-axi-gpio(LogiCORE IP Product Guide)中可以看见AXI GPIO提供通用输入输出接口到AXI接口,32位软核,设计与AXI4-Lite接口进行连接.IOP ...

  2. Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  3. 用WEB技术栈开发NATIVE应用(二):WEEX 前端SDK原理详解

    摘要: WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app.其同时解决了开发效率.发版速度以及用户体验三个核心问题.那么WEEX是如何实现的?目前WEE ...

  4. 自然语言处理NLP星空智能对话机器人系列:第21章:基于Bayesian Theory的MRC文本理解基础经典模型算法详解

    自然语言处理NLP星空智能对话机器人系列: 第21章:基于Bayesian Theory的MRC文本理解基础经典模型算法详解 1,Bayesian prior在模型训练时候对Weight控制.训练速度 ...

  5. petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)

    注:本篇文章由[开源骚客:OpenSoc]公众号首发,现转载至头条号. 新的开始,这一篇文章,就算是使用 Vitis 开发 ZYNQ 的第一篇文章吧. 计划把 ZYNQ 开发写成一个系列,所使用的的软 ...

  6. TortoiseGit学习系列之TortoiseGit基本操作将提交到本地的项目推送到在线仓库(图文详解)...

    前面博客 TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解) TortoiseGit学习系列之TortoiseGit基本操作修改提交项目(图文详解) TortoiseG ...

  7. S32K系列S32K144学习笔记——GPIO外部中断

    一用S32K144苦似海,道友,能不用,千万不去用. 本例程基以下如图所示接口操作,MCU为S32K144,开发平台S32DSworkspace 功能描述:检测信号输入,如有低电平信号输入,则亮灯,无 ...

  8. CSS字体属性之字体系列、字体大小、字体粗细、字体样式以及字体的符合属性(基础详解)

    目录 CSS字体属性 字体系列 字体大小 字体粗细 字体的符合属性 字体属性的总 CSS字体属性 CSS字体属性之字体系列.大小.粗细以及文本样式 字体系列 CSS使用font-family用于定义文 ...

  9. 用WEB技术栈开发NATIVE应用:WEEX SDK原理详解

    摘要: WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app.其同时解决了开发效率.发版速度以及用户体验三个核心问题.那么WEEX是如何实现的?目前WEE ...

最新文章

  1. 从 Android 静音看正确的查bug的姿势?
  2. Hive之 Hql语法解析
  3. 联想家庭云中心:天边飘来“故乡的云”
  4. 《Java遗传算法编程》—— 1.5 生物进化
  5. 普通用户nginx访问不了_Nginx降权启动之使用普通用户管理 | it运维_it技术_linux运维-追梦人博客...
  6. django HttpResponse的用法
  7. duilib入门简明教程 -- 部分bug (11) (转)
  8. RMDB与hadoop的实时整合
  9. 鸿蒙操作系统是pc还是手机,华为鸿蒙操作系统是什么?鸿蒙适用机型首曝光
  10. unity ugui序列帧动画
  11. 专访任玉刚:从菜鸟到资深工程师的进阶之路
  12. kodi资源_Kodi——支持全平台的看片神器
  13. 三分钟就能安装的企业级文档管理系统
  14. Web--用户注册界面
  15. c语言程序设计西华大学,知到C语言程序设计(西华大学)章节答案
  16. java io流过滤流_JAVA io流 文件流 字节流 字符流 过滤流 缓冲流
  17. 用Excel写个摸球模拟器玩玩
  18. 数字孪生核电站促进界面监测的应用实践
  19. 你知道 Compiler 与 Interpreter 的区别吗?
  20. CorelDRAW2022最新版本号V24.0.0.301订阅版

热门文章

  1. 【MySQL快速入门】高级查询:计算函数分组计算
  2. 蓝桥杯2019真题-完全二叉树的权值
  3. 【python笔记】入门练手的题
  4. nvidia显卡linux 7.2,科学网—悲喜录:服务器 CentOS 7.2 安装Nvidia显卡驱动(64bit) - 袁伟的博文...
  5. Docker必备国内镜像
  6. ECharts力导向布局图增加滚动条
  7. Linux查看域名对应的ip地址
  8. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(3)签到题3题
  9. 【CCCC】L2-025 分而治之 (25分),图的度数,使节点独立的方案
  10. 【NOIP2004】【Luogu1086】花生采摘(枚举,给定顺序的模拟)