把STM32F407的keil版程序移植到IAR for ARM上

  • 使用开发板:正点原子的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

发布了3 篇原创文章 · 获赞 12 · 访问量 2462

猜你喜欢

转载自blog.csdn.net/qq_38661196/article/details/105310553