STM32中的RTC实时时钟和配套闹钟设置

这篇具有很好参考价值的文章主要介绍了STM32中的RTC实时时钟和配套闹钟设置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主要初始化函数,以及设置闹钟函数,闹钟中断函数

RTC.c

#include "rtc.h"
#include "delay.h"

//更改这个值,时间与日期将重新初始化
#define  BKP    24010


void Rtc_Init(void)
{
	RTC_InitTypeDef		RTC_InitStruct;
	RTC_TimeTypeDef		RTC_TimeStruct;
	RTC_DateTypeDef		RTC_DateStruct;
	
	//1、使能PWR时钟:
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	
	//2、使能后备寄存器访问。一个断电保存数据的寄存器
	PWR_BackupAccessCmd(ENABLE);
	
	//判断后备寄存器的值
	if(RTC_ReadBackupRegister(RTC_BKP_DR0) != BKP)
	{
		//3、配置RTC时钟源,使能RTC时钟:
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
		RCC_RTCCLKCmd(ENABLE);
		//如果使用LSE,要打开LSE:
		RCC_LSEConfig(RCC_LSE_ON);
		
		
		RTC_InitStruct.RTC_HourFormat	= RTC_HourFormat_24;  //24小时制
		RTC_InitStruct.RTC_AsynchPrediv	= 0x7F;  //128分频  异步分频
		RTC_InitStruct.RTC_SynchPrediv	= 0xFF;  //256分频  同步分频
		//4、 初始化RTC(同步/异步分频系数和时钟格式):
		RTC_Init(&RTC_InitStruct);
		
		RTC_TimeStruct.RTC_H12		= RTC_H12_PM; //下午
		RTC_TimeStruct.RTC_Hours	= 19;//时
		RTC_TimeStruct.RTC_Minutes	= 57;//分
		RTC_TimeStruct.RTC_Seconds  = 00;//秒
		//5、 设置时间:
		RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
		
		RTC_DateStruct.RTC_Year		= 24; 	//年
		RTC_DateStruct.RTC_Month	= 1;	//月
		RTC_DateStruct.RTC_Date		= 3;	//日
		RTC_DateStruct.RTC_WeekDay	= 3;	//星期
		//6、设置日期:
		RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);
			
		//将值写入后备寄存器
		RTC_WriteBackupRegister(RTC_BKP_DR0,BKP);
	}
}


//闹钟A初始化
void RTC_Alarm_A_Init(void)
{
	RTC_AlarmTypeDef	RTC_AlarmStruct;
	RTC_TimeTypeDef 	RTC_AlarmTimeSet;
	EXTI_InitTypeDef   EXTI_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;	
	

	//关闭闹钟:
	RTC_AlarmCmd(RTC_Alarm_A,DISABLE); 
	
	RTC_AlarmTimeSet.RTC_H12		= RTC_H12_PM; //下午
	RTC_AlarmTimeSet.RTC_Hours		= 16;//时
	RTC_AlarmTimeSet.RTC_Minutes	= 37;//分
	RTC_AlarmTimeSet.RTC_Seconds  	= 15;//秒
	
	
	RTC_AlarmStruct.RTC_AlarmTime	= RTC_AlarmTimeSet;		//闹钟时间设置
	RTC_AlarmStruct.RTC_AlarmMask	= RTC_AlarmMask_None;	//无掩码位 按实际时间响应闹钟
	RTC_AlarmStruct.RTC_AlarmDateWeekDaySel	= RTC_AlarmDateWeekDaySel_Date;//按日期进行响应闹钟
	RTC_AlarmStruct.RTC_AlarmDateWeekDay	= 3;  //3号
	//3、配置闹钟参数:
	RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStruct);
	

	EXTI_InitStructure.EXTI_Line 	= EXTI_Line17;			//中断/事件线
	EXTI_InitStructure.EXTI_Mode 	= EXTI_Mode_Interrupt;	//中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;		//中断线使能
	//配置NVIC
	EXTI_Init(&EXTI_InitStructure);
	
	/* Enable and set EXTI Line0 Interrupt to the lowest priority */
	NVIC_InitStructure.NVIC_IRQChannel 					 = RTC_Alarm_IRQn; //中断通道,中断通道在stm32f4xx.h查找
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;  	//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority 		 = 0x01;	//响应优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd 				 = ENABLE;	//通道使能
	NVIC_Init(&NVIC_InitStructure);	
	
	
	//开启配置闹钟中断:
     RTC_ITConfig(RTC_IT_ALRA, ENABLE);	
	//开启闹钟:
	RTC_AlarmCmd(RTC_Alarm_A,ENABLE);
}


//闹钟B初始化
void RTC_Alarm_B_Init(void)
{
	RTC_AlarmTypeDef	RTC_AlarmStruct;
	RTC_TimeTypeDef 	RTC_AlarmTimeSet;
	EXTI_InitTypeDef   EXTI_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;	
	

	//关闭闹钟:
	RTC_AlarmCmd(RTC_Alarm_B,DISABLE); 
	
	RTC_AlarmTimeSet.RTC_H12		= RTC_H12_PM; //下午
	RTC_AlarmTimeSet.RTC_Hours		= 16;//时
	RTC_AlarmTimeSet.RTC_Minutes	= 37;//分
	RTC_AlarmTimeSet.RTC_Seconds  	= 25;//秒
	
	
	RTC_AlarmStruct.RTC_AlarmTime	= RTC_AlarmTimeSet;		//闹钟时间设置
	RTC_AlarmStruct.RTC_AlarmMask	= RTC_AlarmMask_None;	//无掩码位 按实际时间响应闹钟
	RTC_AlarmStruct.RTC_AlarmDateWeekDaySel	= RTC_AlarmDateWeekDaySel_Date;//按日期进行响应闹钟
	RTC_AlarmStruct.RTC_AlarmDateWeekDay	= 3;  //3号
	//3、配置闹钟参数:
	RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_B, &RTC_AlarmStruct);
	
	
	EXTI_InitStructure.EXTI_Line 	= EXTI_Line17;			//中断/事件线
	EXTI_InitStructure.EXTI_Mode 	= EXTI_Mode_Interrupt;	//中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;		//中断线使能
	//配置NVIC
	EXTI_Init(&EXTI_InitStructure);
	
	/* Enable and set EXTI Line0 Interrupt to the lowest priority */
	NVIC_InitStructure.NVIC_IRQChannel 					 = RTC_Alarm_IRQn; //中断通道,中断通道在stm32f4xx.h查找
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;  	//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority 		 = 0x01;	//响应优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd 				 = ENABLE;	//通道使能
	NVIC_Init(&NVIC_InitStructure);	
	
	
	//开启配置闹钟中断:
     RTC_ITConfig(RTC_IT_ALRB, ENABLE);	
	//开启闹钟:
	RTC_AlarmCmd(RTC_Alarm_B,ENABLE);

}

void RTC_Alarm_IRQHandler(void)
{
	//判断中断标志位是否置1
	if(EXTI_GetITStatus(EXTI_Line17) == SET)
	{
			if(RTC_GetFlagStatus(RTC_FLAG_ALRAF) == SET)
			{
				GPIO_ResetBits(GPIOF, GPIO_Pin_9);
			
				RTC_ClearFlag(RTC_FLAG_ALRAF);
			}
			
			if(RTC_GetFlagStatus(RTC_FLAG_ALRBF) == SET)
			{
				GPIO_SetBits(GPIOF, GPIO_Pin_9);
			
				RTC_ClearFlag(RTC_FLAG_ALRBF);
			}		
		//清除中断标志位
		EXTI_ClearITPendingBit(EXTI_Line17);	
	}
}

RTC.h

#ifndef __RTC_H
#define __RTC_H

#include "stm32f4xx.h"


void Rtc_Init(void);
void RTC_Alarm_A_Init(void);
void RTC_Alarm_B_Init(void);
void RTC_Alarm_set(uint32_t Alarm_X ,uint32_t IT_ALRX, uint8_t Hours, uint8_t Minutes , uint8_t  Seconds , uint8_t  AlarmDateWeekDay);

#endif

main.c文章来源地址https://www.toymoban.com/news/detail-856391.html

	
	Rtc_Init();
	
	RTC_Alarm_A_Init();

	RTC_Alarm_B_Init();
	
	
	//设置闹钟时间
	RTC_Alarm_set(RTC_Alarm_A,RTC_IT_ALRA,17,02,5,3);
	

	while(1)
	{
		RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
		RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
		
		printf("日期:%d年%d月%d日\r\n",RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, RTC_DateStruct.RTC_Date);
		printf("时间:%d:%d:%d\r\n",RTC_TimeStruct.RTC_Hours, RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds);
		

到了这里,关于STM32中的RTC实时时钟和配套闹钟设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32——RTC实时时钟

    Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间 底层使用秒计数器可以节省硬件设计电路,

    2024年01月23日
    浏览(42)
  • STM32-RTC实时时钟

    目录 RTC实时时钟 功能框图 UNIX时间戳 初始化结构体 RTC时间结构体 RTC日期结构体 RTC闹钟结构体 进入和退出配置函数 实验环节1:显示日历 常规配置 RTC配置 测试环节 实验现象 实验环节2:闹钟 常规配置 RTC配置 测试环节 实验现象 STM32的RTC外设,实质上是一个 掉电后还继续运

    2024年02月06日
    浏览(49)
  • 【STM32】RTC(实时时钟)

    本质:计数器 RTC中断是外部中断(EXTI) 当VDD掉电的时候,Vbat可以通过电源---实时计时 STM32的RTC外设(Real Time Clock),实质是一个   掉电   后还继续运行的定时器。从定时器的角度来说,相对于通用定时器TIM外设,它十分简单, 只有很纯粹的计时和触发中断的功能 ;但从

    2024年02月03日
    浏览(49)
  • STM32-RTC实时时钟详解

    RTC的本质很简单,就是一个时钟经过精确分频最后得到的一个1Hz的时钟,也可以说是计数器,其他大部分功能都是基于这个计数器设计的数字逻辑。 本文讲的RTC是基于STM32F030来讲的,相比与F1系列的RTC来说,M0的将很多原本需要软件实现的功能硬件化了,使用起来更加便利。

    2024年02月04日
    浏览(47)
  • 【STM32学习】实时时钟 —— RTC

    STM32RTC实时时钟实验讲解,从入门到放弃 【STM32】RTC休眠唤醒(停机模式)、独立看门狗开启状态下 关于STM32使用RTC唤醒停止模式的设置 RTC(Real Time Clock):实时时钟,是指可以像时钟一样输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。总之,RTC只是个能靠电

    2024年02月01日
    浏览(48)
  • STM32-实时时钟RTC-2

                                     

    2024年01月20日
    浏览(47)
  • STM32基础10--实时时钟(RTC)

     目录 前言 RTC框图 STM32实时时钟电路 功能需要 STM32CubeMx配置RTC 配置RCC 配置RTC 配置时间,闹钟,唤醒 开启中断 设置中断优先级 功能代码实现 STM32Cude生成RTC初始化 自定义触发闹钟次数变量  重写周期唤醒回调函数 重写闹钟中断函数         在做51单片机项目时,如果需

    2023年04月11日
    浏览(39)
  • STM32学习笔记(十二)丨RTC实时时钟

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断   

    2024年02月16日
    浏览(48)
  • stm32-OLED屏+RTC实现简易实时时钟(上篇)

    oled屏选择ssd1306,使用RTC实现简易实时时钟 1、MCU接口选择 SSD1306单片机接口由8个数据引脚和5个控制引脚组成。通过BS[2:0]引脚上的硬件选择可以设置不同的MCU模式    通过控制BS[2:0]引脚可以设置MCU与OLED屏的通信方式。因为我使用的是正点原子的开发板,所以我用了适配的接

    2024年01月17日
    浏览(48)
  • stm32-OLED屏+RTC实现简易实时时钟(下篇)

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

    2024年01月18日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包