STM32F103外部晶振由8M变为12M注意事项

官方提供的库文件中,HSE(外部高速时钟)默认为8MHz,最高主频为8*9=72MHz,如果将HSE变为12MHz,不修改库文件的话,最高主频则变为12*9=108MHz,最典型的问题就是USART可以通信,但是接收到的数据与发送的不一致,并且找不到啥原因,害的我瞎折腾了一整天,下面列举需要修改的地方。

1、修改stm32f10x.h中的HSE_VALUE,原本的代码如下:

  1. #if !defined  HSE_VALUE  

  2.  #ifdef STM32F10X_CL     

  3.   #define HSE_VALUE    ((uint32_t)25000000)   

  4.  #else   

  5.   #define HSE_VALUE    ((uint32_t)8000000)   

  6.  #endif   

  7. #endif   

 

 

修改后的如下:

 

  1. #if !defined  HSE_VALUE  

  2.  #ifdef STM32F10X_CL     

  3.   #define HSE_VALUE    ((uint32_t)25000000)   

  4.  #else   

  5.   #define HSE_VALUE    ((uint32_t)12000000)   

  6.  #endif   

  7. #endif   


2、修改system_stm32f10x.c中的时钟配置,先找到void SystemInit(void)---》SetSysClock()---》SetSysClockTo72(),将9倍频改为6倍频,12*6=72MHz,原本代码如下:

  1. #ifdef STM32F10X_CL  

  2.       

  3.             

  4.     RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |  

  5.                               RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);  

  6.     RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |  

  7.                              RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);  

  8.           

  9.     RCC->CR |= RCC_CR_PLL2ON;  

  10.       

  11.     while((RCC->CR & RCC_CR_PLL2RDY) == 0)  

  12.     {  

  13.     }  

  14.       

  15.      

  16.        

  17.     RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);  

  18.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |   

  19.                             RCC_CFGR_PLLMULL9);   

  20. #else      

  21.       

  22.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |  

  23.                                         RCC_CFGR_PLLMULL));  

  24.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);  

  25. #endif   


修改后的如下:

  1. #ifdef STM32F10X_CL  

  2.       

  3.       

  4.       

  5.           

  6.     RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |  

  7.                               RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);  

  8.     RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |  

  9.                              RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);  

  10.     

  11.       

  12.     RCC->CR |= RCC_CR_PLL2ON;  

  13.       

  14.     while((RCC->CR & RCC_CR_PLL2RDY) == 0)  

  15.     {  

  16.     }  

  17.       

  18.      

  19.        

  20.     RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);  

  21.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |   

  22.                             RCC_CFGR_PLLMULL9);  

  23.   

  24. #else      

  25.       

  26.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |  

  27.                                         RCC_CFGR_PLLMULL));  

  28.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);  

  29. #endif   

STM32F103系列微控制器通常需要通过外部晶体振荡器来提供精确的系统时钟。以下是设置外部8MHz晶振的基本步骤以及对应的C语言代码示例: 1. 首先,你需要配置GPIO管脚作为晶振的输入端口。例如,如果你选择PA9和PA10作为XTAL1和XTAL2,则可以这样做: ```c // 定义GPIO口映射 GPIO_InitTypeDef GPIO_InitStructure; // 设置GPIOA为推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // Push-Pull Output GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 2. 下来,连外部晶振到相应的管脚上,并配置相应的时钟源(如PLL)使之锁定外部晶振频率。这通常涉及到系统时钟配置文件(SysTickConfig.h、SystemClock_Config.c等),其中可能包括以下代码: ```c // 配置 PLL (如果使用) RCC_PLLInitTypeDef RCC_PLLInitStruct; RCC_PLLInitStruct.PLLSource = RCC_PLLSOURCE_HSE; // 使用HSE作为源 RCC_PLLInitStruct.PLLM = 8; // 分频因子 M RCC_PLLInitStruct.PLLN = 336; // 锁定倍频系数 N RCC_PLLInitStruct.PLLP = RCC_PLLPRE_DIV2; // 输出分频 P RCC_PLLInitStruct.PLLQ = 7; // 锁定分频 Q HAL_RCC_PLLConfig(&RCC_PLLInitStruct); // 初始化并激活 PLL HAL_RCC_OscConfig(RCC_OscInitStruct); // 开启 HSE 和 PLL // 启动时钟发生器 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); // 设置时钟频率(比如 72 MHz 或者 144 MHz) ``` 这里假设你已经初始化了`RCC_OscConfig`结构体和`RCC_ClkInitStruct`,它们用于设置时钟源和最终系统频率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值