简介:一般正常运行时,我们使用的时HSE(外部高速时钟源),当准备进入低功耗时,我们会切换到内部高速时钟HSI(一般需要分频以降低功耗),关闭HSE(若不关闭就不会出现下面的问题,即不用看本文了)。当从低功耗退出,进入正常运行时,会切换HSE。
这时由于之前关闭了HSE,再次打开HSE时会需要一段时间才会ready,然后再由HSI切换到HSE。
//该函数可实现切换时钟源功能。HSE与HSI互切。
void Switch_SysClock(CLK_Source_TypeDef CLK_NewClock)
{
switch(CLK_NewClock)
{
case CLK_SOURCE_HSE:
//启用外部高速晶振且无分频。12M.
CLK->SWCR|=0x02; //开启切换
CLK->ECKR|=0x01; //使能外部高速晶振
while((CLK->ECKR & 0x02)==0x00); //等待HSE稳定。
CLK->SWR =0xB4;
while((CLK->SWCR & 0x01)==0x01);
CLK->CKDIVR=0x00;
CLK->SWCR&=(~0x02);//关闭切换
CLK->ICKR &= 0xFE;//关闭内部高速晶振
break;
case CLK_SOURCE_HSI:
CLK->SWCR |= 0x02;/开启切换
CLK->ICKR |= 0x01;//使能内部高速晶振
CLK->SWR = 0xE1;
while((CLK->SWCR & 0x01)==0x01);
//CLK->CKDIVR =0x08;//启用内部高速晶振且2分频。8M.
CLK->CKDIVR =0x18;//启用内部高速晶振且8分频。2M.
CLK->SWCR &= (~0x02);//关闭切换
CLK->ECKR &= 0xFE;
break;
case CLK_SOURCE_LSI:
/*
*/
default:break;
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』