整个STMF407系列的学习汇总链接如下:
https://github.com/GreyZhang/g_stmf407
看了一下手头的资料,发现STM32F407是有一个RTC的,通过这个可以方便地进行时间时间的处理。本想先整理一下这个功能,后来发现没有一个很好的显示手段,于是先做了一个基于串口的printf函数出来。
接下来看看RTC功能,具体的驱动功能可以直接跳过了,使用这个芯片的人估计都不在乎,因为太成熟了。RTC的显示看上去有两种,一个是BCD,还有一个是BIN。接下来,探索一下两种方式的使用。
先看看BCD,其实这个方式理解起来很简单,其实就是时间、日期的数值转换成16进制正好是我们习惯上的数值。正式因为这个原因,我昨天先把printf的功能实现了一下。先看看大致的效果:
核心的代码没有几行:
#define BCD_MODE 1
/* USER CODE BEGIN WHILE */
#if BCD_MODE
hacking_test_time.Hours = 0x20;
hacking_test_time.Minutes = 0x50;
hacking_test_time.Seconds = 0x00;
HAL_RTC_SetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BCD);
hacking_test_date.Year = 0x19U;
hacking_test_date.Month = RTC_MONTH_SEPTEMBER;
hacking_test_date.Date = 0x25;
hacking_test_date.WeekDay = RTC_WEEKDAY_WEDNESDAY;
HAL_RTC_SetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BCD);
printf(" %02x-%02x-%02x week:%x\n\r", hacking_test_date.Year, hacking_test_date.Month, hacking_test_date.Date, hacking_test_date.WeekDay);
#else
hacking_test_time.Hours = 20;
hacking_test_time.Minutes = 50;
hacking_test_time.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BIN);
hacking_test_date.Year = 19U;
hacking_test_date.Month = 9;
hacking_test_date.Date = 25;
hacking_test_date.WeekDay = RTC_WEEKDAY_WEDNESDAY;
HAL_RTC_SetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BIN);
printf(" %02d-%02d-%02d week:%d\n\r", hacking_test_date.Year, hacking_test_date.Month, hacking_test_date.Date, hacking_test_date.WeekDay);
#endif
printf("--------------------start to run------------------\n\r");
while (1)
{
if (counter % 500000 == 0)
{
#if BCD_MODE
HAL_RTC_GetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BCD);
HAL_RTC_GetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BCD);
printf("%02x:%02x:%02x\n\r", hacking_test_time.Hours, hacking_test_time.Minutes, hacking_test_time.Seconds);
#else
HAL_RTC_GetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BIN);
printf("%02d:%02d:%02d\n\r", hacking_test_time.Hours, hacking_test_time.Minutes, hacking_test_time.Seconds);
#endif
}
counter++;
/* USER CODE END WHILE */
大致就是先设置了一下时间和日期,之后不断进行时间的打印。关注了一下时间的变化,其实还是很精准的。上面设置的一个关键点就是格式的参数需要写成BCD的参数,还有一个日期回读的目的是数据解锁。
相比之下,BIN格式的时间处理是使用的十进制的数值。这一次,先看看大致的代码实现。为了能够保留两种代码,我做了一个宏条件作为切换。
#define BCD_MODE 0
/* USER CODE BEGIN WHILE */
#if BCD_MODE
hacking_test_time.Hours = 0x20;
hacking_test_time.Minutes = 0x50;
hacking_test_time.Seconds = 0x00;
HAL_RTC_SetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BCD);
hacking_test_date.Year = 0x19U;
hacking_test_date.Month = RTC_MONTH_SEPTEMBER;
hacking_test_date.Date = 0x25;
hacking_test_date.WeekDay = RTC_WEEKDAY_WEDNESDAY;
HAL_RTC_SetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BCD);
printf(" %02x-%02x-%02x week:%x\n\r", hacking_test_date.Year, hacking_test_date.Month, hacking_test_date.Date, hacking_test_date.WeekDay);
#else
hacking_test_time.Hours = 20;
hacking_test_time.Minutes = 50;
hacking_test_time.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BIN);
hacking_test_date.Year = 19U;
hacking_test_date.Month = 9;
hacking_test_date.Date = 25;
hacking_test_date.WeekDay = RTC_WEEKDAY_WEDNESDAY;
HAL_RTC_SetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BIN);
printf(" %02d-%02d-%02d week:%d\n\r", hacking_test_date.Year, hacking_test_date.Month, hacking_test_date.Date, hacking_test_date.WeekDay);
#endif
printf("--------------------start to run------------------\n\r");
while (1)
{
if (counter % 500000 == 0)
{
#if BCD_MODE
HAL_RTC_GetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BCD);
HAL_RTC_GetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BCD);
printf("%02x:%02x:%02x\n\r", hacking_test_time.Hours, hacking_test_time.Minutes, hacking_test_time.Seconds);
#else
HAL_RTC_GetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BIN);
printf("%02d:%02d:%02d\n\r", hacking_test_time.Hours, hacking_test_time.Minutes, hacking_test_time.Seconds);
#endif
}
counter++;
/* USER CODE END WHILE */
从用户代码的复杂度上,其实两者没啥差异。接下来看看运行效果:
显示效果上与BCD没有差异,等待一分钟观察分秒的进位也是OK的,顺带提一下,BCD格式的进位也是OK的。
关于RTC,暂时做这么一点点学习笔记,完整代码参考如下链接: