【转】关于STM32外接4—16MHz晶振主频处理方法

本文介绍了如何在STM32F10x库中修改配置,允许用户随意使用4-16MHz范围内的晶振频率。包括修改源代码文件、调整编译环境设置等三个关键步骤,以实现USART波特率和Systick计时的准确性。解释了在Keil MDK编译环境下,文件内设置参数的优先级低于编译环境设置的原理。

由于STM32F10x库官方采用的是默认的外接8MHz晶振,因此造成很多用户也采用了8MHz的晶振,但是,8MHz的晶振不是必须的,其他频点的晶振也是可行的,只需要在库中做相应的修改就行。
在论坛上看到很多用户反映,使用外接12MHz的晶振,会造成很多的问题,如USART的波特率不正确,Systick走时不准等问题,在无论是在实际调试还是在软件模拟中都会发现这个情况,其实,这不能怪ST官方,我们必须肯定ST官方为方便用户开发所做的努力,下面我们就通过简单的三个步骤就可以让你随意的使用4—16MHz之内任何频点的晶振,我们以STM32F10x_StdPeriph_Lib_V3.4.0为例说明。
第一步,打开stm32f10x.h,将

#define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */

修改为:

#define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
第二步,打开system_stm32f10x.c,修改PLL参数,将
/*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                    RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

修改为:
/* PLL configuration: PLLCLK = HSE * 6 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);
至此,原文件已经修改完成,如果你想将主频修改至其他频率,请自行修改。但是,到现在,如果您直接编译调试的话,就会出现上文所说的USART的波特率不正确,Systick走时不准等问题,原因就是我们需要进行第三部的修改,这个修改不是在原文件中,而是在编译环境中。我们已Keil MDK为例说明。
第三步,打开你已经建立的STM32工程,选择Projects-〉Options for target *,找到Target标签,你会发现,外接的晶振默认还是8MHz,我们将外接的晶振参数修改为12MHz,确定保存,再编译,调试,你就会发现,所有的参数都回归的正常轨道,设置波特率为9600,它也不会跑到14400,设置Systick为1ms中断,它不会1.5ms中断。

现在,我们也得出了一个结论,在keil MDK编译环境的设置参数的优先级是高于原文件中的设置的。

### STM32F0配置有源晶振方法 STM32F0系列微控制器在使用部有源晶振时,需要正确配置其时钟源以确保系统正常运行。以下内容详细说明了如何配置STM32F0的有源晶振。 #### 1. 配置HSE为有源晶振 STM32F0支持通过旁路模式(Bypass Mode)直使用部有源晶振提供的时钟信号。此模式下,内部驱动电路被跳过,因此无需匹配电容[^4]。具体操作包括: - 在RCC控制寄存器(`RCC_CR`)中启用HSE时钟(设置`RCC_CR_HSEON`位)。 - 同时,需设置`RCC_CR_HSEBYP`位以启用旁路模式,从而允许直使用部有源晶振提供的信号。 #### 2. 修改系统时钟频率 根据所使用部有源晶振的实际频率,需修改相关头文件中的宏定义。例如,在`stm32f0xx.h`文件中,将`HSE_VALUE`定义为部有源晶振的实际频率(单位为Hz)。如果使用的是24MHz有源晶振,则应如下修改: ```c #define HSE_VALUE ((uint32_t)24000000U) ``` 此,在`system_stm32f0xx.c`文件中,也需要同步更新PLL的相关参数以匹配新的时钟源频率。例如,调整PLL分频系数以生成目标系统主频[^5]。 #### 3. 配置PLL以生成系统主频 STM32F0的系统主频通常由PLL模块生成。以下是一个典型的PLL配置示例,假设目标主频为72MHz,且部有源晶振频率为24MHz: ```c RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // 初始化HSE并启用旁路模式 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // 使用有源晶振时设置为BYPASS RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL3; // PLL输入时钟乘以3 (24MHz * 3 = 72MHz) RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV1; // 不进行额分频 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { // 初始化错误处理 } // 配置系统时钟为PLL输出 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { // 时钟配置错误处理 } ``` #### 4. 确保代码模板兼容性 在实际项目中,可能需要根据具体的开发环境和工具链(如Keil、IAR或STM32CubeMX)对代码模板进行适当调整。例如,若使用STM32CubeMX生成初始代码,则需在图形化界面中选择部有源晶振作为时钟源,并启用旁路模式[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值