在uFun学习板本身的资料中已经继承了RTC的驱动,而且硬件上还特地添加了超级电容,那么是不是该好好地对待一下RTC。我的回答是“那必须”。硬件上的超级电容位置很明显,和一颗小型纽扣一样。在其他的开发板上这个功能由纽扣电池来提供。所以,咱们的学习板还是很有特色的。现在截取一张硬件的示意图如下:
我使用的工程,是上次已经移植RTOS的工程。当然了,如果用uFun学习板本身的两只老虎工程也是一样的效果,区别就是有没有OS而已。 我们首先新建一个RTC的任务,在这个任务里,读取RTC的值,然后通过串口打印出来。因为相关的初始化在原程序工程里面已经初始化了,所以不再重复。只是有一点需要注意,RTC的时钟初始化需要在系统时钟初始化之后。现在我们添加任务如下:
xTaskCreate( vRTCTask, "RTC", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL );
执行函数vRTCTask()定义为1秒钟执行一次,详细代码:
/**************************************************************
程 序 名:vRTCTask
功能说明:获取RTC时间
**************************************************************/
void vRTCTask( void *pvParameters )
{
const TickType_t xDelay_xms = pdMS_TO_TICKS( 1000 );//延时单位为毫秒
RTC_Init(); // RTC初始化配置,它的初始化需要放置在系统时钟初始化之后
for( ;; )
{
Time_Show();
vTaskDelay( xDelay_xms );
}
}
到这,基本框架已经完成了。接下来就是细节上的一点小改动,为的是实现2点内容:1、启用时间调整功能函数;2、启用串口对时间进行调整。
1、启用时间调整功能函数
通过RTC_Init()进行底层函数的定位,我们能找到这里“if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)” 。这一步对BKP_DR1进行读取,然后和特定的值进行比对。这个值我们设置为0xA666应该也是可行的,都没关系。咱们的硬件上的电容不同于可以取下的纽扣电池,电容是焊接的,短时间不断电这个寄存器的值不会改变,那么时间调整函数Time_Adjust()很难被启用。具体原因可以参看下图:
在这里,进行调试的时候,我加了两句来确定寄存器的值,如下:
// Test = BKP_ReadBackupRegister(BKP_DR1);//寄存器的信息打印是为了调试,正常运行的时候,注释掉。
// printf("\r\n\n BKP_ReadBackupRegister = %0x",Test);
然后,我将寄存器的判断指令改为“if (BKP_ReadBackupRegister(BKP_DR1) == 0xA5A5)”。这样调整函数就会得到调用了,当程序调试完成之后再回“if (BKP_ReadBackupRegister(BKP_DR1) == 0xA5A5)”。复原之后,才不会每次开机都要调整程序。
2、启用启用串口对时间进行调整
通过对 uint32_t Time_Regulate(void) 的修改来启用串口的设置。首先将函数中对USART_Scanf()的屏蔽语句全部清除屏蔽,然后将Tmp_HH、Tmp_MM、Tmp_SS的初始值全部修改为0XFF。因为while的判断条件为 while (Tmp_HH == 0xFF)、while (Tmp_MM == 0xFF)、while (Tmp_SS == 0xFF)。修改之后如图:
最后编译,下载,串口打开,观察到的现象为:
望大家多多指教,附件密码:uFun_RTC
全部回复 2