原文:https://blog.csdn.net/xiuhua_wu/article/details/85237418
背景
前几天有个新需求,使用 STM32 的标准库(STD)做个产品的例程。之前已经做了个 HAL 的,但人家客户不干,非要 STD 的。拖了一周,想起来了,今天就开始做,但是懒啊,直接在网上找了个封装好了的 STD 例程,想直接修修改改,就完事了。
没想到,例程的芯片型号(STM32F103VC)和我手上的开发板(STM32F103C8)不一样,虽然说是都是 STM32F10x 系列,如果要直接在 Keil 上直接调试程序,还是需要把型号选成一样的。没想到在 “Options” 的 Device 把芯片信号选对了之后,就报了一堆的库错误,如下图所示:
其实这种错误,在以前的时候就有遇到过,当时直接就重新下载个一样的芯片型号的例程,直接把问题规避了。老姐长大了,该解决问题了,然后就想了想、查了查。果然,我果然长大了,能解决问题了。
本文就是记录如果解决此问题。
启动文件
咱们先从启动文件《startup_stm32f10x_XX.s》说起。
在工程目录中的 “CMSIS\startup” 文件中有好几个启动文件。不同 Flash 容量的芯片型号选择不同的启动文件,否则会报上述的错误。
具体怎么根据芯片容量选呢?
咱们来看看~~~下图是摘至 STM32F103C8T6 官方的 Product Specifications 文档《DS5319: Medium-density performance line ARM®-based 32-bit MCU with 64 or 128 KB Flash, USB, CAN, 7 timers, 2 ADCs, 9 com. interfaces》,这里面就列出了 3 个 Flash 容量等级:
Low-density :16KB 、32KB Flash
Medium-density :64KB、128KB Flash
High-density : 256KB、384KB 、512KB
Attention:这里只是针对 STM32F103 而言的。
咱们知道了芯片的 Flash 容量等级划分,咱们再回过头来看看,怎么依据容量等级去选择芯片:
Low-density :16KB 、32KB Flash 选择 startup_stm32f10x_ld.s 或 startup_stm32f10x_ld_vl.s
Medium-density :64KB、128KB Flash 选择 startup_stm32f10x_md.s 或 startup_stm32f10x_md_vl.s
High-density : 256KB、384KB 、512KB 选择 startup_stm32f10x_hd.s 或 startup_stm32f10x_hd_vl.s
Attention:这里只是针对 STM32F103 而言的。
那倒这里,咱们就可以尝试着把启动文件加入到工程中,再编译下。
是不是有的童鞋的工程还在报错呢?
从报错信息里面可以发现,报错信息都是来自《stm32f10x.h》部分的 Interrupt Number 部分。那咱们来看看这部分有什么特殊?
在 typedef enum IRQn 枚举类型中出现了以下几个条件编译语句,这几个条件编译语句决定了Interrupt Number 。那这些条件在哪里定义的呢?
#ifdef STM32F10X_LD......
#endif /* STM32F10X_LD */ #ifdef STM32F10X_LD_VL
.......
#endif /* STM32F10X_LD_VL */#ifdef STM32F10X_MD
.......
#endif /* STM32F10X_MD */ #ifdef STM32F10X_MD_VL
......
#endif /* STM32F10X_MD_VL */#ifdef STM32F10X_HD
......
#endif /* STM32F10X_HD */ #ifdef STM32F10X_HD_VL
......
#endif /* STM32F10X_HD_VL */#ifdef STM32F10X_XL
......
#endif /* STM32F10X_XL */ #ifdef STM32F10X_CL
#endif /* STM32F10X_CL */
它们的定义来自 Option 中的 C/C++的 Define 里,只要咱按容量输入对应的宏,再编译,是不是就没有问题了呢~~~
总结
1.依据芯片容量选择对应的启动文件
2.依据芯片容量输入对应的宏条件