STM32单片机RTC闹钟控制

前言

 时钟,类似于人类世界的时间一样,我们在每个时间做不同的事,而单片机里面也有时间,为每个外设提供时钟频率的就是每个单片机都有的晶振,晶振就像单片机的心脏一样,每时每刻都在做滴答时钟跳动,根据这种滴答时钟产生不同的时钟频率,可以根据自己的项目需要对每个外设调整不同的时钟频率。

本次实验目的:

①设置单片机时间并显示时间。

③RTC中alarm闹钟控制LED灯亮灭。

使用单片机型号STM32F103系列

一,RTC简介

RTC又叫实时时钟,单片机根据用户设定的时间走向显示时间,RTC有三个时钟源,HSE外部高速时钟,LSE外部低速时钟,需要外界一个32.768k的时钟来源,另外一个就是LSI内部低速时钟,这个时钟不需要外部时钟来源,直接可以使用的,三个不同的时钟来源决定了ALARM时间的精准度不同,如果项目对时间要求精度较高,可以使用HSE这个时钟频率。假如你的项目是需要一个月或者半年上报一次事件,可以使用LSI时钟来源,时间间隔不大的可以使用LSE时钟。需要注意的是:时间要求精度越高,功耗越高,对低功耗产品不友好。

1.2 RTC Cubemax 设置

1.2.1RTC 功能信息配置

Rtc Alarm 中断使能

为了更好查看实验现象,串口输出日志成了必不可少的辅助工具。

有关串口如何打印输出日志,请参考其他博文。

1.2.2RTC时钟树配置

RTC时钟来源有三个:分别是HSE(外部高速时钟),LSE(外部低速时钟),LSI(内部低速时钟),其中LSI不需要外接时钟来源可以使用,为了方便,直接使用的LSI时钟,想要使用HSE,LSE时钟,建议把以下这两个使能,就可以选择HSE,LSE时钟源,内部时钟选择和RTC一样的频率40MHZ。

二,RTC相关实验

2.1设置和显示RTC时间

Cubemax生成代码之后,首先显示一下,我们在CUBE里设置的时间,

串口打印日志:

输出日志和CUBE里设置基本一致,但是显示年不对,可以对工程中rtc.c中参数进行修改

修改完成,串口输出日志

到这一步已经实现设置和显示RTC时间,但是每次修改单片机时间都要到rtc.c那个文件中去修改很麻烦,显示时候每次都是这么多代码很浪费代码空间,所以,可以写两个通用函数,设置RTC时间和显示RTC。

设置RCT时间函数:

//RTC 设置时间
int RTC_Set(u8 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
	 RTC_TimeTypeDef  stim={0};
	 RTC_DateTypeDef sDate = {0};
			
	    if((hour < 0 ||hour >24) || ( min <0 ||min >60 ) || (sec<0 ||  sec >60))
	  {
			Error_Handler();
			return -1;
	  }
		stim.Hours=hour;
		stim.Minutes=min;
		stim.Seconds=sec;
      if (HAL_RTC_SetTime(&hrtc, &stim, RTC_FORMAT_BIN) != HAL_OK)
    {
         Error_Handler();
    }
		
		sDate.WeekDay = RTC_WEEKDAY_MONDAY;
		sDate.Month = smon;
		sDate.Date = sday;
		sDate.Year = syear;     //-2000;
		
		if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
		{
			Error_Handler();
		}
			
		return 0;
}

显示RTC函数

//RTC 显示函数
void Rtc_time_show(void)
{
    RTC_TimeTypeDef gTim={0};
	RTC_DateTypeDef gDat={0};
	HAL_RTC_GetTime(&hrtc,&gTim,RTC_FORMAT_BIN); //»ñȡϵͳÉèÖÃÈÕÆÚ
	HAL_RTC_GetDate(&hrtc,&gDat,RTC_FORMAT_BIN);  //»ñȡϵͳÉèÖÃÈÕÆÚ
    printf("\r\nNow Date:20%02d-%02d-%02d\n",gDat.Year,gDat.Month,gDat.Date);
	printf("Now Time:%02d:%02d:%02d\n",gTim.Hours,gTim.Minutes,gTim.Seconds);
}

main函数

串口显示:

2.2 RTC中ALAM控制LED灯亮灭

ALARM中断在Cube中已开,进入闹钟中断中LED亮,输出日志闹钟时间到。

2.2.1一次性ALARM闹钟事件

想法:

在设置完时间后,给一个1分钟的闹钟事件。

注意:这个闹钟函数是搬运rtc.c初始化alarm A 中代码来的,在设置闹钟时,要求设置闹钟时间要和本地RTC时间保持一直,比如你单片机设置时间是12:00:00,你想设置一个30S的闹钟,这个函数就不能只传入0,0,30这三个参数,这样的参数代表是,凌晨十二点零点三十秒时间的闹钟,正确应该是(12,0,30),这个函数只能设置一次性闹钟事件,每次在重设时间时会生效。

代码:

//RTC 闹钟1
int RTC_ALARM_SET1(u8 hour,u8 min,u8 sec)
{
		RTC_AlarmTypeDef sAlarm = {0};
  if((hour < 0 ||hour >24) || ( min <0 ||min >60 ) || (sec<0 ||  sec >60))
	  {
			Error_Handler();
			return -1;
	  }
   sAlarm.AlarmTime.Hours = hour;
   sAlarm.AlarmTime.Minutes = min;
   sAlarm.AlarmTime.Seconds = sec;
   sAlarm.Alarm = RTC_ALARM_A;
  if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }
	return 0; 

}

串口输出日志

2.2.2 多次ALAM闹钟触发

待续......

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值