【正点原子STM32】正点原子RTC移植到C8T6

本文详细描述了如何在STM32C8T6开发板上优化RTC时钟,解决时间偏差问题,重点介绍了使用LSI振荡器作为RTC时钟源,取消BKP写保护并配置RTC的步骤。
摘要由CSDN通过智能技术生成

 #参考来自正点原子RTC实时时钟实验

最近使用到RTC时钟做实时时间,但直接使用原子哥官网的代码烧录到C8T6开发板时,会发现时间显示存在偏差。为了确保时间的准确性,需要对RTC(实时时钟)的时钟源进行调整。以下是具体的优化步骤:

1、RTC时钟介绍

        STM32 的实时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,可提供时钟等功能。修改计数器的值可以重新设置系统当前的时间和日期。
        RTC 模块时钟配置系统(RCC BDCR 寄存器)是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。

2、RTC框图

3、三种RTC时钟源

HSE时钟除以128:
LSE振荡器时钟;
LSI振荡器时钟;

4、代码修改

主要修改RTC_init()函数

修改后代码

u8 RTC_Init(void)
{
	//检查是不是第一次配置时钟
	u8 temp=0;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//使能PWR和BKP外设时钟   
	PWR_BackupAccessCmd(ENABLE);	//使能后备寄存器访问  
	if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)		//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
	{	 			 
		BKP_DeInit();	//复位备份区域 	
		RCC_LSICmd(ENABLE);//使能LSI 
		while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)//检查指定的RCC标志位设置与否,等待LSI就绪
		{
			temp++;
			delay_ms(10);
		}
		if(temp>=250)return 1;//初始化时钟失败,晶振有问题	    
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);		//设置RTC时钟(RTCCLK),选择LSI作为RTC时钟    
		RCC_RTCCLKCmd(ENABLE);	//使能RTC时钟  
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_WaitForSynchro();		//等待RTC寄存器同步  
		RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE);		//使能RTC秒中断,RTC_IT_ALR--闹钟时间
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_EnterConfigMode();/// 允许配置	
		RTC_SetPrescaler(40000-1); //设置RTC预分频的值
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_Set(2018,1,14,17,42,55);  //设置时间	--- 重新修改得也把0x5050改了
		RTC_ExitConfigMode(); //退出配置模式  
		BKP_WriteBackupRegister(BKP_DR1, 0X5050);	//向指定的后备寄存器中写入用户程序数据
	}
	else//系统继续计时
	{

		RTC_WaitForSynchro();	//等待最近一次对RTC寄存器的写操作完成
		RTC_ITConfig(RTC_IT_SEC, ENABLE);	//使能RTC秒中断
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
	}
	RTC_NVIC_Config();//RCT中断分组设置		    				     
	RTC_Get();//更新时间	
	return 0; //ok

}	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值