STM32的RTC模块

写在前面:

其实并不困难,RTC已经整合在STM32芯片内部,你可以理解为一个比如AT24C02在芯片里面。

比如你现在要做一个时钟,你需要什么?

A一个一秒钟增加1的一个数

B一个把这个数转化成年月日的算法。

写在这个数u32我们放到全局中,每1S就增加一个,我们用32.768K的晶振,

因为越高越安全,其实我们会分频的,就是1s动一下。

准备空米快


typedef struct 
{
  u8 sec;
	u8 min;
	u8 hour;
	u8 week;
	u8 day;
	u8 mon;
	u8 year;
}_TM;


typedef struct 
{
	void (*init)(void);
	void (*GetTime)(_TM *);
	void (*SetTime)(_TM *);
}_RTC;

确定RTC需要干的活儿

很快吧init写好 抄袭刘洋的代码

void STEP1_RCC(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}

void STEP2_NVIC(void)
{
  NVIC_InitTypeDef NVIC_InitStructure; 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 

	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
	NVIC_Init(&NVIC_InitStructure);
}


void RTC_Configuration(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);

	//允许访问BKP区域
	PWR_BackupAccessCmd(ENABLE);
	//复位BKP
	BKP_DeInit();
	//使能外部低速晶振 32.768K
	RCC_LSEConfig(RCC_LSE_ON);
	//等待外部低速晶振就绪
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);
	//选择RTC外部时钟为低速晶振 32.768K
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
	//使能RTC时钟
	RCC_RTCCLKCmd(ENABLE);
	//等待RTC寄存器同步
	RTC_WaitForSynchro();
	//等待写RTC寄存器完成
	RTC_WaitForLastTask();
	//使能RTC秒中断
	RTC_ITConfig(RTC_IT_SEC,ENABLE);
	//等待写RTC寄存器完成
	RTC_WaitForLastTask();
	//设置预分频
	RTC_SetPrescaler(32767);
	//等待写RTC寄存器完成
	RTC_WaitForLastTask();
}

void Clock_Init(void)
{
	if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)
	{
	 	//第一次运行  初始化设置
		//RTC初始化
		RTC_Configuration();
		//等待写RTC寄存器完成
	    RTC_WaitForLastTask();
		//设置时间初值
		RTC_SetCounter(0xA442);
		//等待写RTC寄存器完成
	    RTC_WaitForLastTask();
		//写配置标志
		BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
	}
	else
	{
		//等待RTC寄存器同步
		RTC_WaitForSynchro();
		//等待写RTC寄存器完成
		RTC_WaitForLastTask();
		//使能RTC秒中断
	    RTC_ITConfig(RTC_IT_SEC,ENABLE);
        //等待写RTC寄存器完成
		RTC_WaitForLastTask();
	}

	RCC_ClearFlag();//清除复位标志;
}

void RTC_Init(void)
{
	STEP1_RCC();
	STEP2_NVIC();
	Clock_Init();
}

算法https://blog.csdn.net/wyzjoyful/article/details/52745918?open_source=weibo_search

中断

extern RTC_SEC;
#if 1
void RTC_IRQHandler(void)
{
   if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)//读取中断标志
   {
   		RTC_ClearITPendingBit(RTC_IT_SEC);//清楚中断标志
		  RTC_SEC=1;//秒中断标志
   }
}

问题遗留:

我现在是自己写的算法,GEEK代码呢?看不懂 头文件在库里面不在工程里面 它的2个算法

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/81504143