【正点原子STM32】STM32时钟系统(时钟树、时钟源、分频器和倍频系数、锁相环、STM32CubeMX时钟树、系统时钟配置步骤)

一、认识时钟树

  • 1.1、什么是时钟?
  • 1.2、认识时钟树(F1)
  • 1.3、认识时钟树(F4)
  • 1.4、认识时钟树(F7)
  • 1.5、认识时钟树(H7)

二、配置系统时钟

  • 2.1、系统时钟配置步骤
  • 2.2、外设时钟使能和失能
  • 2.3、sys_stm32_clock_init 函数(F1)
    • HAL_RCC_OscConfig()函数(F1)
    • HAL_RCC_ClockConfig函数(F1)
  • 2.4、sys_stm32_clock_init 函数(F4/F7)
    • HAL_RCC_OscConfig()函数(F4/F7)
    • HAL_RCC_ClockConfig()函数(F4/F7)
  • 2.5、sys_stm32_clock_init 函数(H7)
    • HAL_RCC_OscConfig()函数(H7)
    • HAL_RCC_ClockConfig()函数(H7)
    • HAL_RCCEx_PeriphCLKConfig()函数(H7)

三、总结

一、认识时钟树

1.1、什么是时钟?

在这里插入图片描述
时钟(Clock)在数字电路和计算机系统中是一种周期性的信号,用于同步和协调系统中各个部分的操作。时钟信号在单片机中是非常重要的,它指导着各个组件的工作,确保它们在正确的时间执行相应的任务。时钟信号通常是一个方波信号,具有固定的周期和占空比。

时钟树(Clock Tree)是指在数字系统或芯片中,将一个主时钟信号分配和扩展到整个系统中各个模块和部分的一种层次结构。时钟树的目的是确保系统中所有的时钟域都能够按照规定的时序要求同步运行。时钟树通常包括以下关键元素:

  1. 主时钟源(Clock Source): 时钟树的起点通常是一个主时钟源,这可以是外部晶振、振荡器或其他时钟源。

  2. 时钟分频器(Clock Divider): 时钟分频器用于将主时钟信号分频,以产生其他模块或部分所需的时钟频率。这样可以根据需要调整时钟频率,使得不同的部分能够以不同的速度运行。

  3. 时钟缓冲器(Clock Buffer): 时钟缓冲器用于放大和驱动时钟信号,确保时钟信号能够准确地传播到系统中的各个部分。

  4. 时钟分配网络(Clock Distribution Network): 时钟分配网络将时钟信号传送到系统中的各个模块。这通常包括时钟线路、时钟树分支等。

时钟树的设计需要考虑时序要求、功耗、噪声和电磁兼容性等因素。精心设计的时钟树能够确保系统各个部分协同工作,提高系统的稳定性和性能。在数字集成电路中,时钟树的设计是一个复杂而关键的任务。

1.2、认识时钟树(F1)

在这里插入图片描述
H、L、S、I、E代表了一些常见的缩写,通常与单片机或者数字电路中的时钟、速度和内外部资源有关。
含义:

  1. H:high

    • 通常表示高电平或高状态。在数字电路中,可能指的是高电压或逻辑高。
  2. L:low

    • 通常表示低电平或低状态。在数字电路中,可能指的是低电压或逻辑低。
  3. S:speed

    • 可能表示速度。在数字电路或通信领域中,S通常用于表示速度、传输速率或时钟频率。
  4. I:internal

    • 可能表示内部。在数字电路中,I可能用于表示内部时钟源、内部资源等。
  5. E:external

    • 可能表示外部。在数字电路中,E可能用于表示外部时钟源、外部资源等。

分频器(Divider)和倍频系数(Multiplier)

分频器和倍频系数是在时钟系统中常见的概念,用于调整时钟信号的频率。让我们更详细地了解这两个概念:

  1. 分频器(Divider):

    • 定义: 分频器用于将输入时钟信号分频,即减小其频率。
    • 作用: 分频器通常用于将高频时钟信号分频为较低的频率,以供给某些模块或外设使用。
    • 公式: 分频后的频率可以通过原始频率除以分频系数得到,即新频率 = 原始频率 / 分频系数。
  2. 倍频系数(Multiplier):

    • 定义: 倍频系数用于将输入时钟信号倍频,即增加其频率。
    • 作用: 倍频系数通常用于提高时钟信号的频率,以满足系统对更高时钟频率的需求。
    • 公式: 倍频后的频率可以通过原始频率乘以倍频系数得到,即新频率 = 原始频率 * 倍频系数。

在实际应用中,分频器和倍频系数的配置对于调整系统时钟至关重要,特别是在使用锁相环(PLL)等技术进行时钟调整时。在微控制器或数字系统中,通过配置分频器和倍频系数,可以灵活地适应不同的硬件要求,以满足外设的时钟需求,同时确保系统时钟的稳定性和准确性。

总的来说,分频器和倍频系数是时钟系统中的两个关键元素,通过它们的配置,可以实现对时钟频率的灵活调整,以满足不同应用场景的需求。

锁相环(Phase-Locked Loop,PLL)

锁相环(Phase-Locked Loop,PLL)是一种控制系统,用于调整输出信号的频率和相位,使其与输入信号保持特定的关系。在PLL中,常用的表达式是F/M*N/P,其中:

  1. F:

    • 表示输出信号的频率。
  2. M:

    • 表示输入信号的参考倍频系数(Multiplier)。
  3. N:

    • 表示反馈倍频系数。
  4. P:

    • 表示分频系数(Divider)。

这个表达式的含义是,通过调整M、N和P的值,可以控制输出频率F。下面是更详细的解释:

  • 输入信号:

    • 输入信号经过倍频(M倍)得到一个高频信号。
  • 反馈:

    • 从输出中采样一部分反馈回输入,以与输入信号同步。
  • 输出频率:

    • 输出频率是输入信号经过M倍频、N倍频、再通过P分频得到的。

具体来说,输出频率F可以通过以下公式计算:

F = F 输入 × M × N P F = \dfrac{F_{\text{输入}} \times M \times N}{P} F=PF输入×M×N

在实际应用中,通过调整M、N和P的值,可以实现对输出频率的精确控制。这种调整通常用于微控制器、射频电路、时钟产生器等应用中,以满足系统对不同频率的需求。
分频器是一种电路或模块,用于将输入的时钟信号分频,即减小其频率。这是在数字电路中常见的一种功能,它允许在系统中使用不同频率的时钟信号,以适应不同的模块和外设的工作需求。分频器通常通过使用可编程的分频系数,将输入时钟信号的频率降低到所需的水平。

以下是分频器的一些关键概念:

  1. 分频系数(Divider Ratio):

    • 分频系数是用于调整输入时钟频率的比例。它是分频器的一个参数,用于控制输出频率。
    • 分频系数 N N N 决定了输入频率与输出频率之间的关系,输出频率等于输入频率除以 N N N
    • 公式: 输出频率 = 输入频率 N \text{输出频率} = \frac{\text{输入频率}}{N} 输出频率=N输入频率
  2. 整数分频和分数分频:

    • 整数分频是指分频系数 N N N 为整数,例如 2、3、4 等。
    • 分数分频是指分频系数 N N N 可以是分数,例如 1 / 2 1/2 1/2 1 / 3 1/3 1/3 等。在某些应用中,分数分频可以提供更灵活的频率调整。
  3. 分频器的应用:

    • 分频器常用于微控制器、数字信号处理器(DSP)、时钟生成器、通信系统等领域。
    • 在微控制器中,分频器用于为外设提供适当的时钟频率。
    • 在通信系统中,分频器可用于调整射频信号的频率。
  4. 分频器类型:

    • 固定分频器:分频系数是固定的,通常在设计中确定。
    • 可编程分频器:分频系数可以通过软件或硬件配置进行调整,提供更大的灵活性。

总体而言,分频器是数字电路中的重要组件,允许系统中的不同部分以不同的时钟频率运行,以满足不同模块的工作要求。在时钟系统设计中,分频器起到了关键的作用,有助于优化电路的性能和功耗。

时钟安全系统(CSS)和自由运行时钟(FCLK)

这两个概念涉及到STM32微控制器的时钟管理和安全特性。让我们更详细地了解它们:

  1. 时钟安全系统(Clock Security System,CSS):

    • 功能: CSS是STM32微控制器上的一项安全特性,旨在监测外部高速时钟(HSE)的稳定性。
    • 作用: 如果HSE启动失败(例如,外部晶振故障),CSS会自动切换到内部高速时钟(HSI),并触发非可屏蔽中断(NMI)。
    • 应用: 这个特性可以用于提高系统的稳定性,防止由于外部时钟问题导致系统工作不正常。
  2. 自由运行时钟(Free Running Clock,FCLK):

    • 功能: FCLK是用于采样中断和调试模块计时的时钟。
    • 作用: 在特定的应用场景中,即使系统进入休眠模式,FCLK仍然保持运行,以确保一些必要的计时和中断采样。
    • 应用: 主要用于允许在休眠状态下执行一些必要的计时或调试操作,以保持对系统状态的监控。

这两个特性都是STM32系列微控制器提供的一些高级时钟管理和安全功能,有助于提高系统的可靠性和稳定性。在使用这些特性时,建议仔细查阅相关的STM32芯片手册和参考资料,以确保正确配置和使用。

STM32F103时钟树简图

在这里插入图片描述
理清这些概念的时序关系和逻辑,我们可以按照以下步骤来组织:

  1. 高速时钟源OSC(HSE、HSI):

    • HSE(High-Speed External)和 HSI(High-Speed Internal)是两种不同的时钟源。
    • HSE是外部高速晶振,HSI是芯片内部的高速时钟源。
  2. 锁相环PLL:

    • 锁相环(PLL)用于调整时钟频率,将其倍频到系统所需的频率。
    • 使用 HAL_RCC_OscConfig() 配置时钟源,选择 HSE 或 HSI 以及其他相关配置。
  3. 分频系数:

    • 配置PLL的分频系数,以调整输出时钟的频率。
    • 这可能包括主时钟(SYSCLK)、AHB时钟、APB1时钟、APB2时钟等。
    • 使用 HAL_RCC_ClockConfig() 进行系统时钟、总线和外设时钟的配置。
  4. 外设时钟使能:

    • 使用 __HAL_RCC_PPP_CLK_ENABLE() 使能外设的时钟。
    • 在这里,PPP表示具体的外设,比如UART、SPI、I2C等。
  5. 扩展外设时钟(RTC/ADC/USB):

    • 使用 HAL_RCCEx_PeriphCLKConfig() 扩展外设的时钟。
    • 这通常包括RTC、ADC、USB等外设。
  6. 内核时钟:

    • 内核时钟是供给CPU内核的时钟。
    • 它通常与系统时钟相同,但可能有差异。
    • 在配置时钟时需要确保内核时钟的要求得到满足。
  7. 具体时钟频率设置:

    • 在上述配置完成后,系统时钟 SYSCLK、AHB总线时钟 HCLK、APB1总线时钟和 APB2总线时钟会根据你的配置和分频系数产生相应频率。
    • 根据具体的需求,设置最大的 APB1 和 APB2 时钟频率(36M 和 72M)。
  8. 低速时钟源OSC(LSI、LSE):

    • LSI(Low-Speed Internal)和 LSE(Low-Speed External)是低速时钟源。
    • 通常用于RTC等外设,LSE的频率是32.768KHz,LSI的频率是40KHz。
  9. IWDG、RTC:

    • IWDG(Independent Watchdog)和 RTC(Real-Time Clock)是一些特殊的定时器或时钟相关的外设。
    • 它们可能需要特殊的时钟配置或者需要特别的时钟源。

总体而言,上述步骤涵盖了从时钟源的选择、通过PLL调整时钟频率、配置各个时钟分频系数,到最终配置系统总线和外设时钟的过程。在具体的应用中,需要根据芯片手册和硬件设计的要求进行调整。

STM32F103时钟树

在这里插入图片描述
这些概念,包括它们之间的关系:

  1. PLLXTPRE:

    • PLLXTPRE用于配置PLL输入时钟源的预分频因子。
    • 通常,可以选择不预分频(PLLXTPRE_DIV1)或者2分频(PLLXTPRE_DIV2)。
  2. PLLSRC:

    • PLLSRC用于选择PLL的输入时钟源,通常可以选择HSE(外部高速晶振)或HSI(内部高速时钟源)。
  3. PLLMUL:

    • PLLMUL用于配置PLL的倍频因子,即将输入时钟的频率乘以多少倍。
    • 具体的倍频因子可以是2、3、4、…、16。
  4. PLLCLK:

    • PLLCLK是指通过PLL倍频后得到的时钟。
  5. SYSCLK:

    • SYSCLK是系统的主时钟,通常由PLLCLK提供。
    • 通过HAL_RCC_ClockConfig()配置PLL、分频因子等,以设置SYSCLK的频率。
  6. HCLK:

    • HCLK是AHB总线的时钟,通常与SYSCLK相同,或者是SYSCLK的一部分。
    • 通过HAL_RCC_ClockConfig()设置HCLK的频率。
  7. Cortex系统时钟:

    • 这是Cortex-M处理器内部的时钟,通常等于HCLK。
  8. 滴答定时器:

    • 滴答定时器通常是一个用于生成定时中断的内部计时器。
    • 它的时钟源可以是SYSCLK或HCLK,通过HAL_InitTick()等函数进行配置。
  9. FCLK:

    • FCLK通常是指Flash存储器的时钟,其频率与HCLK相同。
  10. TIMXCLK:

    • TIMXCLK是指定时器(TIM)的时钟源,可以是内部时钟源或者外部时钟源。
    • 如果APB1预分频系数等于1,则TIMXCLK的频率不变,否则频率会×2。
  11. PCLK:

    • PCLK是指外设总线的时钟,分别对应APB1和APB2总线。
    • 通过HAL_RCC_ClockConfig()配置APB1和APB2的分频因子。
  12. I2SCLK:

    • I2SCLK是I2S接口的时钟。
  13. USBCLK:

    • USBCLK是USB接口的时钟。
  14. RTCCLK:

    • RTCCLK是实时时钟(RTC)的时钟源。
    • 通常可以选择LSE(低速外部时钟)或LSI(低速内部时钟)。
  15. RC-IWDGCLK:

    • RC-IWDGCLK是独立看门狗(IWDG)的时钟源,可以选择LSI。
  16. MCO:

    • MCO是主时钟输出,通过配置可以将SYSCLK、HSI、HSE等输出到MCO引脚,用于外部设备的时钟监测或其他应用。

这些概念的详细理解有助于在STM32CubeMX或其他开发环境中正确配置时钟和时序。请根据具体的硬件和应用需求,在配置时钟时参考芯片手册和相关文档。

STM32CubeMX时钟树(F103)

在这里插入图片描述

1.3、认识时钟树(F4)

在这里插入图片描述

STM32F407时钟树

在这里插入图片描述

STM32F429时钟树

在这里插入图片描述

STM32F4时钟树简图

在这里插入图片描述

STM32CubeMX时钟树(F407)

在这里插入图片描述

STM32CubeMX时钟树(F429)

在这里插入图片描述
为了让 FSUSB 满足 48MHz 把 Main PLL 的倍频系数配置成X384 而不是X360这样系统时钟就超频了
在这里插入图片描述
首先,为了让 FSUSB 满足 48MHz,我们需要将 Main PLL 的倍频系数配置为 X384。以下是一个示例代码,以确保系统时钟的配置满足 USB 的需求。

在这里,我将使用 HAL 库的一些函数作为例子,实际的代码可能会因为使用的具体库和芯片型号而有所不同。以下是一个基本的流程:

#include "stm32f4xx_hal.h"void SystemClock_Config(void);
void Error_Handler(void);int main(void)
{HAL_Init();// 配置系统时钟SystemClock_Config();// 初始化USB外设(这里使用USB FS作为示例)HAL_PCD_MspInit(&hpcd_USB_FS);HAL_PCD_Init(&hpcd_USB_FS);// 进行其他初始化和应用程序代码while (1){// 主循环}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);// 配置 HSE 为 8MHz 外部晶振RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 8;  // 分频系数,原始频率 / 8 = 1MHzRCC_OscInitStruct.PLL.PLLN = 384; // 倍频系数,1MHz * 384 = 384MHzRCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 384MHz / 2 = 192MHz (SYSCLK)RCC_OscInitStruct.PLL.PLLQ = 8;  // 分频系数,384MHz / 8 = 48MHz (USB频率)if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | 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_3) != HAL_OK){Error_Handler();}// 更新系统时钟配置SystemCoreClockUpdate();
}void Error_Handler(void)
{while (1){// 处理错误}
}

这个代码片段中,关键的部分是 RCC_OscInitStructRCC_ClkInitStruct 结构体的配置,特别是 PLL.PLLN 的值设置为 384,以满足 48MHz 的 USB 频率要求。这个例程假设使用的是 STM32Cube HAL 库,并在 main() 函数中调用了 HAL_Init()。实际上,具体的配置可能需要根据你的硬件设计和使用的芯片型号进行调整。在编写代码时,请参考相关的芯片手册和硬件设计文档。

1.4、认识时钟树(F7)

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

STM32F7时钟树简图

在这里插入图片描述

STM32CubeMX时钟树(F767/F750)

在这里插入图片描述

1.5、认识时钟树(H7)

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

STM32H7时钟树简图

在这里插入图片描述

STM32H7时钟树-低频部分简图

在这里插入图片描述### STM32CubeMX时钟树(H7)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、配置系统时钟

2.1、系统时钟配置步骤

在这里插入图片描述
系统时钟配置步骤,下面是对每个步骤进行一些详细解释:

  1. 配置HSE_VALUE:

    • stm32xxxx_hal_conf.h 文件中,你需要设置 HSE_VALUE 宏定义,用于告诉HAL库外部晶振的频率。这是时钟系统的基础,确保HAL库能正确配置时钟。
  2. 调用SystemInit()函数(可选):

    • SystemInit() 函数通常包含在启动文件中,用于执行一些基本的系统初始化。在这里,它可以执行一些硬件的初始化,例如设置向量表和启用FPU等。这一步通常是由编译器自动调用的,你只需确保启动文件正确。
  3. 选择时钟源,配置PLL:

    • 使用 HAL_RCC_OscConfig() 函数配置时钟源和PLL。
    • 通过填写 RCC_OscInitTypeDef 结构体,可以指定HSE或HSI作为时钟源,并配置PLL的倍频系数和分频系数。
    • 示例如下:
      RCC_OscInitTypeDef RCC_OscInitStruct;
      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; // PLL倍频
      RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLL分频
      RCC_OscInitStruct.PLL.PLLQ = 7;   // USB OTG FS, SDIO and RNG分频
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {Error_Handler();
      }
      
  4. 选择系统时钟源,配置总线分频器:

    • 使用 HAL_RCC_ClockConfig() 函数配置系统时钟和总线分频器。
    • 通过填写 RCC_ClkInitTypeDef 结构体,可以选择PLL为系统时钟源,并配置AHB、APB1、APB2等分频系数。
    • 示例如下:
      RCC_ClkInitTypeDef RCC_ClkInitStruct;
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | 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)
      {Error_Handler();
      }
      
  5. 配置扩展外设时钟(可选):

    • 使用 HAL_RCCEx_PeriphCLKConfig() 函数配置扩展外设时钟,如RTC、ADC、USB等。
    • 示例如下:
      RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
      PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB | RCC_PERIPHCLK_RTC;
      PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL;
      PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
      if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
      {Error_Handler();
      }
      

这些步骤涵盖了从外部晶振到PLL配置,再到系统时钟和总线分频的整个过程。确保在配置时钟时参考芯片手册和硬件设计文档,以确保满足具体硬件的要求。

2.2、外设时钟使能和失能

在这里插入图片描述

在HAL库中,使能和失能外设时钟的方法通常使用了一些预定义的宏和函数。以下是对这两个操作的分析:

  1. 使能外设时钟:

    • 通常使用形如 __HAL_RCC_XXX_CLK_ENABLE() 的宏,其中 XXX 表示具体的外设(比如GPIOA、USART1等)。
    • 这个宏实际上是在底层调用了HAL库中相应外设的时钟使能函数,这个函数会配置相应的时钟使能寄存器,以确保外设可以正常工作。
  2. 失能外设时钟:

    • 通常使用形如 __HAL_RCC_XXX_CLK_DISABLE() 的宏,其中 XXX 表示具体的外设。
    • 类似地,这个宏底层会调用HAL库中相应外设的时钟失能函数,将时钟使能寄存器中的相应位清零,以禁用外设的时钟。

这些宏实际上是对底层寄存器的访问进行了封装,方便用户使用。例如,对于GPIOA的时钟使能:

__HAL_RCC_GPIOA_CLK_ENABLE();    // 使能 GPIOA 时钟
__HAL_RCC_GPIOA_CLK_DISABLE();   // 禁止 GPIOA 时钟

上述操作会调用底层的函数,具体实现会涉及到对相应寄存器的设置或清零。这些宏和函数的实现在HAL库的源代码中,用户一般无需直接关注底层实现,只需要正确使用这些宏即可。

这种封装提高了代码的可读性和可维护性,同时确保了对寄存器的操作是正确的。

2.3、sys_stm32_clock_init 函数(F1)

HAL_RCC_OscConfig()函数(F1)

在这里插入图片描述

HAL_RCC_ClockConfig函数(F1)

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

2.4、sys_stm32_clock_init 函数(F4/F7)

HAL_RCC_OscConfig()函数(F4/F7)

在这里插入图片描述

HAL_RCC_ClockConfig()函数(F4/F7)

在这里插入图片描述

2.5、sys_stm32_clock_init 函数(H7)

HAL_RCC_OscConfig()函数(H7)

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

HAL_RCC_ClockConfig()函数(H7)

在这里插入图片描述

HAL_RCCEx_PeriphCLKConfig()函数(H7)

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

三、总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绝世唐门:霍挂六个十万年魂环,一穿七灭团再现,淘汰赛顺利晋级

Hello,小伙伴们,我是拾荒君。 国漫《斗罗大陆2绝世唐门》第32期超前爆料,霍雨浩开局便释放六个十万年魂环,以绝对的气场碾压天灵学院代表队。首次参与高级魂师大赛,霍雨浩便大放异彩秀出超级霍挂,此等操作就连当初的唐…

如何修复鼠标不工作的问题?这里提供几个方法

如果你的鼠标无法连接到你的电脑,或者只能间歇性工作,那就是一个问题。你需要买一个新的吗?不一定。虽然换个便宜的无线鼠标很容易,但在你花钱买一款符合人体工程学的新鼠标或游戏鼠标之前,有一些事情需要尝试。 检查电源 像任何其他外设一样,鼠标需要电源。许多鼠标上都…

人口增长问题 T1063

#include<bits/stdc.h> using namespace std; int main(){int n;double x;cin>>x>>n;for(int i1;i<n;i){xx*1.001;}printf("%.4lf",x);return 0; }

【lesson35】基础IO之fd周边问题

文章目录 基础IO要讲的知识点介绍fd周边问题 基础IO要讲的知识点介绍 1.复习一下C语言的接口 2.直接使用系统接口 3.分析系统接口的细节&#xff0c;引入fd&#xff08;文件描述符&#xff09; 4.fd的周边问题&#xff08;fd的理解、fd和file的关系、fd分配规则、fd重定向…&a…

【数据结构】并查集(路径压缩)

文章目录 并查集1.朴素版本2.路径压缩3.按秩合并4.启发式合并5.练习题 并查集 1.朴素版本 1. 并查集解决的是连通块的问题&#xff0c;常见操作有&#xff0c;判断两个元素是否在同一个连通块当中&#xff0c;两个非同一连通块的元素合并到一个连通块当中。 并查集和堆的结构…

Unity 图片不改变比例适配屏幕

Unity 图片不改变比例适配屏幕 前言项目场景布置代码编写添加并设置脚本效果 前言 遇到一个要让图片适应相机大小&#xff0c;填满屏幕&#xff0c;但不改变图片比例的需求&#xff0c;记录一下。 项目 场景布置 代码编写 创建AdaptiveImageBackground脚本 using System.C…

ConcurrentModificationException异常原因,解决方法,线程安全的单例模式

异常简介 ConcurrentModificationException&#xff08;并发修改异常&#xff09;是基于java集合中的 快速失败&#xff08;fail-fast&#xff09; 机制产生的&#xff0c;在使用迭代器遍历一个集合对象时&#xff0c;如果遍历过程中对集合对象的内容进行了增删改&#xff0c;…

Fink CDC数据同步(二)MySQL数据同步

1 开启binlog日志 2 数据准备 use bigdata; drop table if exists user;CREATE TABLE user(id INTEGER NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL DEFAULT ,birth VARCHAR(20) NOT NULL DEFAULT ,gender VARCHAR(10) NOT NULL DEFAULT ,PRIMARY KEY(id) ); ALTER TA…

刘知远团队大模型技术与交叉应用L6-基于大模型文本理解和生成介绍

介绍 NLP的下游运用可以分为&#xff1a;NLU(理解)和NLG(生成) 信息检索&#xff1a;NLU 文本生成&#xff1a;NLG 机器问答&#xff1a;NLUNLG 大模型在信息检索 大模型在机器问答 大模型在文本生成 信息检索-Information Retrieval (IR) 背景 谷歌搜索引擎目前同时集成了…

NLP入门系列—Attention 机制

NLP入门系列—Attention 机制 Attention 正在被越来越广泛的得到应用。尤其是 [BERT]火爆了之后。 Attention 到底有什么特别之处&#xff1f;他的原理和本质是什么&#xff1f;Attention都有哪些类型&#xff1f;本文将详细讲解Attention的方方面面。 Attention 的本质是什…

Mac M1使用PD虚拟机运行win10弹出“内部版本已过期立即安装新的windows内部版本”

一、问题 内部版本已过期立即安装新的windows内部版本 二、解决 1、如图所示打开zh-CN目录 C:\windows\system32\zh-CN找到licensingui.exe文件 将该文件重命名为licensingui_bak.exe 2、修改完成效果如下 &#xff08;1&#xff09;但操作中发现&#xff0c;需要TrustedIns…

闲的无聊,做了几个微信红包封面,才发现好像没啥用,索然无味

这几天闲的无聊&#xff0c;正好也快要过年了&#xff0c;心血来潮搞几个微信红包封面。 折腾了大半天&#xff0c;又是ps&#xff0c;又是开通微信红包封面平台。 弄了100多个图&#xff0c;选出来50个&#xff0c;最后就提交了1个到微信平台&#xff0c;也通过审核了。 最…

【Kafka】服务器Broker与Controller详解

这里写自定义目录标题 Broker概述Broker总体工作流程Broker重要参数 Controller为什么需要Controller具体作用数据服务Leader选举选举流程脑裂问题羊群效应触发leader选举 Broker 概述 Kafka服务实例&#xff0c;负责消息的持久化、中转等功能。一个独立的Kafka 服务器被就是…

vue2 对接 海康摄像头插件 (视频WEB插件 V1.5.2)

前言 海康视频插件v.1.5.2版本运行环境需要安装插件VideoWebPlugin.exe&#xff0c;对浏览器也有兼容性要求&#xff0c;具体看官方文档 对应下载插件 去海康官网下载插件 里面有dome等其他需要用到的 地址&#xff1a; 安装插件 打开下载的文件里的bin文件 安装一下Video…

修改Vim编辑器的缩进和显示行数

一、Vim编辑器的缩进和显示行数 1.指令 sudo vi /etc/vim/vimrc2.插入内容 set tabstop4 set shiftwidth4 set nu 注意输入的格式&#xff0c;前后不要留空格 tabstop是输入按下tab缩进4个 shiftwidth是批量缩进4个 nu是显示行数

革命性的写作:MDX 让你的 Markdown 全面动起来

1. MDX MDX 是一种标记语法&#xff0c;它结合了 Markdown&#xff08;一种流行的文本到 HTML 的转换工具&#xff09;和 JSX&#xff08;React 中用于描述 UI 组件的语法扩展&#xff09;。MDX 允许你在 Markdown 文档中直接写入 JSX&#xff0c;这意味着你可以在 Markdown 内…

IPv6协议讲解

IPv6协议讲解 IPv6是互联网协议的第六版(Internet Protocol Version 6)&#xff0c;它用于在互联网上路由数据包&#xff0c;旨在替代IPv4&#xff0c;它提供了更多的IP地址和改进的网络功能。IPv6是为了应对互联网快速发展带来的挑战而设计的&#xff0c;它的引入不仅解决了地…

【教学类-40-08】A4骰子纸模制作8.0(2.97CM嵌套骰子表格相连 一页7个 油墨打印A4铅画纸)

作品展示&#xff08;一页7个骰子&#xff0c;表格连在一起&#xff0c;一行一个&#xff08;2嵌套&#xff09;&#xff09; 背景需求&#xff1a; 制作三嵌套盒子并实践后&#xff0c;感觉套起来很紧&#xff0c;还是用2嵌套的铅画纸做骰子比较好&#xff0c; https://blog…

代码随想录算法训练营|day24

第七章 回溯算法 77.组合代码随想录文章详解总结 77.组合 以n5,k3为例 (1)for循环遍历&#xff0c;递归选择符合要求的值加入path&#xff0c;len(path)k时&#xff0c;返回 statrtIndex保证每次递归取到的值不重复 剪枝&#xff1a;i<n-(k-len(path))1 后续需要k-len(pat…

政安晨的AI笔记——示例演绎OpenAI的ChatGPT与DALL·E提示词总原则(并融合创作一副敦煌飞天仙女图)

ChatGPT是由OpenAI开发的一种基于大规模预训练的语言生成模型。它建立在GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的基础上&#xff0c;通过大量的无监督学习和生成式任务训练来学习语言的概念和模式。 ChatGPT的原理是基于Transformer模型。Transfo…