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 系统时钟配置步骤
具体配置步骤如下:
- 配置HSE_VALUE,告诉HAL库外部的晶振频率
- 调用SystemInit()(可选)
- 通过HAL_RCC_Oscconfig()选择时钟源,配置PLL
- 通过HAL_RCC_Clockconfig()选择系统时钟源,配置总线分频器
- 通过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)

浙公网安备 33010602011771号