stm32的晶振频率
时间: 2023-11-13 07:45:59 浏览: 155
STM32的晶振频率可以根据具体需求进行选择和配置。官方默认和大部分场合下,STM32F1使用8MHz的外部晶振作为时钟源。最大的主频时钟是72MHz。理论上,可以选择4M、8M、12M等不同频率的晶振作为时钟源。对于常用的8M晶振,配置为8倍频即可达到72MHz的主频。如果使用12M晶振,则需要配置为6倍频才能达到72MHz的主频。
一般情况下,建议使用官方推荐的频率晶振,因为过高频率的晶振会对外部电路产生辐射,而低频率晶振需要MCU内部倍频器的支持。12MHz晶振是使用较为广泛的频率,例如8051 MCU和NXP系列MCU都默认使用12M晶振。如果产品种类多,使用了不同品牌的MCU,为了减少物料使用种类,可以统一使用12M晶振。
对于STM32F1,如果要使用12M晶振,需要对库文件作部分修改。打开"stm32f10x.h",将119行中8M晶振主频的定义 #define HSE_VALUE ((uint32_t)8000000) 修改为12M晶振的频率。另外,在"system_stm32f10x.c"文件中,还需要修改PLL参数来配置72MHz的主频。
相关问题
stm32f4晶振频率
### STM32F4 晶振默认频率及配置方法
对于STM32F4系列微控制器,默认情况下,外部高速晶振(HSE)的频率设定为25 MHz[^1]。然而,在实际应用中如果使用的开发板配备的是不同频率的晶振,则需要调整相应的设置来匹配新的晶振频率。
当遇到如8 MHz这样的较低频晶体时,为了确保定时器和其他依赖于系统时钟的功能正常工作,应当重新配置PLL(锁相环),使得最终得到期望的工作频率——通常是168 MHz的最大性能模式下的CPU核心频率[^2]。
具体来说,可以通过修改启动文件中的预分频系数、倍频因子等参数实现这一点。下面是一个简单的例子展示如何通过CubeMX工具自动生成代码并适当调整以适应不同的HSE输入:
```c
// 假设使用HAL库进行初始化
void SystemClock_Config(void){
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 启用外部高速晶振
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8; // 对应8MHz HSE的情况
RCC_OscInitStruct.PLL.PLLN = 336; // 设置PLL乘法因子
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){
Error_Handler();
}
/** Initialize SysTick
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|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;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){
Error_Handler();
}
}
```
这段代码展示了针对8 MHz HSE的具体配置方式,其中`RCC_OscInitStruct.PLL.PLLM=8`表示将来自HSE的信号除以8作为VCO输入;而`RCC_OscInitStruct.PLL.PLLN=336`则是指定了VCO输出相对于其输入要被放大多少倍。最后,通过设置合适的APB和AHB总线分频值可以达到优化功耗的目的。
stm32修改晶振频率
### 更改 STM32 外部晶振频率
当遇到不同频率的外部晶振时,调整STM32配置可以确保其正常工作。具体操作涉及多个文件中的参数修改以及开发环境内的设置。
#### 修改 `stm32f10x.h` 文件定义的 HSE 值
对于使用12 MHz外部高速晶体(HSE)的情况,在项目源码目录下的`stm32f10x.h`头文件中找到如下宏定义:
```c
#define HSE_VALUE ((uint32_t)8000000)
```
应将其更改为匹配实际使用的晶振频率值:
```c
#define HSE_VALUE ((uint32_t)12000000) // 将此行更新为新的晶振频率[^1]
```
#### 调整系统初始化函数中的PLL设定
在`SystemInit()`函数内部(通常位于`system_stm32f10x.c`),存在关于PLL倍频器系数的选择逻辑。这里需要根据新选用的HSE频率重新计算合适的PLL乘法因子N,使得最终得到期望的工作主频(比如72MHz)[^2]。
例如原先是基于8MHz设计,则PLL_N=9;现在变为12MHz, 则PLL_N应该设为6来保持相同的输出频率:
```c
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6; /* PLL input clock * 6 */
```
#### IDE (Keil uVision) 的选项卡内核时钟配置
除了上述软件层面的变化外,还需注意IDE本身的编译链接选项是否正确反映了所选硬件资源特性。特别是对于Keil MDK用户来说,应当进入“Options for Target -> C/C++ -> Define”,确认已包含了反映当前芯片特性的预处理器符号声明,如`USE_FULL_ASSERT` 或者特定于器件型号的相关标识符。
另外,“Flash”下载模式下也要保证选择了恰当的目标设备类型,并且启用了必要的启动加载项以适应不同的闪存编程需求。
最后但同样重要的一点是在“Debug”标签页里核查连接方式和接口速度等细节,这有助于提高调试效率并减少潜在错误的发生几率。
通过以上三方面的协同改动,即可顺利完成针对非标准外部晶振频率的支持改造过程。
阅读全文