零死角玩转stm32初级篇3-初识 STM32 库

2023-10-10 10:50

本文主要是介绍零死角玩转stm32初级篇3-初识 STM32 库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇博文目录:

      • 一.STM32库开发的相关概念知识
        • 1.什么是 STM32 库?
        • 2.CMSIS 标准
      • 二.STM32 结构及库层次关系
        • 1.库目录,文件简介
        • 2.CMSIS
        • 3.STM32F10x_StdPeriph_Driver
        • 4.STM32F10x_StdPeriph_Template
        • 5.库各文件间的关系
      • 三.使用库帮助文档
        • 1.常用官方资料
        • 2.官网手册的使用

一.STM32库开发的相关概念知识

1.什么是 STM32 库?

STM32 库是由 ST 公司针对 STM32 提供的函数接口即 API(Application Program Interface) ,开发者可调用这些函数接口来配置STM32 的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速,易于阅读,维护成本低等优点。实际上, 库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器方式的区别如下图所示。

在这里插入图片描述

直接配置寄存器方式的开发速度慢,程序可读性差这二个缺陷往往会影响开发效率,程序维护成本和交流成本,当然在一些特殊场景下我们还是会第一时间选择使用寄存器方式,因为库函数方式通过增加函数层的方式来简化代码,这样的方式会影响执行的速度和占用的资源,所以在一些比较看重执行速度,看重资源占用大小的场景下还是优先使用寄存器方式。

在这里插入图片描述

在这里插入图片描述

2.CMSIS 标准

我们知道由 ST 公司生产的 STM32 采用的是 Cortex-M3 内核 ,内核是整个微控制器的 CPU。该内核是 ARM 公司设计的一个处理器体系架构。ARM 公司并不生产芯片,而是出售其芯片技术授权。ST 公司或其它芯片生产厂商如 TI,负责设计的是在内核之外的部件,被称为 核外外设 或 片上外设、设备外设 。如芯片内部的模数转换外设 ADC、串口 UART、定时器 TIM 等。内核与外设,如同 PC 上的 CPU 与主板、内存、显卡、硬盘的关系。因为基于 Cortex 的某系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex 微控制器 软件 的兼容性问题,ARM 与芯片厂商建立了 CMSIS 标准(Cortex MicroController Software InterfaceStandard)。

在这里插入图片描述

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

  • 内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM 公司提供。
  • 设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。

在这里插入图片描述

可见 CMSIS 层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。STM32 的库,就是按照 CMSIS 标准建立的。

二.STM32 结构及库层次关系

1.库目录,文件简介

在这篇博文中我们介绍了如何下载官方的标准库( 零死角玩转stm32初级篇3-从零创建STM32工程模板 ),这里我们以该标准库为例,对标准库进行介绍。

在这里插入图片描述

进行解压的标准库文件中,该标准库的所有文件如下:

在这里插入图片描述

对于上面的文件,在这篇博文(零死角玩转stm32初级篇3-从零创建STM32工程模板)中进行了简单介绍,如下:

在这里插入图片描述

  • Libraries 文件夹下是驱动库的源代码及启动文件

在这里插入图片描述

  • CMSIS框架下CM3的二个支持包

在这里插入图片描述

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

在这里插入图片描述

2.CMSIS

CMSIS文件夹下有多个文件,重点在于CM3这个文件,该文件下有CoreSupport和DeviceSupport这二个文件。

在这里插入图片描述

在这里插入图片描述

  • CoreSupport

源文件 core_cm3.c 和头文件 core_cm3.h 位于CM3的CoreSupport文件下,它们的作用是为那些采用Cortex-M3 核设计 SOC 的芯片商设计的芯片外设提供一个进入 M3 内核的接口(这两个文件在其它公司的 M3 系列芯片也是相同的,遵守 CMSIS 标准,软件在不同的CM3 芯片的移植工作会变得简单)。

在这里插入图片描述

core_cm3.c 文件还有一些与编译器相关条件编译语句,用于屏蔽不同编译器的差异,我们在开发时不用管这部分,有兴趣可以了解一下。里面包含了一些跟编译器相关的信息,如:RealView Compiler (RVMDK),ICC Compiler(IAR),GNU Compiler。

在这里插入图片描述

较重要的是在 core_cm3.c 文件中包含了 stdin.h 这个头文件,这是一个ANSI C 文件,是独立于处理器之外的,就像我们熟知的 C 语言头文件 stdio.h文件一样。位于 RVMDK 这个软件的安装目录下,主要作用是 提供一些新类型定义,如:

在这里插入图片描述

这些新类型定义屏蔽了在不同芯片平台时,出现的诸如 int 的大小是 16位,还是 32 位的差异。所以在我们以后的程序中,都将使用新类型如int8_t 、int16_t …在稍旧版的程序中还可能会出现如 u8 、u16 、u32 这样的类型,请尽量避免这样使用 ,在这里提出来是因为初学时如果碰到这样的旧类型让人一头雾水,而且在以新的库建立的工程中是无法追踪到 u8 、u16 、u32 这些的定义
的。

  • DeviceSupport

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

在这里插入图片描述

  • system_stm32f10x.c

system_stm32f10x.c ,是由 ST 公司提供的,遵守 CMSIS 标准。该文件的功能是设置系统时钟和总线时钟, M3 比 51 单片机复杂得多,并不是说我们外部给一个 8M 的晶振,M3 整个系统就以 8M 为时钟协调整个处理器的工作。我们还要通过 M3 核的核内寄存器来对 8M 的时钟进行倍频,分频,或者使用芯片内部的时钟。所有的外设都与时钟的频率有关,所以这个文件的时钟配置是很关键的。system_stm32f10x.c 在实现系统时钟的时候要用到 PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了 stm32f10x.h 这个头文件。

  • stm32f10x.h

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

  • startup 启动文件

在这里插入图片描述

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

在这里插入图片描述

arm文件夹下文件名的英文缩写的意义如下(进行选择的时候,要根据自己的芯片进行选择,比如我使用的STM32F103C8T6的FLASH=64K所以应该选择startup_stm32f10x_md.s):

在这里插入图片描述

启动文件是任何处理器在上点复位之后最先运行的一段汇编程序。在我们编写的 c 语言代码运行之前,需要由汇编为 c 语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要把启动文件添加进我们的的工程中去;启动文件的作用如下。

在这里插入图片描述

3.STM32F10x_StdPeriph_Driver

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

在这里插入图片描述

在 src 和 inc 文件夹里的就是 ST 公司针对每个 STM32 外设而编写的库函数文件,每个外设对应一个 .c 和 .h 后缀的文件。我们把这类外设文件统称为: stm32f10x_ppp.c 或 stm32f10x_ppp.h 文件,PPP 表示外设名称。如针对模数转换(ADC)外设,在 src 文件夹下有一个 stm32f10x_adc.c源文件,在 inc 文件夹下有一个 stm32f10x_adc.h 头文件,若我们开发的工程中用到了 STM32 内部的 ADC,则至少要把这两个文件包含到工程里。

在这里插入图片描述

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

在这里插入图片描述

4.STM32F10x_StdPeriph_Template

STM32F10x_StdPeriph_Template 目录下,存放了官方的一个库工程模板,我们在用库建立一个完整的工程时,还需要添加这个目录下的 stm32f10x_it.c 、stm32f10x_it.h 、stm32f10x_conf.h 这三个文件

在这里插入图片描述

  • stm32f10x_it.c

stm32f10x_it.c ,是专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些 系统异常 的接口,其它普通中断服务函数由我们自己添加。但是我们怎么知道这些中断服务函数的接口如何写呢?是不是可以自定义呢?答案当然不是的,这些都有可以在汇编启动文件中找到,具体的大家自个看库的启动文件的源码去吧。

  • stm32f10x_conf.h

stm32f10x_conf.h ,这个文件被包含进 stm32f10x.h 文件。是用来配置使用了什么外设的头文件,用这个头文件我们可以很方便地增加或删除上面driver 目录下的外设驱动函数库。如下面的代码配置表示使用了 gpio、rcc、spi、usart 的外设库函数,其它的注释掉的部分,表示没有用到。

在这里插入图片描述

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

5.库各文件间的关系

下图描述了 STM32 库各文件之间的调用关系,这个图省略了 DSP 核(Cortex-M3 没有 DSP 核)和实时系统层部分的文件关系。在实际的使用库开发工程的过程中,我们把位于 CMSIS 层的文件包含进工程,丝毫不用修改,也不建议修改。对于位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。

在这里插入图片描述

三.使用库帮助文档

1.常用官方资料
  • 《stm32f10x_stdperiph_lib_um.chm》

这个就是前面提到的库的帮助文档,在使用库函数时,我们最好通过查阅此文件来了解库函数原型,或库函数的 调用 的方法。也可以直接阅读源码里面的函数的函数说明。

在这里插入图片描述

  • 《STM32 参考手册.pdf 》

这个文件相当于 STM32 的 datasheet,它把 STM32 的时钟、存储器架构、及各种外设、寄存器都描述得清清楚楚。当我们对 STM32的库函数的 实现方式 感到困惑时,可查阅这个文件,以直接配置寄存器方式开发的话查阅这个文档的频率会更高。但你会累死。下载链接:https://www.stmcu.com.cn/Designresource/detail/localization_document%20/710001?auto_download=1

在这里插入图片描述

  • 《Cortex-M3 权威指南》 宋岩译

该手册详细讲解了 Cortex 内核的架构和特性,要深入了解 Cortex-M3 内核,这是首选,经典中的经典呀。百度网盘下载链接:https://pan.baidu.com/s/1hqEcfEs,内容来源于https://www.jb51.net/books/261914.html。

在这里插入图片描述

2.官网手册的使用

所谓库函数,就是 STM32 的库文件中为我们编写好的函数接口,我们只要调用这些库函数,就可以对 STM32 进行配置,达到控制目的。我们可以不知道库函数是如何实现的,但我们调用函数必须要知道 函数的功能 、 可传入的参数及其意义 、和 函数的返回值 ( 类似于Java语言的API帮助文档 ) 。

  • 打开官网手册stm32f10x_stdperiph_lib_um.chm

在这里插入图片描述

  • 层层打开文档的目录标签 Modules\STM32F10x_StdPeriph_Driver,可看到STM32F10x_StdPeriph_Driver 标签下有很多外设驱动文件的名字 MISC、ADC、BKP、CAN 等标签。我们试着查看 ADC 的 初始化库函数(ADC_Init) 看看,继续打开标签\ADC\ADC_Exported_Functions\Functions\ADC_Init 如下图所示。

在这里插入图片描述

利用这个文档,我们即使没有去看它的具体代码,也知道要怎么利用它了。如它的功能是:以 ADC_InitStruct 参数配置 ADC,进行初始化。原型为 voidADC_Init( ADC_TypeDef * ADCx , ADC_Init_TypeDef * ADC_InitStruct)其中输入的参数 ADCx 和 ADC_InitSturct 均为库文档中定义的 自定义数据 类型 ,这两个传入参数均为结构体指针。

  • ADC_TypeDef 这样的类型是什么意思,可以点击函数原型中带下划线的ADC_TypeDef 就可以查看这是什么类型了。

在这里插入图片描述

这篇关于零死角玩转stm32初级篇3-初识 STM32 库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179940

相关文章

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

docker学习系列(一)初识docker

在第一版本上线之后公司,我们决定将之前使用的开源api文档项目转移到本公司的服务器之上,之前用的是showdoc,showdoc利用的是php技术,作为java程序员表示需要快速部署php环境以及apach容器都需要时间,所以采用第二种方法,即利用docker进行快速部署(虽然学习成本也不比php少)。 一、docker简介 docker的官网是https://www.docker.com,