STM32L051 RTC闹钟配置详解

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

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

参数 设置值 说明
Hours 0 (任意值) 小时字段被掩码,值不影响
Minutes 0 (任意值) 分钟字段被掩码,值不影响
Seconds 30 关键值:设置触发秒数
Sub Seconds 0 (任意值) 子秒字段被掩码
Alarm Mask Date Week day Enable (掩码) 忽略日期/星期
Alarm Mask Hours Enable (掩码) 忽略小时
Alarm Mask Minutes Enable (掩码) 忽略分钟
Alarm Mask Seconds Disable (不掩码) 必须比较秒字段
Alarm Sub Second Mask All masked (全掩码) 忽略子秒
Alarm Date Week Day Sel Date (任意) 字段被掩码不影响
Alarm Date 1 (任意值) 字段被掩码不影响

原理说明

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

2. Alarm A触发执行流程

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

关键点

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

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

硬件配置
c 复制代码
// 在STM32CubeMX中启用:
// [X] RTC
// [X] Alarm A
// [X] Wakeup using RTC alarm
代码实现
c 复制代码
/* 配置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();
  
  // 初始化RTC
  MX_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. 唤醒源配置

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

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

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

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

4. 功耗优化技巧

  1. 最小化唤醒时间

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

    在主循环中处理复杂任务

  2. 快速返回低功耗

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

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

    c 复制代码
    HAL_PWR_EnableBkUpAccess(); // 访问RTC前启用
    HAL_PWR_DisableBkUpAccess(); // 完成后禁用

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

相关推荐
云山工作室1 天前
用于电动汽车的永磁同步电机调速系统建模与仿真(论文+)
stm32·单片机·嵌入式硬件·毕业设计·毕设
yuan199971 天前
AD7689 12位串行ADC驱动与应用
单片机·嵌入式硬件
磨十三1 天前
MCU 时钟系统全解析:主时钟、PLL、分频与外设时钟门控
arm开发·单片机·嵌入式硬件
逐步前行1 天前
Proteus 8.9(四)51单片机仿真
嵌入式硬件·51单片机·proteus
DIY机器人工房1 天前
嵌入式面试题:纹波率怎么计算;Buck 电路电感值的标准计算式是什么?
stm32·嵌入式硬件·面试题·diy机器人工房
DIY机器人工房1 天前
嵌入式面试题:电容滤波,低频高频谁来滤?放置顺序怎么定?
stm32·单片机·嵌入式硬件·diy机器人工房
学习路上_write1 天前
嵌入式系统bringup指南:软硬件调试
c语言·单片机·嵌入式硬件
磨十三1 天前
ARM Cortex-M 系列 MCU:内核、指令、异常与中断解析
arm开发·单片机·嵌入式硬件
罗汉松(山水白河)1 天前
关于串口与UDP通讯的实验
单片机·嵌入式硬件·网络协议·udp·tcp·串口、
d111111111d1 天前
STM32外设--SPI读取W25Q64(学习笔记)硬件SPI
笔记·stm32·单片机·嵌入式硬件·学习