在ST官网上下的固件包,用STM32F10x_StdPeriph_Lib_V3.4.0/Project/STM32F10x_StdPeriph_Template里的工程,编译正确。以下尝试了两种新建工程的方法,均失利:
1。 将固件包里的例程和相应的CMSIS、StdPeriph_Driver拷到工程下,修正target options里的C/C++ include paths项为“../;../Src/App;../Src/CMSIS;../Src/Lib”,编译报错“D:/Keil/ARM/INC/ST/STM32F10x/stm32f10x_type.h(23): error: #256: invalid redeclaration of type name “s32” (declared at line 470 of “Src/App/stm32f10x.h”)”等。
2。 若在工程中增加的文件为固件包中的链接(而不是复制),彻底依照template里的结构,并将include paths依照template进行修正,编译报错“Keil/ARM/INC/ST/STM32F10x/stm32f10x_conf.h(147): warning: #47-D: incompatible redefinition of macro “HSE_Value” (declared at line 511 of “STM32F10x_StdPeriph_Lib_V3.4.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h”)”等。
KEIL装置目录下的为旧版lib,工程中运用的为新版,两者代码结构上有所不同。而编译器在编译了工程文件的一起,主动链接了KEIL装置目录下的文件,形成抵触。但是在选项中没有找到装备是否链接KEIL装置目录下LIB的当地。
问题原理:
对照固件包中模板工程的链接状况,逐个比照模板工程和自建工程中,各源代码链接的所需库的方位。若模板中链接的是固件包中的文件,如system_stm32f10x.h 或 stm32f10x_config.h,即新版lib;而自建工程中链接的相应文件方位为Keil装置目录,阐明工程设置中没有包括该库的途径,使编译器主动寻觅装置目录中的旧版文件。因为库代码结构不同,形成编译过错。因而需求在工程设置的include paths栏中增加新版lib的途径。
问题解决:
关于第二种树立工程的进程,经过报错的信息很简单看出,编译进程链接了keil装置目录下的conf.h,而实际需求运用固件包中的该文件。因而,在include paths中增加固件包conf.h地点目录,即可解决问题。
关于第一种树立工程的进程,stm32f10x_type.h不是工程源代码中直接需求包括和使用的头文件,不简单找到未设定的链接途径。因而,选用“问题原理”中的方法,逐个链接库比照,修正链接途径,也能够找到未包括的方位,解决问题。
还需求注意区别的是,途径中的“../”意为工程文件上一级目录,“./”为工程文件的同级目录。咱们在一些论坛上看到他人贴的自己的途径中,第一个即为”../”,不是有必要的。别的,编译器只能在当时目录下查找文件,不会进入下一级目录,因而指定的途径需求很详细。
呈现这个问题时,搜了不少论坛,也在论坛上问过大牛,大致都是装备途径有问题,却没有提到详细的解决方法,自己探索了好一阵。的确是这个原因,今后假如我遇到相同的发问,估量也会是这么答复。不过,理论和详细实践仍是有间隔的。