第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑦RTC时钟

目录

0.前言

1.功能要求

2.STM32Cubemx初始化

 3.程序实现

main.c相关初始化

RTC函数

RTC_CalendarGet()日期时间获取函数

设置日期RTC_SetDate和时间RTC_SetTime

4.工程文件


0.前言

这套教程针对于蓝桥杯嵌入式比赛的底层模块调试,针对于比赛进行每个模块的调试,低层模块调试好,对于赛题的实现就会方便很多,虽然有一些应试教育的意味,不过准备这个比赛对于程序整体实现思维还是有着很大帮助,我也从中受益颇多!

1.功能要求

使用STM32G431内置的RTC时钟进行计时,获取每时每刻的时间值,同时实现时间和日期的设置。

2.STM32Cubemx初始化

开启RTC时钟

 RTC详细设置

 3.程序实现

main.c相关初始化

 main.c中创建RTC相关变量

/*main.c*/

uint16_t RTC_tt=0;//RTC获取时间计时标志位
uint16_t RTC_Ref=0;//RTC获取时标志位
uint16_t RTC_HH=0,RTC_MM=0,RTC_SS=0;//获取时间变量
uint16_t RTC_Year=0,RTC_Month=0,RTC_Day=0;//获取日期变量

 Task_Time()函数扩充,以执行定时获取RTC值(移步②,查看该函数)

/*main.c*/

void Task_Time(void)
{
	if(++Key_tt==10)	{Key_tt=0;Key_Ref=1;}//按键扫描计时
	if(++Lcd_tt==200)	{Lcd_tt=0;Lcd_Ref=1;}//LCD刷新计时
	if(++ADC_tt==300)	{ADC_tt=0;ADC_Ref=1;}//ADC读取计时
	if(++MCP_tt==200)	{MCP_tt=0;MCP_Ref=1;}//MCP写入计时
	if(++DAC_tt==200)	{DAC_tt=0;DAC_Ref=1;}//DAC输出计时
	if(++RTC_tt==1000)	{RTC_tt=0;RTC_Ref=1;}//RTC获取计时
}

主循环中添加判断程序(RTC_CalendarGet();之后会讲到)

/*main.c*/ 
 
 while (1)
  {
 
	if(RTC_Ref==1)
	{
		RTC_Ref=0;//清除标志位
		RTC_CalendarGet();
	}
 
  }

RTC函数

在rtc.c中定义以下函数(函数讲解查看注释),并在rtc.h中声明

/*rtc.h*/

void RTC_CalendarGet(void);
void RTC_SetTime(uint16_t HH,uint16_t MM,uint16_t SS);
void RTC_SetDate(uint16_t Year,uint16_t Month,uint16_t Day);

RTC_CalendarGet()日期时间获取函数

声明外部变量

/*rtc.c*/

extern uint16_t RTC_HH,RTC_MM,RTC_SS;//获取时间变量
extern uint16_t RTC_Year,RTC_Month,RTC_Day;//获取日期变量

RTC_CalendarGet()编写

/*rtc.c*/

void RTC_CalendarGet(void)
{
	RTC_TimeTypeDef stimestructureget;//定义时间获取结构体
	RTC_DateTypeDef	sdatestructureget;//定义日期获取结构体
	/*应该先获取时间后获取日期*/
	HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);//获取时间
	HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);//获取日期
	/*获取日期时间到自己的变量*/

	RTC_HH=stimestructureget.Hours;
	RTC_MM=stimestructureget.Minutes;
	RTC_SS=stimestructureget.Seconds;
	
	RTC_Year=sdatestructureget.Year;
	RTC_Month=sdatestructureget.Month;
	RTC_Day=sdatestructureget.Date;
	
}

设置日期RTC_SetDate和时间RTC_SetTime

RTC_SetTime函数中的内容之就在rtc.c中的MX_RTC_Init()函数内容进行修改即可,读者可以自行进行查找和对比

/*rtc.c*/

void RTC_SetTime(uint16_t HH,uint16_t MM,uint16_t SS)
{
	
  RTC_TimeTypeDef sTime = {0};
	
  sTime.Hours = HH;
  sTime.Minutes = MM;
  sTime.Seconds = SS;

  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }

}

RTC_SetDate函数中的内容之就在rtc.c中的MX_RTC_Init()函数内容进行修改即可,读者可以自行进行查找和对比

/*rtc.c*/

void RTC_SetDate(uint16_t Year,uint16_t Month,uint16_t Day)
{

  RTC_DateTypeDef sDate = {0};
	
  sDate.Month = Month;
  sDate.Date = Day;
  sDate.Year = Year;

  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
	
}

相关函数定义位置stm43g4xx_hal_rtc.c

/*stm43g4xx_hal_rtc.c*/

HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format);
HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format);

在Task.c中声明外部变量,就可以通过该变量获取时间啦

/*Task.c*/

extern uint16_t RTC_HH,RTC_MM,RTC_SS;//获取时间变量
extern uint16_t RTC_Year,RTC_Month,RTC_Day;//获取日期变量

4.工程文件

该工程文件为全10讲所有内容,可以作为参考,不过还是希望读者能够自己手敲一遍,加深记忆

链接:https://pan.baidu.com/s/1LcNszc7_oHWvXcucCezlxg?pwd=hw07 
提取码:hw07

 

 自己做的笔记,也希望能对你有帮助! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别人家的孩子380

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值