历史上的今天

今天是:2024年09月27日(星期五)

正在发生

2019年09月27日 | STM32学习之旅② 固件库的使用及工程模板的建立

发布者:玉树琼花 来源: eefocus关键字:STM32  固件库  工程模板 手机看文章 扫描二维码
随时随地手机看文章

一、认识其本质

STM32在进入中国市场的时候,商家为了迎合中国市场,翻译了很多英文文献,所以STM32相对与其他单片机的资料是相对丰富的,这也是很多人推崇STM32的原因,这对于我们学习来说也是相当不错的,但是由于翻译版本很多,注意以官方版本为准,在看文档发现不对时应该参考官方文档


固件库其实是官方为了加快开发速度,帮助用户快速上手芯片,进行二次开发而研究出来的,它的出现大大缩短了芯片开发周期


二、为什么要使用固件库

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

好处:开发者可以了解单片机较为底层的寄存器,了解程序在硬件上的具体实现方式,便于纠错。

不足:

移植性差:由于单片机通常由很多外设,而不同型号的的单片机的寄存器操作方式都有所不同,当进行移植是需要修改的内容很多,工作量大。

效率低下:由于单片机内部资源丰富,需要设置的寄存器非常多,需要花很长的时间查阅用户手册才能完成。

(二)基于固件库的编程

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


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


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


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


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

三、所需材料

获取STM32官方固件库,从网盘获取, 密码:8sgn


如何从ST官网获取芯片的相关文档手册,中文版 ,密码:wupy


四、模板创建

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

File->New Workspace


Project->Create New Project

这里写图片描述

建立工程文件夹

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

File->Save Workspace

这里写图片描述

最后是这样

这里写图片描述

(二)STM32固件库的介绍


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

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

image.png

固件库的文件结构


另一位博主的详解

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

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$FWLIBinc

$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


最后一次编译,如下(记住要先右键工程名->Clean然后再Make):

这里写图片描述

错误没有,但是还是会有警告,而且警告的数量始终是53个,这是使用了固件库的原因,但是不影响使用


到这里,一个基本的工程模板就建好了,以后的编程都可以基于这个模板开发,先复制一个副本,然后改成需要的名字,记住要保留模板文件


关键字:STM32  固件库  工程模板 引用地址:STM32学习之旅② 固件库的使用及工程模板的建立

上一篇:嵌入式STM32建立工程的详细步骤
下一篇:STM32学习之旅① 开发环境搭建

推荐阅读

毫无疑问,日渐火热的自动驾驶技术将成为过去50年来最具影响力的技术之一。自动驾驶的实现,能够挽救数百万人的生命,释放无数耗费在驾驶中的时间,并有望缓解扰人的交通拥堵。尽管目前还没有实现真正的自动驾驶,但是,任何新的、有意义的进展,都在为我们描绘那个值得期待的未来。当我们谈及自动驾驶领域的知名厂商时,可能会率先想到特斯拉(Tesla)、...
近日,荷兰科技博客LetsGoDigital曝光了华为正在申请的第二代Mate X折叠屏智能机专利,外观并没有太大改动,但新增了手写笔的收纳槽。图上可以看到它的外观与初代没有太大改变,最大的亮点是它在侧边栏预留了手写笔的收纳槽,在容纳手写笔的侧边栏隔断附近,还可见到集成的摄像头模块,底部则有 USB 端口。 这也就意味着华为Mate X二代将会加入手写笔...
中国5G技术正在逐渐完善和普及,5G技术引发的相关投资正在如火如荼地进行,产业规模都在呈几何级增长。 “十四五”规划正在积极编制中,肩负着稳定经济增长作用的新基建或成为“十四五”的重要方向。 在“十四五”开局之际,我们对新基建进行展望。5G超级应用、物联网等七大领域或是新基建核心发展方向,5G芯片全面带动数字化升级。新基建几大领域可分为“...
小米官方今天宣布,中国射击运动员杨倩成为 Xiaomi Civi 代言人。  公开资料显示,杨倩,2000 年 7 月 10 日出生于浙江省宁波市鄞州区姜山镇杨家弄村,中国女子射击运动员,国际级运动健将,中国国家射击队成员。2021 年 7 月 24 日,杨倩以 251.8 环的成绩获得 2020 年东京奥运会射击女子 10 米气步枪项目金牌,为中国队...

史海拾趣

问答坊 | AI 解惑

大家好啊,好久没来了,突然一种亲切感上来心头。。。

好久没来了,感觉很对不起似的,心里有中失落感,坛子好酒,可我们是如何认真对待的呢。。。 我有所改变,应该,以后坚决为论坛多做事,欢迎大家提问…

查看全部问答∨

传说中的易懂单片机教程(名不虚传)

一直收藏,一直没有共享,或许你不是用它完成的单片机的入门,我也不是,入门了再看,依然受益…

查看全部问答∨

TPMS用充电电路

汽车轮胎防爆系统用充电电路---CN3068,多家采用。…

查看全部问答∨

晒一些安防工程图片~~

检察院讯问室里的,用天地伟业设备…

查看全部问答∨

宽带放大器

本帖最后由 paulhyde 于 2014-9-15 03:38 编辑 宽带放大器  …

查看全部问答∨

232/485 软件控制切换

我想做一个电路,即软件配置成是232通信还是485通信。当然单片机端的输入/输出端口公用,通信接口端也管脚公用。 我想可以通过模拟开关实现,而且一定有人用过,有成熟的电路,所以特请教。 谢谢!…

查看全部问答∨

ds18b20温度传感器读值不稳定???

问题见红色注释 驱动中的函数:(驱动肯定没问题的,是教程上自带的) static ssize_t  s3c2440_18b20_read(struct file *filp, char *buf, size_t len, loff_t *off) {    DS18B20PRO();     *buf=sdata;  ...…

查看全部问答∨

关于89s51的小程序的问题 简单

#include<reg51.h> unsigned char code tab[]={0xco,0x9f,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; sbit S1=P2^0; //这一段是什么意思?? void Delay() {    unsigned int i,j;     ...…

查看全部问答∨

求求各位大哥帮帮忙啊..急(1)

说说以下程序的意思 void IsrIRQ( ) {         int count = 0;         unsigned int isr_pending;         unsigned int isr_mask = 0x00000001;         ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved