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   

猜你喜欢

转载自blog.csdn.net/qinrenzhi/article/details/81805490