上位机图像处理和嵌入式模块部署(mcu的按键输入)

news2024/11/15 7:00:20

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        做技术的同学,大部分都会把精力放在技术本身,却忽视了学的东西有什么实际的用途。就拿gpio来说,一般我们点灯也好、做输入也好,最多也就是当成一个实验demo在使用。可是大家有没有思考过,其实这样一个模块就已经是一个完整的输入、输出的系统了。简单的方面,我们可以做一个2-4译码器、3-8译码器,复杂一点的,我们可以做玩具、做一个设备改造的模块。

        很多同学不理解这个设备改造的模块,还是以卷帘门为例。过去卷帘门,一般就是向上按键按下去,卷帘门上升;向下按键按下去,卷帘门下降。如果我们想扩展一下这个功能,比如向上按下去的时候,为了安全需要,不仅卷帘门上升,还要有一个语音和红绿灯显示,这个时候就可以用这样一个模块来完成了。过去可能非标领域一般都是通过plc来完成,现在我们自己学会了mcu开发,就很自然地想通过mcu来完成。

1、按键输入

        按键输入是和按键输出对应的。按键输出,一般是led点亮、熄灭,又或者是蜂鸣器呼叫等等而按键输入,更多时候来自于外部的反馈,它表示使用的人员希望开启、使用或者是关闭某个功能。

2、main函数分析

        首先,我们还是看下整个demo的原貌,

int main(void)
{
    SystemClock_Config();
	
	LED_GPIO_Config();	 
    Key_GPIO_Config();

	while(1)                            
	{	   
		if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON  )
		{
			LED1_ON;
		}
		else
		{
			LED1_OFF;
		}
	}
}

        和之前相比较,整个流程多了两部分,第一个是添加Key_GPIO_Config,这个主要是告诉mcu,哪些按键希望被当做是key输入使用。第二个是Key_Scan,主要用于检测当前KEY1_PIN是不是已经被按下。如果是被按下了,那么LED1点亮,反之熄灭。

3、配置按键输入

        前面我们说过,要配置按键输入,需要看下Key_GPIO_Config是如何实现的。这部分关注的重点,集中在它和之前GPIO输出有什么差别。

void Key_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    KEY1_GPIO_CLK_ENABLE();

    GPIO_InitStructure.Pin = KEY1_PIN; 
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT; 
    GPIO_InitStructure.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
}

        这里的KEY1_PIN是a0,不过不是重点。重点在于,当key处于输入状态的时候,它的mode和pull是不一样的。这部分,大家可以对比一下之前led的设置,这样看起来效果更好。

void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
    LED1_GPIO_CLK_ENABLE();
  														   
    GPIO_InitStruct.Pin = LED1_PIN;	
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;  
    GPIO_InitStruct.Pull  = GPIO_PULLUP; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);	

    LED_RGBOFF;
}

4、轮询检查key的状态

        较早读书的时候,我会认为轮询是非常低效的一种情况。但是到了mcu这里,轮询是非常常见的一种开发方式。特别是功能比较单一的时候,轮询其实很简洁、很鲁棒,几乎不会出错,

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{			
	if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )  
	{
		return 	KEY_ON;	 
	}
	else
	{
		return KEY_OFF;
	}
}

5、测试方法

        之前野火提供的测试demo其实不是这样,它的case其实是依据它自身的开发板实现的。上面有现成的实体按键。这边的话,我们既然是用一个stm32f103的核心板进行测试,那么就用一根短接线进行测试好了。

        短接线的一头连接在a0上面,另外一头可以连接到电源3.3v,又或者是gnd上面。如果是连接在电源3.3v上面,c13应该亮起;反之则熄灭。通过这样的方式,也可以观察到按键输入的实际效果。另外还有一点要注意的是,我们核心板上面只有一个c13可以点灯,这和野火官方的demo不太一样,所以同样需要改造一下,

#define LED1_PIN                  GPIO_PIN_13                
#define LED1_GPIO_PORT            GPIOC                     
#define LED1_GPIO_CLK_ENABLE()   __HAL_RCC_GPIOC_CLK_ENABLE()

6、美中不足

        这边按键按下去的时候,正常情况下都会delay延时一下,一段事件之后确认按键是不是真的被按下。这样做的好处是防止误触、或者是抖动的发生。当然,我们也可以让测试做的更好玩一点,比如设置成闪烁的形式,

int main(void)
{
    SystemClock_Config();
	
	LED_GPIO_Config();	 
    Key_GPIO_Config();

	while(1)                            
	{	   
		if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON  )
		{
			HAL_Delay(1000);
			LED1_ON;
			HAL_Delay(1000);
			LED1_OFF;
		}
		else
		{
			LED1_OFF;
		}
	}
}

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

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

相关文章

LLM答案抽取|xFinder:针对大型语言模型的稳健且精确的答案提取

【摘要】大型语言模型(LLM)的不断进步使人们越来越关注开发公平可靠的方法来评估其性能的关键问题。特别是测试集泄漏、提示格式过拟合等主观或非主观作弊现象的出现,给法学硕士的可靠评估带来了重大挑战。由于评估框架通常利用正则表达式 (R…

用神经网络预测三角形的面积

周末遛狗时,我想起一个老问题:神经网络能预测三角形的面积吗? 神经网络非常擅长分类,例如根据花瓣长度和宽度以及萼片长度和宽度预测鸢尾花的种类(setosa、versicolor 或 virginica)。神经网络还擅长一些回…

SQL注入:pikachu靶场中的SQL注入通关

目录 1、数字型注入(post) 2、字符型注入(get) 3、搜索型注入 4、XX型注入 5、"insert/update"注入 Insert: update: 6、"delete"注入 7、"http header"注入 8、盲…

在kaggle中的notebook 如何自定义 cuda 版本以及如何使用自定义的conda或python版本运行项目(一)

问题 第一部分 当前kaggle中带有gpu的notebook 默认的cuda 是12.1版本,如果我要跑一个项目是11.3的,如何将默认的cuda 改为自己需要的cuda 11.3 方法 step1 从官网下载需要的版本cuda run 文件(如cuda 11.3) 在nvidia cuda 下…

小程序丨数据功能如何使用

查询发布完成后,如发现信息有误或想要修改信息,老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作,下面来教大家如何使用吧。 📌使用教程 数据功能主要用于在线修改已发布的查询内容&#…

深入探索Kafka:了解其不可或缺的核心组件

🐇明明跟你说过:个人主页 🏅个人专栏:《数据流专家:Kafka探索》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Kafka简介 2、Kafka的应用场景 3、Kafka与其他消…

Unity性能优化工具介绍

文章目录 一.Stats组件1.Audio音频的数据组件:2.图形数据 二.Profiler 性能分析器 一.Stats组件 Unity自带Statistics(统计数据),Game视窗中点击Stats打开 1.Audio音频的数据组件: 1):Level 声音强度 单位是分贝(dB) 表示音频听声音的大小,是闪烁波动的. 2):SDPload 数据信…

CSS基础(第五天)

目录 定位 为什么需要定位 定位组成 边偏移 静态定位 static(了解) 相对定位 relative 绝对定位 absolute(重要) 子绝父相的由来 固定定位 fixed (重要) 粘性定位 sticky(了解&#xff…

C++候捷stl-视频笔记1

认识headers、版本、重要资源 STL的核心思想是泛型编程 新式头文件内的组件封装在命名空间std中: using namespace std; using std::cout;或std::vector vec; 旧式头文件内的组件不封装在命名空间std中 注:不建直接使用using namespace xxx,如果使用的…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进Q学习算法和组合模型的超短期电力负荷预测》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Llama 3 CPU推理优化指南

备受期待的 Meta 第三代 Llama 现已发布,我想确保你知道如何以最佳方式部署这种最先进的 (SoTA) LLM。在本教程中,我们将重点介绍如何执行仅权重量化 (WOQ) 来压缩 8B 参数模型并改善推理延迟,但首先,让我们讨论一下 Meta Llama 3…

贴片反射式红外光电传感器ITR8307

红外光电传感器ITR8307 ITR8307外形 特性 快速响应时间 高灵敏度 非可见波长 薄 紧凑型 无铅 该产品本身将保持在符合RoHS的版本内 描述 ITR8307/S18/TR8是一种光反射开关,它包括一个GaAs IR-LED发射器和一个NPN光电晶体管,该晶体管具有短距离的高…

基于 Milvus Cloud + LlamaIndex 实现初级 RAG

初级 RAG 初级 RAG 的定义 初级 RAG 研究范式代表了最早的方法论,在 ChatGPT 广泛采用后不久就取得了重要地位。初级 RAG 遵循传统的流程,包括索引创建(Indexing)、检索(Retrieval)和生成(Generation),常常被描绘成一个“检索—读取”框架,其工作流包括三个关键步…

C++实现图的存储和遍历

前言 许多新手友友在初学算法和数据结构时,会被图论支配过。我这里整理了一下图论常见的存储和遍历方式,仅供参考。如有问题,欢迎大佬们批评指正。 存储我将提到四种方式:邻接矩阵、vector实现邻接表、数组模拟单链表实现的前向星…

FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧

《FFmpeg开发实战:从零基础到短视频上线》一书的“2.1.1 音视频编码的发展历程”介绍了H.26x系列的视频编码标准,其中H.264至今仍在广泛使用,无论视频文件还是网络直播,H.264标准都占据着可观的市场份额。 之所以H.264取得了巨大…

完美解决原生小程序点击地图markers上的点获取不到对应的坐标信息

需求:地图上有多个markes点,点击每一个获取对应的数据,再根据当前的坐标信息去调用导航。 出现的问题:每次点击的时候获取不到对应的坐标信息,获取到的信息显然不是想要的 原因: 因为你的id不是number类型&…

线上虚拟纪念馆的便利与优势,全天候开放的数字化历史体验

一、搭建线上虚拟纪念馆的意义 在现代社会中,线上虚拟纪念馆越来越受到人们的关注和欢迎。传统纪念馆需要大量的物理空间和资源,而线上虚拟纪念馆则突破了这些限制,提供了更多的可能性和优势。首先,线上虚拟纪念馆能够更好地保存和…

【有手就行】使用你自己的声音做语音合成,CPU都能跑,亲测有效

此文介绍在百度飞桨上一个公开的案例,亲测有效。 厌倦了前篇一律的TTS音色了吗?打开短视频听来听去就是那几个声音,快来试试使用你自己的声音来做语音合成吧!本教程非常简单,只需要你能够上传自己的音频数据就可以(建议…

Mac虚拟机工具 CrossOver 24.0.0 Beta3 Mac中文版

CrossOver是一款在Mac上运行Windows应用程序的软件,无需安装虚拟机或重启计算机,简化了操作过程,提高了工作效率,为用户带来便捷体验。前往Mac青桔下载,享受前所未有的便利和高效。摘要由作者通过智能技术生成 CrossOv…

JVM严镇涛版笔记【B站面试题】

前言 2023-06-19 18:49:33 出自B站 灰灰的Java面试 枫叶云链接:http://cloud.fynote.com/s/4976 JVM面试题大全 Lecturer :严镇涛 1.为什么需要JVM,不要JVM可以吗? 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译&#xff0c…