2、时钟

1 时钟树

1.1什么是时钟

时钟是具有周期性的脉冲信号,常用占空比50%的方波。

1.2时钟树(F1系列)

时钟源名称

频率

材料

用途

高速外部振荡器HSE

4~16MHz

晶体/陶瓷

SYSCLK/RTC

低速外部振荡器LSE

32.768KHz

晶体/陶瓷

RTC

高速内部振荡器HSI

8MHz

RC

SYSCLK

低速内部振荡器LSI

40KHz

RC

RTC/IWDG

时钟安全系统(CSS):若HSE启动失败,切换到HSI,可进入NMI中断

自由运行时钟(FCLK):用于采样中断和调试模块的计时,休眠仍然有效

2 系统时钟配置

2.1 系统时钟配置步骤

具体配置步骤如下:

  1. 配置HSE_VALUE,告诉HAL库外部的晶振频率
  2. 调用SystemInit()(可选)
  3. 通过HAL_RCC_Oscconfig()选择时钟源,配置PLL
  4. 通过HAL_RCC_Clockconfig()选择系统时钟源,配置总线分频器
  5. 通过HAL_RCCEx_PeriphCLKConfig()配置外设扩展时钟(可选)

2.2 外设时钟的使能和失能

使用某个外设前必需先使能对应外设的时钟

使能:__HAL_RCC_PPP_CLK_ENABLE();

失能:__HAL_RCC_PPP_CLK_DISABLE();

2.3 HAL_RCC_Oscconfig()函数

HAL_RCC_Oscconfig()函数是HAL库中配置时钟源的核心函数,负责初始化芯片振荡器和锁相环(PLL)。函数的基本定义为:

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);

该函数接受一个RCC_OscInitTypeDef结构体作为指针并返回一个HAL_StatusTypeDef枚举类型反映操作结果。其中RCC_OscInitTypeDef结构体的定义如下:

typedef stuct

{

uint32_t OscillatorType;

uint32_t HSEState;

uint32_t HSEPredivValue;

uint32_t LSEState;

uint32_t HSIState;

uint32_t HSICalibrationValue;

uint32_t LSIState;

RCC_PLLInitTypeDef PLL;

}RCC_OscInitTypeDef;

该结构体中各成员和参数如下:

OscillatorType:用以选择要配置的振荡器,可选值有

RCC_OSCILLATORTYPE_HSE:高速外部时钟

RCC_OSCILLATORTYPE_HSI:高速内部时钟

RCC_OSCILLATORTYPE_LSE:低速外部时钟

RCC_OSCILLATORTYPE_LSI:低速内部时钟

HSEState/HSIState/LSEState/LSIState:选择对应时钟状态,可选值有

RCC_HSE/HSI/LSE/LSI_ON:开启对应时钟

RCC_HSE/HSI/LSE/LSI_OFF:关闭对应时钟

HSEPredivValue:选择HSE进入PLL前的分频值,对应F1系列可选值有

RCC_HSE_PREDIV_DIV1:1分频(不分频)

RCC_HSE_PREDIV_DIV2:2分频

HSICalibrationValue:微调HSI内部RC振荡器的频率,校准其频率,可选范围为0x00到0x1F

RCC_PLLInitTypeDef:嵌套结构体,用以配置PLL,主要有3个成员:

PLLState:PLL的使能状态,可选值有

RCC_PLL_ON:开启PLL

RCC_PLL_OFF:关闭PLL

PLLSource:PLL的输入时钟源,可选值有

RCC_PLLSOURCE_HSE:选择HSE

RCC_PLLSOURCE_HSI:选择HSI

PLLMUL:PLL倍频,对应F1系列可选范围有RCC_PLL_MUL2到RCC_PLL_MUL16,代表2倍频到16倍频

当函数被调用时会返回一个枚举类型HAL_StatusTypeDef,其可能值有

HAL_OK:配置成功

HAL_ERROR:配置失败

HAL_TIMEOUT:配置超时

2.4 HAL_RCC_ClockConfig()函数

HAL_RCC_ClockConfig()函数是在HAL_RCC_Oscconfig()配置结束后用以确定整个芯片的时钟树,负责选择系统时钟源,并配置所有总线的分频系数。

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);

该函数主要包括两个参数,一个是时钟配置结构体,另一个为FLASH等待周期,并同样返回一个枚举类型HAL_StatusTypeDef反映操作结果,其中结构体的定义如下:

typedef struct

{

uint32_t ClockType;

uint32_t SYSCLKSource;

uint32_t AHBCLKDivider;

uint32_t APB1CLKDivder;

uint32_t APB2CLKDivder;

}RCC_CLKInitTypeDef

ClockType:选择配置的时钟总线,可选值有

RCC_CLOCKTYPE_SYSCLK:系统时钟

RCC_CLOCKTYPE_HCLK:AHB总线时钟

RCC_CLOCKTYPE_PCLK1:APB1外设总线时钟(F1系列最高36MHz)

RCC_CLOCKTYPE_PCLK2:APB2外设总线时钟(F1系列最高72MHz)

SYSCLKSource:选择系统时钟来源,可选值有

RCC_SYSCLK_SOURCE_HSI:选择HSI作为来源

RCC_SYSCLK_SOURCE_HSE:选择HSE作为来源

RCC_SYSCLK_SOURCE_PLLCLK:选择PLL作为来源(常用)

AHBCLKDivider:配置AHB总线时钟的分频系数,可选范围为RCC_SYSCLK_DIV1到RCC_SYSCLK_DIV512,代表1到512分频,将SYSCLK分频后作为HCLK

APB1CLKDivider:配置APB1总线时钟的分频系数,可选范围为RCC_HCLK_DIV1到RCC_HCLK_DIV16,代表1到16分频,将HCLK分频后作为PCLK1

APB2CLKDivider:配置APB2总线时钟的分频系数,可选范围为RCC_HCLK_DIV1到RCC_HCLK_DIV16,代表1到16分频,将HCLK分频后作为PCLK2

FLatency:配置FLASH储存器的访问等待周期。当SYSCLK提高时,CPU访问FLASH的速度需要匹配,否则当CPU速度太快而FLASH无法跟上时就会发生错误,因此需要设置访问等待周期,可选值有(以F1系列为例)

FLASH_LATENCY_0:不等待(当SYSCLK≤24MHz)

FLASH_LATENCY_1:等待1周期(当24MHz<SYSCLK≤48MHz)

FLASH_LATENCY_2:等待2周期(当48MHz<SYSCLK≤72MHz)

posted @ 2026-08-12 16:06  老鼠学32  阅读(0)  评论(0)    收藏  举报