实现STM32的日历读取、设置和输出 您所在的位置:网站首页 实时钟表时间怎么调出来 实现STM32的日历读取、设置和输出

实现STM32的日历读取、设置和输出

#实现STM32的日历读取、设置和输出| 来源: 网络整理| 查看: 265

文章目录 一、实时时钟RTC的原理二、任务内容三、创建项目四、任务一五、任务二六、任务三七、参考

一、实时时钟RTC的原理

实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。

RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。

二、任务内容

1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒;

2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;

3)如果输出内容中需加入“星期x”,请修改代码。

三、创建项目

在这里插入图片描述

设置串口Usart1 在这里插入图片描述

配置RTC 在这里插入图片描述

配置时钟 在这里插入图片描述

project管理 在这里插入图片描述

Code Generator建议勾选 在这里插入图片描述

点击右上角GENERANT CODE生成工程

四、任务一 代码 while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* Get the RTC current Time */ HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN); /* Get the RTC current Date */ HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN); /* Display date Format : yy/mm/dd */ printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date); /* Display time Format : hh:mm:ss */ printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds); printf("\r\n"); HAL_Delay(1000); }

我重写了printf

#include "stdio.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ int fputc(int ch,FILE *f){ uint8_t temp[1]={ch}; HAL_UART_Transmit(&huart1,temp,1,2); return ch; }

注意,如果重写了printf,build前一定要勾选Use MiscroLiB 在这里插入图片描述

效果 STM32的RTC只有一个32位的计数器用来计时,没有寄存器来存年月日时分秒等。通过设置可以让这个计数器1秒加1,从0-0XFFFFFFFF大概可以计时136年。程序要设置一个时间起点表示0,一般设置起始时间为1970-01-01 0:0:0。 而我这是2000,我认为应该是用cubeMx生成的原因,默认值是这个。

在这里插入图片描述

五、任务二 在rtc.c中修改为当前时间 在这里插入图片描述代码 while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* Get the RTC current Time */ HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN); /* Get the RTC current Date */ HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN); /* Display date Format : yy/mm/dd */ printf("%02d年%02d月%02d日\r\n",2000 + GetData.Year, GetData.Month, GetData.Date); /* Display time Format : hh:mm:ss */ printf("%02d时%02d分%02d秒\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds); printf("\r\n"); HAL_Delay(1000); } 效果 在这里插入图片描述 六、任务三 代码: while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* Get the RTC current Time */ HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN); /* Get the RTC current Date */ HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN); /* Display date Format : yy/mm/dd */ printf("%02d年%02d月%02d日\r\n",2000 + GetData.Year, GetData.Month, GetData.Date); /* Display time Format : hh:mm:ss */ printf("%02d时%02d分%02d秒\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds); printf("星期%0d",GetData.WeekDay); printf("\r\n"); HAL_Delay(1000); }

在这里插入图片描述

七、参考

https://www.cnblogs.com/dreamrj/p/14046598.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有