error: #5: cannot open source input file “stm32f10x_lib.h“:

目录

  • 一、问题概述
  • 二、问题解决
  • 三、stm32f10x_lib.h和stm32f10x.h

一、问题概述

一个旧程序使用了keil 4.10版本,需要统一到keil 5.17上。结果发现使用5.17编译报错:
error: #5: cannot open source input file “stm32f10x_lib.h“:_第1张图片
提示缺少stm32f10x_lib.h文件,查看了下工程目录,确实没有这个文件。而且对这个头文件完全没印象。可是为什么在4.10版本就能编译呢?
error: #5: cannot open source input file “stm32f10x_lib.h“:_第2张图片

二、问题解决

网上查了一下,不少人遇到这个问题,一种解决方法是为工程添加一个stm32f10x_lib.h文件。不过我测试了下,找了一个stm32f10x_lib.h加进去,结果又报另一个头文件缺失:
在这里插入图片描述
把这个头文件加进去,又继续报一个新头文件丢失,于是放弃这种方式。
从工程结构和代码风格上看,应该是参考了原子的程序。找到原子的代码看一下,终于找到了最合适的升级方法:

  1. 将程序内包含的stm32f10x_lib.h全部替换为stm32f10x.h
  2. 将sys.c文件也更新替换下

这时再编译,配置中断时的中断线均未定义:
在这里插入图片描述
需要将后缀IRQChannel更改为IRQn即可。

三、stm32f10x_lib.h和stm32f10x.h

查询了下两个文件的区别:

stm32f10x_lib.h是ST公司V2.0版本的库函数使用的头文件,stm32f10x.h是ST公司V3.5之后统一使用的头文件,去掉了lib几个字,代表了新的版本,这个版本规范了代码,不需要包含那么多的头文件了。(链接)

怪不得没有见过stm32f10x_lib.h这个头文件,我生君已老呀。刚学STM32的时候就是下载3.5版本标准库。

可以看下stm32f10x_lib.h文件,实际是通过宏定义包括不同的头文件,如:

#ifdef _NVIC
  #include "stm32f10x_nvic.h"
#endif /*_NVIC */

所以在刚开始报错的时候,手动为工程添加一个stm32f10x_lib.h文件,会继续报错找不到头文件。再看stm32f10x_nvic.h中则定义了中断线:

#define TIM1_CC_IRQChannel           ((u8)0x1B)  /* TIM1 Capture Compare Interrupt */
#define TIM2_IRQChannel              ((u8)0x1C)  /* TIM2 global Interrupt */
#define TIM3_IRQChannel              ((u8)0x1D)  /* TIM3 global Interrupt */

而stm32f10x.h文件中则是直接定义:

  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */

所以在升级工程时,就有了将后缀IRQChannel更改为IRQn的修改。

你可能感兴趣的:(STM32)