请问STM32的系统时钟从外部时钟切换至内部时钟的时候,在切换的瞬间该怎么处理?现在板子是外部晶振提供时钟,我编写程序切换到内部时钟的时候,单片机不工作。并且调试的时候一直处于死循环的状态,不知为何?之前是使用固件库的默认时钟设置,默认是外部时钟。我的操作步骤和代码如下:
/* 系统时钟初始化至内部HSI */void sys_clock(void){ __IO uint32_t HSI_status = 0 HSI_counter = 0; RCC->CR &= ((uint32_t)~RCC_CR_PLLON); //关闭PLL “在重新设置内部时钟HSI作为PLL输入时钟源的时候,必须先关闭PLL” RCC->CR |= ((uint32_t)RCC_CR_HSION); //开启内部时钟 if(HSI_status ==(uint32_t)0x01) //如果内部时钟已经正确开启 则继续配置 { FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; //使能FLASH的预取指并且1 个等待位 RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; //提供给HCLK的时钟频率不分频 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1; //提供给PCLK的时钟频率不分频 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));//清除PLL的倍频系数、HSE的分频数、PLL的时钟源输入设置 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2|RCC_CFGR_PLLMULL6);//设置HSI作为PLL的输入时钟 PLL进行6倍频 RCC->CR |= RCC_CR_PLLON; //使能PLL while((RCC->CR & RCC_CR_PLLRDY) == 0) //等待PLL时钟稳定 { } RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); //清除系统时钟选择位 RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; //选择PLL作为系统时钟源 while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)//等待PLL被选择位系统时钟 { } } else { //内部时钟没有正确开启的意外情况处理程序在这里 }}
程序在运行过程中,时钟提供了程序运行的时钟,不可以用当前运行的时钟来更改当前的时钟的。
时钟是不可以动态修改的,只能是一个程序一个时钟的。
要修改就要停下来,一停下来,程序不运行了,也就无法修改了
在运行过程中不允许切换时钟源的,这种最好重启一次
因为你切换的时候总有那么几个瞬间要停止PLL工作,这是不允许的