STM32的四种开发方式

article/2025/8/26 2:04:52

STM32的四种开发方式

首先看下ST官方给出的四种开发方式的比较

在这里插入图片描述

寄存器开发

寄存器编程对于从51等等芯片过渡过来的小伙伴并不陌生,不管你是什么库,最终操作的还是寄存器,所以对于标准库、HAL库、LL库都是在寄存器上的编程,所以可以直接在各种库中直接操作寄存器。

但寄存器开发方法到了STM32就变得不太容易行得通了,因为STM32的寄存器数量是51单片机的十数倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。但还是会有很小一部分人,喜欢去直接操作寄存器,因为这样更接近原理,知其然也知其所以然。

寄存器开发优缺点:

  1. 比其他库,直接操作寄存器来得更为直接、高效,省略了繁琐的调用和封装过程,但可移植性相对会降低一些。
  2. 同时对于芯片的熟练程度也是提出了要求,对于一款相对外设比较丰富的芯片需要花一定的时间阅读文档的等等,对开发人员有一定的门槛。
  3. 虽然开发起来相对来说比较慢一些,比较繁琐一些,但是接触的都是真正的底层内容,出了问题,我们也能从源头来快速分析解决问题,而且写的代码中省去了一些不必要的判断过程,执行效率会相对高一些,代码看起来也会清爽一些。

标准库开发

标准库全名叫标准外设库(Standard Peripheral Library),其实标准库所做的事情就是对寄存器进行了封装,形成了一套API函数供用户使用

因为STM32有非常多的寄存器,而导致了开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx…之类的。在这些 .c .h文件中,包括一些常用量的宏定义,把一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。用户不用去管寄存器到底是如何操作的,直接调用接口函数进行开发即可。

标准库在早期版本也叫固件函数库或简称固件库,不同人有不同的说法,知道这是同一个东西就行了

HAL库开发

HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(硬件抽象层)。

它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库尤其的有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。

并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。

而且使用ST公司研发的 STM32CubeMx 软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件,可以说是方便至极,但是方便的同时也造成了它执行效率的低下。

HAL库与标准库的区别:https://www.elecfans.com/d/1814945.html(文章同时也介绍了1.句柄 2.MSP函数 3.Callback函数;对HAL库结构和移植使用都有介绍)

在前面的标准库中提到过,所有的API接口都是围绕着外设寄存器基地址,而对于HAL其围绕的是Handle,即一个外设句柄。

在这里插入图片描述

UART_HandleTypeDef 结构体内容


/*** @brief  UART handle Structure definition*/
typedef struct __UART_HandleTypeDef
{USART_TypeDef                 *Instance;        /*!< UART registers base address        */UART_InitTypeDef              Init;             /*!< UART communication parameters      */uint8_t                       *pTxBuffPtr;      /*!< Pointer to UART Tx transfer Buffer */uint16_t                      TxXferSize;       /*!< UART Tx Transfer size              */__IO uint16_t                 TxXferCount;      /*!< UART Tx Transfer Counter           */uint8_t                       *pRxBuffPtr;      /*!< Pointer to UART Rx transfer Buffer */uint16_t                      RxXferSize;       /*!< UART Rx Transfer size              */__IO uint16_t                 RxXferCount;      /*!< UART Rx Transfer Counter           */DMA_HandleTypeDef             *hdmatx;          /*!< UART Tx DMA Handle parameters      */DMA_HandleTypeDef             *hdmarx;          /*!< UART Rx DMA Handle parameters      */HAL_LockTypeDef               Lock;             /*!< Locking object                     */__IO HAL_UART_StateTypeDef    gState;           /*!< UART state information related to global Handle managementand also related to Tx operations.This parameter can be a value of @ref HAL_UART_StateTypeDef */__IO HAL_UART_StateTypeDef    RxState;          /*!< UART state information related to Rx operations.This parameter can be a value of @ref HAL_UART_StateTypeDef */__IO uint32_t                 ErrorCode;        /*!< UART Error code                    */#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Tx Half Complete Callback        */void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Tx Complete Callback             */void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Rx Half Complete Callback        */void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Rx Complete Callback             */void (* ErrorCallback)(struct __UART_HandleTypeDef *huart);             /*!< UART Error Callback                   */void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Abort Complete Callback          */void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Transmit Complete Callback */void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart);  /*!< UART Abort Receive Complete Callback  */void (* WakeupCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Wakeup Callback                  */void (* MspInitCallback)(struct __UART_HandleTypeDef *huart);           /*!< UART Msp Init callback                */void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Msp DeInit callback              */
#endif  /* USE_HAL_UART_REGISTER_CALLBACKS */} UART_HandleTypeDef;
  • 从UART_HandleTypedef结构体里面的内容来看,其中不仅仅包括了UART_Typedef寄存器基地址数据结构,同时还包含通信过程的数据结构,比如缓存区指针及大小等,以及各种初始化和中断回调函数等等用户型数据。

  • 那么HAL库所实现的API不再是简单的像标准库那样封装寄存器了,而是实现了一个外设对象的数据结构封装,这样对于所有的处理只需要传入这个handle对象句柄即可对该对象进行所有操作。

HAL库每个handle句柄结构体中都会存在MSP两个回调函数指针 xxCallback

在这里插入图片描述

这算是HAL库设计不错的地方,MSP(MCU Specific Package)表示单片机的具体方案,是MCU相关的初始化处理。

在早期使用标准库学习stm32的过程中,很多小伙伴都会有这样的体会,经常性的忘记初始化引脚、初始化时钟、处理中断优先级等等错误,那么现在HAL库通过这两个回调函数在初始化过程中用来处理与当前外设功能相关性并不大的硬件配置,这样一方面起到了提醒的目的,另一方面也增强了可移植性。

  • 当然HAL库缺点也非常明显,较多的函数嵌套以及结构体索引,会导致占用更多的程序空间,并且效率上大打折扣。

  • 对于函数指针的大量使用,虽然可以带来代码的更好的扩展和复用,但是其对于MCU的RAM占用也是一笔资源。

  • 然而HAL库性能上的损失,从而让更多的项目趋向于使用高性能MCU

STM32 HAL库结构

在这里插入图片描述

LL库开发

LL库是与HAL库打包发布的一部分库文件,其也叫底层库(Low-Layer),它也是对寄存器进行了封装,与标准库其实差别并不是很大。

在这里插入图片描述

上图是LL库中的UART的相关实现,似乎函数声明部分该库中提供的API并没有标准库那么多,其实LL库中大部分API都是以static inline这样的内联函数形式进行定义的。

内联函数的优势在于不会像函数调用需要跳转到定义处等额外处理,而有点像宏定义一样直接展开并copy代码到执行位置,相对效率会提高很多,当然如果代码特别大,运行时间长,也就没有内联的必要了,所以其内联函数内部代码都相对比较短小。

如何进行选择

ST公司并没有强制要求一定要使用哪一种库来进行开发,所以对于库的选择还是要看个人需求,通过上面的这些描述,大家应该对这些库有了一个清晰的认识。

1、寄存器库算是所有库的根基,对于技术研发非常规范的公司会直接去封装寄存库,根据自己本公司的编码规范从而实现自身的一套API,这样一方面兼容已开发算法等应用库,同时有利于代码风格统一。虽然开发起来相对来说比较慢一些,比较繁琐一些,但是接触的都是真正的底层内容,出了问题,我们也能从源头来快速分析解决问题,而且写的代码中省去了一些不必要的判断过程,执行效率会相对高一些,代码看起来也会清爽一些。

2、标准库的话,用户可以直接使用,使用起来方便,快捷,开发速度快,相对起来也容易上手一点,但是对底层的寄存器操作原理了解不深,只知其一,不知其二,出了问题,解决起来比较麻烦。且官方的驱动库为了容错性高一些等原因,会引入一些判断机制,相对复杂一些,但是实际上有的东西是我们用不到的,这就会造成代码执行效率会相对低一些。

对于一些已使用标准库的老项目,如果技术到位的话,可以直接根据HAL或者LL库,进行版本上的升级和优化,从而降低产品开发风险和成本。

3、对于性能要求不高,且追求开发时效性,可以使用HAL与CubeMX工具结合开发,HAL 的结构更加容易整合 STM32CubeMx,而 STM32CubeMX 是 ST 这几年极力推荐的程序生成开发工具,bug再多应该也会得以修复。

使用 STM32CubeMx 开发,这个相比较来讲入门是最快的,不用接触那些库函数接口,也不用去理会那些寄存器操作,只要在图形化的界面上勾选一些选项就可以了,这简直是懒人必备神器,但是话说回来,这种开发方式,基本上接触单片机底层内容为0%,只要写应用程序就可以了,出了问题更难解决。如果换了个平台,没有这种方便的图形化配置工具,就有点不知所措了。

参考:

https://www.elecfans.com/d/1814945.html

https://www.freesion.com/article/11981446782/

https://zhuanlan.zhihu.com/p/385063476


http://chatgpt.dhexx.cn/article/NAbBOth1.shtml

相关文章

使用STM32固件库开发GD32 汇总

文章目录 GD32与STM32异同1. 相同点2. 外围硬件区别3. 内部结构差别4. 功耗区别(以128k以下容量的作为参考)5. 内部FLASH 区别 使用STM32库开发时钟配置区别1. 晶振起振区别描述解决方法 2. 部分客户使用有源晶振出现问题&#xff0c;在 GD32F103 小容量产品&#xff0c;发现会…

STM32开发必备知识篇:STM32的运行机制

时间飞逝&#xff0c;转眼间已经硕士毕业工作第四年了&#xff0c;嵌入式研发成长道路上曲折坎坷&#xff0c;所以这也是我今年撰写博客的初心&#xff0c;即分享技术积累和研发经验&#xff0c;目前主要分为STM32和FPGA两个专辑&#xff0c;都包括开发必备知识篇和实战项目例程…

如何评判STM32各个MCU的性能?

很多人说STM32性能太弱&#xff0c;那你了解这个性能是如何得出来的吗&#xff1f; 1写在前面 我们经常听见某手机发布会&#xff0c;安兔兔跑分多少多少&#xff0c;其实这个跑分就是体现手机性能的一个指标。 我们使用STM32开发产品&#xff0c;选择MCU时&#xff0c;一般会综…

STM32各系列MCU性能对比及测试说明

置顶/星标公众号&#xff0c;不错过每一条消息&#xff01; 很多人说STM32性能太弱&#xff0c;那你了解这个性能是如何得出来的吗&#xff1f; 1写在前面 我们经常听见某手机发布会&#xff0c;安兔兔跑分多少多少&#xff0c;其实这个跑分就是体现手机性能的一个指标。 我们使…

win xp虚拟机

做嵌入式&#xff0c;用的ADS版本太老了&#xff0c;在xp系统上更方便&#xff0c;所以昨天装了一个。 其实我是一个搬运工&#xff0c;主要参考了另一个人的步骤:点击打开链接 只是第一次让输序列号的时候跳过去了。 要镜像可以留邮箱&#xff0c;好像不能直接放在这里&…

VMware虚拟机装windows xp系统

一.准备安装所需要的软件&#xff1a; 1.VMware虚拟机的下载。 首先下载&#xff1a;VMware Workstation(虚拟机) V6.0.2 Build 59824 汉化版 2.XP的系统软件。 二.在VMware虚拟机为创建新的虚拟机 1.打开虚拟机&#xff0c;选择新建虚拟机&#xff1a; 2.下一步&#xff1a;…

Windows xp,Windows2003虚拟机部署(各2台)

文章目录 ISO镜像下载winxp部署a.安装winxp虚拟机b.优化虚拟机c.做快照 Windows 2003a.安装win2003b.优化c.快照 克隆虚拟机(以win2003为例&#xff09; ISO镜像下载 ISO镜像下载链接 例&#xff1a;下载win10的操作系统 点击操作系统&#xff0c;选择要下载的镜像&#xff0…

VirtualBox 7.0.10 (macOS, Linux, Windows) - 开源跨平台虚拟化软件

VirtualBox 7.0.10 (macOS, Linux, Windows) - 开源跨平台虚拟化软件 Oracle VM VirtualBox 7 请访问原文链接&#xff1a;https://sysin.org/blog/virtualbox-7/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2022 年 10 月…

虚拟机VMware安装XP系统错误解决办法

虚拟机给我的编程工作确实带了很多方便&#xff0c;但是虚拟机的一个最大挑战是硬件赶不上&#xff0c;速度太慢了。最近一直在致力于虚拟机上Win7专业版平台上SQL Server 2005Visual Studio 2012系统开发&#xff0c;最初还可以&#xff0c;但是越到后面速度越慢。最后决定重新…

VM虚拟机安装Windows XP Professional

文章目录 安装XP下载img镜像安装激活安装VM-Tools 参考 安装XP 下载img镜像 在MSDN安装原版系统镜像-img文件&#xff0c;地址https://msdn.itellyou.cn/ 安装激活 新建虚拟机&#xff0c;选择img镜像文件&#xff0c;开启虚拟机&#xff0c;提交注册码安装即可。 安装VM-Tool…

Win10 虚拟机安装 Windows xp(professional sp3)简记(非教学)

实验系统需使用 VB6.0&#xff0c;任务较为复杂&#xff0c;win10下的vb6.0兼容问题较大。考虑win10 虚拟机安装winxp&#xff0c;部分重点记录如下&#xff1a;&#xff08;资料源于网络&#xff09; 虚拟机采用开源的 Oracle VM VirtualBox&#xff0c;&#xff08;Vmware也可…

VirtualBox 免费高效开源虚拟机软件(在XP下装Linux在、Ubuntu下装Vista等)

说起虚拟机软件&#xff0c;相信大家都会知道VMWare和 微软的Virtual PC 了。今天异次元给大家介绍的是另外一款轻量级的虚拟机软件Virtual Box。它原本是由德国的Innotek公司开发的&#xff0c;后来被Sun收购了。不过呢&#xff0c;它从出生到现在被收购&#xff0c;还是一直保…

VirtualBox虚拟机安装Windows XP

Ubuntu&#xff1a;VirtualBox虚拟机安装Windows XP 2011-03-15 14:58:45 标签&#xff1a; ubuntu vbox Windows xp 虚拟机 文件共享 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://…

超级小的xp虚拟机

链接: https://pan.baidu.com/s/1bpxkUdh 密码: 9d5b 只有200cm,启动超快&#xff0c;运行流畅。系统来自www.sdeepin.org 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇…

推荐两个好用的虚拟机、SSH 终端开源工具(Virtual Box、WindTerm)

笔者最近因一些变故&#xff0c;加上阳了&#xff0c;停更了一段时间&#xff0c;并提前回老家过年了。因并没有带笔记本电脑回去&#xff0c;故在折腾了一番老家电脑后&#xff0c;选择拥抱开源&#xff0c;使用一些开源的工具&#xff0c;而非习惯的 VMware Workstation 和 S…

Python 异步编程之——线程

上一篇我们讲到&#xff0c;进程是一个相对独立的单元。而线程则是一个进程内单一顺序的控制流&#xff0c;是操作系统运行调度的最小单元。因此&#xff0c;一个进程可以包含多个线程。比如&#xff0c;播放视频时&#xff0c;画面和声音就是不同的线程在处理。 1.创建线程 &…

深入理解Python异步编程

文章转载自&#xff1a; 驹说码事&#xff0c;内容有部分修改&#xff0c;仅用作学习&#xff0c;如有侵权&#xff0c;请联系删除。 很多朋友对异步编程都处于“听说很强大”的认知状态。鲜有在生产项目中使用它。而使用它的同学&#xff0c;则大多数都停留在知道如何使用 Tor…

Python异步编程Future对象详解

今天继续给大家介绍Python相关知识&#xff0c;本文主要内容是Python异步编程Future对象详解。 一、Python Future对象简介 在上文Python Task对象详解中&#xff0c;我们介绍到了Task对象&#xff0c;而Future对象是Task对象的基类&#xff0c;比Task更加底层。一个Future是…

Python异步编程之concurrent.futures中的Future对象详解

今天继续给大家介绍Python相关知识&#xff0c;本文主要内容是Python异步编程之concurrent的future对象详解。 一、concurrent.futures中Future对象简介 在前文Python异步编程Future对象详解种&#xff0c;我们介绍了asyncio中的Future对象。然而&#xff0c;在Python中&…

python网络编程实战_Python 异步网络编程实战

近年来 Python 的发展的非常迅速&#xff0c;“简单”、“高效”是 Python 吸引人的一大特色。在国内 Python 开发需求越来越大&#xff0c;Python 具有丰富强大的库&#xff0c;现在各个领域都在广泛使用&#xff0c;从 Web 开发&#xff0c;到运维开发&#xff0c;到机器学习…