使用STM32单片机过程中经常会涉及到不同芯片间的代码转换,手头上熟悉的工程需要稍作处理才能用到新的板子上。常见的是STM32F103xE、STM32F103xC(大容量)和STM32F103x8、STM32F103xB(中容量)的转换。这里做一下总结,区分标准库和HAL库。
一、标准库
标准库的启动文件是:
startup_stm32f10x_ld.s
startup_stm32f10x_md.s
startup_stm32f10x_hd.s
对应的宏定义是:
STM32F10X_LD
STM32F10X_MD
STM32F10X_HD
分别对应小容量、中容量、大容量产品。这里的容量是指FLASH的大小,判断方法如下:
小容量:16K<=FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH<=512k
超大容量:768K≤FLASH<=1024K
常用型号的FLASH大小为:
STM32F103xE:512K,大容量;
STM32F103xC:256K,大容量;
STM32F103xB:128K,中容量;
STM32F103x8:64K,中容量;
STM32F103x6:32K,小容量;
STM32F103xG:1024K,超大容量;
工程移植需要改三个地方,器件、启动文件、宏定义
1. 更换器件:
2. 更换启动文件
从大容量换成中容量,例如ZE换成c8,需要把startup_stm32f10x_hd.s
换成startup_stm32f10x_md.s
反之则把把startup_stm32f10x_md.s
换成startup_stm32f10x_hd.s
3. 更改宏定义:
将c/c++
标签页下的Define的STM32F10X_HD
更换成STM32F10X_MD
当然,如果你原本的工程用的是大容量产品,用到了其中的外设是中容量产品没有的,肯定会出错,这时候就要改代码,删掉没有的功能了。例如STM32F103C8
没有串口4和串口5,有相关的代码就会出错。
二、HAL库
HAL库的启动文件是:
startup_stm32f103x6.s
startup_stm32f103xb.s
startup_stm32f103xe.s
startup_stm32f103xg.s
对应的宏定义是:
STM32F103x6
STM32F103xB
STM32F103xE
STM32F103xG
分别对应小容量、中容量、大容量、超大容量产品。
注意这里不要对号入座,四个宏定义对应四类产品,并不是说和STM32的明明系列一致。例如STM32F103C8
和STM32F103CB
对应的宏定义都是STM32F103xB
,千万不要自己弄一个STM32F103x8
的宏定义出来。
移植的步骤如下:
1. 更换器件:
这一步与上面标准库一样
2. 更换启动文件和头文件
这一步很关键,比标准库的移植稍微麻烦一点点。容易搞错。核心:
(1)找到与自己的工程版本一致的HAL库。(HAL库版本一直在更新,不一致的HAL库可能不兼容)
(2)在HAL库中找到正确的启动文件和头文件。
首先默认你已经找到了版本一致的HAL库,如果是使用原子的例程,原子的A盘里面已经提供了。否则就要打开HAL库文件看一看版本了。
启动文件在这个目录下:STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm
:
头文件在这个目录下:STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Include
,文件夹下有不同容量的头文件:
3. 更改宏定义:
与标准库步骤一样,注意使用HAL库的宏定义:STM32F103xB
和STM32F103xE