【普中STM32F1xx开发攻略--标准库版】-- 第 9 章 STM32 固件库介绍

作者:普中科技日期:2025/10/29

(1)实验平台:

普中STM32F103朱雀开发板https://item.taobao.com/item.htm?id=620302685024普中STM32F103玄武开发板https://item.taobao.com/item.htm?id=603479028876(2)资料下载:普中科技-各型号产品资料下载链接


前面章节为大家简单介绍了如何使用寄存器点亮开发板上 LED, 这种开发方式显然是不适合大众, 对于 STM32 这样庞大的芯片, 内部寄存器实在太多, 如果操作的外设比较多, 那么就需要花很多时间查询底层寄存器内容, 而且即使程序写好, 如果要换其他端口或者外设的话, 修改起来非常麻烦, 而且容易出错, 移植性也差。 基于这些原因, ST 公司推出了一套固件库, 内部已经将 STM32 的全部外设寄存器的控制封装好, 给用户提供一些 API 函数, 用户只需要学习如何使用这些 API 函数即可。 本章将向大家介绍这套固件库, 为后面库函数模板创建做好铺垫。 学习本章可以参考《STM32F1xx 中文参考手册》 、 《Cortex-M3 权威指南》 、 《STM32 固件库使用手册(中文翻译版)》 。 本章分为如下几部分内容:

目录

9.1 CMSIS 标准

9.2 库目录及文件介绍

9.2.1 文件夹介绍

9.2.2 文件介绍

9.3 库帮助文档使用


9.1 CMSIS 标准

什 么 是 CMSIS 标 准 ? CMSIS 标 准 英 文 全 称 是 Cortex MicroController Software Interface Standard, 翻译为中文意思就是 ARM Cortex 微控制器软件接口标准。 由于基于 Cortex 核的芯片厂商很多, 不只是 ST 公司, 为了解决不同厂家的 Cortex 核芯片软件兼容的问题, ARM 和这些厂家就建立了这套 CMSIS 标准。

我们可以通过一个基于 CMSIS 标准的应用程序框图来看其重要性。 如下图所示

从图中可以看出, CMSIS 处于中间层, 向上提供给用户程序和实时操作系统所需的函数接口, 向下负责与内核和其他外设通信。 假如没有 CMSIS 标准, 基于Cortex 的芯片厂商就会设计出自己喜欢的风格库函数。 因此 CMSIS 标准就是要强制他们必须按照这个标准来设计。

在 CMSIS 核心层又分为 3 个基本功能层:

(1) 核内外设访问层: ARM 公司提供的访问, 定义处理器内部寄存器地址以及功能函数。

(2) 中间件访问层: 定义访问中间件的通用 API, 由 ARM 提供, 芯片厂商根据需要更新。

(3) 外设访问层: 定义硬件寄存器的地址以及外设的访问函数, 比如 ST公司提供的固件库外设驱动文件(stm32f10x_gpio.c 等文件) 就是在这个访问层。

总的来说其实 CMSIS 就是统一各芯片厂商固件库内函数的名称, 比如在系统初始化的时候使用的是 SystemInit 这个函数名, 那么 CMSIS 标准就是强制所有使用 Cortex 核设计芯片的厂商内固件库系统初始化函数必须为这个名字, 不能修改。 又比如对 GPIO 口输出操作的函数: GPIO_SetBits, 此函数名也是不能随便定义的。 更多关于 CMSIS 标准介绍, 大家可以百度搜索下, 这里就不多解释。

9.2 库目录及文件介绍

上一节我们介绍了 CMSIS 标准, ST 公司按照这个标准设计了一套基于STM32F10x 的固件库, 我们可以直接在 ST 公司的官网进行下载, 在我们光盘“\8--STM32 相关资料\STM32 最新固件库 v3.5” 内也给大家提供了下载好的包,我们提供的固件库包版本是 V3.5。

9.2.1 文件夹介绍

下面就来介绍库文件的目录及文件。 我们打开下载好的固件库包如下图所示:

(1) _htmresc 文件夹: 存放 ST 公司的 LOGO 图标, 这个文件夹不用管。

(2) Libraries 文件夹: 在这个文件夹内有两个子目录, CMSIS 文件夹用于存放符合 CMSIS 标准的文件, 包括 STM32 启动文件、 ARM Cortex 内核文件和对应外设头文件 stm32f10x.h。 STM32F10x_StdPeriph_Driver 文件夹用于存放STM32 外设驱动文件, inc 目录用于存放外设的头文件, src 目录用于存放外设的 源 文 件 。 从 这 些 源 文 件 的 命 名 就 可 以 知 道 对 应 文 件 的 功 能 , 比 如stm32f10x_gpio.c 文件, 包含了对 STM32 的 GPIO 寄存器的操作函数等, 如果要对 STM32 GPIO 操作可以调用这个文件内的函数, 但是要记得添加对应的头文件,如 stm32f10x_gpio.h。 此文件夹内文件在后面创建库函数模板的时候会重点使用。

(3) Project 文件夹: 此文件夹下有 2 个目录, STM32F10x_StdPeriph_Examples 文件夹存放的是 ST 公司提供的外设驱动例程,在开发过程中可以借鉴这些例程快速构建自己的外设驱动。 有时间大家可以看看, 里面的编程思路对我们还是很有帮助的。 STM32F10x_StdPeriph_Templates文件夹存放的是官方的固件库工程模板, 我们后面创建自己工程模板的时候就需要复制此文件夹内的几个文件。

(4) Utilities 文件夹: 此文件夹是 ST 官方评估板的一些源文件, 这里不需要管。

(5) stm32f10x_stdperiph_lib_um.chm 文件: 这个文件是固件库的帮助文档, 可以直接双击打开。 这个文档对于后面学习库函数是非常有帮助的, 只不过这里只有英文版的, 但是里面的英文都很好理解, 如果学习过程中有不明白的单词, 都可以通过百度翻译等软件查询。

9.2.2 文件介绍

在介绍库文件之前先看下它们文件之间的关系, 如下图所示:

core_cm3.h 文件: 位于“\STM32 最新固件库v3.5\Libraries\CMSIS\CM3\CoreSupport” 目录下, 说明此文件属于 CMSIS 标准文件, 是用来提供进入 M3 内核的接口文件, 属于 CMSIS 的核心文件, 由 ARM 提供。 对于所有 M3 内核的芯片来说这个文件都是相同的, 不需要我们修改。

stm32f10x.h 、 system_stm32f10x.h 和 system_stm32f10x.c 文件: 存放在“\STM32 最新固件库v3.5\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x” 目录下, system_stm32f10x.h 是片上外设接入层系统头文件。 主要是申明设置系统及总线时钟相关的函数。 与其对应的源文件是 system_stm32f10x.c。 这个文件里面有一个非常重要的 SystemInit()函数申明, 这个函数在我们系统启动的时候都会调用, 用来设置系统的整个系统和总线时钟。 而 stm32f10x.h 是 STM32F10x的头文件, 类似于 51 单片机的 reg.51, 在开发 STM32F10x 程序的时候基本上都会调用这个头文件, 可见其重要性。 此文件内部封装了 STM32 的总线、 内存和外设寄存器等, 同时该文件还包含了一些时钟相关的定义和中断相关定义等。

stm32f10x_ppp.c文件: 是STM32外设的驱动源文件, 比如stm32f10x_gpio.c文件。 里面已经封装好操作 GPIO 外设底层的内容, 提供给我们使用的是一些 API函数。 stm32f10x_ppp.h 就是对应的头文件。 还有 stm32f10x_rcc.c、 misc.c 和misc.h 文件他们都是存放在“\STM32 最新固件库v3.5\Libraries\STM32F10x_StdPeriph_Driver” 内。

stm32f10x_it.c 文件: 用于存放中断函数, 不过中断函数也可以放在其他工程文件内, 所以这个文件很少操作, 对应的 stm32f10x_it.h 文件是它的头文件。

stm32f10x_conf.h 文件: 是配置文件, 用于删减我们使用的外设头文件,比如使用 GPIO 外设, 那么就需要调用 stm32f10x_gpio.h 头文件, 如果不使用GPIO 外设, 可以将此头文件注释掉, 一般情况下我们不会对这个配置文件操作,因为如果不使用一个外设, 可以在工程内不调用即可。 这几个文件存放在“\STM32最新固件库 v3.5\Project\STM32F10x_StdPeriph_Template” 内。

Application.c 文件: 用于存放用户编写的应用程序, 文件名可以根据个人爱好命名。 我们通常会命名为 main.c, 表示存放我们的主函数代码。

在后面我们创建工程模板时, 添加这些文件还不够, 还要将 STM32 的启动文件添加进来, 否则系统不能启动。 ST 固件库提供的启动文件有很多, 需根据使用的 STM32 芯片来选择, 因为开发板上使用的是高容量的 STM32F1 芯片, 所以选择 startup_stm32f10x_hd.s。 启动文件 startup_stm32f10x_hd.s 存放在“\STM32 最新固件库v3.5\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm” 内。

9.3 库帮助文档使用

在进行库函数开发时, 难免会遇到各种函数不知其含义以及使用方法的困恼, 幸好 ST 公司提供了一套库函数使用说明文档, 但是是英文的, 没关系, 因为函数的使用方法介绍比较简单, 也就是那么些专业词语, 大家多查几遍就认识了。 这个在前面介绍固件库文件夹时也提到过, 为stm32f10x_stdperiph_lib_um.chm, 我们可以直接打开, 如下图所示:

因为 STM32 库函数非常多, 我们不可能把所有的外设函数都记住, 那么这个帮助文档就是学习 STM32 库函数时所必备的, 所以要学会如何在这个帮助文档内查找函数。 我们使用的库函数全部都在下图所示列表下:

要查找哪个外设的库函数, 只需要找到对应的外设名称即可。 比如要查找对GPIO 外设操作的库函数, 我们可以在这个列表下往下拉找到 GPIO 栏, 其中 IO Functions 列表下就是 GPIO 所有操作的库函数如下图所示:

假如我们先在要查找 GPIO_Init 函数的功能说明及使用方法, 可以在下拉列表中点击这个函数名即可进入。 在函数介绍内就有函数的原形、 功能简介、 参数说明、 函数返回值等信息。 如下图所示:

这里给大家介绍的是使用库函数帮助文档来查找函数功能说明等信息, 还可以通过固件库源码来查找, 其实库函数帮助文档就是从固件库源码转换过而来。通过固件库查找在后面创建工程模板的时候会给大家介绍, 非常简单。 如果对英文感冒的朋友, 还可以参考《STM32 固件库使用手册(中文翻译版)》 文档, 该文档是上面固件库的中文翻译版, 只不过有些函数没有, 还有些地方可能与实际固件库函数有点差别, 不过大部分还是一样的, 完全可以借鉴, 后面在编写程序的过程中, 我们就会经常使用到它。


【普中STM32F1xx开发攻略--标准库版】-- 第 9 章 STM32 固件库介绍》 是转载文章,点击查看原文


相关推荐


TraceId如何在Spring-Cloud微服务的REST调用中传递
青鱼入云2025/10/26

文章目录 推荐方案:基于Spring Cloud Sleuth(无侵入,官方推荐)1. 集成Sleuth2. 核心原理3. 日志配置(输出traceId)4. 验证 自定义实现方案(不依赖Sleuth,了解原理)1. 定义常量(统一Header键)2. 发送端:通过拦截器传递traceId(1)RestTemplate调用场景(2)Feign调用场景 3. 接收端:通过过滤器提取traceId并设置到MDC 关键注意事项 在Spring Cloud微服务


Python 的内置函数 classmethod
IMPYLH2025/10/23

Python 内建函数列表 > Python 的内置函数 classmethod Python 的内置函数 classmethod 是一个装饰器,用于将一个方法标记为类方法。类方法属于类本身,而不是类的实例,因此可以在不创建实例的情况下直接通过类名调用。 def classmethod(fn): ''' 把一个方法封装成类方法 :param fn: 要封装的方法 :return: 封装后的方法 ''' 使用 @classmethod 装饰器来定义


攻防世界—easyupload
风语者日志2025/10/22

知识点补充 .user.ini php.ini是php的一个全局配置文件,对整个web服务起作用;而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。 常用配置 auto_prepend_file = <filename> //包含在文件头 auto_append_file = <filename> //包含在文件尾 一句话木马变种 这里的题目由


数据结构(顺序表和链表)
泡泡鱼(敲代码中)2025/10/21

数据结构(题) 一、顺序表 1、移除元素   int removeElement(int* nums, int numsSize, int val) {     int dst = 0;     int src = 0;     while(src<numsSize)     {         if(nums[src]!=val)         {             nums[dst]=nums[src];             dst++;     


运放的 Input Offset Drift(输入失调漂移)
Heismk2025/10/19

Input Offset Drift(输入失调漂移)是衡量运算放大器(或其他精密放大器件)性能的关键指标,用于描述温度变化时输入失调电压的变化率,直接反映器件在温度波动环境下的稳定性。 核心定义 输入失调漂移指的是:当环境温度每变化 1℃ 时,运放的**输入失调电压(Input Offset Voltage)**所发生的变化量,单位通常为 μV/℃(微伏每摄氏度)或 nV/℃(纳伏每摄氏度)。 输入失调电压(Vos):理想运放输入短路时输出应为 0,但实际器件因内部工艺差异,需在输入端施加一个微


Compose 自定义布局和图形
Best_Jerry2025/10/18

Advanced layout concepts - MAD Skills Compose 提供各种开箱即用型解决方案,可帮助您快速轻松地从头开始构建界面。但是,如果您需要更进一步,以实现完全自定义的界面,该怎么办?详细了解高级布局概念,以便自行构建自定义布局,让您的设计实现更上一层楼。 1. Advanced Layout Concepts Layout 这一术语在 Compose 中有多种含义: 以下是每种含义的相关解释: 2. Layout phase and constraint


告别加班!这些数组操作技巧让前端开发效率翻倍
良山有风来2025/10/17

你是不是经常遇到这样的场景:产品经理扔过来一堆数据,要你快速处理展示;后端返回的数组结构复杂,需要层层筛选过滤;明明很简单的数据操作,却要写一大堆循环和判断... 别担心!今天这篇干货,就是来拯救你的。我将带你系统掌握JavaScript数组和对象的核心操作,学完立刻就能用在实际项目中。相信我,掌握这些技巧后,你的开发效率至少提升一倍! 数组基础:从创建到遍历 让我们从最基础的数组操作开始。数组就像是一个数据容器,能帮我们有序地存放各种信息。 创建数组有两种常用方式。第一种是用方括号,这是最简洁


阿里云负载均衡SLB的使用参考:创建阿里云ECS实例操作
熙客2025/10/15

目录 一、背景知识 1.1 概念 1.2 负载均衡类型选择 1.3 核心功能与工作原理 1.4 配置负载均衡的注意事项 二、传统型负载均衡CLB的使用示例 2.1 创建3个ECS实例 2.2 安装nginx 2.3 创建负载均衡CLB 2.4 负载均衡配置 2.5 负载均衡检验 一、背景知识 1.1 概念 阿里云负载均衡能将访问流量分发到后端多台云服务器上,提升应用系统的服务能力和高可用性。它主要包含以下三种产品: 特性维度CLB(传统型负载均衡)ALB(应


NineData云原生智能数据管理平台新功能发布|2025年9月版
NineData2025/10/14

本月共发布 17 项更新,其中重点发布 6 项、功能优化 11 项。 重点发布 数据库 DevOps - SQL 任务事务执行 SQL 任务支持以事务方式执行。在 DML 语句执行失败后自动回滚整个任务,确保执行原子性与一致性。 数据库 DevOps - 数据脱敏与敏感扫描 敏感数据保护模块新增支持 PostgreSQL、SQL Server、Oracle 数据源的自动扫描与脱敏,帮助企业更全面地识别并防护敏感信息。 数据库 DevOps - ER 图增强 ER 图现


Flutter - Melos Pub workspaces 实践
LinXunFeng2025/10/13

欢迎关注微信公众号:FSA全栈行动 👋 一、前言 为解决 App 代码臃肿、编译耗时的问题,我们进行了分包重构,核心思路如下: 业务分包:将不同业务线的代码拆分成独立的包,开发者只需聚焦于各自包内的 example 工程进行开发,从而提升编译和运行效率。 功能沉淀:把跨业务复用的功能(包括基础业务和非业务功能)也抽离成独立的包,逐步让主 App 轻量化为一个“空壳”,负责集成所有模块。 依赖管理:业务包之间使用 git 依赖,指向 master 分支;而非业务的功能包则发布到自建的 unp

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0