keil工程移植到IAR历程

来源:互联网 发布:淘宝古琴哪家好 编辑:程序博客网 时间:2024/06/07 03:18

以下的移植过程以一个LED闪烁实验工程(平台为STM32107)为例:

第一步,创建一个工程文件夹LED,然后在LED文件夹下再建几个子文件夹: src、inc、lib。


第二部,将keil下的文件搬到第一步所建的工程文件夹LED下;将自己写的*.c文件(即keil工程下:LED闪烁实验\src 下的所有文件)放在子文件夹src下,将自己写的*.h文件(即keil工程下:LED闪烁实验\inc 下的所有文件)放在子文件夹inc下,将用到的库文件和驱动文件放在子文件夹lib下。


第三步,在IAR下创建新的project;打开 IAR, Project->Create New Project  创建一个新的C工程,并将工程指向工程文件夹LED下。


第四步,把文件导入新建的工程;新建几个group,并将从kei下搬来的文件导入group下。


把第二步复制的LED\src下的*.c文件导入group src下,把LED\inc下的*.h文件导入group inc下,把LED\lib下的驱动文件(注意是.c文件)导入group lib下


点击编译,提示

Fatal Error[Pe1696]: cannot open source file "stm32f107.h"  D:\keilToIAR\LED\src\stm32f107.c

Fatal Error[Pe1696]: cannot open source file "stm32f10x_it.h" D:\keilToIAR\LED\src\stm32f10x_it.c

Fatal Error[Pe1696]: cannot open source file "stm32_eth.h" D:\keilToIAR\LED\src\main.c

Fatal Error[Pe1696]: cannot open source file "lwip/memp.h" D:\keilToIAR\LED\src\netconf.c

当时很郁闷,文件stm32f107.h、stm32f10x_it.h不是已经导入导入到工程inc下了吗?怎么还会提示打不开文件呢?搞了老半天原来虽然文件是导入了inc中,但是IAR的编译器却还不知道这些文件的位置,下一步继续配置编译器。

第五步,配置编译器;右击工程进入Options,找到C\C++Complier->Preprocessor,在Additional include directories下添加所有用到的头文件所在的文件夹(包括驱动文件和库文件)。

我添加的include directories如下

$PROJ_DIR$\inc
$PROJ_DIR$\lib\CMSIS\Core\CM3
$PROJ_DIR$\lib\lwip-1.3.1\src\include
$PROJ_DIR$\lib\STM32F10x_StdPeriph_Driver\inc
$PROJ_DIR$\lib\STM32_ETH_Driver\inc
$PROJ_DIR$\lib\STM32_EVAL\STM3210C_EVAL
$PROJ_DIR$\lib\STM32_EVAL
$PROJ_DIR$\lib\lwip-1.3.1\port
$PROJ_DIR$\lib\lwip-1.3.1\src\include
$PROJ_DIR$\lib\lwip-1.3.1\src\include\ipv4

这些文件夹下的头文件包括了我所用到的所有驱动文件的头文件和我自己写的头文件。$PROJ_DIR$代表工程所在的目录,比如我的工程目录为D:\keilToIAR\LED,所以$PROJ_DIR$等同于D:\keilToIAR\LED。这些文件夹都是我每次编译找到错误中提示哪些文件是不能打开的,然后再到工程目录(D:\keilToIAR\LED\)下查到到缺少的文件,然后再把包含该文件的路径填入Additional include directories中。

至此,终于提示的错误中没有出现“cannot open source file “....” ”的字样,但是还是会出现

Error[Pe020]: identifier "USART_InitTypeDef" is undefined D:\keilToIAR\LED\lib\STM32_EVAL\stm32_eval.h

Error[Pe020]: identifier "BitAction" is undefined D:\keilToIAR\LED\lib\STM32_EVAL\STM3210C_EVAL\stm3210c_eval_lcd.h 

Error[Pe020]: identifier "RCC_ClocksTypeDef" is undefined D:\keilToIAR\LED\src\stm32f107.c 

Error[Pe020]: identifier "GPIO_Pin_6" is undefined D:\keilToIAR\LED\src\main.c 54 

...

等字样。本来定义这些函数的头文件也全部添加了,而且出现错误的文件也是驱动文件,驱动文件怎么还会出现这样的错误。郁闷,找了半天,包括这些函数的头文件为:

stm32f10x_adc.h

stm32f10x_usart.h

stm32f10x_flash.h

stm32f10x_gpio.h

...

这些头文件都是在stm32f10x_conf.h中引入的,然后再找stm32f10x_conf.h是在哪里引入的,找遍了工程没有找到。Google了一下,发现这个文件基本都是在stm32f107.h中引入的,但是仔细阅读了这个头文件硬是没有找到。最终发现原来是这些驱动头文件没有引入。于是自己按照规则在头文件stm32f107.h中添加如下代码:

#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif /* USE_STDPERIPH_DRIVER */

在stm32f107.h中引入配置头文件stm32f10x_conf.h。注意这里需要右击工程进入Options,找到C\C++Complier->Preprocessor,在Defined symbols下添加宏USE_STDPERIPH_DRIVER

至此,也不会出现 identifier "****" is undefined 的字样。

但是,编译后还是会提示错误:

Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned long __REV16(unsigned long)" (declared at line 177 of "F:\Program Files (x86)\IAR  D:\keilToIAR\LED\lib\CMSIS\Core\CM3\core_cm3.h

Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned long __RBIT(unsigned long)" (declared at line 178 of "F:\Program Files (x86)\IAR  D:\keilToIAR\LED\lib\CMSIS\Core\CM3\core_cm3.h 

...

这些出错的都是core_cm3.h这个库头文件。于是继续google,发现比较老的版本编译这个头文件是没有问题的,但是新的IAR编译这个文件是会报错的。

于是在文件夹下找到这个文件,修改core_cm3.h为其它类型core_cm3.h.old(移除也可以)。再右击工程进入Options,找到General Options->Library Configuration下,勾选Use CMIS.


如果这里是灰色如法勾选,需要在Targer->Processor variant下选择自己要编译的设备:


最后编译全部通过,make也全部通过。That's all!


以上移植过程中使用的软件工具,kei版本为uVersion4.14,IAR版本为7.30.4.8187

1 0