登录/注册

STM32怎么选择内部晶振

STM32怎么选择内部晶振

更多

在 STM32 微控制器中选择和使用内部晶振(时钟源)主要涉及配置时钟系统,使其使用内部生成的时钟信号(HSI, MSI, LSI)作为系统时钟源或其他外设的时钟源。以下是详细步骤和注意事项:

核心步骤:

  1. 了解内部时钟源类型:

    • HSI (High-Speed Internal oscillator): 高速内部RC振荡器。
      • 频率:通常是 8 MHz (某些型号可能不同,如16MHz或精度可调)。
      • 精度:相对较低(典型值 +/-1%,受温度和电压影响)。
      • 用途:可作为系统时钟源、PLL输入源等。
    • MSI (Multi-Speed Internal oscillator): 多速内部RC振荡器(主要存在于STM32L/L4/WB/WL等低功耗系列)。
      • 频率:可在多个档位间切换(例如从100kHz到48MHz)。
      • 精度:不同档位精度不同,通常比HSI更灵活但精度也有限。
      • 用途:低功耗应用的核心时钟源,可动态调整速度和功耗。
    • LSI (Low-Speed Internal oscillator): 低速内部RC振荡器。
      • 频率:通常是 32 kHz 或 40 kHz (具体看型号)。
      • 精度:很低。
      • 用途:主要用于独立看门狗、RTC(实时时钟)或低功耗模式下的唤醒时钟源。一般不用作系统主时钟(SYSCLK)。
  2. 配置时钟树: 这是关键步骤。你需要配置系统选择哪个内部时钟源作为 系统时钟 (SYSCLK) 的来源。这通常通过配置 RCC (Reset and Clock Control) 相关的寄存器来实现。

    • 使用STM32CubeMX (推荐):
      1. 打开STM32CubeMX,创建对应你芯片型号的新工程。
      2. 在图形界面中,导航到 "Clock Configuration" 标签页。
      3. 找到标注着 "System Clock Mux" 或类似名字的选择框(通常在时钟树图的顶部)。
      4. 点击这个选择框,在下拉菜单中选择 HSIMSI (取决于你的芯片和需求)。
        • 如果选择MSI,通常还需要在下面的 MSI Range 设置中选择你需要的具体频率。
      5. 配置其他必要的分频器(AHB Prescaler, APB1 Prescaler, APB2 Prescaler)以获得所需的外设时钟频率。
      6. 配置LSI:通常在 Pinout & Configuration -> System Core -> RCC 页面里,找到 Low Speed Clock (LSE/LSI) Source,选择 LSI。这个配置主要是为了启用LSI供看门狗或RTC使用。
      7. 生成初始化代码(Project -> Generate Code)。生成的代码(主要在SystemClock_Config()函数中)会自动配置好RCC寄存器,将系统时钟切换到选择的内部时钟源。
    • 使用标准外设库/HAL/LL库:
      1. 在主程序初始化阶段(main()函数开始处,或专门的时钟配置函数中),调用库函数配置RCC。
      2. 启用目标内部振荡器:
        • HSI: __HAL_RCC_HSI_ENABLE() (HAL) 或 RCC_HSICmd(ENABLE) (StdPeriph) 或设置 RCC_CR 寄存器中的 HSION 位。
        • MSI: __HAL_RCC_MSI_ENABLE() (HAL) 或设置 RCC_CR 寄存器中的 MSION 位,并配置 RCC_CR 中的 MSIRANGE 选择频率(需查手册)。
        • LSI: __HAL_RCC_LSI_ENABLE() (HAL) 或 RCC_LSICmd(ENABLE) (StdPeriph) 或设置 RCC_CSR 寄存器中的 LSION 位。
      3. 等待振荡器稳定:
        • HSI: 使用 __HAL_RCC_HSI_GET_FLAG() 或轮询 RCC_CR 中的 HSIRDY 位。
        • MSI: 轮询 RCC_CR 中的 MSIRDY 位。
        • LSI: 轮询 RCC_CSR 中的 LSIRDY 位。
      4. 切换系统时钟源:
        • 设置 RCC_CFGR 寄存器中的 SW 位选择源:
          • 00: HSI selected as system clock
          • 01: HSE selected as system clock
          • 10: PLL selected as system clock
          • 11(对于带有MSI的型号): MSI selected as system clock (注意:标准F1/F4等没有MSI,这个位可能保留或用于其他含义)。
        • 使用库函数:__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_HSI) (切换到HSI) 或 __HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_MSI) (切换到MSI)。
      5. 等待时钟源切换完成: 轮询 RCC_CFGR 中的 SWS 位,直到它显示当前系统时钟源确实是你选择的HSI或MSI。
      6. 配置其他分频器(RCC_CFGR 中的 HPRE, PPRE1, PPRE2 等位)。
  3. 验证时钟配置:

    • 使用调试器(如ST-Link)读取 RCC_CFGR 寄存器,检查 SWS 位确认当前系统时钟源。
    • 如果开启了MCO(微控制器时钟输出)功能,用示波器测量MCO引脚输出的频率是否与预期相符。
    • 在代码中读取 SystemCoreClock 变量(这个变量通常在时钟配置后由库函数更新)或 HAL_RCC_GetSysClockFreq() 函数获取系统时钟频率。
    • 观察依赖时钟的外设(如UART波特率、定时器计数等)是否工作正常。

重要注意事项:

  1. 精度限制: 内部RC振荡器(HSI, MSI, LSI)的频率精度显著低于外部晶振(HSE)。HSI/MSI可能在±1%到±3%甚至更高范围漂移(受温度、电压、批次影响)。如果你的应用对时钟精度要求很高(如高速USB、高精度定时、精确UART波特率没有自动波特率检测、特定通信协议),强烈建议使用外部晶振(HSE)
  2. 启动默认: 大多数STM32芯片复位后默认使用HSI作为系统时钟源(频率可能经过内部预分频,如F1默认是8MHz HSI经过2分频得到4MHz SYSCLK)。你的初始化流程通常就是从HSI开始,然后决定是否切换到MSI(如果支持)或PLL(用HSI或HSE作为输入)或直接保持HSI。
  3. PLL输入: HSI/MSI 都可以作为PLL的输入源,倍频后获得更高的系统时钟频率。
  4. 低功耗应用: MSI 是STM32L/L4等低功耗系列的关键特性,允许在运行模式和低功耗模式之间高效切换时钟速度和功耗。LSI则常用于维持看门狗和RTC在待机/停止模式下运行。
  5. 代码位置: 时钟配置代码必须在任何依赖精确时钟的外设初始化之前执行。
  6. 查阅手册: 务必仔细查阅你所使用的具体STM32型号的《参考手册》(Reference Manual) 中的RCC章节(Reset and Clock Control)。 不同系列(F0, F1, F4, L0, L4, G0, H7等)的RCC寄存器和配置细节存在差异。CubeMX通常会根据型号为你处理这些差异。
  7. CubeMX优势: 对于不熟悉复杂时钟树的用户,强烈推荐使用STM32CubeMX。它的图形化界面能直观地展示时钟树结构,自动计算分频系数,避免配置错误,并生成正确的初始化代码。

总结选择内部晶振的流程:

  1. 确定需求: 是否需要高精度?是否需要低功耗优化(考虑MSI)?只需要看门狗/RTC(考虑LSI)?
  2. 查看手册: 确认芯片支持哪些内部时钟源(HSI, MSI)及其特性(频率、精度)。
  3. 配置工具:
    • 首选STM32CubeMX: 在"Clock Configuration"中选择 HSIMSI 作为系统时钟源,配置分频,启用 LSI(如果需要),生成代码。
    • 手动编码: 使用HAL/LL/StdPeriph库函数或直接操作寄存器:使能振荡器 -> 等待就绪 -> 切换系统时钟源 -> 等待切换完成 -> 配置分频器。
  4. 验证: 通过寄存器读取、MCO输出、外设工作状态或库函数获取的时钟频率验证配置是否正确生效。

选择内部晶振主要是为了简化设计(省去外部晶振元件)、降低成本、减小PCB面积或在特定低功耗场景下使用。务必牢记其精度劣势,根据应用的实际要求做出权衡。

STM32F030内部怎么设置,内部是延时函数怎么设置?

STM32F030内部晶振怎么设置,

2025-04-23 07:45:01

STM32使用内部还是外部

STM32使用内部晶振还是外部

2023-12-15 14:14:19

选择.zip

晶振的选择

资料下载 dong59222 2023-03-01 15:37:52

选择.zip

晶振的选择

资料下载 传奇198 2022-12-30 09:21:45

STM32单片机外部内部配置

STM32F4外部晶振配置system_stm32f4xx.c这个文件里

资料下载 佚名 2021-12-24 19:21:12

关于STM32 RTC时钟使用内部/外部的切换方法

    对于使用STM32单片开发项目的同志,经常会使用到STM32的RTC功能,而在配置RTC的功能时需要配置晶

资料下载 h1654155275.3132 2021-11-23 18:07:05

关于外部时钟频率选择

关于外部时钟晶振频率选择芯片的主晶

资料下载 佚名 2021-11-16 18:36:01

有什么作用,如何选择合适的,为什么有时候用内部

晶振有什么作用,如何选择合适的晶

2023-11-27 15:31:56

stm32内部为什么还要用外部

stm32有内部晶振,为什么还要用外部

2023-10-13 06:19:46

为什么没有封装进STM32芯片内部

晶振为什么没有封装进STM32芯片内部?

2023-09-18 16:24:32

STM32外部内部是如何进行切换的

STM32外部晶振和内部

2021-08-10 06:25:22

stm32f103使用内部

stm32f103使用内部晶振,在进行

2021-08-10 06:14:38

STM32外部为什么会不起

芯片:STM32F429开发平台:Keil问题:STM32外部晶振不起

2021-08-05 08:16:14

如何选择合适的

晶振,例如对于STM32内部

2020-06-28 11:40:08
7天热门专题 换一换
相关标签