By Derrick Wang
STM32 RTC不走的总结:
有客户要用到RTC,在帮忙配置的过程中,发现RTC运行不起来,不管是用LSI还是LSE都不行。以下列举我使用NUCLEO-F411的板子为例的测试过程。
cubemx配置:
全部使用内部时钟,RTC时钟源LSI 32khz。RTC打开日历功能。

配置RTC的时钟源为内部32khz。

RTC的配置我修改了以下两个地方124分频,为了获得1hz的时钟基准,32khz/(125*256)=1hz。数据格式改为2进制。
另外就是开了一个串口了,用来打印rtc读取值。生成mdk工程。
主函数就很简单,如下所示(printf接口我添加好了):
int main(void)
{
/* USER CODE BEGIN 1 */
RTC_TimeTypeDef rtcTime;
RTC_DateTypeDef rtcDate;
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_RTC_GetTime(&hrtc,&rtcTime,RTC_FORMAT_BIN);
printf("---%d-%d-%d------\r\n",rtcTime.Hours,rtcTime.Minutes,rtcTime.Seconds);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
打印出来的值如下所示:

可以看到时分秒都是0,也就是RTC没有走动。
测试stm32L433ccu6 stm32L433vct6 stm32F411ret6 都存在这样的现象。
注意这种现象在使用stm32f103c8t6测试的时候不会存在。
后经邵工指点,总算找到原因,实际上也就缺少一条语句:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_RTC_GetTime(&hrtc,&rtcTime,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &rtcDate, RTC_FORMAT_BIN);
printf("---%d-%d-%d------\r\n",rtcTime.Hours,rtcTime.Minutes,rtcTime.Seconds);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
HAL_Delay(1000);
}
/* USER CODE END 3 */
根据邵工的解释,是不读DATE的话,日历值会被锁住。加上HAL_RTC_GetDate这一句就ok了。
stm32型号很多,不是所有型号都有这种现象,如调试过程中发现不走动看是不是也是这种问题。