|
我使用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驱动开发
微信公众号
手机版
[md]我直接在休眠前读 时间 和休眠后马上读时间,还是不对
这个是休眠前的代码
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_EnableWakeUpPin(PWR_WAKEUP_PIN1);
// HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); HAL_PWR_EnterSTANDBYMode();
这个是系统开机的代码
HAL_Init();
/ USER CODE BEGIN Init /
/ USER CODE END Init /
/ Configure the system clock / SystemClock_Config();
/ USER CODE BEGIN SysInit /
/ USER CODE END SysInit /
/ Initialize all configured peripherals / MX_GPIO_Init(); 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;
/
} // MX_RTC_Init(); MX_UART4_Init(); MX_TIM6_Init(); MX_SPI2_Init(); MX_ADC1_Init(); / USER CODE BEGIN 2 /
printf("\n idle year = %d",g_sDateTemp.Year); printf(" idle month = %d",g_sDateTemp.Month); printf(" idle data = %d",g_sDateTemp.Date);
printf("\n hour = %d",g_sTimeTemp.Hours);
printf(" min = %d",g_sTimeTemp.Minutes);
printf(" sec = %d",g_sTimeTemp.Seconds); 这个是打印出来的结果
我把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]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; }
改成这样 还是不对
外部电池,外部晶振
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 → 再读时间,再读日期。
读操作不要只读一部分,时分秒日期都要读取,先读时间 后读日期。
[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]保证VDD和VBAT至少有一个存在的情况下,复位芯片或低功耗唤醒是不会影响RTC工作的。
你先保证正常模式下 RTC正在工作,读取正常。确保LSE工作稳定、代码正常。
然后再验证低功耗,或重启,重启的话必须保证VDD和VBAT至少一个有电~!