Stm32RTC不走动的问题解答
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接口我添加好了):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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测试的时候不会存在。
后经邵工指点,总算找到原因,实际上也就缺少一条语句:
1 2 3 4 5 6 7 8 9 10 11 |
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型号很多,不是所有型号都有这种现象,如调试过程中发现不走动看是不是也是这种问题。
更加详细的解释看这里http://mp.weixin.qq.com/s/b8WwXqD5LYThi7HSTXGzTQ
妈呀感谢!!!!!!!!找了半天了,还有这种规定!!!