You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32L476 Nucleo开发板MSI时钟位无法修改问题求助

STM32L476 MSI时钟无法关闭/修改的原因及解决方法

核心原因

你直接修改MSION位(RCC_CR的位0)失败,是因为当前系统时钟(SYSCLK)正依赖MSI运行。STM32的硬件保护机制会阻止关闭正在作为系统时钟源的时钟,避免系统失速,所以你的清0操作会被硬件忽略,MSION位保持不变。

解决步骤

要修改MSI的配置,必须先把系统时钟切换到其他可用的时钟源(比如HSI),步骤如下:

  1. 启用并切换到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);
    
  2. 修改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));
    
  3. 可选:切回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:45:02