当前位置: 首页 > 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.lryc.cn/news/621564.html

相关文章:

  • 《JMeter核心技术、性能测试与性能分析》 教学大纲及标准
  • 硬核实用!R+贝叶斯解决真实问题:参数估计(含可靠性分析) + 回归建模(含贝叶斯因子比较) + 生产级计算实践 赠「常见报错解决方案」秘籍!
  • 电商架构测试体系:ZKmall开源商城筑牢高并发场景下的系统防线
  • Jmeter自定义脚本
  • Easy Rules 规则引擎详解
  • 【测试工具】JMeter基本使用及MySQL数据库压力测试
  • Stagehand深度解析:从开源自动化工具到企业级RPA平台的演进之路
  • 新手向:Python函数定义与参数传递(位置参数、关键字参数、默认参数)
  • Unity输入系统:旧版Input_System
  • 大气负氧离子自动监测站:解密空气的科技密码
  • SSL和TLS协议的消息认证码(MAC)
  • 【opencv-Python学习笔记(5):几何变换】
  • 《Effective Java》第1条:用静态工厂方法代替构造器
  • 【R语言】R 语言中 gsub 与正则表达式详解(含 POSIX 与 Perl 风格实例)
  • 【R语言】更换电脑后,如何在新设备上快速下载原来设备的 R 包?
  • 智能体开发实战:用Deepseek做一个生成思维导图的智能体
  • 2025高防IP vs 普通IP:本质差异与选型指南
  • 移动板房的网络化建设
  • StarRocks集群部署
  • 39 C++ STL模板库8-容器1-array
  • 常见IP模块的仲裁策略和实现
  • YOLO11分割模型使用rknn2量化部署
  • 网络安全蓝队常用工具全景与实战指南
  • 【DDIA】第二部分:分布式数据
  • 从零到一:发布你的第一个 npm 开源库(2025 终极指南)
  • Elasticsearch赋能规章制度智能检索:从海量文档到秒级响应
  • app-5 控制卡升级
  • 【CV 目标检测】②R-CNN模型
  • 「iOS」————UITableView性能优化
  • GCC深度剖析:从编译原理到嵌入式底层实战