这篇文章记录一下使用STM32CubeMX配置独立看门狗和RTC的过程。基础CubeMX工程的创建可以参考我的前一篇文章《STM32CubeMX使用-1.点个灯(正点原子潘多拉开发板)》。
目录
一. 配置IWDG
二. 配置RTC
三. 读取RTC时间以及刷新IWDG
按照如下图的步骤1~3来使能独立看门狗。按照步骤4~5配置独立看门狗的超时时间,这里的参数需要根据独立看门狗的时钟源频率来设置,此示例IWDG时钟源使用的是LSI 32KHZ,因此可以计算出超时时间为:,然后配置系统时钟并生成项目代码。 最后在main.c 的while中调用 HAL_IWDG_Refresh(&hiwdg)刷新看门狗。
此实验中RTC时钟源跟IWDG一样使用内部低速时钟32KHZ。按如下步骤1~3打开RTC,按照步骤4设置RTC日历的初始时间。然后完成时钟配置并生成代码。
在main.c文件中添加如下代码
int main(void)
{
....
while (1)
{
HAL_IWDG_Refresh(&hiwdg);
HAL_RTC_GetTime(&hrtc, &cur_time, RTC_FORMAT_BCD);
HAL_RTC_GetDate(&hrtc, &cur_date, RTC_FORMAT_BCD);
printf("%02X/%02X/%02X/-%02X:%02X:%02X\r\n",
cur_date.Year, cur_date.Month, cur_date.Date,
cur_time.Hours, cur_time.Minutes, cur_time.Seconds);
HAL_Delay(1000);
}
....
}
注意如果只调用HAL_RTC_GetTime读取时间是不行的,那会出现每次读取的时间都相同的现象,需要在调用HAL_RTC_GetTime之后调用一下HAL_RTC_GetDate,这样才能正确得到时间。原因请看函数HAL_RTC_GetTime的注释,有如下一段描述
* @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values
* in the higher-order calendar shadow registers to ensure consistency between the time and date values.
* Reading RTC current time locks the values in calendar shadow registers until Current date is read
* to ensure consistency between the time and date values.