记录一下最近移植stm32f103工程至stm32f105单片机中踩的坑,103工程直接原封不动下载到105单片机中,因为它们完全兼容,是可以正常运行的。但是如果一些配置不进行修改,很多功能(105具备但是103不具备的)是不能正常运行的,所以还是不要心存侥幸,该改的就要改。
首先,105属于互联网型产品,系统宏定义要改,
启动文件要换,
然后,改后如果发现时钟不正常(串口波特率、can通信速率等异常),这是因为stm32f105 为互联网型产品,默认外部接25MHz晶振,当外部接8MHz晶振时,需要作出如下修改
修改一:
//在system_stm32f10x.h文件中的static void SetSysClockTo72(void)函数(Line1030)中修改代码段
/* 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_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);1234
/* Configure PLLs ------------------------------------------------------/
/ PLL2 configuration: PLL2CLK = (HSE / 8) * 8 = 1 MHz /
/ PREDIV1 configuration: PREDIV1CLK = PLL2 / 1 = 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_DIV8 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV1);1234
//修改参考:http://www.stmcu.org.cn/module/forum/thread-604584-1-1.html
修改二:
//在stm32f10x.h文件中的Line117中修改宏定义
将
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz /
改为
#define HSE_VALUE ((uint32_t)8000000) /!< Value of the External oscillator in Hz */
记录一下最近移植stm32f103工程至stm32f105单片机中踩的坑,103工程直接原封不动下载到105单片机中,因为它们完全兼容,是可以正常运行的。但是如果一些配置不进行修改,很多功能(105具备但是103不具备的)是不能正常运行的,所以还是不要心存侥幸,该改的就要改。
首先,105属于互联网型产品,系统宏定义要改,
启动文件要换,
然后,改后如果发现时钟不正常(串口波特率、can通信速率等异常),这是因为stm32f105 为互联网型产品,默认外部接25MHz晶振,当外部接8MHz晶振时,需要作出如下修改
修改一:
//在system_stm32f10x.h文件中的static void SetSysClockTo72(void)函数(Line1030)中修改代码段
/* 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_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);1234
/* Configure PLLs ------------------------------------------------------/
/ PLL2 configuration: PLL2CLK = (HSE / 8) * 8 = 1 MHz /
/ PREDIV1 configuration: PREDIV1CLK = PLL2 / 1 = 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_DIV8 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV1);1234
//修改参考:http://www.stmcu.org.cn/module/forum/thread-604584-1-1.html
修改二:
//在stm32f10x.h文件中的Line117中修改宏定义
将
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz /
改为
#define HSE_VALUE ((uint32_t)8000000) /!< Value of the External oscillator in Hz */
举报