【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟

这篇具有很好参考价值的文章主要介绍了【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.认识时钟树(掌握)

1.1什么是时钟?

  下图的clk是clock(时钟)的缩写,下面的波形可以理解为脉冲信号或者方波。简单来说,时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波。时钟是单片机的脉搏,搞懂时钟走向及关系,对单片机使用至关重要!
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

1.2认识时钟树(F1)

  下图是F1系列的时钟树,从左侧竖线开始,OSC_OUT与OSC_IN是外部高速晶振所连接的引脚,OSC32_IN与OSC32_OUT是外部低速晶振所连接的引脚,这两个是外部时钟源。STM32还有内部时钟源HSI与LSI。HSE经过PLLXTPRE选择器可以进行1分频或者2分频,PLLSRC用于选择内部还是外部时钟,经过PLL锁相环倍频得到PLLCLK,选择器控制位SW选择SYSCLK的时钟来源。Cortex系统时钟是滴答定时器SysTick,定时器时钟频率都为72Mhz,TIM1和TIM8位高级定时器。
  STM32是向外部输出时钟通道,MCO是引脚PA8复用得到此项功能,时钟来源有四个。
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#
  四个时钟源的名字、作用如下,字母的简写形式为:
H:high
L:low
S:speed
I:internal
E:external
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#
  振荡器主要分为晶体、陶瓷、RC,如果是晶体需要外接晶振,陈本提高,RC振荡器是芯片内部,不需要额外成本,但是从稳定、精确度方面来讲外部振荡器比较好。
  NIM为不可屏蔽中断,在休眠时将AHB总线时钟屏蔽,唤醒时需要中断进行唤醒,FCLK可以保证睡眠时仍可以产生中断,保证芯片内部一部分功能正常使用,
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

1.2.1STM32F103时钟树简图

  STM32F103最大系统时钟为72MHz,HSE与HSI想要得到72MHz需要经过PLL锁相环进行倍频,进入PLL之前也需要进行分频,HSI只有2分频,HSE可以选择1分频或者2分频。HSI经过2分频为4MHz经过16倍频,最大是64MHz,即用内部高速时钟最大可达64MHz显然用内部是不满足的,基本是不使用。F1系列最常用HSE为8MHz,与HSI时钟一致,一分频后为8MHz,经过9倍频,可以得到72MHz。
  经过系统时钟来到HCLK(也就是AHB总线,AHB总线时钟用名字HCLK来表示),从SYSCLK到HCLK需要进行分频(分频系数不用关心,具体的分频系数需要查看寄存器,事实上该分频系数一般设置为1);HCLK经过两个桥分为APB1和APB2总线,分频系数份别为2和1,AHB除了能分出APB1和APB2,AHB总线上还会挂载外设,并且内核时钟也是来自AHB。
  低速有LSI与LSE,LSI可以作为IWDG独立看门狗、RTC实时时钟外设的时钟来源,LSE只能作为RTC的时钟源。

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

时钟源(振荡器)、锁相环:HAL_RCC_OscConfig(),控制时钟源是否打开、锁相环PLL的倍频系数
系统时钟、总线:HAL_RCC_ClockConfig(),配置系统时钟的来源,SYSCLK->HCLK->APB1/APB2的分频器。
使能外设时钟:__HAL_RCC_PPP_CLK_ENABLE()__HAL_RCC_PPP_CLK_ENABLE()并不是函数是宏,PPP代表任意外设,例如GPIO、ADC等,STM32为了低功耗,将所有外设时钟默认是关闭的,想要使用哪一个外设就要使能哪一个宏。
扩展外设时钟(RTC/ADC/USB):HAL_RCCEx_PeriphCLKConfig(),Ex是拓展Extend的缩写,不同系列,该函数配置的外设不同。

1.2.2STM32CubeMX时钟树(F103)

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

1.3认识时钟树(F4)

1.3.1F407时钟树

  下图是F407时钟树图,与F429时钟树不同。图中VCO,V是电压,C是控制,O是振荡器,也就是压控振荡器。
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#
  时钟来源与F1类似,频率有些不同。
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

1.3.2F429时钟树

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

1.3.3STM32F4时钟树简图

  HSE与HSI都无法直接达到SYSCLK的最大时钟频率,需要经过锁相环倍频,在此之前需要进行M倍分频,F1系列锁相环PLL只是倍频器,而F4系列锁相环是先倍频后分频,SYSCLK一般经过1分频到达HCLK也就是AHB总线,在F4系列中AHB分为AHB1和AHB2,甚至AHB3,APB1与APB2是AHB1总线经过桥达到的。。LSE是专门为RTC提供的,RTC对时钟的精准度要求较高,优先选择LSE,如果没有LSE则用LSI代替。
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

时钟源、PLL:HAL_RCC_OscConfig()用于配置四个时钟源的开关,以及RTC振荡器校准系数的设置。
系统时钟、总线:HAL_RCC_ClockConfig()配置系统时钟的来源,
使能外设时钟:__HAL_RCC_PPP_CLK_ENABLE()PPP可以是任意外设,例如GPIO
扩展外设时钟(PLLI2S/ I2S/ LTDC /RTC等):HAL_RCCEx_PeriphCLKConfig()

1.3.4STM32CubeMX时钟树(F407)

  48MHz clocks(MHz)可以作为全速USB(FSUSB)的时钟来源。
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

1.3.5STM32CubeMX时钟树(F429)

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#
USB相关例程的系统时钟配置,为了让FSUSB全速运行,但是系统会超频,但是这些超频是允许的。
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

2,配置系统时钟(掌握)

1.配置HSE_VALUE:告诉HAL库外部晶振频率,在stm32xxxx_hal_conf.h,定义;
2.调用SystemInit()函数(可选):在启动文件中调用, 在system_stm32xxxx.c定义;
3.选择时钟源,配置PLL:通过HAL_RCC_OscConfig()函数设置;
4.选择系统时钟源,配置总线分频器:通过HAL_RCC_ClockConfig()函数设置;
5.配置扩展外设时钟(可选):通过HAL_RCCEx_PeriphCLKConfig()函数设置,正点原子只在H7系列中设置此项
3 +4 + 5 =正点原子自定义函数 sys_stm32_clock_init()

2.1外设时钟使能和失能

  我们要使用某个外设,必需先使能该外设时钟!!!
HAL库使能某个外设时钟的方法,以使能GPIOA为例,如:

 __HAL_RCC_GPIOA_CLK_ENABLE();      		/* 使能 GPIOA 时钟 */

HAL库禁止某个外设时钟的方法,以使能GPIOA为例,如:

__HAL_RCC_GPIOA_CLK_DISABLE();      	/* 禁止 GPIOA 时钟 */

2.2sys_stm32_clock_init 函数(F1)

2.2.1HAL_RCC_OscConfig()函数(F1)

  HAL_RCC_OscConfig()函数原型如下,函数返回值为HAL_StatusTypeDef类型。

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)

  `第一个参数OscillatorType是选择4个振荡器中的哪一个;HSEState配置HSE打开还是关闭;HSI是永远RC振荡器的,会随着温度、电压变化而变化,不稳定,需要有一个校验值。

typedef struct 
{ 
	uint32_t  OscillatorType; 		/* 选择需要配置的振荡器 */ 
	uint32_t  HSEState; 			/* HSE 状态 */ 
	uint32_t  HSEPredivValue; 		/* HSE 预分频值 */ 
	uint32_t  LSEState; 			/* LSE 状态 */ 
	uint32_t  HSIState; 			/* HSI状态 */ 
	uint32_t  HSICalibrationValue; 	/* HSI 校准值 */ 
	uint32_t  LSIState; 			/* LSI 状态 */ 
	RCC_PLLInitTypeDef  PLL; 		/* PLL 结构体 */ 
}RCC_OscInitTypeDef;

RCC_PLLInitTypeDef锁相环结构体如下所示,PLLState是配置打开锁相环还是关闭,倍频系数为2~16倍频。

typedef struct 
{ 
	uint32_t  PLLState; 		/* PLL 状态 */ 
	uint32_t  PLLSource; 	/* PLL 时钟源 */ 
	uint32_t  PLLMUL; 		/* PLL 倍频系数 */ 
}RCC_PLLInitTypeDef;

2.2.2 HAL_RCC_ClockConfig()函数(F1)

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency)

  HCLK是AHB总线时钟,PCLK1是APB1总线上时钟,PCLK2是APB2总线上时钟。

typedef struct 
{ 
	uint32_t  ClockType; 		/* 要配置的时钟(SYSCLK/HCLK/PCLK1/PCLK2) */ 
	uint32_t  SYSCLKSource; 		/* 系统时钟源 */ 
	uint32_t  AHBCLKDivider; 		/* AHB  时钟预分频系数 */ 
	uint32_t  APB1CLKDivider; 	/* APB1 时钟预分频系数 */ 
	uint32_t  APB2CLKDivider; 	/* APB2 时钟预分频系数 */ 
}RCC_ClkInitTypeDef;

  F1系统时钟为72Mhz,FLASH时钟来源来自72Mhz,但是用72Mhz会超频,最大时钟频率为24Mhz,用72Mhz的时钟访问FLAH太快,需要等待几个周期。

uint32_t FLatency 

#define  FLASH_LATENCY_0   0x00000000U 				/* FLASH 0个等待周期 */ 
#define  FLASH_LATENCY_1   FLASH_ACR_LATENCY_0 		/* FLASH 1个等待周期 */ 
#define  FLASH_LATENCY_2   FLASH_ACR_LATENCY_1 		/* FLASH 2个等待周期 */

实际设置FLASH_ACR寄存器LATENCY位域,需要参考《 STM32F10xxx闪存编程参考手册.pdf 》3.1小节

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

2.2.3实际配置步骤

2.3.1.1.配置HSE_VALUE

  在stm32f1xx_hal_conf.h中配置HSE_VALUE的值。

#if !defined  (HSE_VALUE)
#if defined(USE_STM3210C_EVAL)
#define HSE_VALUE    25000000U /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE    8000000U /*!< Value of the External oscillator in Hz */
#endif
#endif /* HSE_VALUE */
2.3.2,调用SystemInit()函数(可选)

  如果不想调用SystemInit()函数,可以用分号“;”注释掉。SystemInit()函数在system_stm32f1xx.c中被定义,只配置了中断向量表所在的位置,并没有配置时钟相关。

; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP
2.3.2,调用sys_stm32_clock_init()函数

  sys_stm32_clock_init()函数一般在main函数的前几行被调用,主要由函数HAL_RCC_OscConfigHAL_RCC_ClockConfig组成。选择要配置的时钟时,可以用或“|”同时设置多个时钟,结构体rcc_osc_init在定义时给到0,如果其中结构体未被赋值,则默认为0,如果不定义可能为随机数,赋值为0是为了避免不必要的麻烦。

void sys_stm32_clock_init(uint32_t plln)
{
    HAL_StatusTypeDef ret = HAL_ERROR;
    RCC_OscInitTypeDef rcc_osc_init = {0};
    RCC_ClkInitTypeDef rcc_clk_init = {0};

    rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE;       /* 选择要配置HSE */
    rcc_osc_init.HSEState = RCC_HSE_ON;                         /* 打开HSE */
    rcc_osc_init.HSEPredivValue = RCC_HSE_PREDIV_DIV1;          /* HSE预分频系数 */
    rcc_osc_init.PLL.PLLState = RCC_PLL_ON;                     /* 打开PLL */
    rcc_osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE;             /* PLL时钟源选择HSE */
    rcc_osc_init.PLL.PLLMUL = plln;                             /* PLL倍频系数 */
    ret = HAL_RCC_OscConfig(&rcc_osc_init);                     /* 初始化 */

    if (ret != HAL_OK)
    {
        while (1);                                              /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */
    }

    /* 选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2*/
    rcc_clk_init.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
    rcc_clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;        /* 设置系统时钟来自PLL */
    rcc_clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1;               /* AHB分频系数为1 */
    rcc_clk_init.APB1CLKDivider = RCC_HCLK_DIV2;                /* APB1分频系数为2 */
    rcc_clk_init.APB2CLKDivider = RCC_HCLK_DIV1;                /* APB2分频系数为1 */
    ret = HAL_RCC_ClockConfig(&rcc_clk_init, FLASH_LATENCY_2);  /* 同时设置FLASH延时周期为2WS,也就是3个CPU周期。 */

    if (ret != HAL_OK)
    {
        while (1);                                              /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */
    }
}

2.4sys_stm32_clock_init 函数(F4/F7)

  STM32F4/F7系列的sys_stm32_clock_init 函数实现主要由HAL_RCC_OscConfig()函数和HAL_RCC_ClockConfig()函数实现。

2.4.1 HAL_RCC_OscConfig()函数

  HAL_RCC_OscConfig()函数的返回值数据类型为HAL_StatusTypeDef ,一般无需关心其返回值,除非函数在调用过程中出现了问题。

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)

  `OscillatorType是选择外部的哪个振荡器,如果要配置多个振荡器,则用竖线“|”隔开。

typedef struct 
{ 
	uint32_t  OscillatorType; 		/* 选择需要配置的振荡器 */ 
	uint32_t  HSEState; 			/* HSE 状态 */ 
	uint32_t  LSEState; 			/* LSE 状态 */ 
	uint32_t  HSIState; 			/* HSI 状态 */ 
	uint32_t  HSICalibrationValue; 	/* HSI 校准微调值,范围0x0~0x1F */ 
	uint32_t  LSIState; 			/* LSI 状态 */ 
	RCC_PLLInitTypeDef  PLL; 		/* PLL 结构体 */ 
}RCC_OscInitTypeDef;
typedef struct 
{ 
	uint32_t  PLLState; 		/* PLL 状态 */ 
	uint32_t  PLLSource; 	/* PLL 时钟源 */ 
	uint32_t  PLLM; 		/* PLL 分频系数 M */ 
	uint32_t  PLLN; 		/* PLL 倍频系数 N */ 
	uint32_t  PLLP; 		/* PLL 分频系数 P */ 
	uint32_t  PLLQ; 		/* PLL 分频系数 Q */ 
}RCC_PLLInitTypeDef; 

2.4.2HAL_RCC_ClockConfig()函数

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency)
typedef struct 
{ 
	uint32_t  ClockType; 		/* 要配置的时钟(SYSCLK/HCLK/PCLK1/PCLK2) */ 
	uint32_t  SYSCLKSource; 		/* 系统时钟源 */ 
	uint32_t  AHBCLKDivider; 		/* AHB  时钟预分频系数 */ 
	uint32_t  APB1CLKDivider; 	/* APB1 时钟预分频系数 */ 
	uint32_t  APB2CLKDivider; 	/* APB2 时钟预分频系数 */ 
}RCC_ClkInitTypeDef;

  配置FLASH的等待周期,由于F4/F7系列的系统时钟都比访问FLASH的时钟更快,如果要有系统时钟访问FLASH则需要进行等待,一共是有0~15,16个选择。但是在有些芯片中,可能是0~7,那么需要查询FLASH_ACR寄存器LATENCY位域

uint32_t FLatency 

#define  FLASH_LATENCY_0   FLASH_ACR_LATENCY_0WS 	/* FLASH 0个等待周期 */ 
#define  FLASH_LATENCY_1   FLASH_ACR_LATENCY_1WS 	/* FLASH 1个等待周期 */ 
#define  FLASH_LATENCY_2   FLASH_ACR_LATENCY_2WS 	/* FLASH 2个等待周期 */ 
... 
#define  FLASH_LATENCY_15   FLASH_ACR_LATENCY_15WS 	/* FLASH 15个等待周期 */ 

2.4.3Stm32_Clock_Init()函数

  下面为F429时钟配置函数,__HAL_PWR_VOLTAGESCALING_CONFIG函数设置调压器输出电压,来控制最大可达到的时钟。其中等待周期FLASH_LATENCY_5可以根据STM32F4xx中文参考手册中的表7, CPU 时钟 (HCLK) 频率对应的等待周期数来进行配置。
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#

//时钟系统配置函数
//Fvco=Fs*(plln/pllm);
//SYSCLK=Fvco/pllp=Fs*(plln/(pllm*pllp));
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));

//Fvco:VCO频率
//SYSCLK:系统时钟频率
//Fusb:USB,SDIO,RNG等的时钟频率
//Fs:PLL输入时钟频率,可以是HSI,HSE等. 
//plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
//pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
//pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
//pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.

//外部晶振为25M的时候,推荐值:plln=360,pllm=25,pllp=2,pllq=8.
//得到:Fvco=25*(360/25)=360Mhz
//     SYSCLK=360/2=180Mhz
//     Fusb=360/8=45Mhz
//返回值:0,成功;1,失败
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{
    HAL_StatusTypeDef ret = HAL_OK;
    RCC_OscInitTypeDef RCC_OscInitStructure; 
    RCC_ClkInitTypeDef RCC_ClkInitStructure;
    
    __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
    
    //下面这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作
    //时使性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有,
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1
    
    RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE
    RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
    RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL
    RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE
    RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
    RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432.  
    RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
    RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
    ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
	
    if(ret!=HAL_OK) while(1);
    
    ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
    if(ret!=HAL_OK) while(1);
    
    //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
    RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
    RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
    RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
    RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4
    RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2
    ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。
		
    if(ret!=HAL_OK) while(1);
}

3,总结(了解)

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟,# STM32-HAL库,stm32,嵌入式硬件,单片机,HAL库,C#文章来源地址https://www.toymoban.com/news/detail-619926.html

到了这里,关于【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F4_时钟系统精讲

    目录 1. 什么是系统时钟 2. 时钟树 2.1 LSI 2.2 LSE 2.3 HSI  2.4 HSE 2.5 PLLCLK 2.6 SYSCLK 2.7 HCLK 2.8 PCLK1 2.9 PCLK2 2.10 RTC/AWU 3 SysTick定时器 3.1 为什么会有Systick定时器? 3.2 SysTick定时器的作用  3.3 SysTick定时器的寄存器 4. IO引脚复用和映射 5. NVIC中断优先级 5.1 中断寄存器 5.2 NVIC中断优先级设

    2024年02月13日
    浏览(24)
  • 【stm32开发笔记】基于HAL库的STM32F4添加DSP库

    本文分两种方法添加DSP库:1.CubeMX直接配置ioc添加; 2.KEIL内添加; 简述:补齐全部lib库-添加DSP包-使能DSP勾选-添加头文件及魔术棒配置-测试 1.补齐lib库。( 如果使用直接默认添加的库,是不支持FPU的,所以需要补齐后找到所需的lib文件进行替换,在MX的工程管理栏,选择复制所

    2024年02月16日
    浏览(39)
  • STM32F4基础:时钟系统、中断及定时器

            时钟系统是CPU的脉搏, 由于STM32 本身非常复杂,外设非常的多,并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可,因此STM32F4 的时钟系统比较复杂 ,不像简单的 51 单片机一个系统时钟就可以解决一切。         如下图所

    2023年04月09日
    浏览(26)
  • STM32F4_HAL库_串口阻塞/中断/DMA三种方式发送数据的配置

    串口阻塞发送的意思就是,发送一段数据,在没有发送完所有数据之前,一直停留在此发送函数(可设定阻塞时间),这个过程中会阻塞别的程序运行; HAL库的配置分为两个层次,一个是HAL库内部调用的、与MCU硬件相关的初始化xxx_MspInit,一个是我们外部调用的初始化xxx_In

    2023年04月25日
    浏览(38)
  • STM32 keil如何下载STM32芯片F1/F4固件库 .pack文件

    1.用keil打开STM32F407的程序,结果提示下面的问题,就是没有安装固件库 2.然后去keil官网下载对应的固件库,官网地址:https://www.keil.com/ 3.然后选中对应的芯片类型,譬如我这个就是STM32F407IGTx 4.双击下面的图标,即.pack可以直接点击安装,并且目录直接默认是keil安装的目录。

    2024年02月13日
    浏览(29)
  • 第三步:STM32F4时钟介绍

    1. STM32 有 5 个时钟源 :HSI 、 HSE 、 LSI 、 LSE 、 PLL 。     ①、 HSI 是高速内部时钟, RC 振荡器,频率为 16MHz ,精度不高。可以直接作为系统   时钟或者用作 PLL 时钟输入。 ②、 HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时                 钟源,频率范

    2024年02月12日
    浏览(32)
  • 7针0.96寸OLED的HAL库代码(硬件SPI/全代码/stm32f1/CubeMX配置/包含有正负浮点数/100%一次点亮)

    HC-SR04超声波模块的使用  编码电机以及双电机驱动 4针 0.96\\\'OLED的使用 更多有意思的文章点击“我的主页” --------😐 更多有意思的视频 ----- B站 @想要亿只独角兽 --------😐 之前发布了一篇硬件I2C的0.96\\\' OLED驱动代码,这次就添加一篇硬件SPI的驱动代码。 其实改动的代码不多,

    2024年02月16日
    浏览(30)
  • 4针0.96寸OLED的HAL库代码(硬件I2C/全代码/stm32f1/CubeMX配置/包含有正负浮点数/100%一次点亮)

    一、HC-SR04超声波模块的使用 二、4针OLED的HAL库代码介绍及使用(本篇) 三、7针OLED的HAL库代码介绍及使用 四、编码电机以及双电机驱动 更多有意思的文章点击“我的主页” --------😐 更多有意思的视频 ----- B站 @想要亿只独角兽 --------😐 之前在做一些小项目时用到了OLED,到

    2024年02月10日
    浏览(25)
  • STM32F1使用HAL库驱动DS18B20

    目录 DS18B20概述 工程配置  命令手册 单总线协议  初始化时序  写时序 读时序 读取温度 驱动附录  DS18B20是一款单总线(one wire)芯片,因此其DQ引脚与单片机相连的IO口既要是输入也要是输出,cubeMX的初始化引脚设置只能选择其一,这里我们使用手动配置引脚。 先用cubeMX生

    2024年02月04日
    浏览(26)
  • 【STM32F4系列】【HAL库】电机控制(转速和角度)(PID实战1)

    实现电机最常使用的两个功能, 转速控制 和 位置控制 使用PID闭环控制(控制线性系统最简单快捷的控制方法) 为了实现 控制电机转动 和 闭环控制 需要: 电机(废话) 编码器( 霍尔编码器 或者 光电编码器 均可) 电机驱动(这里选的是 l298n模块 ) 千万注意黑色的地线,单片机的地要

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包