STM32学习之旅② 固件库的使用及工程模板的建立


目录:

一、认识其本质


  • STM32在进入中国市场的时候,商家为了迎合中国市场,翻译了很多英文文献,所以STM32相对与其他单片机的资料是相对丰富的,这也是很多人推崇STM32的原因,这对于我们学习来说也是相当不错的,但是由于翻译版本很多,注意以官方版本为准,在看文档发现不对是应该参考官方文档
  • 固件库其实是官方为了加快开发速度,帮助用户快速上手芯片,进行二次开发而研究出来的,它的出现大大缩短了芯片开发周期

二、为什么要使用固件库


(一)基于寄存器的编程(传统编程方式)


  • 好处:开发者可以了解单片机较为底层的寄存器,了解程序在硬件上的具体实现方式,便于纠错。
  • 不足:
    1. 移植性差:由于单片机通常由很多外设,而不同型号的的单片机的寄存器操作方式都有所不同,当进行移植是需要修改的内容很多,工作量大。
    2. 效率低下:由于单片机内部资源丰富,需要设置的寄存器非常多,需要花很长的时间查阅用户手册才能完成。

(二)基于固件库的编程


  • 极大缩短了开发周期,从而减少了开发成本

  • 不用深入底层底层便可以灵活规范地操作每一个外设,使编程思维更清晰,有利于开发人员将精力集中在顶层设计上

  • 具有可重入性,便于移植,便于二次开发

  • 固件库的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。


  • 另外,STM32的固件库是开源的,它的源码可以供我们学习参考,参考其如何使用c语言去实现一些复杂的功能。

三、所需材料



四、模板创建


(一)工作区和工程的建立

  • File->New Workspace

  • Project->Create New Project

这里写图片描述

  • 建立工程文件夹
    这里写图片描述
    这里写图片描述

  • File->Save Workspace
    这里写图片描述

  • 最后是这样

这里写图片描述


(二)STM32固件库的介绍



- 固件库的文件结构:下表简述了固件库文件内容及作用

这里写图片描述
这里写图片描述

文件夹名称 子文件夹名称 子子文件夹名称 子子子文件夹名称 描述
_htmresc ST官方Logo
Libraries CMSIS CM3 CoreSupport Cortex-M3内核内联汇编文件
DeviceSupport 全局头文件、时钟配置文件以及相关启动文件
STM32F10x_StdPeriph_Driver 标准固件库文件,包含STM32外设对应驱动
Project STM32F10x_StdPeriph_Examples 各种外设使用例程
Project STM32F10x_StdPeriph_Template 不同IDE对应的模板文件
Utilities STM32_EVAL STM32评估版相关文件

固件库的文件结构


(三)工程模板的建立及移植


1.复制工程源码


  • 虽然STM32 固件库里面提供了很多例程给我们,但是都是基于ST 官方发行的一些评估板的,在实际应用当中,我们可能由于某些原因,不可能和官方评估板做的一模一样,因此需要在STM32 标准例程的基础上,进行移植和修改。

  • 建立层叠的文件夹,便于源码的管理,在根文件夹里面建立“USER”,“CMSIS”,“FWLIB”,“DRIVER”几个文件夹,如下图所示。其中,“USER”文件夹,主要存放用户应用程序和中断文件,如main.c 等等;“CMSIS”主要存放内核和系统相关的代码;“FWLIB”主要存放STM32 标准外设的驱动代码,“DRIVER”主要存放用户的驱动代码

这里写图片描述

  • 复制相关文件至建立的模板文件夹。需要复制的文件夹如下表(小技巧:同时打开固件库文件夹和模板文件夹,找到文件后直接ctrl+c、ctrl+v就OK了):
    这里写图片描述

2.添加工程源码

  • 我们最基本的源码文件已经复制到我们建立的工程文件夹里面,接下
    来要做的就是在IAR 里面创造代码管理文件夹,以及将相关的代码添加到文件夹
    里面。

  • 在IAR中添加管理文件夹,打开建立好的工作区

这里写图片描述

  • 右键工程名->Add->Add Group…输入文件夹名称->OK,需要建立的文件夹如下图所示

这里写图片描述

  • 添加所需的文件,Add->Add File,需要添加的文件如下图
    这里写图片描述

  • 最后是这样
    这里写图片描述

  • 关于启动文件的选择
    这里写图片描述


3.IDE的配置



  • 第一次编译:Project->Make,然后是一堆错误,如下:
    这里写图片描述
    我们看到这些错误大多是 cannot open source file "stm32f10x_spi.h" ,编译器告诉为们找不到对应的头文件。解决方案是在option中添加对应的头文件,右键工程名->Option…->Category->C/C++ Compiler->Preprocessor->在“Additional include directories:”输入头文件的包含路径:
$PROJ_DIR$\
$PROJ_DIR$\CMSIS\
$PROJ_DIR$\FWLIB\inc\
$PROJ_DIR$\USER\
  • 每一行里面用回车隔开,IAR是支持相对文件路径的,但是要使用$PROJ_DIR$$PROJ_DIR$即代表根目录文件夹“STM32F10X Template”。
    这里写图片描述


  • 第二次编译,还是有很多错误,仔细观察可以发现,错误大多是 "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" ,请选择芯片的型号

这里写图片描述

  • 双击错误,条船到如图所示的地方
    这里写图片描述

  • 用Find功能找到其定义的地方
    这里写图片描述

  • 这其实是预编译处理,需要用户指定需要使用的芯片型号,解决方案是在Options中进行预编译处理,Options->Category->C/C++ compiler->Preprocessor->在“Defined Symbol”里面定义所需要的芯片容量,添加STM32F10X_MD,如下图:
    这里写图片描述



  • 第三次编译,编译器告诉我们没有包含“core_cm3.h”文件,解决方案是解决方式还是两种,一是为将库函数里面的core_cm3.h文件加入进工程。但是这样编译可能会出现其他错误,因此直接使用第二种方法,即使用IAR 自带的core_cm3.h文件。Option->General Option->Target里面选择芯片型号,接着在在Option->General Option->Library Configuration里面勾选“use
    CMSIS”,点击“OK”,如下图所示:
    这里写图片描述
    这里写图片描述
    这里写图片描述


  • 第四次编译,编译器告诉我们缺少main.c文件,解决方案File->New File->File->Save->命名为main.c->右键USER->Add->Add “main.c”,打开main.c,添加如下代码
#include "stm32f10x.h"
int main()
{
    return 0;
}

这里写图片描述

这里写图片描述



  • 第五次编译,0错误
    这里写图片描述


  • 尽管错误已经没有了,但是当我们调用驱动库去操作外设的时候还是发现有问题,将以下代码添加到main.c文件中,Make,如下图
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
int main()
{
    GPIO_SetBits(GPIOA,0);
    return 0;
}

这里写图片描述

这是因为使用驱动库的宏没有打开,解决方案:Options->Category->C/C++ compiler->Preprocessor->Defined Symbol添加USE_STDPERIPH_DRIVER,如图

这里写图片描述

  • 然后设置链接选项里面的flash 配置文件,Linker->Config->Linker Configuration file->,把“Override Default”选项勾选上,手动设置文件路径为$PROJ_DIR$\stm32f10x_flash.icf

  • 最后一次编译,如下:
    这里写图片描述

  • 错误没有,但是还是会有警告,这是使用了固件库的原因,但是不影响使用


  • 到这里,一个基本的工程模板就建好了

回到顶部


完!
爱学习的人总是好运的!!!

猜你喜欢

转载自blog.csdn.net/qq_39432978/article/details/81592119