-
使用开发板:正点原子的STM32F407ZGTb——探索者
-
使用IAR版本,IAR Embedded Workbench for ARM 7.80.4.12495,如下图所示
IAR版本信息
-
使用ST-Link进行在线下载程序和调试
-
使用正点原子提供的源代码移植到IAR上,有人说,为啥要移植到IAR上呢,也没啥,总有需要嘛。如下图所示为所有的库函数源代码
正点原子库函数源代码
-
整个移植过程与思路,使用上面提到的 正点原子 提供的工程文件,直接在工程里面新建IAR工程,然后让整个工程实现支持IAR和Keil。
-
IAR软件安装——————略,请去官方下载,自行安装。
正文开始,以源代码:实验0 Template工程模板为基础来实现移植
新建IAR工程,打开IAR→project→Create New Project...
我们选择建立一个空工程
在工程文件夹下新建一个IAR文件夹
把工程保存到这个文件夹下
接下来就是整个工程的搭建,在新建的工程上右键 →Add →Add Group...,熟悉IAR的都知道怎么做了,可以跳过
我们建立下图所示的分组,里面是用来添加源程序文件的,分组以方便后期管理,熟悉IAR的都知道怎么做了,可以跳过
保存所有,保存工作空间,这样新的空工程就建好了
我还建立了一个说明的组,用来放说明文件
接下来就是把各个分组的文件导入
首先是有一个要处理的是STM32启动文件,如果没有这个文件,程序也可以编译通过,也可以运行,但是中断函数是进不去的,而keil使用的是在工程目录下的CORE文件夹下的:startup_stm32f40_41xxx.s 文件,如下图所示,但是这个文件我暂时还无法让它适用于IAR,所以我们要去找适合IAR的启动文件
打开安装IAR for ARM的路径,
...\IAR Systems\Embedded Workbench 7.5\arm\RTOS\SEGGER\ST\STM32F407\embOS_STM32F4_Discovery\DeviceSupport
选择startup_stm32f40x.s,这是使适用于IAR的STM32启动文件
复制一份到在工程文件夹下建立的IAR文件夹中
然后,把它添加进IAR分组中,详细操作如下图,跟添加分组有点类似,熟悉IAR的也都知道怎么做了,可以跳过
在IAR分组上 右键 →Add →Add Files...
选择刚才复制的startup_stm32f40x.s文件,双击添加
我们发现CORE文件夹里面就只有唯一一个需要添加的文件——startup_stm32f40_41xxx.s ,结果我们还不用它了,所以建立的CORE分组好像就没什么用了,也可以把它移除,【吐血】
之后就是把工程文件夹中的每一个文件夹中的.c源文件添加到对应分组中,跟上面添加startup_stm32f40x.s文件相同,理解的 同孩 可以跳过自己操作了
如下图,以添加delay.c文件到SYSTEM分组中为例演示,
在SYSTEM分组上 右键 →Add →Add Files...
选择相应文件夹下的delay.c文件就OK了,如果该目录下需要添加的文件多的话,是可以批量添加的,支持鼠标区域选择、Ctrl + A全选 、Ctrl + 鼠标多选 、Shift + 鼠标区域选择 等window差用的功能与快捷键,移除时亦可以~,keil好像移除的只能一个文件一个文件的移除
然后我还在IAR文件夹里新建了一个 说明 文件夹并在里面新建了一个说明.txt的文件,用来解释说明这个工程文件的功能,用途等等,并把工程文件下的README文件夹中的说明文件 README.txt添加了进来,
至此,所有源文件都添加进来了,如下图,是与keil的对比,主要区别是两个的启动文件的不同,FWLIB中是外设的库,一般是使用哪个外设添加相应的外设库,也可以全部添加,我只添加了几个作为示例
接下来是一些设置,添加完之后如果直接编译,肯定是一大堆一大堆的错误,
在工程上右键 →Options...打开工程设置
选择General Options →Target →Device →ST ...直到选择自己使用的单片机型号,例如我的ST STM32F407ZG ,选择好了之后不要急着点 OK,
一般我们都要支持printf串口输出,再次选择Library Configuration →Library 选择Full就可以为后面支持printf串口输出做好准备了,之后也不要急着点 OK,
选择C/C++Compiler 点击右边的小箭头 →找到 Preprocessor
→在Defined symbols:(one per line)里面输入两个宏定义:
USE_STDPERIPH_DRIVER
STM32F40_41xxx
在Additional include directories:(one per line)里面输入地址
$PROJ_DIR$
$PROJ_DIR$\.
$PROJ_DIR$\..\CORE
$PROJ_DIR$\..\FWLIB\inc
$PROJ_DIR$\..\FWLIB\src
$PROJ_DIR$\..\SYSTEM\delay
$PROJ_DIR$\..\SYSTEM\sys
$PROJ_DIR$\..\SYSTEM\usart
$PROJ_DIR$\..\USER
这是所有工程文件包含的文件夹,里面有头文件需要IAR去这里面找
也可以手动一个文件夹一个文件夹添加,点击右边的 ... ,可以看到已经添加的地址(相对地址)
点击 Click to add添加新的地址 ,
例如,我把README文件夹添加进来,双击该文件夹,演示作用,其实没什么用,
进入之后,点击Select
可以看到,刚选择之后默认问绝对地址,这样与对于移植程序或移动不友好,改为相对地址
点击右侧的向下的三角▽,选择$PROJ_DIR$\..\README ,就OK了
因为是演示,没用,所以我们在把它去掉,【我太南了】,点击要去掉的地址,点击前面的红色×就可以了
这样设置就好了,但是,也不要急着点 OK,【吐血】,我们顺便把ST-Link也一并设置好,
选择Debugger →Setup →Driver →选择ST-LINK
选择ST-LINK,可以设置连接方式、速度等
OK,终于完成了,可以点OK了
你以为完成了吗,如果你添加了usart.c的话,你编译还是会出错,【再次吐血】
相信我,只差亿点点,只剩 亿 步,就能完成了
打开usart.c,编译的 warnings:1 errors: 1
可以看到他写的是....
警告无法识别
错误,已经定义声明,那就是重复定义
既然有错,那就把错误的去掉好了,【嘿嘿嘿】
于是, warnings:0 errors: 0
我们遇到什么错误,都不要害怕,消除错误的最好办法就是把错误的部分去掉,只要去掉就不会出错 [狗头] [狗头] [狗头] [狗头]
我们跳转定义,发现在stdio.h中已经有定义,那keil为什么..,好了这个问题留给有时间和精力童孩探索了,【我才不会说我去试了一下就没深入了解了】
在线调试,使用printf,串口可以输出
总算移植成功了。
多难兴邦
天佑中华
愿逝者安息
颂英雄不朽
前辈们
这盛世如您所愿
将来
就放心的交给我们吧
2020年4月4日14:22:43
PS:2020年4月7日补充说明:
当时有亿点点遗漏,真的只是亿点点T^T,如下,
这个函数:void _sys_exit(int x) 原来不是长这样的,本来是长这样的:_sys_exit(int x)当时编译的时候出错了,我下意识的以为是自己不小心把 函数前面的 void 给删掉了,结果是人家本来就没带,所以有的小伙伴如果没注意,在编译的时候可能还是会出错的。
这里还要说一下,在keil里面没加这个 void 虽然在Build Output里面:warnings:0 errors: 0
但是也有警告在这个函数前面还是有提醒警告,如下图所示
而加上 void 之后,就没有警告了,说明这还是正点原子写这个的时候没有特别注意这一个,虽然对结果没影响。
好了,本次修订结束,如果有新的小伙伴发现还有哪里有问题的话,欢迎提出,大家相互学习和探讨