从STM32f103移植程序到STM32407要注意的点
1、底层库问题
这种问题最好直接找买板子时候附带的相应芯片的完整库按照相应文件添加,注意不要漏或者重复,不然编译时会出现重定义问题。库文件添加好之后,直接将需要移植的部分复制粘贴在相应的文件夹中即可。新手推荐按照源程序搭建文件夹,方便对照配置。
2、宏定义问题
在移植时很常见的问题。确定是这种问题的,在stm32f4xx.h头文件里有一段 /* #define STM32F407xx */ /*!< STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG and STM32F407IE Devices */
类似的描述,选择相应版本的字符串添加进魔术棒中的c/c+里面宏定义区域即可。
3、代码块在文后不声明问题
STM32f4似乎不支持同时定义变量与赋值的形式,需要将变量的定义放在函数体的最前面问题就解决。
4、时钟问题
103中的时钟跟407中的时钟设置有很大的不同,比如103中定义的AFI/O(I/O口时钟)在407相应的函数中直接没有找到。个人解决的方法是直接选取__HAL_RCC_GPIOH_CLK_ENABLE()
使用的,非hal库的程序可以选择对应的配置更改,从定义来自哪里一点一点前推找到定义的位置就大致了解该如何选用。
时钟问题二
时钟频率的设置问题,在103中是以分频、倍数的方式来选择频率的,在407中换成P\Q\M\N四种参数的选择。可以从RCC_OscInitTypeDef
开始一步步前推看个参数代表的意义是什么,然后结合计算公式选择相应的数字或者已经定义的引用。(这一块解决之后很快就忘记当时怎么想的了2333)
5、结构体定义问题
103中的结构体跟407中的结构体有区别的地方非常多,很多结构定义103中有但407中要么名字换了,要么内容更改或者直接放到不同的头文件里导致找不到而出错。比如DMA的结构体RCC_OscInitTypeDef
可以去查看两者的内容有些许差别,如果涉及到这方面,就要注意找了。还有可能会出现出现的头文件不同导致明明有结构体但是未定义的报错,这时候在文件顶部包含一下结构体所在位置的文件名可以解决。
暂时就想到这么多,主要就花费在时钟和结构体的函数体不同的寻找方面。另外如果真的导入文件出现重定义问题,在方块里将添加的文件删掉就好了。