【学习笔记】STM32F407探索者HAL库开发(五)F407时钟系统配置


在这里插入图片描述

1 F407_CubeMX时钟树配置(传送门)

在这里插入图片描述
在这里插入图片描述

  1. 宏定义 HSE_VALUE;
  2. 调用HAL_RCC_OscConfig()函数,配置输入时钟源;
  3. 调用HAL_RCC_ClockConfig()函数,配置系统时钟源以及 SYSCLK、AHB、APB1 和 APB2 相关参数;
  4. 在main函数中调用sys_stm32_clock_init()函数并设置形参;

注意:第2点和第3点中的函数均在sys_stm32_clock_init()函数中调用,main函数中只调用sys_stm32_clock_init()函数,且sys_stm32_clock_init()函数的描述在sys.c中,main.c中只配置该函数的四个形参。

为便于查找,在后续新项目的时钟系统配置时可以直接按照下图参数进行配置。具体详解见后文。

2 STM32F407时钟树

STM32内部也是由多种多样的电路模块组合在一起实现的。当一个电路越复杂,在达到正确的输出结果前,它可能因为延时会有一些短暂的中间状态,而这些中间状态有时会导致输出结果会有一个短暂的错误,这叫做电路中的“毛刺现象”,如果电路需要运行得足够快,那么这些错误状态会被其它电路作为输入采样,最终形成一系列的系统错误。为了解决这个问题,在单片机系统中,设计时以时序电路控制替代纯粹的组合电路,在每一级输出结果前对各个信号进行采样,从而使得电路中某些信号即使出现延时也可以保证各个信号的同步,可以避免电路中发生的“毛刺现象”,达到精确控制输出的效果。

由于时序电路的重要性,因此在MCU设计时就设计了专门用于控制时序的电路,在芯片设计中称为时钟树设计。由此设计出来的时钟,可以精确控制我们的单片机系统,这也是我们这节要展开分析的时钟分析。为什么是时钟树而不是时钟呢?一个MCU越复杂,时钟系统也会相应地变得复杂,如STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。

对于STM32F4系列的芯片,正常工作的主频可以达到168Mhz,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十Khz的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般都是采取多时钟源的方法来解决这些问题。

2.1 STM32F407时钟系统图

STM32本身非常复杂,外设非常的多,为了保持低功耗工作,STM32的主控默认不开启这些外设功能。用户可以根据自己的需要决定STM32芯片要使用的功能,这个功能开关在STM32主控中也就是各个外设的时钟。

如下图为一个简化的STM32F4时钟系统。图中已经把我们主要关注几处标注出来。

在这里插入图片描述

A部分表示输入时钟源,可分为外部时钟源和内部时钟源;
B为锁相环“PLL”;
C为我们重点需要关注的系统时钟源选择器,此项决定了MCU的系统主时钟“SYSCLK”的大小;AHB预分频器将SYSCLK分频或不分频后分发给其它外设进行处理,包括到D部分的Cortex-M内核系统的时钟和使能单元。
E为定时器以及其它外设的时钟源APB1/APB2。F是STM32的MCO时钟输出功能。

2.2 STM32F103时钟树简图

2.2.1 高速部分

在这里插入图片描述
HSE 4~26 MHz,HIS 16 MHz,F407的SYSCLK最大168MHz,无法达到,所以要/M分频之后,通过PLL锁相环

### STM32F407 CubeMX 时钟配置教程 在使用STM32CubeMX进行STM32F407时钟配置时,需要了解其内部和外部时钟源以及如何通过图形化界面设置系统时钟。以下内容将详细介绍如何完成这一任务。 #### 系统时钟源概述 STM32F407支持多种时钟源,包括低速外部时钟(LSE)、低速内部时钟(LSI)、高速内部时钟(HSI)以及高速外部时钟(HSE)。其中,LSE通常用于RTC模块,频率为32.768kHz[^1];LSI是RC振荡器,频率约为40kHz,也主要用于低功耗模式下的RTC或唤醒功能[^1];HSI是内部RC振荡器,默认频率为16MHz(不同于F1系列的8MHz)[^1];HSE则可以连接外部晶振,频率范围为4MHz至26MHz。 #### 配置步骤详解 在STM32CubeMX中,可以通过以下方式配置时钟: 1. **选择时钟源** 在“Pinout & Configuration”页面中,导航到“System Core”下的“RCC”选项卡。在这里可以选择PLL(锁相环)输入时钟源,通常是HSE或HSI。如果使用外部晶振,则选择HSE并确保其模式设置为“Crystal/Ceramic Resonator”。 2. **配置PLL参数** PLL用于生成更高的系统时钟频率。可以在同一页面中调整PLL的倍频系数(M、N、P、Q、R值),以满足特定的应用需求。例如,为了达到168MHz的主系统时钟频率,可以设置如下参数: - M = 8(分频系数) - N = 336(倍频系数) - P = 2(输出分频系数)[^1] 此时,PLL输出频率计算公式为: ```plaintext f(VCO) = f(HSE or HSI / M) * N f(SYSCLK) = f(VCO) / P ``` 假设使用8MHz HSE作为PLL输入时钟,则最终系统时钟频率为: ```plaintext f(SYSCLK) = (8MHz / 8) * 336 / 2 = 168MHz ``` 3. **启用AHB/APB总线预分频** 在“Clock Configuration”页面中,可以进一步配置AHB、APB1和APB2总线的预分频因子。这些设置决定了外设和内存的运行速度。对于高性能应用,通常将AHB总线设置为与SYSCLK相同的速度(即不分频),而APB1和APB2可以根据外设需求适当降低频率。 4. **验证时钟树** 在“Clock Configuration”页面底部,可以看到完整的时钟树图。它显示了所有时钟源及其分配情况,包括SYSCLK、AHB、APB1、APB2等总线频率。确保这些值符合设计要求[^1]。 5. **生成代码** 完成上述配置后,点击“Project”菜单下的“Generate Code”按钮,STM32CubeMX将自动生成初始化代码,包括RCC时钟配置部分。生成的代码中会包含类似以下内容: ```c RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // 初始化振荡器 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { // 错误处理 } // 初始化时钟 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { // 错误处理 } ``` #### 注意事项 - 在实际硬件上,确保正确安装了外部晶振,并且其负载电容值符合数据手册中的推荐值[^1]。 - 如果使用HSI作为PLL输入时钟源,需注意其初始精度较低,可能会影响最终系统时钟的稳定性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值