整个STMF407系列的学习汇总链接如下:
https:///GreyZhang/g_stmf407
前面做了一个RTC的例程,在main函数的while循环中通过计数器累加做了一个简单的延时间隔。但是从打印的效果看,不是很精准。接下来实现一个稍微精准一点的任务调度。
其实,像这么少的任务量,直接跑个中断ISR也就可以了,毕竟是学习例程。如果是应用,自然还是OS或者调度器做一个更好的管理。
之前也实现了SysTick,其实基于这个,简单的任务调度一下子就做的出来。SysTick本身的handler可以简单考虑为一个1ms的task,做一个计数器就可以实现1000ms的调度。之后,我可以利用这个1000ms的调度打印一下RTC的时间。
核心的调度相关设计代码:
void HAL_SYSTICK_Callback(void)
{
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_SYSTICK_Callback could be implemented in the user file
*/
if (systick_counter_1ms % 1000 == 0U)
{
task_1000ms();
}
systick_counter_1ms++;
}
void task_1000ms(void)
{
rtc_time_display();
}
void HAL_IncTick(void)
{
HAL_SYSTICK_Callback();
}
其中,用于测试的RTC打印代码:
void rtc_time_display(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
}
编译链接成功之后,烧写测试:

从输出结果看,现在的准确度比之前好多了,至少没有出现重复输出的现象。后续,改进的方案我不再考虑简单的调度器了,直接考虑使用OS。这样,也能够顺利的打开新的学习篇章。
完整的参考代码: https:///GreyZhang/g_stmf407
















