标题:
STM8L单片机RTC时钟问题请教。
[打印本页]
作者:
yaofu
时间:
2021-6-4 11:18
标题:
STM8L单片机RTC时钟问题请教。
各位大牛:现用STM8L151单片机,采用低功耗模式,启动看门狗,外部RTC时钟,rtc唤醒,唤醒后喂狗,正常情况下系统运行正常,但板子一旦受潮,rtc晶振不起振,造成看门狗复位,此时切换RTC为内部LSI模式,如果外部晶振不能正常起振,切换不成功,这个问题如何解决?
作者:
yaofu
时间:
2021-6-4 13:44
void rtc_init(void)
{
u16 ddys=0;
RTC_ClearITPendingBit(RTC_IT_WUT);
RTC_ClearITPendingBit(RTC_IT_ALRA);
CLK_PeripheralClockConfig(CLK_Peripheral_RTC,DISABLE); //打开RTC时钟
/*如果外部晶振有问题,切换内部晶振*/
CLK_data=0;//外部晶振0,内部晶振为1
if((rest_clk<20)||(FLASH_ReadByte(CLK_LSE_LSI)!=0x01))//(CLK_data==0)//外部时钟
{
CLK_LSEConfig(CLK_LSE_ON);
while( RESET==CLK_GetFlagStatus(CLK_FLAG_LSERDY))
{
if((++ddys)>8000)
{
CLK_data=1;
break;
}
}
CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);//时钟为LSE 2分频
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //打开RTC时钟
}
else
{
CLK_data=1;
RTC_WakeUpCmd(DISABLE);
CLK_LSEConfig(CLK_LSE_OFF);
CLK_LSICmd(ENABLE);
while (CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == RESET);
CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1);//时钟为LSE 2分频
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //打开RTC时钟
}
RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16); //唤醒设置为16分频
RTC_SetWakeUpCounter(80); //设置唤醒寄存器时间为 1s 2048 ,0.5秒 1024
RTC_ITConfig(RTC_IT_WUT, ENABLE); //使能RTC唤醒中断使能
RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC唤醒标志
RTC_ClearITPendingBit(RTC_IT_ALRA);
RTC_WakeUpCmd(ENABLE);
delayms(5);
}
作者:
yaofu
时间:
2021-6-4 13:44
本帖最后由 yaofu 于 2021-6-4 13:57 编辑
这个程序在外部晶振正常时,经过20次重启,切换到内部晶振,外部晶振一直不正常,好像一直切换不过去。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1