问题描述:使用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相关的设备速度会下降很多的。
上一篇:STM32 IO口初始化流程
下一篇:STM32 USART串口初始化
推荐阅读最新更新时间:2024-03-16 16:10