STM32使用外部8M晶振如何配置HCLK时钟为20Mhz
时间: 2024-11-10 20:32:17 浏览: 129
STM32微控制器通常需要配合外部晶振来设置系统时钟(HCLK)。假设你想将外接8MHz晶体用于生成20MHz的HCLK,可以按照以下步骤进行配置:
1. **硬件连接**:
- 首先,你需要一个8 MHz的石英晶体和相应的谐振器电路。将晶体的一端连接到STM32的XTAL1引脚,另一端接到XTAL2(有的型号是RCC_XTALIN或RTC_OUT)。
- 如果你的STM32有独立的时钟输入(如HSE引脚),确保该引脚处于高阻抗状态。
2. **软件配置**:
- 进入STM32的STM32CubeMX工具,选择你的项目和设备,然后进入“Clock Configuration”模块。
- 在"System Clock Source"下拉菜单中,选择"External clock (HSE)",并设置"HSI48 Prescaler"为"Off"(如果可用的话,因为8M不是标准的HSI频率)。HSI48是一个内部辅助时钟源,但在这个场景中不用考虑它。
- 设置"External oscillator (8MHz)"作为"HSI Frequency",即8MHz。
- 然后,找到"HAL_RCC_OscConfig()"函数,设置时钟配置。示例如下:
```c
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_XTAL;
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // 开启HSI
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 启用PLL
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; // PLL源从HSI取
RCC_OscInitStruct.PLL.PLLM = 25; // 分频系数 M,取决于想要的实际频率(20M / 8M * 2)
RCC_OscInitStruct.PLL.PLLN = 200; // 频率分倍数 N,计算得出实际HCLK频率(M * N = 20M)
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // P分频因子
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; // Q分频因子
HAL_RCC_OscConfig(&RCC_OscInitStruct);
```
- 接下来,配置系统时钟(RCC_ClkInitStruct):
```c
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 将SYSCLK源设为PLL
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; // HCLK不分频,保持20M
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; // APB1时钟也是20M
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1; // APB2时钟也是20M
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); // 设置闪存等待周期
```
- 最后更新时钟树:
```c
HAL_RCC_ClockUpdate();
```
完成上述配置后,你的STM32 F1系列的HCLK应该会被设置为20MHz。注意,具体的数值可能会因设备型号、编写的库版本等因素有所差异,所以确保检查实际的设备手册或使用的SDK文档。
阅读全文