STM32U575按键转换及设备驱动

embedded/2025/1/12 15:41:43/

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

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.ppmy.cn/embedded/153316.html

相关文章

【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky

目录 relative 相对定位 absolute 绝对定位 fixed 固定定位 sticky 粘性定位 position:relative 、absolute、fixed 、sticky (四选一) top:距离上面的像素 bottom:距离底部的像素 left:距离左边的像素…

【Git】问题汇总

在push的时候显示 protocol error: bad line length 8192 我在本地创建了一个gogs服务器,现在正在上传代码,但是出现了上述的这个问题。 解决方法 设置本地http.postBuffer(待验证) 方法一:全局配置 git config --g…

python+fpdf:创建pdf并实现表格数据写入

目录 创建pdf文件对象 新增页 添加自定义字体 设置字体 设置文字颜色和背景色 插入内容 换行 插入图片 保存pdf 完整代码 安装:pip install fpdf 创建pdf文件对象 from fpdf import FPDF, Alignpdf FPDF() # 创建pdf文件对象 获取边距 print(pdf.l_…

天天 AI-250110:今日热点-字节豆包Web端反超百度文心一言,DeepSeek也发力了|量子位智库月报

2AGI.NET:天天AI-20250109 人工智能(AI)和硬件技术继续以惊人的速度发展,不断刷新我们对技术边界的认知。从英伟达的RTX 50系列显卡到清华团队的数学推理突破,再到AI算力的多个利好,这些技术的发展正在推动…

element-ui Cannot read properties of undefined (reading ‘indexOf‘)

报错信息 element-ui 在使用Form 表单,在使用重置this.$refs[formName].resetFields();()时报错,是因为每个el-form-item标签需要prop这个属性,不添加就会报错

Unity学习笔记(六)使用状态机重构角色移动、跳跃、冲刺

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 整体状态框架(简化) Player 是操作对象的类: 继承了 MonoBehaviour 用于定义游戏对象的行为,每个挂载在 Unity 游戏对象上的脚本都需要继承自 MonoBehaviour&#x…

halcon三维点云数据处理(七)find_shape_model_3d_recompute_score

目录 一、find_shape_model_3d_recompute_score例程代码二、set_object_model_3d_attrib_mod函数三、prepare_object_model_3d 函数四、create_cube_shape_model_3d函数五、获得CamPose六、project_cube_image函数七、find_shape_model_3d函数八、project_shape_model_3d函数 一…

5种IO模型

目录 一、认识IO二、5种IO模型三、非阻塞IO代码 一、认识IO 什么是IO? Input(输入)和Output(输出)。 冯诺依曼体系结构中,数据从输入设备拷贝到内存,经过处理后,再从内存拷贝到输出设备。现实情况中,数据并不是那么流…