STM32F429第八篇之stm32f4xx_hal_rcc
发布日期:2021-05-14 11:31:18 浏览次数:15 分类:精选文章

本文共 3895 字,大约阅读时间需要 12 分钟。

STM32F429 HAL库中RCC用法详解

创新设计手册

目录

综述

特性

复位之后,芯片的时钟源为HSI。Flash预取缓存,D缓存,I缓存和所有外设全部禁用。此时,只有内部SRAM,FLASH和JTAG还在工作。

  • 在高速总线和低速总线上都没有预分频,这些总线上映射的设备全都以HSI速度在运行。
  • 所有外设的时钟都关闭,除了SRAM和FLASH。
  • 所有GPIO为浮空输入状态,除了JTAG,其用于特定的debug功能。

一旦设备复位,用户软件必须做以下工作:

  • 配置时钟源来驱动系统时钟(SYSCLK)。
  • 配置系统时钟频率和Flash设定。
  • 配置AHB和APB的预分频。
  • 使能将要使用的GPIO。
  • 配置不是SYSCLK驱动的外设时钟源。

为了管理外设读写寄存器,应该考虑到:外设有效使能相比于RCC外设时钟使能有一个延时:

  • 延时取决于外设映射。
  • 若外设映射在AHB总线上,延时为2个AHB时钟。
  • 若外设映射在APB总线上,延时为2个APB时钟。

解决方案:对于AHB和APB外设中,虚拟读取外设已经插入到每一个 __HAL_RCC_PPP_CLK_ENABLE() 宏中。

初始化和反初始化函数

这个模块的函数实现以下功能:

  • 配置内部/外部振荡器:HSE,HSI,LSE,LSI,PLL,CSS,MCO
  • 系统总线时钟:SYSCLK,AHB,APB1,APB2

内部/外部时钟和PLL配置

  • 高速内部时钟(HSI):16MHz,工厂校正RC振荡器,可以直接使用或者间接用作系统时钟(SYSCLK)源。
  • 低速内部时钟(LSI):32kHz,低功耗RC振荡器,可以用于IWDG或者RTC时钟源。
  • 高速外部时钟(HSE):4-26MHz晶振,可以直接使用或者间接作用系统时钟(SYSCLK)源。另外还可以作为RTC时钟源。
  • 低速外部时钟(LSE):32kHz晶振,可以用作RTC时钟源。

系统,AHB,APB总线时钟配置

  • 可以作为SYSCLK时钟源的有:HSI, HSE, PLL。
  • AHB时钟(HCLK)从SYSCLK分频而来,可以用于驱动CPU,存储器和映射到AHB上的外设。
  • APB1(PCLK1)和APB2(PCLK2)时钟从AHB时钟分频而来,且用于驱动映射到该总线的外设。

注意

更多关于时钟树等更多的信息,可以参考<博客>。

外设控制函数

这部分函数用于控制RCC时钟频率。此外,这部分包含以下API:

...

函数介绍

HAL_RCC_DeInit

函数原型:

void HAL_RCC_DeInit(void)

复位RCC时钟到默认状态。

注意:

默认状态如下所示:

  • HSI打开且用作系统时钟源。
  • HSE和PLL关闭
  • CSS,MCO1和MCO2关闭
  • 所有中断关闭。

这个函数并不修改以下配置:

  • 外设时钟
  • LSI,LSE,和RTC时钟

HAL_RCC_OscConfig

函数原型:

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef * RCC_OscInitStruct)

通过RCC_OscInitStruct中的参数初始化RCC 晶振的特定参数。

注意:

  • 当PLL用作系统时钟的时候,不可以被禁用。
  • 该API不适用于将LSE Bypass转换成LSE On或者将LSE On 转化成LSE Bypass。
  • 该API不适用于将HSE Bypass转换成HSE On或者将HSE On 转化成HSE Bypass。用户需要首先将转换成HSE OFF,然后在去转换HSE Bypass或者HSE On.

HAL_RCC_ClockConfig

函数原型:

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef * RCC_ClkInitStruct, uint32_t FLatency)

根据特定参数RCC_ClkInitStruct来初始化CPU,AHB,APB系统时钟。

注意:

  • CMSIS变量用来存储系统时钟频率,且通过本函数调用的HAL_RCC_GetHCLKFreq()函数来更新数据。

结构体

HAL_StatusTypeDef

这个枚举类型定义了HAL的状态。

typedef enum {
HAL_OK = 0x00U,
HAL_ERROR = 0x01U,
HAL_BUSY = 0x02U,
HAL_TIMEOUT = 0x03U
} HAL_StatusTypeDef;

RCC_OscInitTypeDef

OscillatorType(振荡器类型)
/** @defgroup RCC_Oscillator_Type Oscillator Type  */
#define RCC_OSCILLATORTYPE_NONE ((uint32_t)0x00000000U)
#define RCC_OSCILLATORTYPE_HSE ((uint32_t)0x00000001U)
#define RCC_OSCILLATORTYPE_HSI ((uint32_t)0x00000002U)
#define RCC_OSCILLATORTYPE_LSE ((uint32_t)0x00000004U)
#define RCC_OSCILLATORTYPE_LSI ((uint32_t)0x00000008U)
HSEState(HSE状态)
/** @defgroup RCC_HSE_Config HSE Config  */
#define RCC_HSE_OFF ((uint8_t)0x00U)
#define RCC_HSE_ON ((uint8_t)0x01U)
#define RCC_HSE_BYPASS ((uint8_t)0x05U)
LSEState(LSE状态)
/** @defgroup RCC_LSE_Config LSE Config  */
#define RCC_LSE_OFF ((uint8_t)0x00U)
#define RCC_LSE_ON ((uint8_t)0x01U)
#define RCC_LSE_BYPASS ((uint8_t)0x05U)
HSIState(HSI状态)
/** @defgroup RCC_HSI_Config HSI Config  */
#define RCC_HSI_OFF ((uint8_t)0x00U)
#define RCC_HSI_ON ((uint8_t)0x01U)
#define RCC_HSICALIBRATION_DEFAULT ((uint32_t)0x10U)
LSIState(LSI状态)
/** @defgroup RCC_LSI_Config LSI Config  */
#define RCC_LSI_OFF ((uint8_t)0x00U)
#define RCC_LSI_ON ((uint8_t)0x01U)
PLL(PLL初始化)
typedef struct {
uint32_t PLLState; /*!PLL状态*/
uint32_t PLLSource; /*!RCC_PLLSource: PLL输入时钟源*/
uint32_t PLLM; /*!PLLM: PLL VCO输入时钟分割器*/
uint32_t PLLN; /*!PLLN: PLL VCO输出时钟乘数器*/
uint32_t PLLP; /*!PLLP: 主系统时钟(SYSCLK)分割器*/
uint32_t PLLQ; /*!PLLQ: OTG FS,SDIO和RNG时钟分割器*/
} RCC_PLLInitTypeDef;

RCC_ClkInitTypeDef

typedef struct {
uint32_t ClockType; /*!时钟类型*/
uint32_t SYSCLKSource; /*!系统时钟源*/
uint32_t AHBCLKDivider; /*!AHB时钟预分频器*/
uint32_t APB1CLKDivider; /*!APB1时钟预分频器*/
uint32_t APB2CLKDivider; /*!APB2时钟预分频器*/
} RCC_ClkInitTypeDef;

结论

通过适当配置RCC振荡器和时钟系结构件,开发者可以实现对STM32F429的精确控制。在实际应用中,需要注意时钟源的设置和外设时钟的有效使能延时。

上一篇:STM32F429第九篇之stm32f4xx_hal_rcc_ex
下一篇:STM32F429第七篇之RCC(复位与时钟)

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年05月03日 04时03分15秒