SystemClock_Config 函数解析
SystemClock_Config 函数解析
这个函数用于配置STM32微控制器的系统时钟。以下是每一行设置的详细解释:
1. 电源配置
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
配置电源供应为LDO(低压差线性稳压器)模式
2. 调节器输出电压配置
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
设置内部稳压器输出电压为Scale3模式(最低电压模式,用于低功耗)
3. 等待稳压器就绪
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
等待直到电压调节器稳定并准备就绪(VOSRDY标志置位)
4. 振荡器配置
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSI;
指定要配置的振荡器类型:HSI48(48MHz高速内部时钟)和HSI(高速内部时钟)
RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
配置HSI时钟不分频(保持原始频率)
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
使用默认的HSI校准值
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
启用HSI48时钟
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
不启用PLL(锁相环)
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {Error_Handler(); }
应用振荡器配置,如果失败则调用错误处理函数
5. 时钟树配置
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
指定要配置的所有时钟类型:系统时钟、AHB总线时钟、APB1/APB2总线时钟等
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
选择HSI作为系统时钟源
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
系统时钟不分频
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
AHB总线时钟不分频
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;
APB3总线时钟不分频
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
APB1总线时钟不分频
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
APB2总线时钟不分频
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
APB4总线时钟不分频
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {Error_Handler(); }
应用时钟配置,设置FLASH等待状态为1(因为时钟频率较低),如果失败则调用错误处理函数
总结
这个配置将系统设置为:
使用内部HSI时钟作为系统时钟源
所有总线时钟都不分频
工作在低电压模式(Scale3)
不使用PLL,因此系统时钟频率就是HSI的原始频率(通常是16MHz或更低,取决于具体芯片)
这是一个相对低功耗的基本时钟配置