要想驱动RTC很简单,查看stm32f10x参考手册找到以下图片内容,就有思路了。
经过参考手册介绍
LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供
一个低功耗且精确的时钟源。
我们选用LSE时钟源。
根据以上图片作者的思路是:
1.首先使能对应位 进行访问RTC
2.选择对应时钟源
3.配置RTC
4 .选择中断
参考如下图便可以写代码了。
最后得出代码 便可驱动RTC(代码有注释):
void rtc_init(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE); //使能BKPEN位
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //使能PWREN位
PWR_BackupAccessCmd(ENABLE); //使能PWR_CR的DBP位
RCC_LSEConfig(RCC_LSE_ON); //配置LSE时钟源开
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RTCCLK时钟源配置为LSE
RCC_RTCCLKCmd(ENABLE); //使能RTCCLK配置生效
RTC_WaitForLastTask(); //等待RTOFF位为1
RTC_EnterConfigMode(); //进入配置模式
RTC_WaitForLastTask(); //根据配置RTC寄存器得 每次写RTC的寄存器都要等待RTOFF位为1
RTC_SetCounter(1672502392); //RTC从这个数开始计时 这是时间戳 可以上网查时间戳转换
RTC_WaitForLastTask(); //再次等待写入完成
RTC_SetPrescaler(0x7fff); //预分频设定为0x7fff = 32.767 LSE为32.768Khz分频后约得 1KHZ
RTC_WaitForLastTask(); //再次等待写入完成
RTC_ITConfig(RTC_IT_SEC,ENABLE);//RTC中断配置,让秒中断使能
RTC_WaitForLastTask();//再次等待写入完成
RTC_ExitConfigMode(); //离开配置模式
RTC_WaitForLastTask();//再次等待写入完成
NVIC_InitStruct.NVIC_IRQChannel = RTC_IRQn; //NVIC是总中断配置 选择RTC这个中断通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //中断使能
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //中断优先级2
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; //同等优先级下 这个中断优先级3
NVIC_Init(&NVIC_InitStruct); //让上面配置生效
}
-------------------------------------------------虚线为止已经驱动好RTC了---------------------------------------
下面读取RTC里面的值:
/*
函数功能:RTC读取
函数参数:无
函数返回值:无
函数描述:无
*/
void Rtc_Read(void)
{
RTC_WaitForSynchro(); //软件等待RTC_CRL中的RSF位置1
TIME = RTC_GetCounter();//正式读取
timeinfo = localtime(&TIME); //用time.h头文件里面的函数进行 数据处理
}
------------------------读取内容完毕--------------------------------------------------------------------------
读内容说明
在主函数文件里面定义了如下变量
uint32_t TIME;
struct tm* timeinfo;
读取到的内容 经过数据处理后 可用 结构体指针 取得想要的年月日时分秒。
图里面的内容不是定义的 是time.h文件自带的 。
觉得对你有点帮助的朋友麻烦点点赞,鼓励一下!谢谢 亲 们