• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

STM32切换时钟的问题

奔跑的黑蚂蚁 2018-07-25 浏览量:1747

请问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
    {
         //内部时钟没有正确开启的意外情况处理程序在这里
    }
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 程序在运行过程中,时钟提供了程序运行的时钟,不可以用当前运行的时钟来更改当前的时钟的。

    时钟是不可以动态修改的,只能是一个程序一个时钟的。

    要修改就要停下来,一停下来,程序不运行了,也就无法修改了

    • 发布于 2018-08-22
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:3
  • 一般这种情况下,比较省事的方法是用STM32CubeMX生成RCC内部时钟和外部时钟各一个工程,只取它们RCC的初始化库函数,切换时钟源的时候只需要切换库函数执行顺序即可。

    • 发布于2018-07-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 在运行过程中不允许切换时钟源的,这种最好重启一次

    因为你切换的时候总有那么几个瞬间要停止PLL工作,这是不允许的

    • 发布于2018-07-29
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个切换时钟要在初始化的时候进行设置,所以最好是重启然后设置时钟
    • 发布于2018-07-30
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

STM32切换时钟的问题