STM32F103构建固件库模板(PS固件库文件树介绍)

2023-11-03

参考:STM32F103ZE新建固件库模板
作者:追兮兮
发布时间:2020-10-14 10:31:45
网址:https://blog.csdn.net/weixin_44234294/article/details/109065495
参考博文:https://blog.csdn.net/visual_eagle/article/details/104126122

固件库的使用

固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道, 向上提供用户函数调用的接口(API)。在 51的开发中我们常常的作法是直接操作寄存器,而对于 STM32 这种级别的 MCU,数百个寄存器记起来又是谈何容易。于是 ST(意法 半导体)推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一整套接口(API) 供开发者调用,大多数场合下,你不需要去知道操作的是哪个寄存器,你只需要知道调用哪些函数即可

以本博的学习板STM32F103ZET6为例,固件库(库函数的集合)是由官方提供的,这个官方是ST公司,而不是正点原子官方。也就是说不仅仅这一型号单片机,ST系列其他型号的单片机库函数依旧可以适用。所以不必担心更换板子后不知如何去编程。

任何处理器,不管它有多么的高级,归根结底都是要对处理器的寄存器进行操作。但是固件库不是万能的,如果想要把 STM32 学透,光读 STM32 固件库是远远不够的,你还是要了 解一下 STM32 的原理。

创建固件库文件夹

新建一个文件夹Template(自己随意起),该目录下四个文件夹如图(名字也可以自己起)

  • Core:一些核心文件和启动文件(或者分开为:CMSIS和STARTUP)
  • Libiraries(FWLIB):固件库(外设驱动)
  • Project:工程文件,keil创建的工程保存在此
  • User:main函数,应用程序
  • Doc:创建readme.txt工程项目描述文件
  • 将生成的.hex文件存在于OBJ目录下

不同人习惯不同,放置的位置会有一些区别,不过无伤大雅。


在这里插入图片描述

固件库官方源文件拷贝到相应文件夹

Libiraries(FWLIB)

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver目录下有inc(头文件)和src(.c文件)两个文件copy到Template文件夹下的Libiraries内,里面都是外设的一些驱动,如下所示。


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

CORE

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport目录下两个文件copy到之前新建的文件Template下的CORE文件下。

在这里插入图片描述
在这里插入图片描述

\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm目录下还要copy一个启动文件到CORE。
(>128kFLASH大容量的用hd,中等的用md,<64kFLASH小的用ld)战舰板子就用hd

在这里插入图片描述
在这里插入图片描述

Core目录完成,内部显示如下:

在这里插入图片描述

USER

\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x目录下copy三个文件到USER文件。

在这里插入图片描述

在这里插入图片描述

\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录下复制以下四个文件到USER。

在这里插入图片描述
在这里插入图片描述

新建工程

打开MDK5新建工程

在这里插入图片描述

目录选择之前新建的template下的User,文件名字自己取

在这里插入图片描述

选择芯片型号,我这里是STM32F103ZE。

江江视频里此处选的STM32F103C8

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目新建后的目录

在这里插入图片描述

此时点击之前新建的文件Template下的USER后:(会出现以下文件,点开前两个都是空文件)

在这里插入图片描述

将固件库文件导入到工程

工程下创建文件夹

此时固件库内容的复制已经完成,现在就要在MDK5中将文件导入到工程。在工程下创建文件夹。

江江视频里的方法:
工程下创建文件夹:右键选择Add Group,挨个添加,鼠标长按进行修改名字。
向文件夹内添加文件:直接在主界面双击文件夹,弹出添加界面进行文件的添加。

右键选择Manage Project items…创建三个文件夹(Keil
主界面魔术棒右边是这个快捷键)。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

文件夹内添加文件

FWLIB:Add Files… \LibLIbiiraries\src(全部文件)

在这里插入图片描述
USER:Add Files… \USER(3个.c文件)
在这里插入图片描述
COREc:Add Files… \CORE(.c文件+.s文件)

在这里插入图片描述

生成.hex文件

点击魔术棒将生成的.hex文件存在于Project(大部分人之前这个文件夹都取名为OBJ)

在这里插入图片描述
在这里插入图片描述

添加头文件路径

此时编译会出现找不到头文件的error。

需添加头文件路径,编译时自动就把头文件包含进来。

在这里插入图片描述

发现编译再次出错

在这里插入图片描述

原因:实际上User目录下的这个.h文件是没有被导入进去的

在这里插入图片描述
在这里插入图片描述

上面这句话说明只有定义了USE_STDPERIPH_DRIVER才会包含这个头文件,所以需要添加宏定义到Define,点击ok。

在这里插入图片描述

再次编译就不报错了

在这里插入图片描述

STM32固件库文件树结构简介

STM32固件库文件树及构成详解(库版本:STM32F10x_StdPeriph_Lib_V3.5.0)

库减压后所有文件夹构成如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Libraries 文件夹

有 CMSIS 和 STM32F10x_StdPeriph_Driver 两个目录,这两个目录包含 固 件 库 核 心 的 所 有 子 文 件 夹 和 文 件 。 其 中 CMSIS 目 录 下 面 是 启 动 文 件 ,STM32F10x_StdPeriph_Driver 放的是 STM32 固件库源码文件。源文件目录下面的 inc 目录存放的是 stm32f10x_xxx.h 头文件,无需改动。src 目录下面放的是 stm32f10x_xxx.c 格式的固件库源码文件。每一个.c 文件和一个相应的.h 文件对应。这里的文件也是固件库的核心文件,每个外设对应的一组文件。

Project 文件夹

有两个文件夹,顾名思义, STM32F10x_StdPeriph_Examples 文件夹下面存放的的 ST 官方提供的固件实例源码,在以后的开发过程中,可以参考修改这个官方提供的实例来快速驱动自己的外设,很多开发板的实例都参考了官方提供的例程源码,这些源码对以后的学习非常重STM32F10x_StdPeriph_Template 文件夹下面存放的是工程模板。Utilities 文件下就是官方评估板的一些对应源码。

固件库的帮助文档

根目录中还有一个 stm32f10x_stdperiph_lib_um.chm 文件,直接打开可以知道,这个文档学习过程中非常有用

STM32固件库内部结构功能简介

这里可参照视频学习:【150集-野火F103霸道/指南者视频教程】
P16 初识STM32固件库—我们认为固件库应该是什么样子的

1. 汇编编写的启动文件

startup_ stm32f10x_ hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、对用c库函数_ main最终去到c的世界

 
 
 
 
  • 1

2. 时钟配置文件

system_ stm32f10x.c: 把外部时钟HSE=8M, 经过PLL倍频为72M。

 
 
 
 
  • 1

3. 外设相关的

stm32f10x.h: 实现了内核之外的外设的寄存器映射
XXX: GPIO、 USRAT、 I2C、 SPI、 FSMC 
stm32f10x_ xx.c: 外设的驱动函数库文件
stm32f10x__xx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明

 
 
 
 
  • 1
  • 2
  • 3
  • 4

4. 内核相关的

CMSIS - Cortex 微控制器软件接口标准
core_cm3.h:实现了内核里面外设的寄存器映射
core_ _cm3.c .
NVIC(嵌套向量中断控制器)、sysTick(系统滴答定时器)
misc.h
misc.c

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5. 头文件的配置文件

stm32f10x_ _conf.h: 头文件的头文件
/ /stm32f10x_ _usart.h
/ /stm32f10x_ _i2c.h
/ /stm32f10x_ spi.h
/ /stm32f10x_ adc.h
/ /stm32f10x_ fsmc.h

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

6. 专门存放中断服务函数的c文件

stm32f10x_ it.c
stm32f10x_ it.h
中断服务函数你可以随意放在其他的地方,并不是一定要放在stm32f10x_it.c

 
 
 
 
  • 1
  • 2
  • 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103构建固件库模板(PS固件库文件树介绍) 的相关文章

  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一

随机推荐

  • linux下项目部署和配置域名

    项目部署和配置域名 1 首先将项目放入 home www wwwroot default 不同服务器 www路径可能不一样 目录下 2 找到apche目录 一般apache目录在 usr local apache下 也可以通过命令find
  • 修改为一个接口

    Select SELECT COUNT id AS total orders n FROM eb store order int totalOrder Select SELECT SUM pay price AS total income
  • react中useState、useRef之间的区别

    今天写代码用useState 数据总是差一步 同学提醒我他是异步 我恍然大悟 用useRef就好了 记录一下他俩的区别 1 useState 组件更新不会改变之前的状态 可以保存状态 值变化 会render 视图会更新 setState是异
  • Some Information in Study

    Books recommended by programmer 1 Code Complete 2nd Ed by Steve McConnell 2 The Pragmatic Programmer 3 Structure and Int
  • Nodejs的安装

    1 Nodejs的安装 1 下载与安装 下载地址 http nodejs cn download 也可以从网盘下载 链接 https pan baidu com s 1 tnPpgoZldQJherlXkUJdA 提取码 lmxo 2 进行
  • SpringBoot 27 Dubbo-admin、Zookeeper 安装

    27 1 Dubbo 什么是 Dubbo Apache Dubbo 是一款高性能 轻量级的开源 Java RPC 框架 它提供了 三大核心能力 面向接口的远程方法调用 智能容错和负载均衡 以及服务自动注册和发现 Dubbo 采用全 Spri
  • GO 导入(import)相对路径(Relative Path)的问题

    1 问题的产生 在github上fork一个开源项目之后 想要修改部分代码后供公司项目使用 发现需要修改源项目中的所有内部import 例如开源模块 M中存在P1 P2等package 其中P2 import P1的import路径为 gi
  • JavaWeb详解(第四篇)之JSP 简介

    JavaWeb详解 第四篇 之JSP 简介 1 JSP概述 1 1 什么是JSP JSP 全称是 Java Servlet Pages 它是和 servlet 技术一样 都是 SUN 公司定义的一种用于动态开发 web 资源的技术 JSP
  • conda 创建/删除/复制/重命名 深度学习环境

    1 创建 打开anaconda的prompt面板 先创建一个python3 9的环境 conda create n pytorch1 9 python 3 9 创建完之后可以激活环境 activate pytorch1 9 进一步可以安装t
  • CRM软件系统能否监控手机的使用

    CRM可以监控手机吗 答案是不可以 CRM是一款帮助企业优化业务流程 提高销售效率的工具 例如Zoho CRM 最多也就是听一下销售的通话录音 却不可以监控手机 毕竟CRM不是一款监控软件 CRM的主要作用有以下几点 1 管理客户数据 CR
  • 【数据结构】带头双向循环链表---C语言版(单链表我们分手吧,不要再找我玩了!!!)

    文章目录 一 前言 二 链表的分类 1 单向或者双向链表 2 带头或者不带头链表 3 循环或者非循环 4 最常用链表 三 带头双向循环链表详解 创建带头双向循环链表 接口1 定义结构体 LTNode 接口2 初始化 创建哨兵卫 LTInit
  • mmdet_config_builder_win

    在mmdet框架中使用config配置文件构建网络模型 from mmdet models builder import build detector from mmcv import Config import torch import
  • Android 内核调用充电状态和电池电量

    Android 内核调用充电状态和电池电量 前言 一 调用的文件 二 调用函数 1 引入使用 2 返回值说明 小结 前言 因为Android项目需求 不是什么时候都是用APP来实现功能 部分项目是要求需要驱动需要独立完成部分系统层面的功能
  • 在vue中引入echart的折线图时,echarts.graphic.LinearGradient,不能正常显示的解决方法。

    在vue中需要达到折线图 且有区域渐变色的效果 那么像下面那样子直接复制过来 在vue中不能渲染出来 需要将原来的 new echarts graphic LinearGradient 改成这样 new this echarts graph
  • Vue线上部署之cdn加速(终极加速)

    文章目录 1 概述 3 cdn gzip vs gzip 1 概述 之前做过服务器nginx开启gzip压缩 速度缩减了很多 加载时间在1秒多 会出现白屏 原因是好多依赖被打包到js中了 体积太大 加载很慢 今天加了下cdn 速度真正起飞
  • Tomcat 线程池

    目录 概述 tomcat线程池工作原理 关键源码 Connector 配置 Executor 线程配置 tomcat核心组件 题外 概述 Tomcat 是一个流行的 Java Web 服务器 它使用线程池来处理客户端请求 线程池是一组预先创
  • 矩阵的转置等于矩阵的逆

    http zhidao baidu com question 334500638 html 百度知道三个回答 矩阵A的转置矩阵A T等于A的逆矩阵A 1 那么AA T AA 1 E 设A 1 2 3 n T 其中 i为n维列向量 那么A T
  • 华为机试-在字符串中找出连续最长的数字串

    题目描述样例输出输出123058789 函数返回值9输出54761 函数返回值5接口说明函数原型 unsignedint Continumax char pOutputstr char intputstr 输入参数 char intputs
  • Android zygote进程启动过程

    zygote启动过程中涉及到以下模块 app process zygote USAP socket FileDescriptor FD AndroidRuntime AppRuntime 定义于app process模块 继承自Androi
  • STM32F103构建固件库模板(PS固件库文件树介绍)

    参考 STM32F103ZE新建固件库模板 作者 追兮兮 发布时间 2020 10 14 10 31 45 网址 https blog csdn net weixin 44234294 article details 109065495 参