STM32——时钟、HSE、旁路模式、有源晶振

本文介绍了微控制器中的时钟配置概念,包括外部时钟(E)和内部时钟(I),高速时钟(HS)和低速时钟(LS)。详细解析了HSE、HIS、LSE、LSI四种时钟类型及其在STM8和STM32系列MCU中的应用。阐述了如何通过软件配置使用外部时钟源,并对比了HSE晶体模式和旁路模式的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初识时钟

  1. 从时钟源的角度,分为两类外部时钟(E)和内部时钟(I)。
  2. 从时钟速率的角度,分为两类高速时钟(HS)和低速时钟(LS)。

而把它们组合起来就有四种时钟:HSE、HIS、LSE、LSI。至于为什么会有这么复杂的时钟配置,主要是考虑到系统的性能和功耗两个方面的因素吧。单一时钟的话可能会导致性能过剩并且功耗过高。多个时钟的话可以平衡功耗和性能之间的平衡。
特此说明一下,系统复位后,默认初始化的是HIS时钟提供sysclock。也就是16MHZ。为了提示系统性能,我们需要使能外部时钟晶振(板载25MHz)。

这四类时钟在芯片内部通过配置,完成对各个外设的驱动。
到了芯片内部,对应到那么多的外设,时钟的分类就更多了,但是主要考虑到桥的存在,分为五类:AHB3、AHB2、AHB1、APB2、APB1。芯片内的所有外设都分别挂载在这五个总线上,至于哪个外设挂歪在哪个总线上,我们就需要查看芯片的RM0410 Reference manual(了。

不论STM8还是STM32系列的MCU,芯片复位后默认时钟源都是内部HSI,要使用外部时钟源HSE的话,得通过软件对相关控制寄存器进行使能配置才行。

如果使用外部HSE的话,一般有两种模式:

在这里插入图片描述

1、外部晶体/陶瓷谐振器(HSE晶体)模式

这种模式用得比较常见,HSE晶体可以为系统提供较为精确的时钟源。在时钟控制寄存器RCC_CR中的HSERDY位用来指示高速外部振荡器是否稳定。在启动时,直到这一位被硬件置’1’,时钟才被释放出来。HSE晶体可以通过设置时钟控制寄存器里RCC_CR中的HSEON位被启动和关闭。

该时钟源是由外部无源晶体与MCU内部时钟驱动电路共同配合形成,有一定的启动时间,精度较高。
为了减少时钟输出的失真和缩短启动

### STM32F0配置外接有源晶振的方法 STM32F0系列微控制器在使用外部有源晶振时,需要正确配置其时钟源以确保系统正常运行。以下内容详细说明了如何配置STM32F0的外接有源晶振。 #### 1. 配置HSE有源晶振 STM32F0支持通过旁路模式(Bypass Mode)直接使用外部有源晶振提供的时钟信号。此模式下,内部驱动电路被跳过,因此无需匹配电容[^4]。具体操作包括: - 在RCC控制寄存器(`RCC_CR`)中启用HSE时钟(设置`RCC_CR_HSEON`位)。 - 同时,需设置`RCC_CR_HSEBYP`位以启用旁路模式,从而允许直接使用外部有源晶振提供的信号。 #### 2. 修改系统时钟频率 根据所使用的外部有源晶振的实际频率,需修改相关头文件中的宏定义。例如,在`stm32f0xx.h`文件中,将`HSE_VALUE`定义为外部有源晶振的实际频率(单位为Hz)。如果使用的是24MHz有源晶振,则应如下修改: ```c #define HSE_VALUE ((uint32_t)24000000U) ``` 此外,在`system_stm32f0xx.c`文件中,也需要同步更新PLL的相关参数以匹配新的时钟源频率。例如,调整PLL分频系数以生成目标系统主频[^5]。 #### 3. 配置PLL以生成系统主频 STM32F0的系统主频通常由PLL模块生成。以下是一个典型的PLL配置示例,假设目标主频为72MHz,且外部有源晶振频率为24MHz: ```c RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // 初始化HSE并启用旁路模式 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // 使用有源晶振时设置为BYPASS RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL3; // PLL输入时钟乘以3 (24MHz * 3 = 72MHz) RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV1; // 不进行额外分频 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { // 初始化错误处理 } // 配置系统时钟为PLL输出 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { // 时钟配置错误处理 } ``` #### 4. 确保代码模板兼容性 在实际项目中,可能需要根据具体的开发环境和工具链(如Keil、IAR或STM32CubeMX)对代码模板进行适当调整。例如,若使用STM32CubeMX生成初始代码,则需在图形化界面中选择外部有源晶振作为时钟源,并启用旁路模式[^3]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值