搜遍全互联网也没发现有我这种问题的。可能是程序哪里有问题。
现象描述:
STM32 RTC时钟,用的是外部32.768晶振,配置的1秒中断,MDK 4.60
配置完后运行,
用MDK观察RTC->CNTL,RTC->CNTH(RTC计数器)寄存器会过几秒迅速跳动到下一秒。
举例:
....7,8,9,10,11,12,13....
10,跟11之间的间隔很短,其它数之间间隔约1秒。运行10个左右的数就会突然快速变化一秒
有没有大神碰到过这个问题。。
贴代码
static void RTC_Config(void)
{
uint8_t cnt;
// 开启电源管理,备份时钟;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);// 使能备份通道;
BKP_DeInit(); // Reset Backup Domain
RCC_LSEConfig(RCC_LSE_ON); // 开启外部低速时钟32.768KHz
cnt = 0;
// Wait till LSE is ready
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
if((cnt++)>10){
break;
}else{
Delay_ms_SysTick(2);
}
}
if(cnt>=10){
// 使用外部高速晶振 128分频
RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
// 标记RTC故障;
}else{
/* Select LSE as RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
}
RCC_RTCCLKCmd(ENABLE); // 使能RTC时钟
RTC_WaitForSynchro(); // 等RTC时钟同步
RTC_WaitForLastTask(); // 等RTC完成;
//允许RTC秒中断
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask(); // 等RTC完成;
// 设置预分频值;
if(cnt<10){
/* Set RTC prescaler: set RTC period to 1sec */
RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) = 1HZ */
}else{
RTC_SetPrescaler(62499); //25000000 / 128 = 195312.5,如果是8M / 128 = 62500,则这里应该填为62499
}
RTC_WaitForLastTask(); // 等RTC完成;
}
|