STM32U575按键转换及设备驱动

news2025/1/8 19:15:59

要求通过单片机实现以下功能:

1.单片机有三种工作模式(定义全局变量MM表示模式,MM=1,2,3表示三种不同的模式)

  • LED控制模式
  • 风扇控制模式
  • 蜂鸣器控制模式

2.可以在某一个模式下通过拓展板KEY1按键控制设备

按键按下一次,设备打开,按键再按下一次,设备关闭(设备管脚输出反向电平)

3.关于模式的切换可以通过以下两种方式:

  • 通过串口通信,电脑端发送当前模式(设置串口接收中断,接收到的字符串进行比较)
    • 电脑发送BEE,进入蜂鸣器控制模式
    • 电脑发送FAN ,进行风扇控制模式
    • 电脑发送LED,进入LED模式
  • 通过底板用户自定义按键进行模式切换
    • 按键按下一次进入LE
      char buf[128];//用于接受数据
      int MM=0;
      uint32_t lastDebounceTime = 0; // 上次有效触发的时间
      const uint32_t debounceDelay = 10; // 消抖时间阈值(单位ms)
      
      int find_char(const char *str, char c)
      {
          int i = 0;
          while (str[i] != '\0')
          {
              if (str[i] == c)
              {
                  return i; // 找到字符,返回索引
              }
              i++;
          }
          return -1; // 未找到字符,返回 -1
      }
      
      // 手动实现字符串长度计算
      int string_length(const char *str)
      {
          int len = 0;
          while (str[len] != '\0')
          {
              len++;
          }
          return len;
      }
      
      int compare_strings(const char *str1, const char *str2)
      {
          while (*str1 && *str2)
          {
              if (*str1 != *str2)
              {
                  return 0; // 不相等
              }
              str1++;
              str2++;
          }
          // 如果两个字符串都结束了,说明完全相等
          return (*str1 == '\0' && *str2 == '\0') ? 1 : 0;
      }
      
      void ToggleDevicePin(int mode)
      {
          switch (mode)
          {
          case 0:
              HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);
              break;
          case 1:
              HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
              break;
          case 2:
              HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
              break;
          default:
              break;
          }
      }	
      void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
      {
          if (GPIO_Pin == GPIO_PIN_9)
          {
              ToggleDevicePin(MM); // 根据当前模式切换管脚状态
          }
          else if (GPIO_Pin == GPIO_PIN_12)
          {
              uint32_t currentTime = HAL_GetTick(); // 获取当前时间(ms)
      
              // 消抖逻辑
              if ((currentTime - lastDebounceTime) > debounceDelay)
              {
                  lastDebounceTime = currentTime; // 更新上次触发时间
                  MM = (MM + 1) % 3;             // 切换 MM 状态
              }
          }
      }
      
      void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
      {
      		printf("uart1_recv intterrput OK:%s\n",buf);
      		static int index = 0; // 当前接收缓冲区索引
              if (buf[index] == '\n' || index >= sizeof(buf) - 1) // 检测到换行符或缓冲区已满
              {
                  buf[index] = '\0'; // 标记字符串结束
                  //dataReady = 1; // 设置数据接收完成标志
                  index = 0; // 重置缓冲区索引
              }
              else
              {
                  index++; // 增加索引,准备接收下一个字符
              }
              HAL_UART_Receive_IT(&huart1, (uint8_t *)&buf[index], 1); // 继续接收
      }
      D模式,再按一次,进入风扇模式,再按一下,进入蜂鸣器模式

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

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

相关文章

Spring源码分析之事件机制——观察者模式(一)

目录 事件基类定义 事件监听器接口 事件发布者接口及实现 事件广播器实现 小小总结 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二)-CSDN博客 Spring源码分析之事件机制…

JDK、JRE、JVM三者的关系、JDK8的新特性、JVM内存结构,堆栈的区别

1.JDK、JRE、JVM三者的关系 JDK (Java Development Kit)----Java开发工具包,用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境,只能运行.class文件,不能编译。 JVM (Java Virtual Machine)----Java虚拟…

【Linux】文件的压缩与解压

目录 gzip和 gunzip bzip2 和 bunzip2(特点和gzip相似) xz和unxz(特点和gzip相似) zip 和 unzip tar gzip和 gunzip 特点:只能对单个的普通文件进行压缩 不能进行归档,压缩或解压后的源文件都不存在 压缩后所生成的压缩格式是.gz格式 压缩&…

LInux单机安装Redis

1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…

VSCode 使用鼠标滚轮控制字体

一、 文件 | 首选项 | 设置 二、单击在 settings.json中编辑 "editor.mouseWheelZoom": true 注注注意:保存哦!ctrlS 三、测试 按住ctrl鼠标滚轮,控制字体大小

enzymejest TDD与BDD开发实战

一、前端自动化测试需要测什么 1. 函数的执行逻辑,对于给定的输入,输出是否符合预期。 2. 用户行为的响应逻辑。 - 对于单元测试而言,测试粒度较细,需要测试内部状态的变更与相应函数是否成功被调用。 - 对于集成测试而言&a…

TCP通信原理学习

TCP三次握手和四次挥手以及为什么_哔哩哔哩_bilibili

空间不足导致Oracle集群内存使用率暴增

一、现象 操作系统内存使用率告警,已达到98%,,告警内容如下: 【全景监控:Oracle主机内存使用监控】 【主机名】:XXXXX11 【主机IP】主机IP:*.126.15 【告警内容】当前内存使用率为98.9%,超警…

嵌入式入门Day38

C Day1 第一个C程序C中的输入输出输出操作coutcin练习 命名空间使用方法自定义命名空间冲突问题 C对字符串的扩充C风格字符串的使用定义以及初始化C风格字符串与C风格字符串的转换C风格的字符串的关系运算常用的成员变量输入方法 布尔类型C对堆区空间使用的扩充作业 第一个C程序…

【JMM】Java 内存模型

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 前言2. JMM 内存模型内容3. JMM 内存模型简单执行示意图 ⚠️ 不要与 JVM 内存分布混为一谈论&#xff0c…

SEO新革命:如何通过Search Everywhere优化全面打破搜索壁垒

谷歌不再总是人们寻求答案的首选之地。他们越来越多地转向社交媒体、YouTube、亚马逊和 ChatGPT。这些平台本身已经成为搜索引擎。 因此,SEO 需要发展。仅靠搜索 “引擎” 优化已经不够了。品牌需要优化其在每个平台上的自然存在。 您需要一种新型的 SEO&#xff…

Spring 设计模式:经典设计模式

Spring 设计模式:经典设计模式 引言 Spring 框架广泛使用了经典设计模式。 这些模式在 Spring 内部发挥着重要作用。 通过理解这些设计模式在 Spring 中的应用,开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。 经典设计模式 控制反转&am…

“AI 视频图像识别系统,开启智能新视界

咱老百姓现在的生活啊,那是越来越离不开高科技了,就说这 AI 视频图像识别系统,听起来挺高大上,实际上已经悄无声息地融入到咱们日常的方方面面,给咱带来了超多便利。 先讲讲安防领域吧,这可是 AI 图像识别的…

开源AI智能名片2+1链动模式S2B2C商城小程序在商业流量获取中的应用研究

摘要: 随着互联网技术的迅猛发展,商业流量的获取已成为企业市场竞争中的关键环节。传统意义上的“客流量”在互联网语境下被赋予了新的内涵,即“商业流量”,其本质依然指向用户。在当前线上线下融合的商业环境中,流量…

【蓝桥杯研究生组】第14届Java试题答案整理

试题链接&#xff1a;链接 A题 满足条件的答案有&#xff1a;35813116 public class TianShu {public static void main(String[] args) {int ans 0;// 2000.1.1 - 2000000.1.1// 年份是月份的倍数&#xff0c;也是日的倍数for (int year2000; year<2000000; year) {for …

c/c++ 里的进程间通信 , 管道 pipe 编程举例

&#xff08;1&#xff09;以下是一个网上的使用 pipe 编程的范例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h>int main() {int pipefd…

RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案

RK3588FPGA核心板采用Rockchip RK3588新一代旗舰 级八核64位处理器&#xff0c;支持8K视频编解码&#xff0c;多屏4K输出&#xff0c;可实现12屏联屏拼接、同显、异显&#xff0c;适配多种操作系统&#xff0c;广泛适用于展览展示、广告内容投放、新零售、商超等领域实现各种媒…

uniapp使用chooseLocation安卓篇

本文章全部以高德地图为例 代码 <view class"bottom"><button click"choose">定位</button> </view> choose() {uni.chooseLocation({success: function(res) {console.log(位置名称&#xff1a; res.name);console.log(详细地…

flutter 专题三十三 Flutter 重构去哪儿QTalk

QTalk 是去哪儿网内部的一个 IM 沟通工具&#xff0c;同时集成了很多内部的系统&#xff0c;比如 OA 审批&#xff0c;门禁打卡&#xff0c;请假审批&#xff0c;预定会议室&#xff0c;驼圈&#xff08;驼厂朋友圈&#xff09;等功能&#xff1b;方便内部办公沟通、交流的同时…

任务调度之Quartz(二):Quartz体系结构

1、Quartz 体系结构 由上一篇的Quartz基本使用可以发现&#xff0c;Quartz 主要包含一下几种角色&#xff1a; 1&#xff09;Job&#xff1a;也可以认为是JobDtetail&#xff0c;表示具体的调度任务 2&#xff09;Trigger&#xff1a;触发器&#xff0c;用于定义任务Job出发执行…