有关基于stm32f10x系列v2.0库函数在MDK5中打开 头文件找不到的另一种方法

来源:互联网 发布:jsp oracle 网站源码 编辑:程序博客网 时间:2024/06/07 09:46

最近做一个课题,需要某传感器芯片,在网上买来,想偷懒直接用卖家测试好的例程,用电脑装的MDK5打开提示:   (19): error:  #5: cannot open source input file "stm32f10x_lib.h": No such file or directory"  
       看到这个错误第一想到的就是这个头文件没有加上,然后就看工程文件里查看,发现没有,又去固件库文件下查看,还是没有,这个时候我感觉就有问题了,于是百度论坛搜索,后来大概知道是例程基于v2.0的固件库编写的,这一点在工程的任意一个库文件重点开就能看到,而MDK5是基于v3.5库编写的,后来找到的解决办法也就如网上大多说所说:
       出现这种情况因为固件库v3.5中已经没有了stm32f10x_lib.h文件,取而代之的是stm32f10x.h文件,但是仅仅用#include "stm32f103x.h"代替#include "stm32f10x_lib.h 依然解决不了问题,又会出现
main.c(137): error:  #20: identifier "FLASH_Latency_2" is undefined 

的问题,这时候需要在工程文件下加入下图中的5个头文件到工程中,

然后用#includestm32f10x_map.h和#includestm32f10x_nvic.h来代替程序中的#includestm32f10x_lib.h,

具体参考该方法的原创来源:http://www.openedv.com/posts/list/29355.htm
大部分用该方法可以解决问题,但是我按照该方法依然出现
main.c(139): error:  #20: identifier "FLASH_PrefetchBuffer_Enable" is undefined 
error:  #20: identifier "WWDG_IRQChannel" is undefined等等问题。


     按照如上方法最后折腾了一下午还是没有解决错误所在,不过弄明白了两点:
      1.老的库文件中的大部分定义在新的v3.5固件库中并没有改变只是整合到新的头文件中例如stm32f10x.h(替换掉stm32f10x_lib.h)中;       

      2.要想完全解决问题,对于在新库中已经不使用的老的定义,如 USART1_IRQChannel等,必须在辛苦中找到对应的进行替换。


解决办法:
      对于前面提到的第1点: 既然大部分函数名是一样的,解决编译用老库的程序,出现一堆错误的时间还不如根据自己的习惯在MDK5中新建一个工程模板添加需要的.c文件,如main.c spi.c i2c.c等  ,然后重新编译就会出现很多"USART1_IRQChannel" is undefined、
error:  #20: identifier "WWDG_IRQChannel" is undefined 等等好多undefined,这就是 上面对应的第2点,就说明改用法在新库中没有定义,这里以USART1_IRQChannel为例:程序原型是:
 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_Init(&NVIC_InitStructure);
就可以去NVIC_Init定义的地方去找,或者找到一个例程 看看如何使用NVIC_Init,对比发现  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn ;
不一样,然后就去WWDG_IRQn定义的地方发现,都是USART1_IRQn 、USART2_IRQn 、USART2_IRQn,这个时候如果你明白老程序中的代码
USART1_IRQChannel就是代表USART1_IRQn的话那直接替换掉就可以了,当然如果不太确定也可以去百度或者老的固件库中USART1_IRQChannel
定义的地方查看其定义然后进行同等的替换就可以了。


找不到可替换项怎么办?:
      在这里还会遇到一些找不到如上说说的同义替换的情况,例如  bool  的使用,在新的v3.5中是没有这个用法的,那怎么办?我也没有百度搜,直接在老库的头文件中搜索,在stm32f10x.h中找到typedef enum {FALSE = 0, TRUE = !FALSE} bool;的定义,同时在新的头文件
stm32f10x.h中找不到有关bool和TRUE、FALSE的定义,后来又发现在老板程序中TRUE、FALSE多作为返回值使用,而在新的例程中多直接用0或1表示,那么这样分析下来也就很明显了,新库中直接删掉了这样的定义,那么于是我就把所有的bool换成int、ture换成1、FALSE换成0,通过类似的一系列修改最终解决问题。






















0 0
原创粉丝点击