i.MX6裸机开发(6):GPIO输入——按键查询检测

news2024/9/21 2:44:07

按键检测使用到GPIO外设的基本输入功能,GPIO外设相关的概念请参考 第四章节汇编点亮LED灯

本章主要内容:

  • i.MX 6U 在硬件上实现按键消抖

  • Pro开发板按键原理图和功能分析

  • 在led_rgb_c基础上修改为button

  • 编译代码,实现按键查询控制LED

1. 按键查询试验

1.1. 硬件设计

按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键 时会产生下图中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。

按键抖动

按键抖动

不过i.MX 6U的GPIO引脚带有施密特触发器功能,使用该功能可以对信号实现消抖处理,见下图硬件消抖, 从而简化了软件的工作,软件只需要直接检测引脚的电平即可。

硬件消抖

 

1.2. 硬件原理图分析

在Pro底板中包含了4个按键:

1、RST复位按键。

该按键连接至i.MX 6U的POR引脚,当该引脚为低电平时会引起i.MX6U芯片的复位(复位的基本现象是程序从头开始运行)。 从按键的原理图可知,该按键在没有被按下的时候,引脚状态为高电平,当按键按下时,引脚状态为低电平(按键所在的电路导通,引脚接到地)。 所以,平时POR_B引脚保持高电平,芯片正常运行,按下按键时产生复位。 如下所示。

RST复位按键

2、MODE按键

MODE按键最为特殊,它通过一系列电路连接至两个引脚BOOT_MODE[0]和BOOT_MODE[1],当该按键按下时,BOOT_MODE[0]引脚状态为高电平, BOOT_MODE[1]则相反为低电平。BOOT_MODE[0]和BOOT_MODE[1]都具有GPIO的功能,即我们可以选取这二者中任意一个设置成GPIO的输入模式并检测相应的输入电平, 来判断按键是否被按下。MODE按键这样设计是为了方便切换芯片的启动方式,芯片复位启动后会检测这两个引脚的电平, 根据BOOT_MODE[0]和BOOT_MODE[1]的电平状态来选择FLASH还是USB的启动方式。 在本章实验中我们不使用该按键。MODE按键在原理图中的位置如下所示。

MODE按键

3、ON/OFF按键

该按键连接至i.MX 6U的ONOFF引脚,长按可以实现开关机。该按键不要用作普通按键使用。 ON/OFF按键在原理图中的位置如下图所示。

ON/OFF按键

4、KEY按键

该按键连接至SNVS_TAMPER1引脚,用作普通的按键。 本实验将用该按键实现GPIO输入功能。KEY按键在原理图中的位置如下图所示。

KEY按键

对这4个按键的信息及相应GPIO端口引脚号的总结具体见下表。

表各个按键的信息及GPIO端口引脚号

按键

丝印编号

GPIO功能

按键按下时的电平

其它功能

RST复位按键

SW1

不支持

低电平

复位芯片

ON/OFF按键

SW3

不支持

低电平

从低功耗唤醒

MODE按键

SW4

支持

BOOT_MODE[0]与BOOT_MODE[1]相反

选择芯片启动方式

KEY按键

SW2

支持

高电平

若你使用的实验板按键的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。

2. 实验代码讲解

本章的示例代码目录为:bare_metal/button

野火裸机下载工具download_tool路径为:bare_metal/download-tool/download-tool.tar.bz2

为简化程序设计,本程序在LED程序基础上修改。我们重点介绍修改的部分,其他与LED章节相同。

2.1. 编程思路

  1. 初始化按键使用到的GPIO引脚。

  2. 编写简单的按键检测函数。

  3. 查询按键控制LED。

  4. 修改makefile文件。

2.2. 代码分析

2.2.1. 在RGB灯代码上修改

本程序在RGB等程序基础上修改,复制“base_code/bare_metal/led_rgb_c” 为“base_code/bare_metal/button”,如下图所示。

复制led_rgb_c

将文件“led.c”和“led.lds”分别修改为“button.c”和“button.lds”,添加按键代码我们只需要修改“makefile”文件以及“button.c”文件。

2.2.2. 修改button.c

与led灯引脚设置方法相同,只是配置稍有不同,具体代码如下所示,这里只列出了按键相关的代码,完整代码请参考本章配套例程。

/*按键2 GPIO端口、引脚号及IOMUXC复用宏定义*/
#define button2_GPIO               GPIO5
#define button2_GPIO_PIN           (1U)
#define button2_IOMUXC             IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01

/* 按键PAD配置 */
#define button_PAD_CONFIG_DATA            (SRE_0_SLOW_SLEW_RATE| \
                                    DSE_6_R0_6| \
                                    SPEED_2_MEDIUM_100MHz| \
                                    ODE_0_OPEN_DRAIN_DISABLED| \
                                    PKE_0_PULL_KEEPER_DISABLED| \
                                    PUE_0_KEEPER_SELECTED| \
                                    PUS_0_100K_OHM_PULL_DOWN| \
                                    HYS_1_HYSTERESIS_ENABLED)
/* 配置说明 : */
/* 转换速率: 转换速率慢
   驱动强度: R0/6
   带宽配置 : medium(100MHz)
   开漏配置: 关闭
   拉/保持器配置: 关闭
   拉/保持器选择: 保持器(上面已关闭,配置无效)
   上拉/下拉选择: 100K欧姆下拉(上面已关闭,配置无效)
   滞回器配置: 开启 */

int main()
{
   /*以下省略RGB灯初始化相关的代码*/
   ...
   /*按键初始化*/
   CCM->CCGR1 |= CCM_CCGR1_CG15(0x3);  //开启GPIO5的时钟

   /*设置 绿灯 引脚的复用功能以及PAD属性*/
   IOMUXC_SetPinMux(RGB_GREEN_LED_IOMUXC,0);
   IOMUXC_SetPinConfig(RGB_GREEN_LED_IOMUXC, button_PAD_CONFIG_DATA);

   GPIO5->GDIR &= ~(1<<1);  //设置GPIO5_01为输入模式

   while(1)
   {
      if((GPIO5->DR)&(1<<1))
      {
         delay(0xFF);
         if((GPIO5->DR)&(1<<1))
         {
            /*有按键按下,执行绿色led灯翻转*/
            if((GPIO4->DR)&(1<<20))
            {
               GPIO4->DR &= ~(1<<20);    //绿灯亮
               while((GPIO5->DR)&(1<<1));//等待按键松开
            }
            else
            {
               GPIO4->DR |= (1<<20);     //绿灯灭
               while((GPIO5->DR)&(1<<1));//等待按键松开
            }
         }
      }
   }
   return 0;
}

结合代码各部分简单说明如下:

  • 第2-4行: 定义按键使用到的引脚。

  • 第7-14行: 设置按键引脚的PAD属性,与LED灯引脚PAD属性差别是这里开启了滞回器的功能。

  • 第30-36行: 开启GPIO5的时钟并初始化按键引脚。与LED引脚初始化不同这里将引脚设置为输入。

  • 第38-58行: 在while(1)死循环中检测按键的状态,如果按键按下则翻转绿灯状态并等待按键松开。

3. 实验准备

3.1. 编译试验代码

3.1.1. 修改makefile

makefile文件主要是修改文件名,将“led”修改为button,其他内容并没有修改,修改过的makefile 如下所示。

all: start.o button.o
arm-none-eabi-ld -Tbutton.lds $^ -o button.elf
arm-none-eabi-objcopy -O binary -S -g button.elf button.bin
%.o : %.S
arm-none-eabi-gcc -g -c $^ -o start.o
%.o : %.c
arm-none-eabi-gcc -g -c $^ -o button.o

 .PHONY: clean
 clean:
 rm *.o *.elf *.bin

为简化难度暂时这样修改,后面章节将会介绍更简单易用的修改方式。

3.1.2. 编译代码

程序编写完成后,在“button” 文件夹下执行make命令,makefile工具便会自动完成程序的编译、链接、格式转换等工作。 正常情况下我们可以在当前目录看到生成的一些中间文件以及我们期待的.bin文件。

3.2. 烧录试验程序

在编译下载官方SDK程序到开发板章节我们详细讲解了如何将二进制文件烧写到SD卡(烧写工具自动实现为二进制文件添加头)。这里再次说明下载步骤。

  • 将一张空SD卡(烧写一定会破坏SD卡中原有数据!!!烧写前请保存好SD卡中的数据),接入电脑后在虚拟机的右下角状态栏找到对应的SD卡。将其连接到虚拟机。

  • 进入烧写工具目录,执行 ./mkimage.sh <烧写文件路径> 命令,button.bin位于home目录下,则烧写命令为 ./mkimage.sh /home/button.bin 。

  • 执行上一步后会列出linux下可烧写的磁盘,选择你插入的SD卡即可。这一步非常危险!!!一定要确定选择的是你插入的SD卡!!,如果选错很可能破坏你电脑磁盘内容,造成数据损坏!!!。确定磁盘后SD卡以“sd”开头,选择“sd”后面的字符即可。例如要烧写的sd卡是“sdb”则输入“b”即可。

4. 程序运行结果

按下KEY按键,LED绿灯亮,再按则绿灯灭。

实验效果

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

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

相关文章

OpenAI 通过强大的结构化输出功能增强了其 API

介绍 可以通过打开/关闭 JSON 模式或使用函数调用来创建先前结构化的输出。 大型语言模型 (LLM) 与一般的对话式 UI 非常相似&#xff0c;擅长处理以自然语言呈现的非结构化数据。首先对这些非结构化输入进行组织和处理&#xff0c;然后将其重新转换为自然语言作为结构化响应。…

WIFI驱动开发

Linux 4.9 内核驱动移植 Linux 4.9 BSP 内核驱动 下载驱动后获得驱动的 tar.gz 压缩包 解压后找到如下驱动与文件夹 进入内核&#xff0c;找到 linux-4.9/drivers/net/wireless 文件夹中&#xff0c;新建文件夹aic8800 并且把上面的驱动与文件夹放入刚刚创建好的 aic8800 中。…

动漫二次元漂亮的网站导航HTML5源码

二次元漂亮网站导航HTML源码&#xff0c;页面中还调用了很多外站的图片等链接需自行更换。 动漫二次元漂亮的网站导航HTML5源码

NASA:ARM 增强短波实验(ARESE)太阳辐射数据

目录 简介 摘要 代码 网址推荐 0代码在线构建地图应用 机器学习 ARM Enhanced Shortwave Experiment (ARESE) Solar Radiation Data 简介 ARESE 研究了晴朗和多云大气对太阳辐射的吸收。 测量使用了三个飞机平台&#xff1a;一架高空载人埃格雷特飞机、一架装有仪器的双…

百度地图SDK Android版开发 8 覆盖物示例2动画

百度地图SDK Android版开发 8 覆盖物示例2动画 前言动画相关的类和接口帧动画MarkerOptions 加载动画MarkerOptionsMarkerOptions.MarkerAnimateType 动画类型 Animation动画MarkerAnimation类及其子类AnimationTransformationRotateAnimationAlphaAnimationScaleAnimationSing…

二、Java变量

文章目录 一、变量介绍1.1 为什么需要变量1.2 变量的介绍1.4 变量使用注意事项 二、号的使用三、数据类型1.1 整数类型1.2 浮点类型1.3 字符类型(char)1.4 布尔类型&#xff1a;boolean 四、编码五、数据类型转换5.1 自动类型转换5.2 强制类型转换5.3 基本数据类型和String类型…

计算机毕业设计花卉交易管理系统

技术可行性 根据花卉交易管理的基本需求&#xff0c;该系统需要实现把商品的基本信息&#xff0c;销售信息等内容存放到数据库中&#xff0c;是典型的管理信息系统。管理信息系统是建立在现代信息技术基础之上&#xff0c;面向组织的全面管理和简单决策的信息系统[3]。其开发主…

K8S故障

故障显示 解决办法 kubectl -n kube-system edit deployments.apps coredns删除下列数据

探秘沙漠玫瑰:花语蕴含的爱与坚韧及其独特魅力

在广袤无垠的沙漠深处&#xff0c;隐藏着一种神秘而独特的植物——沙漠玫瑰。它宛如大自然遗落在荒漠中的珍宝&#xff0c;绽放着别样的光芒。当人们提及沙漠玫瑰时&#xff0c;首先想到的便是它那饱含深意的花语。那究竟沙漠玫瑰的花语中蕴含着怎样的浪漫与坚韧呢&#xff1f;…

景联文科技高质量文本标注:驱动自然语言处理技术的发展与应用

文本标注是自然语言处理&#xff08;NLP&#xff09;领域的一个重要环节&#xff0c;是指在文本数据上添加额外的信息或标记的过程&#xff0c;目的是为了让计算机能够理解和处理这些文本数据。 通过文本标注&#xff0c;可以为文本中的各个部分提供具体的含义和上下文信息&…

C++相关概念和易错语法(26)(decltype、nullptr、左值和右值、移动构造和移动赋值)

1.decltype “decltype(表达式) 变量名”可以定义变量&#xff0c;这个变量的类型是()括号内表达式的类型&#xff0c;注意这个表达式不会执行&#xff0c;只会推导这个表达式的类型&#xff0c;这点和sizeof一样 2.nullptr 根据#define NULL 0&#xff0c;可知NULL会被预处理…

搭建GAN对抗生成网络进行图像模态转换

生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;是一种强大的生成模型&#xff0c;它可以通过学习训练数据的分布来生成新的样本。在医学图像处理中&#xff0c;GANs被广泛用于图像模态转换&#xff0c;例如从MRI到CT的转换&#xff0c;这对于临床…

【牛客】两个字符串之间的最短距离

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;算法题 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://www.nowcoder.com/practice/2c6a0a8e1d20492f92941400036e0890 本道题是个模版…

uniapp+vue3的双向渐变

在App.vue中 <style lang"scss">/*每个页面公共css */ import common/style/common-style.scss </style> 在common-style.scss中 //全局双向渐变 .pageColor{background:linear-gradient(to bottom,rgba(0,0,0,0),#fff 400rpx),//到400rpx才做白色渐变…

解锁NGINX---SSL:打造安全、高效的网站加密体验

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

Spring Boot整合Sentry

Spring Boot整合Sentry Sentry搭建Sentry中新建项目集成SpringBoot1. 添加依赖2. 配置Sentry4. 日志集成&#xff08;可选&#xff09;5. 测试Sentry集成6. 配置实时告警配置Alert Settings配置警报规则 发送消息服务代码参照文档 Sentry 是一个日志平台&#xff0c;分为客户端…

WEB服务器的部署及优化

什么是 www&#xff1f; www 是 world wide web 的缩写&#xff0c;及万维网&#xff0c;也就是全球信息广播的意思 通常说的上网就是使用 www 来查询用户所需要的信息。 www 可以结合文字、图形、影像以及声音等多媒体&#xff0c;超链接的方式将信息以 Internet 传递到世界…

记录一下QGIS栅格操作-植被NDVI指数计算

记录一下QGIS栅格操作-植被NDVI指数计算 以计算植被NDVI指数为例&#xff0c;介绍QGIS栅格的相关操作以及应用。 NDVI 数据简介及下载 下载&#xff1a; 地理空间数据云https://www.gscloud.cn/search 选择波段4&#xff08;可见光红色波段&#xff09;和波段5&#xff08;近…

VS2022 - 制作自己的C#类库dll,并输出Unity识别的pdb调试信息文件

然后编写库代码&#xff0c;设置dll生成目录 *** 输出unity可以识别的pdb调试信息文件 *** 右键项目-属性-生成-高级-调试信息&#xff1a;可移植(Portable PDB) 这是因为Unity只能识别MDB和Portable PDB文件 这样设置后&#xff0c;把dll和pdb文件放入到Unity中同文件夹下&…

金融帝国实验室(Capitalism Lab)官方技术支持中文汉化包_v4.09

<FCT汉化小组>Vol.001号作品 ————————————— ◎ 作品名称&#xff1a;金融帝国实验室&#xff08;Capitalism Lab&#xff09;官方中文汉化包 ◎ 制作发布&#xff1a;FCT汉化小组 ◎ 发布版本&#xff1a;CapLab Simplified Chinese loc v4.09 ◎ 发布时…