|
我使用RTC 进行休眠唤醒,进入休眠电流值 OK, RTC 也能唤醒,但是唤醒后 RTC 读到的时间就不对了,请问是什么原因
g_sAlarm.AlarmTime.Hours = sTime.Hours ; g_sAlarm.AlarmTime.Minutes = sTime.Minutes; g_sAlarm.AlarmTime.Seconds = sTime.Seconds; g_sAlarm.Alarm= RTC_ALARM_A; // HAL_PWR_EnableBkUpAccess();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
// SystemClock_RestoreFromStop(); MX_GPIO_Init(); MX_TIM6_Init(); MX_ADC1_Init(); // MX_RTC_Init(); // My_RTC_Init(); MX_SPI2_Init(); MX_UART4_Init(); HAL_Delay(10); Fun_Main_Init(); |
STM32F103的串口1(PA9/10)映射到PB6/7
STM32F103RCT6断电以后,ADC会漏电
简单平稳过度-回顾2025&说说我心中的ST中文论坛
Error in final launch sequence: Failed to execute MI command: target remote localhost:61234
基于STM32F103的HAL库实现USB(HID) OTA升级
STM32F103C8T6单片机通过PA4、PA5、PB10、PB11接口与单个74HC595D连接,然后通过CAN发报0x87,74HC595D输出脚Q1和Q5是常高电平,但连接多个74HC595D时,Q1和Q5波形不正常,为什么会出现方波?
STM32的内部Flash操作是不是优先级最高?
cudeide执行run是烧录还是只是执行呢
STM32 GPIO 开漏,NMOS 导通能承受多大电流
L9663驱动开发
微信公众号
手机版
外部电池,外部晶振
After waking up from Standby mode, program execution restarts in the same way as after a
Reset (boot pins sampling, vector reset is fetched, etc.).
所以检查一下代码开始,是不是没有判断RTC被初始化过还是上电复位,从而决定是否需要重新初始化RTC。
如果没有这一步,那么每次唤醒都会初始化RTC从而使得时间不能连续。 库中有例程可以参考。
你唤醒后或者复位后,你这样操作:
清 RSF → 等 RSF 置 1 → 再读时间,再读日期。
读操作不要只读一部分,时分秒日期都要读取,先读时间 后读日期。
我把MX_RTC_Init 函数下面这段代码// 掉了,但是还是不对,是不是可以认为,只要RTC 初始化过了,时间就不对了,那我该怎么处理呢,我尝试用一个寄存器做标注,但是重启后这个寄存器好像也呗初始化了
/ USER CODE BEGIN Check_RTC_BKUP /
/ USER CODE END Check_RTC_BKUP /
/* Initialize RTC and set the Time and Date / /* sTime.Hours = 0; sTime.Minutes = 0; sTime.Seconds = 0;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY; DateToUpdate.Month = RTC_MONTH_JANUARY; DateToUpdate.Date = 1; DateToUpdate.Year = 0;
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } */
[md]好像没找到这个寄存器
我找了下,有的。 不同系列寄存器有点不一样,F1系列在RTC_CRL。
关键地方,就是你每次读日历时,保证按照先读TIME,再读DATE的步骤进行很重要。
\STM32Cube_FW_F1_V1.8.6\Projects\STM3210E_EVAL\Examples\RTC\RTC_Calendar
[md]怎么来回初始化呢。
你初始化后,建个标志. STM32F1系列里常用个备份域寄存器来做标志。
每次复位后检查该标志,如果该标志已经被你设置过了,就跳过RTC的初始化。
RTC_CalendarConfig 找不到这个函数啊
[md]不好意思,刚才搞晕了,这个方法的却是可以知道是不是休眠重启,但是这样休眠重启后RTC数据还是不对啊
[md]if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!=0X32F2) { HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x32F2); // RTC_CalendarConfig(); MX_RTC_Init(); } else { hrtc.Instance->CRL &=~0x08; while((hrtc.Instance->CRL&0x08)==0x08); hrtc.Instance->CRL |=0x08; }
改成这样 还是不对
[md]保证VDD和VBAT至少有一个存在的情况下,复位芯片或低功耗唤醒是不会影响RTC工作的。
你先保证正常模式下 RTC正在工作,读取正常。确保LSE工作稳定、代码正常。
然后再验证低功耗,或重启,重启的话必须保证VDD和VBAT至少一个有电~!