这是一个前几天就想整理的一份例程笔记,但是由于自己对FreeRTOS的了解不多,遇到了一点小障碍。FreeRTOS中集成了RTC的代码之后总是会进入异常中断,后来发现其实是堆栈分配的原因。

         这里把之前的这个例程补充一下,以后的hack也会基于FreeRTOS,让自己逐渐适应在这个RTOS上做开发的感觉。

         RTC的例程之前整理了,可以参考下面的链接:

其实,只要资源上没有出问题,软件的集成还是很容易的。我自己的测试代码中设计了一个初始化的接口和一个周期性打印的接口,具体代码如下:

#include "rtc_test.h"

RTC_HandleTypeDef hrtc;
RTC_TimeTypeDef hacking_test_time;
RTC_DateTypeDef hacking_test_date;

void rtc_test_1000ms_task(void)
{
#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
}

void rtc_test_init(void)
{
#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
}

         值得一提的是,这个初始化必须在RTC的模块初始化之后,否则的话初始化数据会被覆盖掉。软件编译成功后,烧写测试结果:

149_基于FreeRTOS实现RTC的时间输出_初始化

         从运行结果看,基本正确,也能够看得出OS的周期性调度基本OK。但是,还是有很多细节性的问题暴露了出来需要以后再研究改进。比如:


  1. 初始的时间打印了两次;
  2. 调度的周期控制不够准确,算不上是很严格的实时性,只是从结果看基本OK。