142_STM32F407_RTC

         整个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,暂时做这么一点点学习笔记,完整代码参考如下链接:

         https://github.com/GreyZhang/g_stmf407

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值