关于#include 头文件替换总结的两种方法

2019-08-13 21:49发布

    keil 升级版本后原头文件无法使用,做为资深小菜鸟,实在是头疼啊,无奈必须整出来,于是乎找了些资料和网站看,有的是对的有的是错的,有的说需要添加target  options 的C/C++选项卡的各种东西但后来发现没有必要啊……,于是整理出两个修改方法。留给自己以后用,也给需要的师弟师妹们,技术有限,有什么错误请指正!(交流QQ:806508634    XXL)
方法一:
1)将源文件#include <stm32f10x_lib.h>替换为#include "stm32f10x.h"(先编译按照错误提示..SYSTEMsyssys.c(1): error:  #5: cannot open source input file "stm32f10x_lib.h": No such file or directory来替换)
2)替换完后编译,  出现错误代码E:KEIL FOR ARMARMIncSTSTM32F10xstm32f10x.h(96): error:  #35: #error directive: "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"   #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
       此时在target  options 的C/C++选项卡 Define中添加STM32F10X_MD后问题解决。
3)再次编辑后又会出现..SYSTEMusartusart.h(3): error:  #5: cannot open source input file "stm32f10x_lib.h": No such file or directory,继续将没有替换的替换完
4)再次编译出现..SYSTEMsyssys.c(68): error:  #136: struct "<unnamed>" has no field "IPR"
     这是因为KEIL 3.5的库许多定义都变了这里整理出一下定义(此处为借鉴正点原子)
     所有的USART1_IRQChannel,全部变成:USART1_IRQn。
     所有的XXX_IRQChannel,都需要改为:XXX_IRQn
     NVIC_VectTab_FLASH之类的定义,直接去掉。或者用其他的替换。或者自己定义。
     stm32f10x_map.h,不需要再包含了。
     IPR,全部要换成IP。
   只需要根据上面的整理修改错误代码即可
5)再次编译  此时会出现.OBJTEST.axf: Error: L6218E: Undefined symbol IS_NVIC_OFFSET (referred from sys.o).错误。百度搜不到解决方法。自己试着发现只要将上面一个警告提示的地方..SYSTEMsyssys.c(20): warning:  #223-D: function "assert_param" declared implicitly       屏蔽即可消除错误不知为什么,请高手指点。
6)再次编译可成功。
至此方法一总结完毕。
方法二:
1)将cortexm3_macro   stm32f10x_conf   stm32f10x_it  stm32f10x_map  stm32f10x_nvic  stm32f10x_type 五个文件夹拷贝靠自己的工程文件夹system下
2)将源文件#include <stm32f10x_lib.h>替换为#include <stm32f10x_map.h>、#include <stm32f10x_nvic.h>这两个头文件(可先编译,根据错误提示..SYSTEMdelaydelay.h(3): error:  #5: cannot open source input file "stm32f10x_lib.h": No such file or directory来替换)
3)编译后,我发现出现了这个错误test.c(9): error:  #5: cannot open source input file "stm32f10x_map.h": No such file or directory错误提示,于是我在网上找结局方案。
    发现有人回答target  options 的C/C++选项卡 Define中添加USE_STDPERIPH_DRIVER,STM32F10X_HD.H,后来经过试验发现STM32F10X_HD.H是错的,不能有.H,有.出现新的问题(真坑爹啊),去掉.H后依然不行,问题没有解决
     后来才发现我的第一条没有添加………………  个人教训请大家仔细!!!
这样3)就不是问题了。
4)再次编译又会出现同样的错误..SYSTEMdelaydelay.h(3): error:  #5: cannot open source input file "stm32f10x_lib.h": No such file or directory。继续替换,完成后编译通过。
至此方法二总结完毕。

    总结,再出现这个问题的时候很纠结,也查过不少资料,也包括想正点原子的原子哥请教。得到了很多方法,有的论坛上把这两种方法弄的很乱(也有可能是我的理解问题)现在终于捉摸清楚了,所以总结出以上两种方法。  
    其中方法一不需要拷贝"stm32f10x.h",因为新建工程里面有STM32F10x.s这个文件,但是需要在target  options 的C/C++选项卡 Define中添加STM32F10X_MD。运用方法二的时候需要手动向工程里添加cortexm3_macro   stm32f10x_conf   stm32f10x_it  stm32f10x_map  stm32f10x_nvic  stm32f10x_type 五个文件夹,一般添加在SYSTEM文件夹里。OK!
    此篇文章先给也被这个问题困扰的人!(PS:务必多做,为了一步一步总结出这两种方法,每种方法我分别又改了两遍,熟能生巧。)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。