问题描述:使用STM32F105RB芯片进行串口编程,宏定义为STM32F10X_HD,串口正常,能够收发数据,如果宏定义为STM32F10X_CL,则发送数据混乱,跟波特率不一致的现象很相似。STM32F105为互联型产品,应该进行STM32F10X_CL的宏定义。后续解决后会发上来。
解决方案:
1、原因,由于在谁stm32f10x.h中有这样一段话
#if !defined HSE_VALUE #ifdef STM32F10X_CL #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ #else #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ #endif /* STM32F10X_CL */ #endif /* HSE_VALUE */这段话的含义是说,如果选择了CL型的芯片,也就是互联型芯片,则外部高速时钟默认为25M,而实际项目上我接的晶振是8M的这样问题就出线了
2、解决办法
1)在stm32f10x.h头文件中把HSE_VALUE值修改为你实际晶振的值,例如修改为8000000;
2)在system_stmf10x.c中
#ifdef STM32F10X_CL /* Configure PLLs ------------------------------------------------------*/ /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10| RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); /* Enable PLL2 */ RCC->CR |= RCC_CR_PLL2ON; /* Wait till PLL2 is ready */ while((RCC->CR & RCC_CR_PLL2RDY) == 0) { } /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);把PLL2的时钟恢复为40M,否则PLL2相关的设备速度会下降很多的。