Cube

image.png

开启外设

image.png

配置为LSE,使用外部时钟源,掉电仍计时

Kconfig

  1. menuconfig BSP_USING_ONCHIP_RTC
  2. bool "Enable RTC"
  3. select RT_USING_RTC
  4. select RT_USING_LIBC
  5. default n
  6. if BSP_USING_ONCHIP_RTC
  7. choice
  8. prompt "Select clock source"
  9. default BSP_RTC_USING_LSE
  10. config BSP_RTC_USING_LSE
  11. bool "RTC USING LSE"
  12. config BSP_RTC_USING_LSI
  13. bool "RTC USING LSI"
  14. endchoice
  15. endif

在board文件夹下的Kconfig文件添加代码段
即在Env工具中添加片上外设配置项

Env

image.png
开启RTC
image.png
选择LSE

  1. scons --target=mdk5

生成MDK工程

MDK

image.png
自动生成驱动文件即配置成功

接口函数

设置日期

通过如下函数设置 RTC 设备当前日期值:

  1. rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
参数 描述
year 待设置生效的年份
month 待设置生效的月份
day 待设置生效的日
返回 ——
RT_EOK 设置成功
-RT_ERROR 失败,没有找到 rtc 设备
其他错误码 失败

设置时间

通过如下函数设置 RTC 设备当前时间值:

  1. rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
参数 描述
hour 待设置生效的时
minute 待设置生效的分
second 待设置生效的秒
返回 ——
RT_EOK 设置成功
-RT_ERROR 失败,没有找到 rtc 设备
其他错误码 失败

获取当前时间

使用到 C 标准库中的时间 API 获取时间:

  1. time_t time(time_t *t)
参数 描述
t 时间数据指针
返回 ——
当前时间值

使用示例如下所示:

  1. time_t now; /* 保存获取的当前时间值 */
  2. /* 获取时间 */
  3. now = time(RT_NULL);
  4. /* 打印输出时间信息 */
  5. rt_kprintf("%s\n", ctime(&now));

上机实验

  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include <board.h>
  4. rt_err_t ret = RT_EOK;
  5. int main(void)
  6. {
  7. /* 设置日期 */
  8. ret = set_date(2020, 2, 29);
  9. if (ret != RT_EOK)
  10. {
  11. rt_kprintf("set RTC date failed\n");
  12. return ret;
  13. }
  14. /* 设置时间 */
  15. ret = set_time(23, 27, 00);
  16. if (ret != RT_EOK)
  17. {
  18. rt_kprintf("set RTC time failed\n");
  19. return ret;
  20. }
  21. }
  22. static int get_time(int argc, char *argv[])
  23. {
  24. time_t now;
  25. /* 获取时间 */
  26. now = time(RT_NULL);
  27. rt_kprintf("%s\n", ctime(&now));
  28. return ret;
  29. }
  30. /* 导出到 msh 命令列表中 */
  31. MSH_CMD_EXPORT(get_time, rtc sample);

image.png