ZYNQ-嵌入式学习(4)

news2024/9/23 1:29:23

GPIO之MIO中断

  • GPIO的MIO中断功能
  • 实验:使用GPIO的MIO中断功能,实现按键控制LED的亮灭。

GPIO的MIO中断功能


从MIO输入到GPIO的线路有一个通向中断检测模块的分支。
INT_TYPE寄存器表示中断类型。包括边沿和电平两种类型。
INT_POLARITY寄存器表示极性。包括正负极性。电平类型中断包括低电平触发(-)和高电平触发(+)。边沿类型中断包括上升沿极性(+)和下降沿极性(-)。
INT_ANY寄存器针对边沿触发类型的中断。若为1,则两种边沿变换都可触发中断。

INT State寄存器用来保存中断状态。清零端口连接INT_STAT。INT_STAT写1清除中断。
读INT_STAT可获知引脚当前中断状态,即是否有中断产生。

INT_MASK寄存器表示MIO的哪个引脚的中断被屏蔽。读取此寄存器可知哪些引脚的中断被屏蔽。
INT_DIS表示关闭使能,即屏蔽。(disable)
INT_EN表示中断使能。

若某个引脚检测到中断,且同时这个引脚的中断未被屏蔽,则与门输出高电平,即输出一个中断到GIC,即向GIC发送一个IRQ中断请求。GIC即为PS中的中断控制器。#52表示中断ID。
GIC可接收PS和PL的IRQ,通过中断ID获知是谁发起的请求。每个外设的ID都不同,对于GPIO,其中断号为52。

实验:使用GPIO的MIO中断功能,实现按键控制LED的亮灭。

#include "stdio.h"
#include "xparameters.h"
#include "xparameters_ps.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "sleep.h"

#define GPIO_DEVICE_ID		XPAR_XGPIOPS_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
// GPIO中断号(52)
#define GPIO_INTERRUPT_ID	XPAR_XGPIOPS_0_INTR

// 核心板上PS端LED连接到MIO0
#define MIO0_LED 			0

#define MIO12_KEY			12

#define GPIO_BANK	XGPIOPS_BANK0  /* Bank 0 of the GPIO Device */


XGpioPs_Config * ConfigPtr;

XGpioPs Gpio;

// 中断控制器的驱动实例
XScuGic Intc;

// 中断控制器的配置实例
XScuGic_Config *IntcConfig;

XScuGic *GicInstancePtr;

XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */

u32 key_press = 0;

u32 led_value = 0;

void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio, u16 GpioIntrId);

void IntrHandler();

int main(){


	printf("GPIO interrupt test!\n\r");

	// 根据器件的ID,查找器件的配置信息
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);

	// 初始化GPIO驱动
	XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);

	// 把GPIO某个引脚的方向设置为输出(第二个参数为输出Pin的ID(0~117);第三个参数为方向指示:为0:输入;为1:输出)
	XGpioPs_SetDirectionPin(&Gpio, MIO0_LED, 1);

	// 设置输出使能,第三个参数为1:打开输出使能;为0:关闭输出使能
	XGpioPs_SetOutputEnablePin(&Gpio, MIO0_LED, 1);

	// 设置中断系统
	SetupInterruptSystem(&Intc, &Gpio, GPIO_INTERRUPT_ID);

	while(1){
		if(key_press){
			led_value = ~led_value;
			key_press = 0;
			XGpioPs_WritePin(&Gpio, MIO0_LED, led_value);

			// 清除之前的中断状态
			XGpioPs_IntrClearPin(&Gpio, MIO12_KEY);

			// 延时消抖
			usleep(200000);

			// 再次使能按键中断
			XGpioPs_IntrEnablePin(&Gpio, MIO12_KEY);


		}
	}
	return 0;
}

void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,
				u16 GpioIntrId)
{


	// 查找中断控制器配置信息并进行初始化
	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);

	// 关联中断处理函数IntrHandler
	XScuGic_Connect(GicInstancePtr, GpioIntrId,
				(Xil_ExceptionHandler)IntrHandler,
				(void *)Gpio);

	// 将bank0中所有引脚都设置为下降沿中断
	//XGpioPs_SetIntrType(Gpio, GPIO_BANK , 0x00, 0xFFFFFFFF, 0x00);

	// 将MIO单个引脚(与按键相连的pin12)设置为下降沿中断
	XGpioPs_SetIntrTypePin(Gpio, MIO12_KEY, XGPIOPS_IRQ_TYPE_EDGE_FALLING);

	/* Enable the GPIO interrupts of Bank 0. */
	//XGpioPs_IntrEnable(Gpio, GPIO_BANK, (1 << Input_Pin));

	// 设置MIO单个引脚的中断使能(主动)
	XGpioPs_IntrEnablePin(Gpio, MIO12_KEY);

	// 设置GIC能够接收GPIO中断(被动)
	XScuGic_Enable(GicInstancePtr, GpioIntrId);


}

void IntrHandler(){
	// 中断处理程序:当检测到pin12出现下降沿时,触发中断,即将key_press变量赋值为1。
	key_press = 1;
	printf("interrupt detected!\n\r");
	// 执行完中断处理函数后,将中断屏蔽掉
	XGpioPs_IntrDisablePin(&Gpio, MIO12_KEY);
}


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

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

相关文章

基于 STM32+FPGA 的多轴运动控制器的设计

运动控制器是数控机床、高端机器人等自动化设备控制系统的核心。为保证控制器的实用性、实时性和稳定 性&#xff0c;提出一种以 STM32 为主控制器、FPGA 为辅助控制器的多轴运动控制器设计方案。给出了运动控制器的硬件电路设计&#xff0c; 将 S 形加减速算法融入运动控制器&…

【Git】合并多条 commit 注释信息

文章目录1、查看 commit 记录2、合并 commit 注释1、查看 commit 记录 # 3 指的是查看最近 3 次的 commit 记录&#xff0c;如果要查看多次的可以修改数字 # -3 不加&#xff0c;则表示查看所有 commit 记录&#xff0c;一般还是用数字去指定 git log -32、合并 commit 注释 …

【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(单向LSTM,附完整代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 提起LSTM大家第一反应是在NLP的数据集上比较常见,不过在图片分类中,它同样也可以使用。我们以比较熟悉的 mnist…

软件测试面试自我介绍/项目介绍居然还有模板?我要是早点发现就好了

目录 1、自我介绍 2、项目介绍 2.1、最全电商项目介绍 2.2、电商项目介绍 2.3、在线教育项目介绍 2.4、互联网金融项目介绍 总结 1、自我介绍 以XXX简历来举例&#xff08;参照下面的案例&#xff0c;编写你的自我介绍&#xff0c;框架就是&#xff1a;我是谁&#xff0…

深入Kafka核心设计与实践原理读书笔记第三章消费者

消费者 消费者与消费组 消费者Consumer负责定于kafka中的主题Topic&#xff0c;并且从订阅的主题上拉取消息。与其他消息中间件不同的在于它有一个消费组。每个消费者对应一个消费组&#xff0c;当消息发布到主题后&#xff0c;只会被投递给订阅它的消费组的一个消费者。 如…

go gin学习记录1

环境&#xff1a; MAC M1&#xff0c;Go 1.17.2&#xff0c;GoLand 默认执行指令的终端&#xff0c;如果没有特别说明&#xff0c;指的都是goland->Terminal 创建项目 Goland中新建项目&#xff0c;在$GOPATH/src/目录下建立t_gin项目。 进入项目&#xff0c;在goland的T…

spark04-文件读取分区数据分配原理

接 https://blog.csdn.net/oracle8090/article/details/129013345?spm1001.2014.3001.5502通过上一节知道 总字节数为7 每个分区字节数为3代码val conf: SparkConf new SparkConf().setMaster("local").setAppName("wordcount")val sc: SparkContext ne…

日日顺供应链|想要看清供应链发展趋势,先回答这三个问题

技术变革如何支撑供应链及管理服务的发展&#xff1f; 数字化与科技化开始承托供应链管理能力的升级与变革&#xff1f; 如何从客户需求的纬度反推供应链及管理服务的模式变革&#xff1f;在过去的三年中&#xff0c;我国的供应链企业经受了最为极端的挑战&#xff0c;但当下&a…

论文写作——公式编辑器、latex表格、颜色搭配器

1、公式编辑器(网页版mathtype可用于latex公式编辑): MathType demo - For DevelopersLive demonstration about the features of Mathtype which allows edition equations and formulas (PNG, flash, SVG, PDF, EPS), based on MathML and compatible with LaTeX.https:/…

C++之可调用对象、bind绑定器和function包装器

可调用对象在C中&#xff0c;可以像函数一样调用的有&#xff1a;普通函数、类的静态成员函数、仿函数、lambda函数、类的非静态成员函数、可被转换为函数的类的对象&#xff0c;统称可调用对象或函数对象。可调用对象有类型&#xff0c;可以用指针存储它们的地址&#xff0c;可…

孙子兵法-36计

目录 04、攻其无备&#xff0c;出其不意。——《孙子兵法始计篇》 08、不战而屈人之兵&#xff0c;善之善者也。——《孙子兵法谋攻篇》 09、上兵伐谋&#xff0c;其次伐交&#xff0c;其次伐兵&#xff0c;其下攻城。 01、兵者&#xff0c;国之大事&#xff0c;死生之地&…

想要的古风女生头像让你快速get

如今我看到很多人都喜欢用古风女生当作头像&#xff0c;那么今天我就来教大家如何快速得到一张超美的古风女生头像~ 上图就是我使用 APISpace 的 AI作画(图像生成)服务 快速生成的古风女生头像&#xff0c;不仅可以限定颜色&#xff0c;还可以选择『宝石镶嵌』或『花卉造型』这…

【HAL库】STM32CubeMX开发----STM32F407----Uart串口接收空闲中断

一、Uart串口接收空闲中断----详解 首先介绍串口通信的数据传输方式&#xff0c;这样后面的Uart串口空闲中断能更好的理解。 Uart串口通信----数据传输方式 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备得RXD接口。 一个字符一个字符地传输&#xff0c;每个字符…

设计模式C++实现11:观察者模式

参考大话设计模式&#xff1b; 详细内容参见大话设计模式一书第十四章&#xff0c;该书使用C#实现&#xff0c;本实验通过C语言实现。 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式。 观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察…

Windows安装Gradle(IDEA兼容版)

IDEA兼容版本 IDEA安装目录下查看兼容Gradle版本&#xff1a;D:\win11\program\idea_2022.2.3\plugins\gradle\lib Gradle下载环境变量 1.创建仓库目录 D:\win11\program\gradle-7.4-bin\gradle-7.4\repository2.添加环境变量 GRADLE_HOME&#xff1a;D:\win11\program\gradle…

Java连接Redis

Jedis是Redis官方推荐的Java连接开发工具。api&#xff1a;https://tool.oschina.net/apidocs/apidoc?apijedis-2.1.0一、 导入包<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><…

在职阿里6年,一个29岁女软件测试工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09;其中成功的有4家&…

新版bing(集成ChatGPT)的申请方法

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

redis知识汇总(部署、高可用、集群)

文章目录一、redis知识汇总什么是redisredis的优缺点&#xff1a;为什么要用redis做缓存redis为什么这么快什么是持久化redis持久化机制是什么&#xff1f;各自优缺点&#xff1f;AOF和RDB怎么选择redis持久化数据和缓存怎么做扩容什么是事务redis事务的概念ACID概念主从复制re…

03 OpenCV图像运算

文章目录1 普通加法1 加号相加2 add函数2 加权相加3 按位运算1 按位与运算2 按位或运算、非运算4 掩膜1 普通加法 1 加号相加 在 OpenCV 中&#xff0c;图像加法可以使用加号运算符&#xff08;&#xff09;来实现。例如&#xff0c;如果要将两幅图像相加&#xff0c;可以使用…