数码之家

 找回密码
 立即注册
搜索
查看: 1804|回复: 11

[STM] STM32L051系统复位时正常,断电导致RTC复位,这是为什么

[复制链接]
发表于 2023-3-5 08:51:01 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
STM32L051RTC模块,按下系统复位键时,RTC时间正常,但当断电后再通电时,RTC被复位,时分秒均被清零。STM32L0511脚有外接3V电池,且电压正常。MX_RTC_Init代码中的时间初始化设置有注释掉。
STM32CubeMX配的代码(HAL)RTC.c代码如下:
#include "rtc.h"
RTC_HandleTypeDef hrtc;
void MX_RTC_Init(void)
{
  //RTC_TimeTypeDef sTime = {0};
  //RTC_DateTypeDef sDate = {0};
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat =RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut =RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutRemap =RTC_OUTPUT_REMAP_NONE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType =RTC_OUTPUT_TYPE_OPENDRAIN;
  if (HAL_RTC_Init(&hrtc) !=HAL_OK)
  {
    Error_Handler();
  }
  /*
  sTime.Hours = 0x0;
  sTime.Minutes = 0x0;
  sTime.Seconds = 0x0;
  sTime.DayLightSaving =RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation =RTC_STOREOPERATION_RESET;
  if (HAL_RTC_SetTime(&hrtc,&sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  sDate.WeekDay =RTC_WEEKDAY_WEDNESDAY;
  sDate.Month = RTC_MONTH_MARCH;
  sDate.Date = 0x1;
  sDate.Year = 0x23;
  if (HAL_RTC_SetDate(&hrtc,&sDate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
      */
}
void HAL_RTC_MspInit(RTC_HandleTypeDef*rtcHandle)
{
  if(rtcHandle->Instance==RTC)
  {
    __HAL_RCC_RTC_ENABLE();
  }
}
void HAL_RTC_MspDeInit(RTC_HandleTypeDef*rtcHandle)
{
  if(rtcHandle->Instance==RTC)
  {
    __HAL_RCC_RTC_DISABLE();
  }
}
请大佬分析一下,哪个环节出问题了?

发表于 2023-3-30 14:21:00 | 显示全部楼层
发帖子的时候如果有代码,要用插入代码工具,这样才方便看,如果有人愿意帮你,可以直接告诉你是哪一行有问题。

  1. #include "rtc.h"
  2. RTC_HandleTypeDef hrtc;
  3. void MX_RTC_Init(void)
  4. {
  5.     // RTC_TimeTypeDef sTime = {0};
  6.     // RTC_DateTypeDef sDate = {0};
  7.     hrtc.Instance = RTC;
  8.     hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  9.     hrtc.Init.AsynchPrediv = 127;
  10.     hrtc.Init.SynchPrediv = 255;
  11.     hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  12.     hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  13.     hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  14.     hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  15.     if (HAL_RTC_Init(&hrtc) != HAL_OK)
  16.     {
  17.         Error_Handler();
  18.     }
  19.     /*
  20.     sTime.Hours = 0x0;
  21.     sTime.Minutes = 0x0;
  22.     sTime.Seconds = 0x0;
  23.     sTime.DayLightSaving =RTC_DAYLIGHTSAVING_NONE;
  24.     sTime.StoreOperation =RTC_STOREOPERATION_RESET;
  25.     if (HAL_RTC_SetTime(&hrtc,&sTime, RTC_FORMAT_BCD) != HAL_OK)
  26.     {
  27.       Error_Handler();
  28.     }
  29.     sDate.WeekDay =RTC_WEEKDAY_WEDNESDAY;
  30.     sDate.Month = RTC_MONTH_MARCH;
  31.     sDate.Date = 0x1;
  32.     sDate.Year = 0x23;
  33.     if (HAL_RTC_SetDate(&hrtc,&sDate, RTC_FORMAT_BCD) != HAL_OK)
  34.     {
  35.       Error_Handler();
  36.     }
  37.         */
  38. }
  39. void HAL_RTC_MspInit(RTC_HandleTypeDef *rtcHandle)
  40. {
  41.     if (rtcHandle->Instance == RTC)
  42.     {
  43.         __HAL_RCC_RTC_ENABLE();
  44.     }
  45. }
  46. void HAL_RTC_MspDeInit(RTC_HandleTypeDef *rtcHandle)
  47. {
  48.     if (rtcHandle->Instance == RTC)
  49.     {
  50.         __HAL_RCC_RTC_DISABLE();
  51.     }
  52. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-30 14:42:40 | 显示全部楼层
595953427@qq 发表于 2023-3-30 14:21
发帖子的时候如果有代码,要用插入代码工具,这样才方便看,如果有人愿意帮你,可以直接告诉你是哪一行有问 ...

哦,谢谢你的建议。
回复 支持 反对

使用道具 举报

发表于 2023-5-15 09:03:37 | 显示全部楼层
主程序里做了掉电判断么,是不是一上电就把RTC直接初始化了?
回复 支持 反对

使用道具 举报

发表于 2024-1-10 16:28:03 | 显示全部楼层
没有使能BKP时钟,也没有使能PWR访问
RTC初始化之后要写一个标志位到备份区RAM,下次上电的时候根据备份区RAM的标志位来判断是否第一次上电,如果是第一次上电,就写入默认日期时间到RTC,如果不是第一次上电,就读出日期时间。
这个HAL库bug太多,更新也很频繁,现在新的hal库跟你上面发的完全不一样了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-10 17:07:21 | 显示全部楼层
595953427@qq 发表于 2024-1-10 16:28
没有使能BKP时钟,也没有使能PWR访问
RTC初始化之后要写一个标志位到备份区RAM,下次上电的时候根据备份区R ...

我记得当时是有写一个标志位的,没有效果。即使人为地关闭时钟初始化,也无效。
如果新的HAL库相对较好,那就等有空的时候再弄弄了。
我试了沁恒芯片RTC,是正常的。我就不相信这东西会这样。
回复 支持 反对

使用道具 举报

发表于 2024-1-10 18:42:12 来自手机浏览器 | 显示全部楼层
lmn2005 发表于 2024-1-10 17:07
我记得当时是有写一个标志位的,没有效果。即使人为地关闭时钟初始化,也无效。
如果新的HAL库相对较好, ...

标志位有没有写成功?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-10 19:28:52 | 显示全部楼层
595953427@qq 发表于 2024-1-10 18:42
标志位有没有写成功?

太久,给忘记了,有空再看看
回复 支持 反对

使用道具 举报

发表于 2024-1-11 09:07:38 | 显示全部楼层
051没有VBAT脚
回复 支持 反对

使用道具 举报

发表于 2024-1-11 09:07:39 | 显示全部楼层
051没有VBAT脚
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-11 09:18:37 | 显示全部楼层

是这种情况?英文版的手册都看不懂,所以---
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-11 09:30:08 | 显示全部楼层
本帖最后由 lmn2005 于 2024-1-11 09:32 编辑

我都以为与STM32F103一样,引脚1就是VBAT,唉,这个问题困了我半年多,今天终于解决了,谢谢大佬!谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 07:40 , Processed in 0.202800 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表