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

STM32L051 RTC闹钟配置详解

1. 设置RTC Alarm A每30秒触发

在STM32CubeMX中配置Alarm A每30秒触发的参数设置如下:

参数设置值说明
Hours0 (任意值)小时字段被掩码,值不影响
Minutes0 (任意值)分钟字段被掩码,值不影响
Seconds30关键值:设置触发秒数
Sub Seconds0 (任意值)子秒字段被掩码
Alarm Mask Date Week dayEnable (掩码)忽略日期/星期
Alarm Mask HoursEnable (掩码)忽略小时
Alarm Mask MinutesEnable (掩码)忽略分钟
Alarm Mask SecondsDisable (不掩码)必须比较秒字段
Alarm Sub Second MaskAll masked (全掩码)忽略子秒
Alarm Date Week Day SelDate (任意)字段被掩码不影响
Alarm Date1 (任意值)字段被掩码不影响

原理说明

  • 仅比较秒字段(Seconds=30)
  • 其他所有字段被掩码忽略
  • 当RTC秒数到达30时触发闹钟
  • 每60秒触发一次(00:00:30, 00:01:30…)

2. Alarm A触发执行流程

当Alarm A触发时:

RTC硬件中断控制器处理器RTC_IRQHandlerHAL_RTC_AlarmAEventCallback用户代码置位ALRAF标志位RTC_ISR.ALRAF = 1发送RTC全局中断请求退出低功耗模式(若在Stop模式)跳转到中断服务程序检查中断源清除ALRAF标志执行用户回调函数执行自定义处理逻辑RTC硬件中断控制器处理器RTC_IRQHandlerHAL_RTC_AlarmAEventCallback用户代码

关键点

  1. 硬件自动置位RTC_ISR寄存器的ALRAF标志
  2. 若已使能中断(ALRAIE=1),触发RTC全局中断
  3. CPU跳转到RTC_IRQHandler中断服务程序
  4. 必须手动清除ALRAF标志(否则只触发一次)
  5. 最终调用用户自定义的HAL_RTC_AlarmAEventCallback

3. Stop模式+RTC唤醒完整实现

硬件配置
// 在STM32CubeMX中启用:
// [X] RTC
// [X] Alarm A
// [X] Wakeup using RTC alarm
代码实现
/* 配置Alarm A每30秒触发 */
void Configure_RTC_Alarm(void)
{RTC_AlarmTypeDef sAlarm = {0};sAlarm.AlarmTime.Hours = 0;sAlarm.AlarmTime.Minutes = 0;sAlarm.AlarmTime.Seconds = 30;  // 关键:设置30秒触发sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY | RTC_ALARMMASK_HOURS | RTC_ALARMMASK_MINUTES; // 掩码日/时/分sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; // 掩码所有子秒sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;sAlarm.AlarmDate = 1;sAlarm.Alarm = RTC_ALARM_A;if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}
}/* 进入Stop模式 */
void Enter_Stop_Mode(void)
{// 配置唤醒源HAL_PWREx_EnableWakeUpPin(PWR_WAKEUP_PIN1);  // 启用RTC唤醒// 挂起滴答定时器HAL_SuspendTick();// 清除所有挂起的中断__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);// 进入Stop模式(保留SRAM和寄存器)HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);// 唤醒后恢复系统时钟SystemClock_Config(); // 恢复滴答定时器HAL_ResumeTick();
}/* RTC Alarm A回调函数 */
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{// 用户自定义处理逻辑// 例如:点亮LED或处理数据HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}/* 主函数流程 */
int main(void)
{HAL_Init();SystemClock_Config();// 初始化RTCMX_RTC_Init();Configure_RTC_Alarm();// 启用RTC中断HAL_NVIC_SetPriority(RTC_IRQn, 0, 0);HAL_NVIC_EnableIRQ(RTC_IRQn);while (1){// 正常运行时执行任务...// 当需要低功耗时Enter_Stop_Mode();// 唤醒后继续执行...}
}
执行流程
主程序运行
调用Enter_Stop_Mode
配置唤醒源
挂起滴答定时器
进入Stop模式
RTC Alarm触发?
唤醒处理器
恢复系统时钟
恢复滴答定时器
执行RTC中断服务程序
调用用户回调函数
关键配置说明
  1. 唤醒源配置

    HAL_PWREx_EnableWakeUpPin(PWR_WAKEUP_PIN1);
    
    • 使能RTC Alarm作为唤醒源
  2. 低功耗模式选择

    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    
    • PWR_LOWPOWERREGULATOR_ON:保持低功耗稳压器
    • PWR_STOPENTRY_WFI:使用WFI指令进入停止模式
  3. 时钟恢复

    SystemClock_Config(); // 唤醒后必须重新配置时钟
    
    • 退出Stop模式后系统时钟会复位为MSI(4MHz)
    • 需要重新配置主时钟(HSI/HSE/PLL)
  4. 中断处理

    // stm32l0xx_it.c中
    void RTC_IRQHandler(void)
    {HAL_RTC_IRQHandler(&hrtc);
    }
    
    • HAL库自动处理标志位清除
    • 最终调用用户回调函数

4. 功耗优化技巧

  1. 最小化唤醒时间

    void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    {// 只执行最必要的操作wakeup_flag = true; // 设置标志位
    }
    

    在主循环中处理复杂任务

  2. 快速返回低功耗

    while(1)
    {if(wakeup_flag){ProcessData(); // 处理数据wakeup_flag = false;}Enter_Stop_Mode(); // 立即返回低功耗
    }
    
  3. RTC校准

    • 使用HAL_RTCEx_SetSmoothCalib()提高计时精度
    • 尤其在使用LSI作为时钟源时
  4. 备份域保护

    HAL_PWR_EnableBkUpAccess(); // 访问RTC前启用
    HAL_PWR_DisableBkUpAccess(); // 完成后禁用
    

通过此配置,系统将在Stop模式下消耗约1μA电流,每30秒唤醒一次执行任务,实现超低功耗运行。

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

相关文章:

  • Elasticsearch:使用 Gradio 来创建一个简单的 RAG 应用界面
  • 敏捷数据开发实践:基于 Amazon Q Developer + Remote MCP 构建本地与云端 Amazon Redshift 交互体系
  • 软件重构的破与立:模式方法创新设计与工程实践
  • 【Vibe Coding 工程之 StockAnalyzerPro 记录】- EP1.先写 PRD
  • 集成电路学习:什么是Object Detection目标检测
  • 【算法专题训练】13、回文字符串
  • 另类的pdb恢复方式
  • 逆向练习(六)Andrénalin.3/4
  • Linux应用软件编程---多任务(进程2)(资源回收函数(wait、waitpid)、exec函数族、linux下的命令、const四种位置表示的含义)
  • 一周学会Matplotlib3 Python 数据可视化-绘制树形图
  • Laravel 中解决分表问题
  • ESP32-C3_SMARTCAR
  • 高并发场景下限流算法对比与实践指南
  • 【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?
  • ABP vNext+ WebRTC DataChannel 低延迟传感推送
  • 物联网(IoT)系统中,通信协议如何选择
  • C++——分布式
  • Al大模型-本地私有化部署大模型-大模型微调
  • 图像识别控制技术(Sikuli)深度解析:原理、应用与商业化前景
  • Zabbix【部署 01】Zabbix企业级分布式监控系统部署配置使用实例(在线安装及问题处理)程序安装+数据库初始+前端配置+服务启动+Web登录
  • 後端開發Python篇
  • StarRocks集群部署
  • 从 0 到 1 玩转Claude code(蓝耘UI界面版本):AI 编程助手的服务器部署与实战指南
  • Xget:为您的开发工作流解锁极致速度
  • 清除 pnpm 缓存,解决不同源安装依赖包失败的问题
  • “大模型”技术专栏 | 浅谈基于 Kubernetes 的 LLM 分布式推理框架架构:概览
  • 力扣 hot100 Day74
  • Floyd 判圈算法(龟兔赛跑算法)
  • LeetCode热题100--146.LRU缓存--中等
  • SSL和TLS协议的消息认证码(MAC)