STM32F105 USART1/USART3 调试笔记

由103系列向105系列移植

目录

由103系列向105系列移植

故障现象:USART1乱码

故障排除:时钟和外部晶振的适配调整

外部晶振配置

时钟配置

故障现象:USART3收发均无效

故障排除:端口重映射

 


STM32F103系列单片机简单易学,资源丰富,特别是库函数的存在使得开发周期缩短,故其市场占有率高。

STM32F105/107系列单片机相比103系列性能更加优异,功能也更加完善。多数单片机学习者是先学习103系列然后才转移到105/107系列,移植的一般过程是将原有的F103系列的工程通过修改能够是和F105系列单片机的运行。当然,在移植的过程中也会出现一些问题,本文记录的就是USART1/USART3的移植问题。

故障现象:USART1乱码

移植过程中出现的第一个问题是USART1乱码,这主要是因为单片机的时钟没有正确配置。我们一步一步来分析。

对于下图红色框线中的参数相信大家一定不陌生,这个参数主要是对应单片机产品线,也可以大致表征片内FLASH容量,常见的参数有STM32F10X_MD,M即medium,对应的是单片机之一是STM32F103RBT6;还有STM32F10X_HD,H即high,对应的单片机之一是STM32F103ZGT6。本例中讨论的是STM32F105RBT6,因为该单片机具有2路CAN,具有较高的性价比。我们需要把参数修改成CL,与105系列单片机相匹配。

STM32F105 USART1/USART3 调试笔记_第1张图片

具体的参数含义参照下图,建议了解即可。STM32F105 USART1/USART3 调试笔记_第2张图片

 

故障排除:时钟和外部晶振的适配调整

外部晶振配置

105系列单片机建议的晶振频率是25M,可是由于103系列单片机开发形成的惯性思维,多数开发者还是会选用8M晶振,虽然编译没有错误,但是单片机却无法正常工作。我们需要先配置晶振频率,如下图所示:定位至stm32f10x.h文件,将25M更改为8M,因为此时电路板上实际采用的是8M。

STM32F105 USART1/USART3 调试笔记_第3张图片

时钟配置

定位至system_stm32f10x.c文件,由于此时晶振已经是8M,为了维持PLL2的40M频率,需要将原参数配置为以下参数。至此,可以解决USART1乱码的问题。

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 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); 
#else    
    /*  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);
#endif /* STM32F10X_CL */

配置完成后时钟如下图所示

STM32F105 USART1/USART3 调试笔记_第4张图片

故障现象:USART3收发均无效

USART3的引脚有两种选择,默认端口和重映射端口。如下图所示,第一幅图片是STM32CUBE软件生成,绿色框线内的PB10 PB11即为默认端口,红色框线内的PC10 PC11即为重映射端口。第二幅图片是STM32F105系列单片机的数据手册生成,与图一表示的信息相同。

 

STM32F105 USART1/USART3 调试笔记_第5张图片STM32F105 USART1/USART3 调试笔记_第6张图片

需要注意的是,如果采用端口重映射的方式启用USART3,要使能对应的端口时钟,同时使能复用时钟,最后是使能USART3的时钟和激活USART端口重映射。

故障排除:端口重映射

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
 //remap RCC_APB2Periph_AFIO

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE); 

	//USART3_TX   PC.10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PC.10
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	
	GPIO_Init(GPIOC, &GPIO_InitStructure);

	//USART3_RX	  PC.11
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOC, &GPIO_InitStructure);  

 

 

 

你可能感兴趣的:(STM32F1)