【【Micro Blaze按键中断实验】】

news2025/1/12 12:23:29

Micro Blaze按键中断实验

中断是一种当满足要求的突发事件发生时通知处理器进行处理的信号。中断可以由硬件处理单元和外
部设备产生,也可以由软件本身产生。对硬件来说,中断信号是一个由某个处理单元产生的异步信号,用
来引起处理器的注意。对软件来说,中断还是一种异步事件,用来通知处理器需要改变代码的执行,不过
轮询所产生的中断的过程是同步的。

实验之前我们需要了解一下 AXI INTC 这个 IP 核,AXI INTC 的全称是 AXI Interrupt Controller(AXI中断控制器),AXI 中断控制器(INTC)核能将来自外围设备的多个中断输入集中到单个中断输出,再将中断传输给系统处理器。通过用于 AMBA(高级微控制器总线体系结构高级可扩展接口)协议的 AXI 规范的从属接口访问用于检查,启用和确认中断的寄存器。AXI INTC(中断控制器)具有以下特点:AXI INTC IP 核可以通过 AXI4-Lite 接口访问,最高支持 32 个中断,中断控制器之间可以级联产生其他的中断信号并且支持快速中断模式。中断控制器的每个输入或输出都可以配置为电平或边缘敏感。中断信号间的优先级由向量的位决定,最低有效位(LSB,在本例中为位 0)具有最高优先级。中断控制器中包含中断使能寄存器,能够有选择地使能单个中断输入。该 IP 也可以配置软件中断功能,还能中断嵌套。
在这里插入图片描述

Regs Block(Registers Block 即寄存器模块):此模块包含控制寄存器和状态寄存器。它们都通过AXI4-Lite 从接口访问,每个寄存器均为四字节。

Int Det(Interrupt Detection 即中断检测):此模块用于检测中断输入。它可以配置每个中断输入为电平或边缘触发。
Irq Gen(Interrupt Generation 即中断生成):此模块具有以下功能:(1)从中断控制器生成最终输出中断。(2)中断灵敏度由配置参数决定。(3)检查控制寄存器(MER 和 IER)中用于中断生成的启用条件。(4)在确认后重置中断。(5)在 IVR(中断向量)寄存器中写入活动中断的向量地址,并为挂起的中断启用 IPR 寄存器。

我们对于这个IP 还是来总结一下

这个IP的作用是 接收到来自外部输入的中断(由Int Det 中断检测) 当我们就按测到之后,传递给Regs Block 寄存器模块 将信息考量处理之后 传递给 Irq Gen (中断生成模块) 在配置下,这个模块给外部输出一个中断

我们直接来看 实验任务
本章的实验任务是通过 AXI GPIO 检测按键状态产生中断信号,中断控制器检测到中断后,给处理器发送中断请求,处理器通过接收到的中断控制 LED 灯的亮灭。
在这里插入图片描述

系统框图中,按键 KEY 作为 AXI GPIO 的输入,LED 作为 AXI GPIO 的输出。当 AXI GPIO 检测到按键状态发生变化时,AXI GPIO 就会产生一个中断信号传入中断控制器(AXI Interrupt Controller),中断控制器生成中断输出信号,传入 MicroBlaze 处理器,MicroBlaze 处理器通过接收到的中断信号控制 LED。中断控制器通过 AXI Interconnect 与 MicroBlaze 互联,MicroBlaze 可以通过 AXI 接口对中断控制器进行配置。

我们创建一个 GPIO口 用来连接 按键 所以是1位的 数据位宽 并且 我们需要打开中断

在这里插入图片描述

我们现在对 AXI 中断的 各项功能进行分析
在这里插入图片描述

我们需要连接 中断与 Micro Blaze 和 GPIO 按钮相连
在这里插入图片描述

我们重新配置 xdc文件
在这里插入图片描述

对于 xdc的来历 我们观察 开发板的管脚图
在这里插入图片描述

#include "xparameters.h"
 #include "xintc.h"
 #include "xgpio.h"
 #include "sleep.h"

 #define KEY_DEV_ID XPAR_AXI_GPIO_0_DEVICE_ID //按键 AXI GPIO ID
 #define LED_DEV_ID XPAR_AXI_GPIO_1_DEVICE_ID //LED AXI GPIO ID
 #define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID //中断控制器 ID
 #define EXCEPTION_ID XIL_EXCEPTION_ID_INT //中断异常 ID
 #define AXI_GPIO_INTR_ID XPAR_INTC_0_GPIO_0_VEC_ID //AXI GPIO 中断 ID

 static XIntc Intc; //中断控制器实例
 static XGpio KEY_Gpio; //GPIO 中断实例 按键
 static XGpio LED_Gpio; //GPIO 实例

 int led_value; //LED 值
 int key_value; //按键值
 int Intr_times = 0; //有效中断计数
 int key_intr_flag = 0; //中断标志

 void GpioHandler(void *CallbackRef);

 int main(){
 xil_printf("AXI GPIO INTERRUPT TEST!\r\n");
 //AXI_GPIO 器件初始化
 XGpio_Initialize(&KEY_Gpio, KEY_DEV_ID);
 XGpio_Initialize(&LED_Gpio, LED_DEV_ID);
 //为指定的 GPIO 信道设置所有独立信号的输入/输出方向
 XGpio_SetDataDirection(&LED_Gpio, 1, 0);
 //设置 LED 初始值
 XGpio_DiscreteWrite(&LED_Gpio, 1, 0x0f);
 XGpio_SetDataDirection(&KEY_Gpio, 1, 1);
 //初始化中断控制器
 XIntc_Initialize(&Intc, INTC_DEVICE_ID);
 //关联中断 ID 和中断服务函数
 XIntc_Connect(&Intc,AXI_GPIO_INTR_ID,(Xil_ExceptionHandler)GpioHandler,&KEY_Gpio );
//使能中断
 XGpio_InterruptEnable(&KEY_Gpio, 1);
 //使能全局中断
 XGpio_InterruptGlobalEnable(&KEY_Gpio);
 //在中断控制器上启用中断向量
 XIntc_Enable(&Intc,AXI_GPIO_INTR_ID);
 //启动中断控制器
 XIntc_Start(&Intc, XIN_REAL_MODE);
 //设置并打开中断异常处理
 Xil_ExceptionInit();
 Xil_ExceptionRegisterHandler(EXCEPTION_ID,
 (Xil_ExceptionHandler)XIntc_InterruptHandler,&Intc);
 Xil_ExceptionEnable();

 while(1){
 if(key_intr_flag){ //检测中断标志信号有效
 key_value = XGpio_DiscreteRead(&KEY_Gpio, 1); //读取按键值
 if(key_value == 0){ //检测按键是否按下
 if(Intr_times == 0) //根据有效中断数点亮 LED
 led_value = 0x01;
 else if(Intr_times == 1)
 led_value = 0x02;
 else if(Intr_times == 2)
 led_value = 0x04;
 else
 led_value = 0x08;
 //按键按下后点亮对应 LED 灯
 XGpio_DiscreteWrite(&LED_Gpio, 1, led_value);
 xil_printf("i = %d\r\n",Intr_times); //打印当前的 Intr_times
 Intr_times = (Intr_times + 1)%4; //将计数值约束在 0 到 3 之间
 //延迟 1 秒消抖
 sleep(1);
 }
 key_intr_flag = 0; //中断标志清零
 }
 }
 return 0;
 }

 void GpioHandler(void *CallbackRef){
 XGpio *GpioPtr = (XGpio *)CallbackRef;
key_intr_flag = 1; //接收到中断,标志信号拉高
 XGpio_InterruptDisable(GpioPtr, 1); //关闭中断
 XGpio_InterruptClear(GpioPtr, 1); //清除中断
 XGpio_InterruptEnable(GpioPtr, 1); //使能中断
}

我们把分析 逻辑 以及 中断的使用 放在了 下一节上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何利用 Snapchat 制定数字营销战略

近年来,Snapchat已成为数字营销领域的重要参与者。Snapchat 已经发展成为一种复杂的营销工具,被各种公司用来与年轻受众互动,此前它最初被认为是一个专门供青少年发布快速、转瞬即逝内容的平台。Snapchat 上的日活跃用户数量超过 2.8 亿&…

CMD命令切换至D盘

1.使用快捷键winr进入如下所示界面: 2.在框内输入CMD 后点击确定,即可进入如下界面; 3.输入d: 后按下enter即可转换成功; 补充一些CMD命令: 1. appwiz.cpl:程序和功能 2. calc:启动计算器 3.…

分布式仿真SNN的思考(二)

经过漫长的思考,我依然无法为昨天的第二个问题找到合适的解决方法。然后今天依然对整体的放着进行思考,找出规律再去写代码。考虑SNN网络: 那么他的邻接表gabal_adj: 0 1 2 1 3 2 1 3 3 4 5 4 6 5 2 6 5 3 假设有两…

SSL证书为什么要收费?

SSL证书之所以需要收费,主要涉及以下几个方面的原因: 验证过程成本 SSL证书颁发机构(CA,Certificate Authority)必须执行验证过程,以确保证书请求者的身份和域名所有权。这些验证程序需要时间和资源&…

PyQt6 QCommandLinkButton命令链接按钮控件

​锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计32条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…

IO延迟引起的虚拟机故障排查

vmware 虚拟机连上之后总感觉非常卡,查看CPU 内存资源使用率是正常的。 message 日志有cpu卡住的报错 NMI watchdog: BUG: soft lockup - CPU#8 stuck for 23s! [container-31451:45878]下面分析是什么导致的服务器cpu卡住。 1、打开prometheus,观察服务…

IP地理定位技术的服务内容详解

IP地理定位技术是一种通过IP地址确定设备或用户地理位置的技术,广泛应用于广告定向、网络安全、位置服务等领域。本文将深入探讨IP地理定位技术的服务内容,解析其在不同场景中提供的多种服务。 1. 准确的地理位置信息提供: IP地理定位技术的…

从自动化、数字化到智能化,鸿蒙与制造业的双向奔赴

终端万物互联,商业竞争瞬息万变,制造企业面临着数字化转型与产品智能化升级的双重考验。鸿蒙操作系统以统一操作系统方案,可以为制造企业解决设备生态碎片化以及跨终端对接问题,提供安全性、流畅度、多屏协同等功能,实…

2023年【安全员-B证】最新解析及安全员-B证免费试题

题库来源:安全生产模拟考试一点通公众号小程序 安全员-B证最新解析是安全生产模拟考试一点通生成的,安全员-B证证模拟考试题库是根据安全员-B证最新版教材汇编出安全员-B证仿真模拟考试。2023年【安全员-B证】最新解析及安全员-B证免费试题 1、【多选题…

Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)

​ 目录 前言: 准备资料: 正文: 1:打包一个带有签名的apk 2:对包进行反编译 3:使用ipaguard来对程序进行加固 前言: 对于辛辛苦苦完成的apk程序被人轻易的反编译了,那就得不偿…

怎样成为一名出色的汽车销售?

要成为一名杰出的汽车销售,需要掌握以下几个重要要素: 首先,坚实的知识储备是必不可少的。你需要熟悉汽车的基本构造、市场动态以及竞争对手的最新动态。此外,对各种汽车配置和功能的深入理解将使你能够更好地向客户解释和推荐适…

使用C语言创建高性能爬虫ip网络

之前写的python和GO语言的爬虫ip池的文章引起很大反响,这次我将以C语言来创建爬虫IP池,但是因为其复杂性,可能代码并非完美。但是最终也达到的想要的效果。 因为在C语言中创建代理IP池可能会比较复杂,且C语言并没有像Python那样的…

深度学习——激活函数汇总

深度学习——激活函数汇总 一、ReLU 一、ReLU 参考资料: https://zhuanlan.zhihu.com/p/428448728

html/css中位置position的绝对位置absolute顺时针盒子案例图片排序

目标图片&#xff1a; Dreamweaver界面&#xff1a; 代码部分&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style type"text/css">.red{background-color:r…

【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.4---9.1.6)

目录 9.1.4 设计立方体类 ​编辑 9.1.5 成员函数在类的外部实现 9.1.6 类在其他源文件的实现步骤&#xff08;实现类在不同文件的实现&#xff0c;后续引出构造函数&#xff09; 注意:类定义在同文件testclass.h中&#xff0c;而testclass.cpp是用来实现&#xff08;声明&…

【redis】[windows]redis安装以及配置等相关

前言&#xff1a;下载安装配置密码、远程访问等等 目录 一、下载 二、配置文件说明 1、bind 1.1 这个参数默认值是127.0.0.1&#xff0c;也就是只允许redis所在机器访问redis。 1.2 如果我们的应用服务和redis服务不在一个机器我们就需要修改这个参数为0.0.0.0&#xff0c…

春秋云镜 CVE-2022-30887

春秋云镜 CVE-2022-30887 多语言药房管理系统 (MPMS) 靶场介绍 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0c;并根据到期…

SpringBoot整合Activiti7——错误事件(十一)

文章目录 错误事件开始事件边界事件结束事件代码实现开始事件xml文件测试流程流程执行步骤 边界与结束事件xml文件自定义错误监听器测试流程流程执行步骤 错误事件 好像都是中断的。非中断没测出来&#xff01;&#xff01;&#xff01; <!-- 定义错误 --> <error id&…

基于Python Flask 的全流程全栈项目自己的实战心得

我基于Python Flask框架开发全流程全栈项目的实战经验和心得。我将介绍整个项目的架构设计、前后端交互、数据库管理以及部署等方面&#xff0c;并提供具体的代码示例。通过这个实例项目&#xff0c;你将学习到如何使用Flask构建一个完整的Web应用&#xff0c;并了解一些常见的…

关于PFMEA的风险评估都在这里——SunFMEA软件

1、评价严重度 严重度应该独立于发生度和探测度的评价&#xff0c;不能认为发生概率低或者探测能力强&#xff0c;失效就不会到达顾客手中&#xff0c;不会造成糟糕的失效影响&#xff0c;严重度就低。 其实&#xff0c;严重度评估的是已经识别的失效链的严重程度&#xff0c…