正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.6讲 GPIO中断实验-GPIO驱动添加中断处理函数

news2024/11/23 22:33:05

前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第15.6 讲” 的读书笔记。第15讲主要是介绍I.MX6U处理器GPIO中断控制实验。本节将参考正点原子的视频教程第15讲和配套的正点原子开发指南文档进行学习。

在第15.6讲视频教程中,正点原子会讲解了如何初始化gpio支持中断模式,并且如何启用gpio中断,如何关闭gpio中断,如何读取gpio的中断标志位,在中断处理结束之后如何清除gpio外设的中断标志位。

0. 概述

本章实验的功能和之前按键控制蜂鸣器的实验一样,只是按键采用中断的方式来处理。当按下KEY0以后就打开蜂鸣器,再次按下蜂鸣器KEY0就关闭蜂鸣器。

1. gpio按键电路原理分析

如之前按键KEY实验中分析的过的,正点原子I.MX6ULL ALPHA/Mini开发板的按键KEY0接 I.MX6ULL 处理器的 "UART1_CTS_B" 引脚。

当按键KEY0按下时,当默认按键松开时GPIO读取到高电平,当按键按下时GPIO读取到低电平。通过读取GPIO输入引脚的电平,当读取到低电平是说明按键KEY0被按下。

1.2 按键消抖

当然,如之前按键KEY0实验分析的那样还需要在检测到KEY0被按下时对按键进行消抖处理,防止按键按下瞬间的高低电平抖动操作按键被判断为多次误触发。

理想的按键的按键电平变化

实际按键的电平变化过程

2. 配置GPIO复用,GPIO方向

将I.MX6U处理器的 "UART1_CTS_B" 引脚配置为按键KEY0的gpio引脚输入input模式需要如下几步,我们在之前的按键实验里已经分析过,这里不再详细描述。

  1. 配置 "UART1_CTS_B" 引脚复用为 GPIO1_IO18 模式
  2. 配置"UART1_CTS_B" 引脚的电气特性,包括压摆率,下拉电阻,磁滞特性,等属性。
  3. 配置GPIOx_GIDR 寄存器,设置GPIO的输出方向是Output输出还是Input输入。
  4. 对于GPIO输出模式的话,写GPIOx_DR寄存器的对应bit位来控制GPIO的输出是低电平还是高高电平。

3. 配置GPIO中断模式

GPIO引脚作为input输入时可以根据GPIO引脚上的电平变化来触发中断,我们可以通过按键KEY0的 GPIO1_IO18 引脚的电平变化来触发gpio中断的方式来检测按键是否被按下。

在之前的按键KEY0实验里,我们通过处理器不断地循环来检测按键是否被按下,当处理器不停的循环检测按键的电平时处理器什么也不能干,这就造成了处理器资源的浪费。使用中断的方式可以极大的提高处理器系统的运行效率。

I.MX6U 处理器的GPIO输入接口中断通过寄存器 "GPIOx_ICR1, GPIOx_MR, GPIOx_ISR, GPIOx_EDGE_SEL" 来配置启用/关闭,GPIO输入中断触发类型(低电平触发,高电频触发,电平下降沿触发,电平上上沿触发,电平上升下降沿都触发)。

GPIO1_IO18 引脚的GPIO中断配置需要如下步骤:

  1. 设置GPIOx->ICR寄存器配置,对应引脚bit位的GPIO输入信号中断触发类型,选择是低电平触发,高电平触发,电平下降沿触发,还是电平上升沿触发。
  2. 设置GPIOx->MR寄存器,对应引脚bit位来使能或关闭gpio输入中断触发。
  3. 在gpio中断处理完成之后向 GPIOx->ISR 寄存器的对应引脚bit位写1,来清除gpio外设的中断标志位。

4. GPIO中断处理函数编写

如上面分析,GPIO中断驱动函数编写需要初始化GPIO引脚的IO口复用模式,IO口的电气特性,GPIO的工作模式为输入模式,GPIO口使能输入信号中断触发,GPIO口的输入信号中断触发方式,以及在处理完GPIO口的中断ID之后写1清楚对应的中断标志位。

在bsp/bsp_gpio.h中增加 GPIO 输入信号中断出发类型的枚举类型定义 ‘enum _gpio_int_mode’:

#ifndef __BSP_GPIO_H__
#define __BSP_GPIO_H__

#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "cc.h"


typedef enum _gpio_int_mode
{
	kGPIO_Noint 		 			= 0,
	kGPIO_LowInterrupt				= 1,
	kGPIO_HighInterrupt				= 2,
	kGPIO_RaisingEdgeInt			= 3,
	kGPIO_FalllingEdgeInt			= 4,
	kGPIO_FallingOrRaisingEdgeInt 	= 5,
} gpio_int_mode_t;

typedef enum _gpio_pin_direction
{
	kGPIO_DigitalOutput = 0U,	/*输出*/
	kGPIO_DigitalInput  = 1U,	/*输入*/
	
} gpio_pin_direction_t;

typedef struct _gpio_pin_config 
{
	gpio_pin_direction_t directioin;	/* GPIO 方向:输入还是输出 */
	int outputLogic; 					/* 如果是输出的话,默认输出电平 */
	gpio_int_mode_t intMode;			/* GPIO中断模式 */
} gpio_pin_config_t;


/* 初始化函数 */
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
void gpio_pinwrite(GPIO_Type *base, int pin, int value);
int  gpio_pinread(GPIO_Type *base, int pin);

void gpio_intmode_config(GPIO_Type *base, int pin, gpio_int_mode_t mode);
void gpio_int_enable(GPIO_Type *base, int pin);
void gpio_int_disable(GPIO_Type *base, int pin);
void gpio_int_cleanFlag(GPIO_Type *base, int pin);

#endif

在 'gpio_init()’ 初始化函数总增加gpio输入信号中断触发模式配置函数,gpio中断触发启用函数,gpio中断触发关闭函数。

#include "bsp_gpio.h"


/*
 * @description 	: GPIO初始化。
 * @param - base 	: 要初始化的寄存器组。
 * @param - pin		: 要初始化的寄存器脚号。
 * @param - config	: GPIO 配置结构体。
 * @return 			: 无
 */
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
{
	if(config)
	{
		if(config->directioin == kGPIO_DigitalOutput){
			base->GDIR |= (1<<pin);								/* 输出 */

			gpio_pinwrite(base, pin, config->outputLogic);		/* 默认输出电平 */
		}
		else if(config->directioin == kGPIO_DigitalInput){
			base->GDIR &= ~(1<<pin);							/* 输入 */
		}

		if(config->directioin == kGPIO_DigitalInput){
			gpio_intmode_config(base, pin, config->intMode);		/* gpio中断触发方式配置 */
		}
	}
}

/*
 * @description 	: 指定 GPIO 输出高或者低电平。
 * @param – base 	: 要输出的 GPIO 组。
 * @param – pin 	: 要输出的 GPIO 脚号。
 * @param - value	: 要输出的电平, 1 输出高电平, 0 输出低低电平
 * @return 			: 无
 */
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
	if(value == 0)
		base->DR &= ~(1<<pin);
	else
		base->DR |= (1<<pin);
}

/*
 * @description 	: 读取指定 GPIO 的电平值。
 * @param – base 	: 要读取的 GPIO 组。
 * @param – pin 	: 要读取的 GPIO 脚号。
 * @return 			: 1 读取高电平, 0 读取低低电平。
 */
int  gpio_pinread(GPIO_Type *base, int pin)
{
	return ((base->DR >> pin) & 0x1);
}

/*
 * @description 	: 启用GPIO指定pin的中断。
 * @param – base 	: 要启用的 GPIO 组。
 * @param – pin 	: 要启用的 GPIO 脚号。
 * @return 			: 无。
 */
void gpio_int_enable(GPIO_Type *base, int pin)
{
	base->IMR |= (1 << pin);
}

/*
 * @description 	: 禁用GPIO指定pin的中断。
 * @param – base 	: 要禁用的 GPIO 组。
 * @param – pin 	: 要启用中断的 GPIO 脚号。
 * @return 			: 无。
 */
void gpio_int_disable(GPIO_Type *base, int pin)
{
	base->IMR &= ~(1 << pin);
}

/*
 * @description 	: 清除GPIO指定pin的中断标志。
 * @param – base 	: 要清除的 GPIO 组。
 * @param – pin 	: 要清除中断的 GPIO 脚号。
 * @return 			: 无。
 */
void gpio_int_cleanFlag(GPIO_Type *base, int pin)
{
	/* 写1清除对应的中断标志位 */
	base->ISR |= (1 << pin);
}

/*
 * @description 	: 设置GPIO中断触发类型。
 * @param – base 	: 要清除的 GPIO 组。
 * @param – pin 	: 要清除中断的 GPIO 脚号。
 * @return 			: 无。
 */
void gpio_intmode_config(GPIO_Type *base, int pin, gpio_int_mode_t mode)
{
	volatile unsigned int *icr;			/* volatile关键字要求立即写入内存,不要在寄存器中缓存 */
	unsigned int icrShift = pin;

	if(pin < 16)
	{
		icr = &base->ICR1;

	}
	else{
		icr = &base->ICR2;
		icrShift -= 16;
	}

	//我忘记了清理GPIO1->EDGESEL寄存器的对应pin
	base->EDGE_SEL &= ~(1 << pin);
	
	*icr &= ~(0x3 << (icrShift * 2));	/* 清零gpio->ICR 寄存器对应的位 */

	switch(mode)
	{
		case kGPIO_Noint:
			break;
		case kGPIO_LowInterrupt:
			*icr |= (0 << (icrShift * 2));
			break;
		case kGPIO_HighInterrupt:
			*icr |= (1 << (icrShift * 2));
			break;
		case kGPIO_RaisingEdgeInt:
			*icr |= (2 << (icrShift * 2));
			break;
		case kGPIO_FalllingEdgeInt:
			*icr |= (3 << (icrShift * 2));
			break;
		case kGPIO_FallingOrRaisingEdgeInt:
			base->EDGE_SEL |= (1 << pin);
			break;
	}
}

在 'gpio_intmode_config()' 中根据GPIO输入信号的中断触发类型设置对应的 GPIOx->CR1或者CPIOx->CR2寄存器对应bit位来选择GPIO输入信号中断触发类型。

4.1 KEY0 按键选择电平下降沿触发

根据正点原子I.MX6ULL ALPHA/Mini开发板的按键KEY0的电路原理图分析,当按下按键KEY0时GPIO1_IO18的输入信号从高电平变为低电平,所以我们的按键KEY0链接的GPIO1_IO18的输入中断触发方式选择为“电平下降沿触发”。

4.2 KEY0按键消抖

如之前KEY0按键实验中已经分析过得,我们物理按键不是理想的按键,在按键KEY0被按下的瞬间会有多次的电平高低跳变,按下按键一次可能或触发多次中断,所以需要在按键进行消抖。

5. 总结和实验遇到的问题记录

本节分析了将按键对应的GPIO口配置为gpio输入模式,并启用gpio口的中断触发,根据KEY0的电路原理图选择gpio口的中断触发类型。参考I.MX6ULL手册,将gpio输入模式的配置配置到 GPIOx->CR1, GPIOx->CRx, GPIOx->MR, GPIOx->ISR 寄存器里对应的bit位。

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

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

相关文章

2024年第十届中西部外语翻译大赛

2024年第十届中西部外语翻译大赛 竞赛信息 “由中西部翻译协会共同体指导发起&#xff0c;各省市译协共建学术指导委员会&#xff0c;2024年第十届中西部外语翻译大赛由中西部翻译协会共同体秘书处&#xff08;武汉公仪网络科技有限公司&#xff09;承办。” - 获奖证书样图 -…

MQTT_服务器的安装_1.3

此例子是以Windows系统安装开源版本的EMQX 下载 EMQX 下载并解压 解压如图 进入bin 文件夹在文件目录中输入cmd回车 启动服务器 然后在cmd中输入下面的代码&#xff08;会弹出一个访问网络的选项&#xff0c;确认可以访问网络&#xff09; emqx start 结果如图&#xff08;…

半小时搞懂STM32知识点——UART

1.UART 1.1为什么要使用UART这种协议?介绍一下UART及其特点 成本低&#xff0c;硬件简单&#xff0c;数据格式灵活&#xff1b; 低速全双工异步串行通信 1.2 UART数据帧格式&#xff1f; 起始位&#xff08;1&#xff09;&#xff0b;数据位&#xff08;5-8&#xff09; 校验位…

百面算法工程师 | YOLOv6面试考点原理全解析

本文给大家带来的百面算法工程师是深度学习目标检测YOLOv6面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习目标检测面试问题&#xff0c;并提供参考的回答…

项目管理—需求管理规程(软件研发过程标准,管理标准,标书技术编写,资质评审,安全管理体系,项目交付,实施运维,各类建设方案)

软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c;技术解…

GPT-4o 引领人机交互新风向,向量数据库赛道沸腾了

OpenAI 发布 ChatGPT-4o&#xff0c;意味着人机交互进入新的时代。Chat-GPT4o 是一个跨文本、视觉和音频端到端训练的新模型&#xff0c;所有输入和输出都由同一个神经网络处理。这也在告诉所有人&#xff0c;GenAI 连接非结构化数据&#xff0c;非结构化数据之间跨模态的交互正…

Geoserver

Geoserver GIS工具 文章目录 Geoserver前言一、Geoserver是什么&#xff1f;二、概念1.Geoserver结构图2.相关概念3.Geoserver相关站点4.Geoserver安装5.PostgreSQL安装1.拉取镜像2.创建挂载卷3.安装 6 Docker 环境安装postgrespostgis扩展 总结其他参考资料 前言 GeoServer&…

从开发板导出根文件系统并修改(Ubuntu)

前面提到过基于ubuntu-base去构建根文件系统基于Ubuntu-base构建根文件系统-CSDN博客&#xff0c;但是有时候我们并不需要重头开始&#xff0c;可以基于现有的根文件系统做调整。又或者我们直接在出厂的系统上去搭建好自己的运行环境并且编译出自己想要的程序&#xff0c;现在要…

Web浏览器的兼容性测试需要考虑哪些测试点?

测试web网站兼容性时&#xff0c;可以使用各种测试用例来确保网站在不同浏览器中的良好兼容性。以下是一些常见的兼容性测试用例示例&#xff1a; 1. 页面加载测试&#xff1a; - 确保网站在不同浏览器中正常加载&#xff0c;没有加载错误。 - 检查页面加载时间&#xff0c;…

Kivy UI界面

一、版本介绍 Ubuntu&#xff1a;18.04.6 LTS Conda&#xff1a;4.5.12 Python&#xff1a;3.6.15 Kivy&#xff1a;2.0.0 二、安装Kivy # 更新系统包列表 sudo apt-get update# 安装Kivy的依赖项 sudo apt-get install -y python-pip libsdl2-dev libsdl2-image-dev li…

【机器学习】:基于决策树与随机森林对数据分类

机器学习实验报告&#xff1a;决策树与随机森林数据分类 实验背景与目的 在机器学习领域&#xff0c;决策树和随机森林是两种常用的分类算法。决策树以其直观的树形结构和易于理解的特点被广泛应用于分类问题。随机森林则是一种集成学习算法&#xff0c;通过构建多个决策树并…

Galxe已投资Pencils Protocol,投资者阵营正不断扩大

近日&#xff0c;Scroll 生态项目 Penpad 将品牌进一步升级为 Pencils Protocol&#xff0c;全新升级后其不仅对 LaunchPad 平台进行了功能上的升级&#xff0c;同时其也进一步引入了 Staking、Vault 以及 Shop 等玩法&#xff0c;这也让 Pencils Protocol 的叙事方向不再仅限于…

“图生视频”技术创新:剪贴画秒变动画生成的实验验证与分析

在最近的研究进展中&#xff0c;AniClipart系统的问世标志着文本到视频生成技术的一个重要里程碑。这一系统由香港城市大学和莫纳什大学的研究者们共同开发&#xff0c;旨在解决将静态剪贴画图像根据文本提示自动转换成动画序列的挑战。传统的动画制作流程繁琐且耗时&#xff0…

Python 小抄

Python 备忘单 目录 1.语法和空格 2.注释 3.数字和运算 4.字符串处理 5.列表、元组和字典 6.JSON 7.循环 8.文件处理 9.函数 10.处理日期时间 11.NumPy 12.Pandas 要运行单元格&#xff0c;请按 ShiftEnter 或单击页面顶部的 Run&#xff08;运行&#xff09;。 1.语法和空格…

「每日跟读」英语常用句型公式 第15篇

「每日跟读」英语常用句型公式 第15篇 1. It’s only logical that __ 合理的做法/结论是__ It’s only logical that we should take a break &#xff08;合理的做法是我们应该休息一下&#xff09; It’s only logical that we work hard to make money&#xff08;合理…

如何设计知识竞赛活动中的观众互动环节

知识竞赛活动过程中有多种方式进行观众互动&#xff0c;达到台上台下互动的效果&#xff0c;让台下观众参与到竞赛活动中&#xff0c;增加现场气氛。下面介绍几种常用观众互动环节设计方法。 一、台上选手对抗台下观众 此方案为台下观众和台上选手一起答题&#xff0c;如果台…

又双叒叕新增2本SCI期刊“On Hold“,慎投,有剔除风险!

本周投稿推荐 SSCI • 2区社科经管类&#xff0c;3.0-4.0&#xff08;录用友好&#xff09; EI • 计算机工程生物医学等&#xff08;领域广&#xff0c;录用极快&#xff09; CNKI • 3天内初审录用&#xff0c;随即出版&#xff08;急录友好&#xff09; SCI&EI …

[Bootloader][uboot]code总结

文章目录 1、U_BOOT_DRIVER2、DM框架dm_scan_platdatadm_extended_scan_fdt 1、U_BOOT_DRIVER 使用这个宏可以定义一个驱动实例&#xff0c;宏定义是 其中使用的struct driver结构体 使用的ll_entry_declare宏定义是 归结为 2、DM框架 1、 DM框架 DM模型抽象出了以下四个…

测试之路 - 精准而优雅

引子 这几年业内一直在做精准测试&#xff0c;大都使用工具 diff 代码改动、分析代码覆盖率这些平台集成的能力。 业务测试中&#xff0c;我们在技术设计和代码实现的基础上也做了一些精减和精准的测试实践&#xff0c;通过深入测试有针对的设计 case&#xff0c;发现隐藏问题…

智游剪辑1.5.0发布!

智游剪辑1.5.0发布了&#xff0c;快来看看更新了啥功能吧&#xff01; 主页卡片升级 现在功能卡片新增图标&#xff0c;比以前更好看更直观 我的收藏 遇到自己喜欢的功能直接点击收藏就可以了&#xff0c;后面我们就能快速找到这个功能 批量ncm转mp3功能 目前看后台有很多人…