帮我写一个stm32f103c8hal库的时钟配置函数,用PLL倍频HSI到64mhz
时间: 2024-10-10 10:04:09 浏览: 20
stm32HAL库完美实现单总线挂多个DS18B20
3星 · 编辑精心推荐
在STM32F103C8 HAL库中,配置系统时钟通常涉及到以下几个步骤:设置HSI作为源、启用HSI预分频器、启动PLL并设置适当的因子以达到目标频率,以及更新系统时钟频率。这里是一个简化版的示例函数,假设你已经有了基本的HAL初始化:
```c
#include "stm32f10x_hal.h"
void SetSystemClockTo64MHz(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
// 1. 初始化时钟振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_PLLHSI48;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 8; // 根据实际HSI频率调整这个值,HSI默认频率通常是8MHz
RCC_OscInitStruct.PLL.PLLN = 7; // 为了得到64MHz,HSI需要经过6次分频,所以N=7*8MHz/64MHz
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 如果HSI有效率较低,可以考虑增加 PLL 的 P 分数
RCC_OscInitStruct.PLL.PLLQ = 5; // 另外一个可自定义项,取决于系统的性能需求
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
// 错误处理...
}
// 2. 初始化系统时钟
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_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
// 错误处理...
}
// 3. 确认时钟是否已切换到期望频率
uint32_t sysclk_freq = HAL_RCC_GetSysClockFreq();
if (sysclk_freq < 64000000UL || sysclk_freq > 64000010UL) // 检查实际频率在64MHz附近
{
// 警告或错误...
}
}
```
请注意,上述代码仅为示例,并未涵盖所有异常处理和详细的错误检查。在实际项目中,你需要确保每个操作都成功完成,并且考虑到不同设备可能的特性差异。
阅读全文