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

在STM32 HAL库中使用 WFI 实现低功耗准确延时

内容

使用一个16位定时器TIM1,并结合"__WFI"指令让CPU进入睡眠模式,实现延时过程低功耗、延时时间准确的delay模块。

delay.h

#ifndef __DELAY_H
#define __DELAY_H#include "stm32f1xx_hal.h"
#include <stdint.h>extern TIM_HandleTypeDef htim1; // TIM1 用于硬件延时// WFI 阻塞延时,微秒级 (不占用 CPU 资源)
void DELAY_Hardware_Us(uint32_t us);// WFI 阻塞延时,毫秒级 (不占用 CPU 资源)
void DELAY_Hardware_Ms(uint32_t ms);#endif // __DELAY_H

delay.c

#include "delay.h"
#include "stm32f1xx.h"// 延时完成标志,中断服务函数设置
static volatile uint8_t g_hardware_delay_complete = 0; /*** @brief  微秒级硬件延时 (WFI/CPU 睡眠)* @param  us: 延时时长 (微秒, 1us 到约 65535us)* @retval None*/
void DELAY_Hardware_Us(uint32_t us)
{if (us == 0) {return;}// TIM1 是 16 位定时器,最大周期是 65536 us (约 65.5 ms)if (us > 65535) {// 如果延时超过最大限制,递归调用毫秒延时函数处理DELAY_Hardware_Ms(us / 1000);// 处理剩余的微秒部分uint32_t remaining_us = us % 1000;if (remaining_us > 0) {DELAY_Hardware_Us(remaining_us);}return;}// 1. 设置自动重装载值 (ARR)// TIM1 时钟是 72 MHz, 预分频 72-1 后,计数频率是 1 MHz (1 tick = 1 us)// ARR = 目标时长 (us) - 1__HAL_TIM_SET_AUTORELOAD(&htim1, us - 1);// 2. 清除更新标志,并重置完成标志__HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_UPDATE);g_hardware_delay_complete = 0;// 3. 启动定时器中断HAL_TIM_Base_Start_IT(&htim1);// 4. 进入 WFI 等待中断 (CPU 睡眠)while (g_hardware_delay_complete == 0) {__WFI(); }// 5. 中断到达,停止定时器HAL_TIM_Base_Stop_IT(&htim1);
}/*** @brief  毫秒级硬件延时 (WFI/CPU 睡眠)* @param  ms: 延时时长 (毫秒)* @retval None*/
void DELAY_Hardware_Ms(uint32_t ms)
{uint32_t i;// 每次延时 60ms,避免单次调用超过 65.535ms 的 16 位定时器限制for (i = 0; i < ms / 60; i++) {DELAY_Hardware_Us(60000);}// 处理剩余的毫秒部分uint32_t remaining_ms = ms % 60;if (remaining_ms > 0) {DELAY_Hardware_Us(remaining_ms * 1000);}
}

中断处理(在stm32f1xx_it.c中)

(如果在TIM中断回调函数执行的过程中,被更高优先级的函数打断了,有小概率CPU会睡不醒,也可以在函数开始前后使能/使能中断更周全些)

// TIM1 全局中断服务程序
void TIM1_UP_IRQHandler(void) 
{HAL_TIM_IRQHandler(&htim1);
}// HAL TIM 中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{// 检查是否是 TIM1 触发的更新事件if (htim->Instance == TIM1) {// 设置完成标志,唤醒等待 WFI 的 CPUg_hardware_delay_complete = 1;}// ... 其他定时器回调
}

http://www.dtcms.com/a/618101.html

相关文章:

  • 编程语言落地手册:erlang实现与汇编剖析
  • 搜索下单(es、mysql、MQ同步;关于事务失效)
  • aleph-node Node upgrade instructions 节点升级说明
  • 找谁做网站网站建设与运营培训班
  • 智能制造与工业4.0:5G与物联网的深度融合
  • GSV1201S(2201S)#ACP@支持 DisplayPort 1.2 到 HDMI 1.4 转换且集成嵌入式 MCU
  • Linux SPI 驱动实验
  • 【开题答辩全过程】以 基于Java的水族馆销售与经营管理系统的设计与实现为例,包含答辩的问题和答案
  • 网站响应是什么问题吗最近国际时事
  • 从拟南芥到线虫:我的生物信息学多组学实操笔记
  • 指尖革命!2025输入法生态位深度测评:智能,远不止于输入!
  • 如何在Windows系统上安装和配置Node.js及Node版本管理器(nvm)
  • 网站开发 保证书旅游网站制作分析
  • Docker实战深度解析:从Nginx部署到私有镜像仓库管理
  • 读书笔记|算法的破坏性影响
  • 网站制作需要平台企业网站的切片怎么做
  • 数据结构与算法工程笔记:决策树/sstable与性能优化
  • Linux 服务器配置 rootless docker Quick Start
  • LTE/5G L3 RRC层技术介绍
  • C语言进阶知识--文件操作
  • 网站建设需要哪些资料扶贫网站建设方案
  • C++标准模板库(STL)——list的模拟实现
  • 幽冥大陆(二十二)dark语言智慧农业电子秤读取——东方仙盟炼气期
  • 5.驱动led灯
  • RTL8367RB的国产P2P替代方案用JL6107-PC的可行性及实现方法
  • <MySQL——L1>
  • 有没有网站做字体变形自学软装设计该怎么入手
  • 做网站咸阳贵州省建设厅城乡建设网站
  • 分布式监控Skywalking安装及使用教程(保姆级教程)
  • 可信数据空间的分布式数字凭证和分布式数字身份