STM32——STM32库结构详解

2023-05-16

       STM32库是由ST公司针对STM32提供的函数接口,即API(application program interface),开发者可以调用这些函数接口来配置STM32的寄存器,脱离最底层的寄存器操作,使开发高效、阅读方便、维护成本低。

       实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。

123
库开发与直接配置寄存器方式的区别

1.为什么使用库开发

       因为STM32外设资源丰富,带来的必然是寄存器数量和复杂程度的增加,这是直接配置寄存器就会有如下缺点:

(1)开发速度慢

(2)程序可读性差

       这两个缺点直接影响了开发效率,程序维护成本,交流成本。采用寄存器开发能够让开发更直观,程勋运行占用资源少。库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的,只需要追踪到库的最底就能理解。

       库就是建立了一个新的软件抽象层,库的优点就是分层的优点,库的缺点,也是软件分层带来的缺点。

C语言与汇编语言、库与寄存器开发的区别
C语言与汇编语言、库与寄存器开发的区别

2.寄存器结构及库层次关系

2.1CMSIS标准

       我们知道由ST公司生产的STM32采用的是Cotex—M3内核,内核是整个微控制器的CPU。该内核是ARM公司设计的一个处理器体系架构。ARM公司并不生产芯片,而是出售其芯片技术授权。ST公司或其他芯片生产厂商如TI,负责设计的是在内核之外的部件,被称为核外外设或片上外设、设备外设。如芯片内部的模数转换外设ADC、串口UART。定时器TIM等。内核与外设,如同PC上的CPU与主板、内存、显卡、硬盘之间的关系。

       因为基于cortex的某系列芯片采用的内核都是相同的区别主要为核外的片上外设的差异,这些差异缺导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的cortex微控制器软件的兼容性问题,ARM与芯片厂商建立了CMSIS标准(cortex microcontroller software interface standard),所谓CMSIS标准,实际是新建了一个软件抽象层

CMSIS架构

CMSIS标准中最主要的时CMSIS核心层,他包括了:

(1)内核函数层:其中包含用于访问内核寄存器的名称,地址定义,主要由ARM公司提供。

(2)设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。

2.2库文件简介

        从ST官网可以获得STM32的3.5版库。 

(1)Libraries文件夹是驱动库的源代码及启动文件。

(2)Project文件夹下是用驱动库写的例子跟一个工程模板。

       在使用库开发是,我们需要吧libraries目录下的库函数文件添加到工程中,并查阅库帮助文档(Release_Notes.html)来了解ST提供的库函数,这个文档说明了每一个库函数的使用方法。

2.2.1 core_cm3.c文件

       在coreSupport中的是位于CMSIS标准的内核设备函数层的M3核通用的源文件core_cm3.c和头文件core_cm3.h,他们的作用是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口。这两个文件在其他公司的M3系列芯片也是相同的。

       core_cm3.c文件中包含了stdin.h这个文件,这是一个ANSI C文件,是独立于处理器之外的,就像我们熟知的C语言头文件stdio.h文件一样。

        core_cm3.c跟启动文件一样都是底层文件,都是由ARM公司提供的,遵守CMSIS标准,即所有芯片的库文件都带有这个文件,这样软件在不同的CM3芯片的移植工作就得以简化。

2.2.2 system_stm32f10x.c文件

       在DeviceSupport文件夹下的是启动文件、外设寄存器定义&中断向量定义层的一些文件,这是由ST公司提供的。

startup文件夹是各种STM32型号的启动文件;

stm32f10x.h文件是定义寄存器的地址及使用的结构体封装;

system_stm32f10x.c文件是设备外设访问层,主要配置时钟频率;

system_stm32f10x.h文件是配置时钟频率相应的头文件。

       system_stm32f10x.c,是由ST公司提供的,遵守CMSIS标准。改文件的功能是设置系统时钟和总线时钟,M3比51单片机复杂得多,并不是说我们外部给一个8M的晶振,M3整个系统就以8M的时钟进行倍频,分频,或者使用芯片内部的时钟。所有的外设与时钟的频率有关,所以这个文件的时钟配置是很关键的。

        system_stm32f10x.c在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10x.h这个头文件。

2.2.3 stm32f10x.h文件

stm32f10x.h这个 文件非常重要,是一个非常底层的文件。

所有的处理厂商都会将对内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的的开发环境中。这样,我们再开发自己的应用程序的时候只要将这个文件包含进来就可以了。

2.2.4启动文件

Libraries\CMSIS\Core\CM3\startup\arm文件夹下是由汇编编写的系统启动文件,不同的文件对应不同的芯片型号,在使用时要注意。

 文件名的英文缩写的意义如下:

cl:互联型产品, stm32f105/107 系列
vl:超值型产品, stm32f100 系列
xl:超高密度(容量) 产品, stm32f101/103 系列
ld:低密度产品, FLASH 小于 64K
md:中等密度产品, FLASH=64 or 128
hd:高密度产品, FLASH 大于 128
启动文件是任何处理器在上复位之后最先运行的一段汇编程序。在我们编写的C语言代码运行之前,需要由汇编为C语言的运行建立一个合适的环境,接下来才能运行我们的程序。

启动文件的作用:

(1)初始化堆栈指针SP;

(2)初始化程序计数器指针PC;

(3)设置堆、栈的大小;

(4)设置异常向量表的入口地址;

(5)配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);

(6)设置C库的分支入口_main(最终用来调用main函数);

(7)在3.5版的启动文件还调用了在system_stm32f10x.c文件中的SystemInit()函数配置系统时钟,在旧版的工程中要用户进入main函数自己调用SystemInit()函数。

2.2.5 STM32F10x_StdPeriph_Driver 文件夹

Libraries\STM32F10x_StdPeriph_Driver 文件夹下有 inc(include 的缩写)跟 src(source 的简写)这两个文件夹,这都属于CMSIS的设备外设函数部分。src里面是每个设备外设的驱动程序,这些外设是芯片制造商在Cortex-M3核外加进去的。

misc.c 文件,这个文件提供了外设对内核中的 NVIC(中断向量控制器)的访问函数,在配置中断时,我们必须把这个文件添加到工程中。

 2.2.6 stm32f10x_it.c、 stm32f10x_conf.h 文件

 我们在用库建立一个完整的工程时,还需要添加stm32f10x_it.c、 stm32f10x_it.h、stm32f10x_conf.h 这三个文件。

stm32f10x_it.c,是专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些系统异常的接口,其他普通中断服务函数由我们自己添加。这些中断函数不可以自己定义,可以在汇编启动文件中找到。

 stm32f10x_conf.h,这个文件被包含进stm32f10x.h,是用来配置是用来什么外设的头文件,用这个头文件我们可以很方便的增加或删除上面driver目录下的外设驱动函数库。

stm32f10x_conf.h 这个文件还可配置是否使用“断言” 编译选项, 在开发时使用断言可由编译器检查库函数传入的参数是否正确,软件编写成功后,去掉“断言” 编译选项可使程序全速运行。可通过定义 USE_FULL_ASSERT或取消定义来配置是否使用断言。
 

2.3 库各文件间的关系

 

 库文件直接包含进工程即可,丝毫不用修改,而有的文件就要我们在使用的时候根据具体的需要进行配置。在实际的使用库开发工程的过程中,我们把位于CMSIS层的文件包含进工程丝毫不用修改,也不建议修改。针对位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。

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

STM32——STM32库结构详解 的相关文章

  • 数据结构视频教程哪个好

    来源 xff1a 我是码农 xff0c 转载请保留出处和链接 xff01 本文链接 xff1a http www 54manong com id 61 1207 目前 xff0c 具我粗略不完全统计 xff0c 网络上流传的数据结构视频教程
  • X11相关(一)

    在盒子上折腾qtmediahub的时候 xff0c uxlaunch怎么都无法正常启动 xff0c 查了一下x11的log xff0c 发现错误如下 xff1a XSERVTransSocketUNIXCreateListener Sock
  • java获取首字母字符串首字母

    import net sourceforge pinyin4j PinyinHelper import java util regex Pattern String hostName 61 34 集团 2012 版知识库管理系统 34 St
  • 嵌入式到底该怎么学

    想学习单片机的同学可以关注 私信我或者在评论区回复我要入门 很多人都不知道嵌入式怎么学 xff0c 这一期我就简单说一下我的理解 嵌入式这个概念太广了 xff0c 可能很多人认为嵌入式就是嵌入式Linux 但是其实并不仅仅只有Linux x
  • 嵌入式有哪些发展方向?

    想学习单片机的同学可以关注 私信我或者在评论区回复我要入门 最近几年经过移动互联网 物联网的高速发展 xff0c 嵌入式技术在我们生活中随处可见 xff0c 在通讯 网络 工控 医疗 电子等领域发挥着越来越重要的角色 xff1b 随着对嵌入
  • 公式截取神器:将文献中的公式快速粘贴进word:

    一共需要两个软件 mathpix snipping tool 负责对公式截屏 然后自动转化为LaTex公式语法 AxMath 负责将LaTex语法转化为word里可显示的公式 作用与MathType一样 但个人感觉这个软件更好用 而且还是国
  • ubuntu安装HDF5 1.10.4 以及对应的python hdf5包

    1 安装HDF5 1 10以及对应的python hdf5的包 xff08 HDF5 1 10 4安装具体可参考其他博客 xff09 2 使用命令行环境变量安装对应的python hdf5包 xff0c HDF5 DIR 61 usr lo
  • Redis相关知识点整理

    文章目录 前言一 Redis基本数据类型StringHashListSetSort Set xff08 zset xff09 二 键值 xff08 key xff09 的常用操作三 Redis持久化方式3 1 持久化方式之RDB3 2 持久
  • html5基础入门知识(干货)

    一 什么是html 用来描述网页的语言 超文本标记语言 不是编程 xff0c 而是一种标记语言 使用标记标签来描述网页等等 我们只需记住html就是用标记标签来描述网页 xff0c xff08 网页是前端哦 xff0c 平时你们听过的c c
  • Matlab使用过程中内存不足问题的总结

    做图像处理的 xff0c 对matlab这工具软件一定不会陌生 xff0c 他的高集成度为图像处理提供了很大的方便 xff0c 但我们在使用时难免会出现内存不足的问题 xff0c 2 3G的内存还不够处理一次简单图像 xff0c 这确实很恐
  • VIO系统介绍

    VIO xff08 visual inertial odometry xff09 即视觉惯性里程计 xff0c 有时也叫视觉惯性系统 xff08 VINS xff0c visual inertial system xff09 xff0c 是
  • VINS-MONO概述

    VINS Mono是HKUST的Shen Shaojie团队开源的一套Visual Inertial融合定位算法 xff0c https github com HKUST Aerial Robotics VINS Mono xff0c 是用
  • 主流VIO框架分析及VINS部分解析

    本文为搜集的资料整理 xff1a C0包含位姿和运动信息 xff1b 对于T0来说 xff0c 不仅受rv10 rv11的视觉影响 xff0c 也受rb01的IMU的影响 上述方式繁琐 xff0c 故引入因子图 xff0c 便于思路梳理和理
  • evo评测VINS-MONO---TUM数据集

    为了想测试室外场景下VINS MONO定位情况 xff0c 室外环境的KITTY数据集因无时间戳 xff0c EVO测评较困难 故选择TUM数据集 xff0c outdoors1 8 户外 xff1a 在校园内的室外场景拍摄 xff0c 但
  • ROS编译错误:Could not find a package configuration file provided by “XXX“

    解决 xff1a 系统提示缺少什么包 xff0c 就安装什么包即可 xff1a sudo apt get install ros noetic xff0c 依据自己的系统和出错提示更改相关内容 示例 xff1a 1 xff09 CMake
  • ZED2运行VINS-MONO初试

    上篇博客 xff0c 已经完成ZED2的标定 xff0c 获取相关标定参数 xff0c 将在此基础上进行VINS的相关修改 xff0c 实现使用ZED2运行VINS MONO 一 VINS MONO环境搭建 因为系统环境从ubuntu18
  • ZED2双目相机运行VINS-FUSION初试

    基于ZED2运行VINS MONO的经验 xff0c 在运行VINS FUSION前有几点tips想跟大家分享 xff0c 应该能在运行的过程中避免一些踩坑吧 TIPs 1 xff09 关于zed2标定 开始使用Kalibr进行相机单目 双
  • VINS Fusion GPS融合部分

    概述 VINS Fusion在VINS Mono的基础上 xff0c 添加了GPS等可以获取全局观测信息的传感器 xff0c 使得VINS可以利用全局信息消除累计误差 xff0c 进而减小闭环依赖 局部传感器 如相机 xff0c IMU x
  • STM32烧录一次后无法再次烧录

    STM32烧录一次后无法再次烧录 本人是使用cubemx配置stm32 xff0c 在配置sys时没有配置Debug xff0c 所以会导致程序只可以烧录一次的情况 xff0c 再次烧录会发生无法找到芯片的情况 解决方法是将单片机reset
  • Vins-fusion gps融合 KITTY数据集测试

    下载kitti数据集 下载kitti数据集和真值poses的00 txt以及sequences文件00序列的times txt xff0c xff08 全网找了好久 xff0c 最后不得已翻墙从官网down下来的 xff09 代码修改 xf

随机推荐

  • Vins-fusion GPS融合部分测试(自己的数据ZED+RTK)

    经过前一段时间的积累 xff0c 目前暂时成功实现了用自己的数据测试实现Vins fusion 43 GPS融合 xff0c 其实放在数据采集处理上的时间比较多 xff0c 踩了很多坑 xff0c 效果在一些部分还不是很好 xff0c 后期
  • Ceres Solver实例分析

    ceres简介 Ceres solver 是谷歌开发的一款用于非线性优化的库 xff0c 在谷歌的开源激光雷达slam项目cartographer中被大量使用 本篇博客结合相关实例介绍一下 Ceres库 的基本使用方法 xff1a 使用Ce
  • MSCKF算法简介

    感谢 xff1a 紫薯萝卜 https zhuanlan zhihu com p 76341809 论文 xff1a https arxiv org abs 1712 00036 代码 xff1a https github com Kuma
  • API函数详解:CreateSemaphore函数

    Windows API函数 Visual Basic 语法格式声明Declare Function CreateSemaphore Lib 34 kernel32 34 Alias 34 CreateSemaphoreA 34 lpSema
  • java 专业英语词汇

    abstract 关键字 抽象 39 bstr kt access vt 访问 存取 39 kses n 入口 使用权 algorithm n 算法 39 lg riem annotation java 代码注释 n u 39 tei n
  • 自动控制原理(1)-典型环节的传递函数

    构成线性定常控制系统的七个环节 xff1a 比例环节 xff0c 微分环节 xff0c 一阶微分环节 xff0c 二阶微分环节 xff0c 积分环节 xff0c 惯性环节 xff0c 振荡环节 1 比例环节 K为比例系数比例环节又称无惯性环
  • ESP8266从入门到入门系列(一) 你好,ESP8266

    0 前言 转载自我的古月居频道 距离我签约古月居已经过去了一个月了 xff0c 博主因为在这一个月的时间里琐碎的事情非常的多 xff0c 所以也推迟了我发博客的时间 古月居这个平台是以ROS起家的 xff0c 但是我们不能局限于软件 xff
  • BearPi-HM_Nano 鸿蒙os学习笔记(一)-在Windows下搭建开发环境

    BearPi HM Nano 鸿蒙os学习笔记 一 在Windows下搭建开发环境 0 前言 最近HarmonyOS2 0发布了 xff0c 就想着跟上时代的脚步 xff0c 后来在度娘上搜索相关信息 xff0c 发现了一款比较便宜的鸿蒙开
  • 普通数组如何转换成json数据格式

    我们都知道json有很多种格式 xff0c 而开发过程中经常遇到格式转换的问题 xff0c 特别是接口调用的时候 xff0c 如何将普通数组转成我们需要的json格式呢 xff0c 下面我提供了一种方法 xff0c 也是一种思路 xff0c
  • github常用命令(收藏版)

    目录 创建仓库 x1f30f 初始化仓库 x1f30f 查看仓库状态 x1f30f 设置用户信息 x1f30f 创建钥匙 x1f30f 验证钥匙 x1f30f 与远程仓库建立连接 x1f30f 重新设置仓库url地址 x1f30f 初次拉取
  • Android中Parcelable接口用法

    1 Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel Classes implementing t
  • STM32开发笔记(四)——FreeRTOS

    STM32开发笔记 xff08 四 xff09 FreeRTOS 小狼 64 http blog csdn net xiaolangyangyang 一 FreeRTOS调度原理 FreeRTOS调度分为时间片调度和抢占调度两种 时间片调度
  • 硬件学习之为什么三相电机不需要电容?

    1 单项电机 一个单相电机里一共有两个线圈 xff0c 主线圈和副线圈 当单相正弦电流通过主线圈时 xff0c 主线圈就会产生一个交变脉动磁场 xff0c 这个磁场的强弱随时间作正弦电流变化而变化 xff0c 但在它的方向一直是1 3这个方
  • Orb-slam2+win7+VS2015+USB双目摄像头

    Orb slam2 43 win7 43 VS2015 43 USB双目摄像头 本文将介绍如何在win7上使用USB双目摄像头实现Orb slam2 主要硬件 我们以USB双目摄像头 43 VS2015 43 win7来实现功能 xff1a
  • win7+opencv-2.4.13安装教程

    win7 43 opencv 2 4 13安装教程 本文将介绍如何在win7上安装opencv 2 4 13 一 安装过程 1 下载OpenCV 安装包 xff0c 以opencv 2 4 13 为例 2 双击 opencv 2 4 13
  • WIN7+Visual Studio 2013安装配置教程

    WIN7 43 Visual Studio 2013安装配置 本文将介绍如何在win7上安装Visual Studio 2013 一 xff1a 安装过程 1 下载Visual Studio 2013 安装包 下载之后的文件是 iso 格式
  • Ubuntu18.04 + Orb-Slam3 + USB双目摄像头

    Ubuntu18 04 43 Orb slam3 43 USB双目摄像头 本文将介绍如何在Ubuntu18 04上使用USB双目摄像头实现Orb slam3 主要硬件 我们以USB双目摄像头在Ubuntu18 04上来实现功能 xff1a
  • 树莓派结合Pixhawk飞控实现四轴双目视觉避障

    无人机双目视觉避障的实现 本文将介绍如何使用树莓派结合PIX飞控实现无人机双目视觉避障的功能 主要硬件 我们以双目摄像头 43 树莓派 43 Pixhawk飞控来实现功能 xff1a 双目摄像头与树莓派通过USB接口来连接 xff0c 树莓
  • TypeScript 终极初学者指南

    大家好 xff0c 我是 ConardLi xff0c 在过去的几年里 TypeScript 变得越来越流行 xff0c 现在许多工作都要求开发人员了解 TypeScript xff0c 各大厂的大型项目基本都要求使用 TypeScript
  • STM32——STM32库结构详解

    STM32库是由ST公司针对STM32提供的函数接口 xff0c 即API xff08 application program interface xff09 xff0c 开发者可以调用这些函数接口来配置STM32的寄存器 xff0c 脱离