STM32实时时钟

RTC(real time clock)实时时钟

STM32的RTC外设,实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运行来看,它是STM32中唯一一个具有这个功能的外设(RTC外设的复杂之处不在于它的定时,而在于它掉电还可以继续运行的特性)。

所谓掉电,是指电源VDD断开的情况下,为了RTC外设掉电可以继续运行,必须给STM32芯片通过VBAT引脚街上锂电池.当主电源VDD有效时,由VDD给RTC外设供电.当VDD掉电后,由VBAT给RTC外设供电.无论由什么电源供电,RTC中的数据始终都保存在属于RTC的备份域中,如果主电源和VBA都掉电,那么备份域中保存的所有数据都将丢失(备份域除了RTC模块的寄存器,还有42个16位的寄存器可以在VDD掉电的情况下保存用户程序的数序,系统复位或电源复位时,这些数据也不会被复位)
 

RTC时钟源:
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

● HSI振荡器时钟
● HSE振荡器时钟
● PLL时钟

RTC原理图

RTC时钟的框图还是比较简单的,这里我们把他分成两个部分:

APB1 接口:用来和 APB1 总线相连。 此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。

通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC 核心接口:由一组可编程计数器组成,分成两个主要模块 。

RTC特征:
1.可编程的预分频系数:分频系数最高2^20。
2.32位的可编程计数器,可用于较长时间段的测量。
3.2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上)。
4.可以选择以下三种RTC时钟源:
—— HSE时钟除以128;
—— LSE振荡器时钟:
—— LSI震荡器时钟。
5.2个独立的复位类型:
—— APB1接口由系统复位;
—— RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位。
6.3个专门的可屏蔽中断:
—— 闹钟中断,用来产生一个软件可编程的闹钟中断。
—— 秒中断,用来产生一个可编程的周期性中断信号(最长1s)。
—— 溢出中断,指示内部可编程计数器溢出并回转为0的状态。

RTC相关库函数

1、RTC时钟源和时钟操作函数

void RCC_RTCCLKConfig(uint32_t  CLKSource);//时钟源选择
 void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能

2、RTC配置函数(预分频,计数值:

void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL
void RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTL
void RTC_SetAlarm(uint32_t AlarmValue);//闹钟设置:ALRH/ALRL

3、RTC中断设置函数

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH

4、RTC允许配置和退出配置函数

void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF
void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF

5、同步函数

void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF
 void RTC_WaitForSynchro(void);//等待时钟同步:CRL位RSF

6、相关状态位获取清除函数:

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);

7、其他相关函数

PWR_BackupAccessCmd();//BKP后备区域访问使能
RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟
RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源
 PWR_BackupAccessCmd();//BKP后备区域访问使能
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP

其他相关函数(BKP等)

RTC配置步骤:
1.使能PWR和BKP时钟:RCC_APB1PeriphClockCmd();
2. 使能后备寄存器访问: PWR_BackupAccessCmd();
3. 配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
4.设置RTC预分频系数:RTC_SetPrescaler();
5. 设置时间:RTC_SetCounter();
6.开启相关中断(如果需要):RTC_ITConfig();
7.编写中断服务函数:RTC_IRQHandler();
8.部分操作要等待写操作完成和同步。
RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步

RTC代码如下

rtc.c

#include "rtc.h"
#include "led.h"
#include "delay.h"
#include "usart.h" 
 
NVIC_InitTypeDef   NVIC_InitStructure;
 
//RTC时间设置
//hour,min,sec:小时,分钟,秒钟
//ampm:@RTC_AM_PM_Definitions  :RTC_H12_AM/RTC_H12_PM
//返回值:SUCEE(1),成功
//       ERROR(0),进入初始化模式失败 
ErrorStatus RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm)
{
	RTC_TimeTypeDef RTC_TimeTypeInitStructure;
	
	RTC_TimeTypeInitStructure.RTC_Hours=hour;
	RTC_TimeTypeInitStructure.RTC_Minutes=min;
	RTC_TimeTypeInitStructure.RTC_Seconds=sec;
	RTC_TimeTypeInitStructure.RTC_H12=ampm;
	
	return RTC_SetTime(RTC_Format_BIN,&RTC_TimeTypeInitStructure);
}
 
 
//RTC日期设置
//year,month,date:年(0~99),月(1~12),日(0~31)
//week:星期(1~7,0,非法!)
//返回值:SUCEE(1),成功
//       ERROR(0),进入初始化模式失败 
ErrorStatus RTC_Set_Date(u8 year,u8 month,u8 date,u8 week)
{
	
	RTC_DateTypeDef RTC_DateTypeInitStructure;
	RTC_DateTypeInitStructure.RTC_Date=date;
	RTC_DateTypeInitStructure.RTC_Month=month;
	RTC_DateTypeInitStructure.RTC_WeekDay=week;
	RTC_DateTypeInitStructure.RTC_Year=year;
	return RTC_SetDate(RTC_Format_BIN,&RTC_DateTypeInitStructure);
}
 
//RTC初始化
//返回值:0,初始化成功;
//       1,LSE开启失败;
//       2,进入初始化模式失败;
u8 My_RTC_Init(void)
{
	RTC_InitTypeDef RTC_InitStructure;
	u16 retry=0X1FFF; 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
	PWR_BackupAccessCmd(ENABLE);	//使能后备寄存器访问 
	
	if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)		//是否第一次配置?
	{
		RCC_LSEConfig(RCC_LSE_ON);//LSE 开启    
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)	//检查指定的RCC标志位设置与否,等待低速晶振就绪
			{
			retry++;
			delay_ms(10);
			}
		if(retry==0)return 1;		//LSE 开启失败. 
			
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
		RCC_RTCCLKCmd(ENABLE);	//使能RTC时钟 
 
        RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//RTC异步分频系数(1~0X7F)
        RTC_InitStructure.RTC_SynchPrediv  = 0xFF;//RTC同步分频系数(0~7FFF)
        RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;//RTC设置为,24小时格式
        RTC_Init(&RTC_InitStructure);
 
		RTC_Set_Time(23,59,56,RTC_H12_AM);	//设置时间
		RTC_Set_Date(14,5,5,1);		//设置日期
	 
		RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050);	//标记已经初始化过了
	} 
 
	return 0;
}
 
//设置闹钟时间(按星期闹铃,24小时制)
//week:星期几(1~7) @ref  RTC_Alarm_Definitions
//hour,min,sec:小时,分钟,秒钟
void RTC_Set_AlarmA(u8 week,u8 hour,u8 min,u8 sec)
{ 
	EXTI_InitTypeDef   EXTI_InitStructure;
	RTC_AlarmTypeDef RTC_AlarmTypeInitStructure;
	RTC_TimeTypeDef RTC_TimeTypeInitStructure;
	
	RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//关闭闹钟A 
	
    RTC_TimeTypeInitStructure.RTC_Hours=hour;//小时
	RTC_TimeTypeInitStructure.RTC_Minutes=min;//分钟
	RTC_TimeTypeInitStructure.RTC_Seconds=sec;//秒
	RTC_TimeTypeInitStructure.RTC_H12=RTC_H12_AM;
  
	RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDay=week;//星期
	RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_WeekDay;//按星期闹
	RTC_AlarmTypeInitStructure.RTC_AlarmMask=RTC_AlarmMask_None;//精确匹配星期,时分秒
	RTC_AlarmTypeInitStructure.RTC_AlarmTime=RTC_TimeTypeInitStructure;
    RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmTypeInitStructure);
 
	
	RTC_ClearITPendingBit(RTC_IT_ALRA);//清除RTC闹钟A的标志
    EXTI_ClearITPendingBit(EXTI_Line17);//清除LINE17上的中断标志位 
	
	RTC_ITConfig(RTC_IT_ALRA,ENABLE);//开启闹钟A中断
	RTC_AlarmCmd(RTC_Alarm_A,ENABLE);//开启闹钟A 
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line17;//LINE17
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE17
    EXTI_Init(&EXTI_InitStructure);//配置
 
	NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);//配置
}
 
//周期性唤醒定时器设置  
/*wksel:  @ref RTC_Wakeup_Timer_Definitions
#define RTC_WakeUpClock_RTCCLK_Div16        ((uint32_t)0x00000000)
#define RTC_WakeUpClock_RTCCLK_Div8         ((uint32_t)0x00000001)
#define RTC_WakeUpClock_RTCCLK_Div4         ((uint32_t)0x00000002)
#define RTC_WakeUpClock_RTCCLK_Div2         ((uint32_t)0x00000003)
#define RTC_WakeUpClock_CK_SPRE_16bits      ((uint32_t)0x00000004)
#define RTC_WakeUpClock_CK_SPRE_17bits      ((uint32_t)0x00000006)
*/
//cnt:自动重装载值.减到0,产生中断.
void RTC_Set_WakeUp(u32 wksel,u16 cnt)
{ 
	EXTI_InitTypeDef   EXTI_InitStructure;
	
	RTC_WakeUpCmd(DISABLE);//关闭WAKE UP
	
	RTC_WakeUpClockConfig(wksel);//唤醒时钟选择
	
	RTC_SetWakeUpCounter(cnt);//设置WAKE UP自动重装载寄存器
	
	
	RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC WAKE UP的标志
    EXTI_ClearITPendingBit(EXTI_Line22);//清除LINE22上的中断标志位 
	 
	RTC_ITConfig(RTC_IT_WUT,ENABLE);//开启WAKE UP 定时器中断
	RTC_WakeUpCmd( ENABLE);//开启WAKE UP 定时器 
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line22;//LINE22
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE22
    EXTI_Init(&EXTI_InitStructure);//配置
 
 
	NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);//配置
}
 
//RTC闹钟中断服务函数
void RTC_Alarm_IRQHandler(void)
{    
	if(RTC_GetFlagStatus(RTC_FLAG_ALRAF)==SET)//ALARM A中断?
	{
		RTC_ClearFlag(RTC_FLAG_ALRAF);//清除中断标志
		printf("ALARM A!\r\n");
	}   
	EXTI_ClearITPendingBit(EXTI_Line17);	//清除中断线17的中断标志 											 
}
 
//RTC WAKE UP中断服务函数
void RTC_WKUP_IRQHandler(void)
{    
	if(RTC_GetFlagStatus(RTC_FLAG_WUTF)==SET)//WK_UP中断?
	{ 
		RTC_ClearFlag(RTC_FLAG_WUTF);	//清除中断标志
		LED1=!LED1; 
	}   
	EXTI_ClearITPendingBit(EXTI_Line22);//清除中断线22的中断标志 								
}

main.c

#include "sys.h"
#include "delay.h"  
#include "usart.h"  
#include "rtc.h"
 
int main(void)
{ 
	RTC_TimeTypeDef RTC_TimeStruct;
	RTC_DateTypeDef RTC_DateStruct;
 
	u8 tbuf[40];
	u8 t=0;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);      //初始化延时函数
	uart_init(115200);		//初始化串口波特率为115200
	My_RTC_Init();		 		//初始化RTC
 
	RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);		//配置WAKE UP中断,1秒钟中断一次
		
  	while(1) 
	{		
		t++;
		if((t%10)==0)	//每100ms更新一次显示数据
		{
			RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
	sprintf((char*)tbuf,"Time:%02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds); 
			printf("%s\r\n",tbuf);	
			
			RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
			sprintf((char*)tbuf,"Date:20%02d-%02d-%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date); 
			printf("%s\r\n",tbuf);	
	
			sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.RTC_WeekDay); 
			printf("%s\r\n",tbuf);	
		} 
		if((t%20)==0)LED0=!LED0;	//每200ms,翻转一次LED0 
		delay_ms(10);
	}	
}


 

 

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
rtcSTM32 STM32 STM32的实时钟( 实时钟( 实时钟( RTCRTCRTC)是一个独立的定时器。 )是一个独立的定时器。 )是一个独立的定时器。 )是一个独立的定时器。 )是一个独立的定时器。 STM32STM32 STM32的 RTCRTCRTC模块拥有一组连续计数 模块拥有一组连续计数 模块拥有一组连续计数 模块拥有一组连续计数 模块拥有一组连续计数 的计数器, 的计数器, 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 在相应软件配置下,可提供时钟日历的功能。修改计数器值以重新设系统当 前的时间和日期。 前的时间和日期。 前的时间和日期。 前的时间和日期。 RTCRTCRTC模块和时钟配置系统 模块和时钟配置系统 模块和时钟配置系统 模块和时钟配置系统 模块和时钟配置系统 (RCC_BDCR(RCC_BDCR(RCC_BDCR(RCC_BDCR(RCC_BDCR(RCC_BDCR(RCC_BDCR(RCC_BDCR(RCC_BDCR寄存器 寄存器 )是在后备区域,即系统复位或从待机模式 是在后备区域,即系统复位或从待机模式 是在后备区域,即系统复位或从待机模式 是在后备区域,即系统复位或从待机模式 是在后备区域,即系统复位或从待机模式 是在后备区域,即系统复位或从待机模式 是在后备区域,即系统复位或从待机模式 是在后备区域,即系统复位或从待机模式 是在后备区域,即系统复位或从待机模式 唤醒后 唤醒后 RTCRTCRTC的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器的设置和 时间维持不变。但是在系统复位后,会自动禁止访问备寄存器RTCRTCRTC, 以防止对后备区域 以防止对后备区域 以防止对后备区域 以防止对后备区域 (BKP)(BKP)(BKP)(BKP)(BKP)的意外写操作。所以在要设置时间之前, 的意外写操作。所以在要设置时间之前, 的意外写操作。所以在要设置时间之前, 的意外写操作。所以在要设置时间之前, 的意外写操作。所以在要设置时间之前, 的意外写操作。所以在要设置时间之前, 的意外写操作。所以在要设置时间之前, 的意外写操作。所以在要设置时间之前, 的意外写操作。所以在要设置时间之前, 先要取消备份区域( 先要取消备份区域( 先要取消备份区域( 先要取消备份区域( 先要取消备份区域( BKPBKPBKP) 写保护。 写保护。 RTCRTCRTC的简化框图,如 的简化框图,如 的简化框图,如 的简化框图,如 图 20.1. 0.1. 1所示: 所
基于STM32实时时钟(RTC)万年历代码是用于实现日期、时间和万年历功能的程序。以下是一个简单的示例代码: ```c #include "stm32f4xx.h" #include "stm32f4xx_rtc.h" #include "stm32f4xx_rcc.h" #include "stdio.h" void RTC_Configuration(void); int main(void) { RTC_Configuration(); // 配置RTC while (1) { RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DateStructure; RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); // 获取当前时间 RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure); // 获取当前日期 printf("Current Date: %02d-%02d-%04d\n", RTC_DateStructure.RTC_Date, RTC_DateStructure.RTC_Month, RTC_DateStructure.RTC_Year + 2000); printf("Current Time: %02d:%02d:%02d\n", RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds); printf("Day of Week: %d\n", RTC_DateStructure.RTC_WeekDay); // 延时1秒 for (int i = 0; i < 1000000; i++){} RTC_ClearFlag(RTC_FLAG_SEC); // 清除秒中断标志位 } } void RTC_Configuration(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 使能PWR时钟 PWR_BackupAccessCmd(ENABLE); // 允许访问RTC和后备寄存器 RCC_LSEConfig(RCC_LSE_ON); // 使能LSE外部晶振 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){} // 等待LSE晶振稳定 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // 选择RTC时钟源为LSE RCC_RTCCLKCmd(ENABLE); // 使能RTC时钟 RTC_InitTypeDef RTC_InitStructure; RTC_StructInit(&RTC_InitStructure); RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; // 使用24小时制 RTC_InitStructure.RTC_AsynchPrediv = 127; // RTC异步分频器预分频值 RTC_InitStructure.RTC_SynchPrediv = 255; // RTC同步分频器预分频值 RTC_Init(&RTC_InitStructure); // 初始化RTC RTC_DateTypeDef RTC_DateStructure; // 设置初始日期为2021年1月1日 RTC_DateStructure.RTC_Month = RTC_Month_January; RTC_DateStructure.RTC_Date = 1; RTC_DateStructure.RTC_Year = 21; RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Thursday; RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure); } ``` 以上代码实现了一个基于STM32实时时钟(RTC)万年历功能。在`main`函数中,获取并显示当前的日期、时间和星期几,并通过循环每秒刷新显示。`RTC_Configuration`函数用于配置RTC相关的寄存器和时钟源,并设置初始日期为2021年1月1日。请注意,此示例代码仅供参考,并且可能需要根据具体的STM32型号和开发环境进行适当的调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值