STM32L476 Nucleo开发板MSI时钟位无法修改问题求助
STM32L476 MSI时钟无法关闭/修改的原因及解决方法
核心原因
你直接修改MSION位(RCC_CR的位0)失败,是因为当前系统时钟(SYSCLK)正依赖MSI运行。STM32的硬件保护机制会阻止关闭正在作为系统时钟源的时钟,避免系统失速,所以你的清0操作会被硬件忽略,MSION位保持不变。
解决步骤
要修改MSI的配置,必须先把系统时钟切换到其他可用的时钟源(比如HSI),步骤如下:
启用并切换到HSI时钟
// 启用HSI时钟 RCC->CR |= RCC_CR_HSION; // 等待HSI就绪 while(!(RCC->CR & RCC_CR_HSIRDY)); // 将系统时钟切换为HSI RCC->CFGR &= ~RCC_CFGR_SW; // 清除原有SW位配置 RCC->CFGR |= RCC_CFGR_SW_HSI; // 设置SW位为HSI // 等待切换完成(检查SWS位确认) while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI);修改MSI配置
现在系统时钟已经切换到HSI,就可以安全修改MSI了:// 关闭MSI RCC->CR &= ~RCC_CR_MSION; // 等待MSI完全关闭 while(RCC->CR & RCC_CR_MSIRDY); // 修改MSIRANGE为0x8(对应16MHz,依据STM32L4手册定义) RCC->CR &= ~RCC_CR_MSIRANGE; // 清除原有范围配置 RCC->CR |= (0x8 << RCC_CR_MSIRANGE_Pos); // 设置新的频率范围 // 重新启用MSI RCC->CR |= RCC_CR_MSION; // 等待MSI就绪 while(!(RCC->CR & RCC_CR_MSIRDY));可选:切回MSI作为系统时钟
如果后续需要用MSI作为系统时钟,重复类似切换步骤即可:RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_MSI; while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_MSI);
补充说明
- 尽量使用STM32标准库的位定义(比如
RCC_CR_MSION)替代硬编码移位值,代码可读性和兼容性更好。 - 每次修改时钟配置后,必须等待相应的就绪位置位,确保时钟稳定后再进行下一步操作。
内容的提问来源于stack exchange,提问作者vimmy
相关产品推荐
相关产品推荐

