STM32的时钟可以使用内部RTC产生时钟日历,也可以使用外部芯片产生更为精确的时钟,如DS3231时钟芯片。本文介绍使用内部RTC产生时钟。
RTC的时钟源有以下三种: ─ HSE时钟除以128; ─ LSE振荡器时钟;(常用的是外部低速,稳定精准,重要的是VDD掉电后可有后备供电区域给它供电) ─ LSI振荡器时钟。
一般情况下,为了VDD掉电后可使用后备供电区域给它供电,可以使用LSE振荡器时钟
RTC时钟配置的一般步骤:
1:使能PWR时钟:RCC_APB1PeriphClockCmd();
2:使能后备寄存器访问: PWR_BackupAccessCmd();
3:配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
4:初始化RTC(同步/异步分频系数和时钟格式):RTC_Init ();
5:设置时间:RTC_SetTime ();
6:设置日期:RTC_SetDate();
7:开启相关中断(可选)
8:编写中断函数(可选,如果第7开启中断的话)
相应的库函数代码:
RTC_InitTypeDef RTC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5152) //是否第一次配置?
{
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RCC_LSEConfig(RCC_LSE_ON);//LSE 开启
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(12,0,0,RTC_H12_AM); //设置时间
RTC_Set_Date(17,11,1,3); //设置日期
RTC_WriteBackupRegister(RTC_BKP_DR0,0x5152); //标记已经初始化过了
}
如果有中断 唤醒,7,8的中断配置步骤如下;
1:如上,配置好RTC初始化相关参数。
2:关闭WakeUp:RTC_WakeUpCmd(DISABLE);
3:配置WakeUp时钟分频系数/来源: RTC_WakeUpClockConfig();
4:设置WakeUp自动装载寄存器:RTC_SetWakeUpCounter();
5:使能WakeUp : RTC_WakeUpCmd( ENABLE);
6:开启配置闹钟中断:
RTC_ITConfig();
EXTI_Init();
NVIC_Init();
7:编写中断服务函数: RTC_WKUP_IRQHandler();
相应库函数代码如下:
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RTC_WakeUpCmd(DISABLE);//关闭WAKE UP
RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);//唤醒时钟选择
RTC_SetWakeUpCounter(0);//设置WAKE UP自动重装载寄存器
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 = RTCWKUP_PRIORITY;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = RTCWKUP_SUBPRIORITY;//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置 文章来源:https://www.toymoban.com/news/detail-685425.html
void RTC_WKUP_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_WUT)){
RTC_ClearITPendingBit(RTC_IT_WUT);
RTC_GetTime(RTC_Format_BCD, (RTC_TimeTypeDef*)&systemtime.time);
RTC_GetDate(RTC_Format_BCD, (RTC_DateTypeDef*)&systemtime.date);
}
EXTI_ClearITPendingBit(EXTI_Line22);
}文章来源地址https://www.toymoban.com/news/detail-685425.html
到了这里,关于STM32的RTC时钟配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!