目录
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
自己做的笔记,也希望能对你有帮助!