当前位置: 首页 > article >正文

STM32U575按键转换及设备驱动

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

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.kler.cn/a/488887.html

相关文章:

  • 哈利·波特是谁?大型语言模型中的近似取消学习
  • 【docker】exec /entrypoint.sh: no such file or directory
  • 安卓投屏电脑最详细教程
  • 面试:C++类成员初始化顺序
  • 【设计模式】介绍常见的设计模式
  • 工厂管理中 BOM(物料清单)
  • 【2025 Rust学习 --- 12 实用工具特型02】
  • ubuntu安装ssh9.2
  • java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
  • 某地武警海警总队建筑物自动化监测
  • 20250110_ PyTorch中的张量操作
  • [ Android ] JetPack WorkManager Overview
  • Qt初识——下载与环境配置
  • QTcpSocket 中设置接收缓冲区大小
  • 嵌入式C语言:二维数组
  • ZDH-调度服务
  • 人工智能-数据分析及特征提取思路
  • 【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)
  • scrapy爬取图片
  • 项目管理之引论
  • 预测市场平台 Aegis:Al Agent + Web3,为预测市场提供新的动力
  • 【JAVA面试】基本类型与包装类型
  • 利用Python爬虫技术从义乌购获取商品列表
  • AIP-1 AIP目的和指南
  • npm i 报错
  • 获得PostgreSQL中级认证后,可以从事哪些工作岗位?