stm32f407获取系统时钟
时间: 2025-01-06 15:31:02 浏览: 9
### 配置和获取 STM32F407 的系统时钟
#### 1. 主 PLL 和 SYSCLK 配置
为了使 STM32F407 微控制器能够高效运行,需先配置主相位锁定环路 (PLL),从而获得所需的系统时钟频率。通常情况下,HSE 或 HSI 可作为输入源给到 PLL 进行倍频操作。
对于基于外部高速晶振(HSE)的情况:
```c
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 初始化外设时钟
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
// 配置并启用 HSE 振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){
// 错误处理...
}
// 设置 AHB, APB1, APB2 分频因子以及选择SYSCLK源为PLL输出
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | \
RCC_CLOCKTYPE_PCLK1 | \
RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // 对应于APB1总线
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // 对应于APB2总线
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){
// 错误处理...
}
```
上述代码片段展示了如何初始化外部高速晶体,并设置相应的分频系数以确保不同总线上设备能稳定工作[^1]。
#### 2. 获取当前系统时钟频率
要读取当前的系统时钟频率,可以利用 `HAL_RCC_GetSysClockFreq()` 函数来实现这一点。此函数会返回实际使用的系统时钟速率值(单位 Hz)。另外还可以调用其他类似的 API 来查询特定总线上的有效时钟速度,比如 PCLK1 和 PCLK2。
```c
uint32_t sysclk_freq = HAL_RCC_GetSysClockFreq(); // 获取 SYSCLK 实际频率
uint32_t pclk1_freq = HAL_RCC_GetPCLK1Freq(); // 获取 APB1 总线的实际频率
uint32_t pclk2_freq = HAL_RCC_GetPCLK2Freq(); // 获取 APB2 总线的实际频率
printf("System Clock Frequency: %luHz\n", sysclk_freq);
printf("APB1 Bus Frequency: %luHz\n", pclk1_freq );
printf("APB2 Bus Frequency: %luHz\n", pclk2_freq );
```
这段程序说明了怎样通过标准库提供的接口轻松地访问这些重要的定时参数。
阅读全文