目录

  • 一、RTC原理
  • 二、创建STM32cube工程
  • 1、新建项目
  • 2、设置RCC
  • 3、设置串口Usart1
  • 4、配置RTC
  • 5、设置时钟
  • 6、对整个工程调整
  • 三、在keli中修改添加代码
  • 1、输出初始时间
  • 2、输出现在的时间
  • 3、重新烧录,然后查看效果
  • 四、总结


一、RTC原理

实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。

二、创建STM32cube工程

1、新建项目

采用F103C8芯片创建项目

stm32cubemx 年月日时分秒 stm32 日期_stm32cubemx 年月日时分秒

2、设置RCC

stm32cubemx 年月日时分秒 stm32 日期_stm32cubemx 年月日时分秒_02

3、设置串口Usart1

stm32cubemx 年月日时分秒 stm32 日期_stm32cubemx 年月日时分秒_03

4、配置RTC

stm32cubemx 年月日时分秒 stm32 日期_实时音视频_04

5、设置时钟

将HCLK换成72,然后回车。

stm32cubemx 年月日时分秒 stm32 日期_2d_05

6、对整个工程调整

stm32cubemx 年月日时分秒 stm32 日期_实时音视频_06

stm32cubemx 年月日时分秒 stm32 日期_单片机_07

三、在keli中修改添加代码

1、输出初始时间

1、在main.c中定义时间和日期的结构体用来获取时间和日期

RTC_DateTypeDef GetData;  //获取日期结构体
RTC_TimeTypeDef GetTime;   //获取时间结构体

stm32cubemx 年月日时分秒 stm32 日期_单片机_08


2、在main函数的while循环中添加以下代码

/* 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);

stm32cubemx 年月日时分秒 stm32 日期_stm32_09

3、在main.c文件中重写fputc函数,完成printf函数的重定向

//添加头文件#include "stdio.h"
int fputc(int ch,FILE *f){
 uint8_t temp[1]={ch};
 HAL_UART_Transmit(&huart1,temp,1,2);
 return ch;
}

stm32cubemx 年月日时分秒 stm32 日期_实时音视频_10


4、点击target修改设置

stm32cubemx 年月日时分秒 stm32 日期_stm32cubemx 年月日时分秒_11


5、烧录后用野火串口助手查看效果

stm32cubemx 年月日时分秒 stm32 日期_2d_12


可以看到时间从0年1月1号零分零秒开始,所以初始时间不是 1970年1月1日零分零秒

2、输出现在的时间

1、在rtc.c中修改为当前时间

stm32cubemx 年月日时分秒 stm32 日期_单片机_13


2、在main.c添加如下代码:

/* Display date Format : weekday */
		if(GetData.WeekDay==1){
			printf("星期一\r\n");
		}else if(GetData.WeekDay==2){
			printf("星期二\r\n");
		}else if(GetData.WeekDay==3){
			printf("星期三\r\n");
		}else if(GetData.WeekDay==4){
			printf("星期四\r\n");
		}else if(GetData.WeekDay==5){
			printf("星期五\r\n");
		}else if(GetData.WeekDay==6){
			printf("星期六\r\n");
		}else if(GetData.WeekDay==7){
			printf("星期日\r\n");
		}

stm32cubemx 年月日时分秒 stm32 日期_2d_14

3、重新烧录,然后查看效果

stm32cubemx 年月日时分秒 stm32 日期_单片机_15

四、总结

此次实验,我了解了实时时钟RTC的原理。并且实现了STM32的日历读取、设置和输出。
通过调用HAL库函数,获取时间日期,用printf函数输出。