侵权投诉

全网最全STM32 HAL的知识总结

嵌入式ARM 2021-06-28 17:54 次阅读

ST 为开发者提供了非常方便的开发库:有标准外设库(SPL库)、HAL 库(Hardware Abstraction Layer,硬件抽象层库)、LL 库(Low-Layer,底层库)三种。前者是ST的老库已经停更了,后两者是ST现在主推的开发库。

相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,ST新出的芯片已经没有STD库了,比如F7系列。目前,HAL库已经支持STM32全线产品。

通过文字描述可以知道HAL库的几个点:1.最大可移植性。2.提供了一整套一致的中间件组件,如RTOSUSB,TCP / IP和图形等。3.通用的用户友好的API函数接口。4.ST新出的芯片已经没有标准库。5.HAL库已经支持STM32全线产品。

网友认为,“HAL我觉得是极好的,就是SPI接收时速度实在太慢,不用DMA的话,吃不消。“

通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。网上关于标准库、HAL库的描述相信是数不胜数。

可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的地方或者是不同意见的也可以大家提出。

01、直接配置寄存器

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

02、标准库

上面也提到了,STM32有非常多的寄存器,而导致了开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx…之类的。在这些 .c .h文件中,包括一些常用量的宏定义,把一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。也是目前最多人使用的方式,也是学习STM32接触最多的一种开发方式,我也就不多阐述了。

03、HAL库

HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。库如其名,很抽象,一眼看上去不太容易知道他的作用是什么。它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库尤其的有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。

也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有。

例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。是而且使用ST公司研发的STMcube软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件,可以说是方便至极,但是方便的同时也造成了它执行效率的低下,在各种论坛帖子真的是被吐槽的数不胜数。

HAL库和标准固件库区别

STM32的开发中,我们可以操作寄存器:

GPIOF-》BSRR=0x00000001;//这里是针对STM32F1系列

这种方法当然可以,但是这种方法的劣势是你需要去掌握每个寄存器的用法,你才能正确使用STM32,而对于STM32这种级别的MCU,数百个寄存器记起来又是谈何容易。于是ST(意法半导体)推出了官方标准固件库,标准固件库将这些寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用,大多数场合下,你不需要去知道操作的是哪个寄存器,你只需要知道调用哪些函数即可。

比如上面的控制 BRR 寄存器实现电平控制,官方库封装了一个函数:

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){GPIOx-》BRR= GPIO_Pin;}

这个时候你不需要再直接去操作 BRR 寄存器了,你只需要知道怎么使用 GPIO_ResetBits()这个函数就可以了。在你对外设的工作原理有一定的了解之后,你再去看标准库函数,基本上函数名字能告诉你这个函数的功能是什么,该怎么使用,这样开发就方便很多。

标准固件库自推出以来受到广大工程师推崇,现在很多工程师和公司还在使用标准库函数开发。不过,ST官方已经不再更新STM32标准固件库,而是力推新的固件库:HAL库。

比如上面的控制BSRRL 寄存器实现电平控制,官方 HAL 库封装了一个函数:

voidHAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,GPIO_PinStatePinState){assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if(PinState!= GPIO_PIN_RESET){GPIOx-》BSRR= GPIO_Pin;}else{GPIOx-》BSRR= (uint32_t)GPIO_Pin 《《 16;}}

这个时候你不需要再直接去操作BSRRL 寄存器了,你只需要知道怎么使用HAL_GPIO_WritePin这个函数就可以了。

标准固件库和HAL库一样都是固件库函数,由ST官方硬件抽象层而设计的软件函数包,由程序、数据结构和宏组成,包括了STM32所有外设的性能特征。 这些固件库为开发者底层硬件提供了中间API,通过使用固件库,无需掌握底层细节,开发者就可以轻松应用每一个外设。

HAL 库和标准库本质上是一样的,都是提供底层硬件操作 API,而且在使用上也是大同小异。有过标准库基础的同学对 HAL 库的使用也很容易入手。ST 官方之所以这几年大力推广 HAL 库,是因为 HAL 的结构更加容易整合 STM32Cube,而 STM32CubeMX 是 ST 这几年极力推荐的程序生成开发工具。所以这几年新出的 STM32 芯片,ST 直接只提供 HAL 库。

在ST的官方声明中,HAL库是大势所趋。ST最新开发的芯片中,只有HAL库没有标准库。标准库和HAL库虽然都是对外设进行操作的函数,但由于标准库官方已经停止更新,而且标准库在STM32创建工程和初始化时,不能由CubMX软件代码生成使用,也就是说CubMX软件在生产代码时。

工程项目和初始化代码就自动生成,这个工程项目和初始化代码里面使用的库都是基于HAL库的。STM32CubeMX是一个图形化的工具,也是配置和初始化C代码生成器 ,与STM32CubeMX配合使用的是HAL库(硬件抽象层软件库)。

基本配置

工程创建

通过内核芯片的选择,创建相应的工程文件。

对时钟系统进行配置,对引脚及基本功能进行配置。

配置时钟系统我们首要思考的是:我们需要怎样的时钟系统,而不是如何配置时钟系统。

配置SWD程序烧录接口,使用ST-Link进行烧录下载。

工程管理设置推荐图中所示配置,实现更快编译和更简洁的文件系统。

点击“GENERATE CODE”生成Keil工程文件

如果你已经安装了编译环境MDK了,可点击直接打开工程。

GPIO使用

开发环境搭建好以后,可以依开始STM32的开发,下面是使用GPIO的例程,让LED灯每隔400ms闪烁一次

打开STM32CubeMX新建工程,选择STM32F103ZET6芯片。选择外部高速晶振(HSE)。

根据下位机主控引脚分配图及原理图,选择LED引脚

PD7为LED1输出控制管脚,选择GPIO_OUTPUT模式。

点击Clock Configuration配置系统时钟为72M最高速度。

点击Configuration-》GPIO配置管脚。LED管脚配置为低速推挽输出模式,既不上拉也不下拉(即默认的模式不用配置)。

点击生成报告,软件会提示新建工程,输入工程名,选择工程保存路径。IDE选择MDK-ARM V5。

在Code Generator中找到Generated files框,勾选Generated periphera initialization as a pair of ‘.c/.h’files per IP。外设初始化为独立的C文件和头文件。

点击生成代码。点击Open Project打开工程。到这里我们就配置好工程外设初始化。

点击Build按钮,然后等一会,Build Optput信息框会输出没有错误没有警告。在main函数里添加如下代码

延时电平翻转函数,这样LED灯就能开始闪烁。

再点击Build按钮,然后等一会,Build Optput信息框会输出没有错误没有警告。代码烧写。

现在开始烧写程序,烧写程序有两种,一种是使用ST-LINK工具烧写,一种是直接用与上位机通讯的串口1烧写。烧写工具使用mcuisp。

软件可自行网上搜索,下载配置如下。

选择好串口端口后,可以开始下载。

HAL库固件库安装与用户手册

1.首先设置让Cube可以自动联网下载相关固件库选择updater Settings

2.根据芯片选择所需固件版本是向下兼容的,可以直接选择最新版。但如果觉得最新版太大,可以阅读下面的Main Changes.能够支持你目前的芯片就好。

选好了,点击Install Now就行,过程可能有点长。建议直接官网下载到本地,再安装

文件会被下载到如下位置,建议更改此目录,不要选在C盘!!!

查找帮助手册

3.寻找用户帮助手册进入固件所在文件夹,里面包含很多内容。

比如说 官方提供的开发板程序

每个型号下面都有对应功能的实现

用户手册就在Drivers文件夹下面。

STM32 HAL库与标准库的区别——浅谈句柄、MSP函数、Callback函数

01句柄

句柄(handle),有多种意义,其中第一种是指程序设计,第二种是指Windows编程。现在大部分都是指程序设计/程序开发这类。

· 第一种解释:句柄是一种特殊的智能指针。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。· 第二种解释:整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例。

STM32的标准库中,句柄是一种特殊的指针,通常指向结构体!

在STM32的标准库中,假设我们要初始化一个外设(这里以USART为例),我们首先要初始化他们的各个寄存器。在标准库中,这些操作都是利用固件库结构体变量+固件库Init函数实现的:

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式

USART_Init(USART3, &USART_InitStructure); //初始化串口1

可以看到,要初始化一个串口,需要:

· 1、对六个位置进行赋值,

· 2、然后引用Init函数,

USART_InitStructure并不是一个全局结构体变量,而是只在函数内部的局部变量,初始化完成之后,USART_InitStructure就失去了作用。

而在HAL库中,同样是USART初始化结构体变量,我们要定义为全局变量。

UART_HandleTypeDef UART1_Handler;

typedef struct{ 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 */ uint16_t TxXferCount; /*!《 UART Tx Transfer Counter */ uint8_t *pRxBuffPtr; /*!《 Pointer to UART Rx transfer Buffer */ uint16_t RxXferSize; /*!《 UART Rx Transfer size */ 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 State; /*!《 UART communication state */ __IO uint32_t ErrorCode; /*!《 UART Error code */}UART_HandleTypeDef;

我们发现,与标准库不同的是,该成员不仅:

· 1、包含了之前标准库就有的六个成员(波特率,数据格式等),· 2、还包含过采样、(发送或接收的)数据缓存、数据指针、串口 DMA 相关的变量、各种标志位等等要在整个项目流程中都要设置的各个成员。该UART1_Handler就被称为串口的句柄,它被贯穿整个USART收发的流程,比如开启中断:

HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);

比如后面要讲到的MSP与Callback回调函数:

void HAL_UART_MspInit(UART_HandleTypeDef *huart);void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

在这些函数中,只需要调用初始化时定义的句柄UART1_Handler就好。

02MSP函数

MSP: MCU Specific Package 单片机的具体方案

MSP是指和MCU相关的初始化,引用一下正点原子的解释,个人觉得说的很明白:我们要初始化一个串口,首先要设置和 MCU 无关的东西,例如波特率,奇偶校验,停止位等,这些参数设置和 MCU 没有任何关系,可以使用 STM32F1,也可以是 STM32F2/F3/F4/F7上的串口。而一个串口设备它需要一个 MCU 来承载,例如用 STM32F4 来做承载,PA9 做为发送,PA10 做为接收,MSP 就是要初始化 STM32F4 的 PA9,PA10,配置这两个引脚。所以 HAL驱动方式的初始化流程就是:

HAL_USART_Init()—》HAL_USART_MspInit() ,先初始化与 MCU无关的串口协议,再初始化与 MCU 相关的串口引脚。

在 STM32 的 HAL 驱动中HAL_PPP_MspInit()作为回调,HAL_PPP_Init()函数所调用。当我们需要移植程序到 STM32F1平台的时候,我们只需要修改 HAL_PPP_MspInit 函数内容而不需要修改 HAL_PPP_Init 入口参数内容。在HAL库中,几乎每初始化一个外设就需要设置该外设与单片机之间的联系,比如IO口,是否复用等等,可见,HAL库相对于标准库多了MSP函数之后,移植性非常强,但与此同时却增加了代码量和代码的嵌套层级。可以说各有利弊。

同样,MSP函数又可以配合句柄,达到非常强的移植性:

void HAL_UART_MspInit(UART_HandleTypeDef *huart);

入口参数仅仅需要一个串口句柄,这样就能看出句柄的方便。

03Callback函数

类似于MSP函数,个人认为Callback函数主要帮助用户应用层的代码编写。

还是以USART为例,在标准库中,串口中断了以后,我们要先在中断中判断是否是接收中断,然后读出数据,顺便清除中断标志位,然后再是对数据的处理,这样如果我们在一个中断函数中写这么多代码,就会显得很混乱:

void USART3_IRQHandler(void) //串口1中断服务程序{u8 Res;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART3);//读取接收到的数据/*数据处理区*/} }}

而在HAL库中,进入串口中断后,直接由HAL库中断函数进行托管:

void USART1_IRQHandler(void) {HAL_UART_IRQHandler(&UART1_Handler);//调用HAL库中断处理公用函数/***************省略无关代码****************/}

HAL_UART_IRQHandler这个函数完成了判断是哪个中断(接收?发送?或者其他?),然后读出数据,保存至缓存区,顺便清除中断标志位等等操作。比如我提前设置了,串口每接收五个字节,我就要对这五个字节进行处理。在一开始我定义了一个串口接收缓存区:

/*HAL库使用的串口接收缓冲,处理逻辑由HAL库控制,接收完这个数组就会调用HAL_UART_RxCpltCallback进行处理这个数组*//*RXBUFFERSIZE=5*/u8 aRxBuffer[RXBUFFERSIZE];

在初始化中,我在句柄里设置好了缓存区的地址,缓存大小(五个字节)

/*该代码在HAL_UART_Receive_IT函数中,初始化时会引用*/huart-》pRxBuffPtr = pData;//aRxBuffer huart-》RxXferSize = Size;//RXBUFFERSIZE huart-》RxXferCount = Size;//RXBUFFERSIZE

则在接收数据中,每接收完五个字节,HAL_UART_IRQHandler才会执行一次Callback函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

在这个Callback回调函数中,我们只需要对这接收到的五个字节(保存在aRxBuffer[]中)进行处理就好了,完全不用再去手动清除标志位等操作。所以说Callback函数是一个应用层代码的函数,我们在一开始只设置句柄里面的各个参数,然后就等着HAL库把自己安排好的代码送到手中就可以了~

综上,就是HAL库的三个与标准库不同的地方之个人见解。个人觉得从这三个小点就可以看出HAL库的可移植性之强大,并且用户可以完全不去理会底层各个寄存器的操作,代码也更有逻辑性。但与此带来的是复杂的代码量,极慢的编译速度,略微低下的效率。看怎么取舍了。

04STM32 HAL库结构

说到STM32的HAL库,就不得不提STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间。STM32CubeMX就是以HAL库为基础的,且目前仅支持HAL库及LL库!首先看一下,官方给出的HAL库的包含结构:

· 4.1 stm32f4xx.h主要包含STM32同系列芯片的不同具体型号的定义,是否使用HAL库等的定义,接着,其会根据定义的芯片信号包含具体的芯片型号的头文件:

#if defined(STM32F405xx) #include “stm32f405xx.h”#elif defined(STM32F415xx) #include “stm32f415xx.h”#elif defined(STM32F407xx) #include “stm32f407xx.h”#elif defined(STM32F417xx) #include “stm32f417xx.h”#else #error “Please select first the target STM32F4xx device used in your application (in stm32f2xx.h file)”#endif

紧接着,其会包含stm32f4xx_hal.h。

· 4.2 stm32f4xx_hal.h:stm32f4xx_hal.c/h 主要实现HAL库的初始化、系统滴答相关函数、及CPU的调试模式配置

· 4.3 stm32f4xx_hal_conf.h:该文件是一个用户级别的配置文件,用来实现对HAL库的裁剪,其位于用户文件目录,不要放在库目录中。

接下来对于HAL库的源码文件进行一下说明,HAL库文件名均以stm32f4xx_hal开头,后面加上_外设或者模块名(如:stm32f4xx_hal_adc.c):

· 4.4 库文件

stm32f4xx_hal_ppp.c/.h // 主要的外设或者模块的驱动源文件,包含了该外设的通用API

stm32f4xx_hal_ppp_ex.c/.h // 外围设备或模块驱动程序的扩展文件。这组文件中包含特定型号或者系列的芯片的特殊API。以及如果该特定的芯片内部有不同的实现方式,则该文件中的特殊API将覆盖_ppp中的通用API

stm32f4xx_hal.c/.h // 此文件用于HAL初始化,并且包含DBGMCU、重映射和基于systick的时间延迟等相关的API

· 4.5 其他库文件

用户级别文件:

stm32f4xx_hal_msp_template.c // 只有.c没有.h。它包含用户应用程序中使用的外设的MSP初始化和反初始化(主程序和回调函数)。使用者复制到自己目录下使用模板。

stm32f4xx_hal_conf_template.h // 用户级别的库配置文件模板。使用者复制到自己目录下使用

system_stm32f4xx.c // 此文件主要包含SystemInit()函数,该函数在刚复位及跳到main之前的启动过程中被调用。 它不在启动时配置系统时钟(与标准库相反)。 时钟的配置在用户文件中使用HAL API来完成。

startup_stm32f4xx.s // 芯片启动文件,主要包含堆栈定义,终端向量表等stm32f4xx_it.c/.h // 中断处理函数的相关实现

· 4.6 main.c/.h //

根据HAL库的命名规则,其API可以分为以下三大类:

· 初始化/反初始化函数:HAL_PPP_Init(), HAL_PPP_DeInit()

· IO 操作函数:HAL_PPP_Read(), HAL_PPP_Write(),HAL_PPP_Transmit(), HAL_PPP_Receive()

· 控制函数:HAL_PPP_Set (), HAL_PPP_Get ()。

· 状态和错误: ** HAL_PPP_GetState (), HAL_PPP_GetError ()。

注意:目前LL库是和HAL库捆绑发布的,所以在HAL库源码中,还有一些名为 stm32f2xx_ll_ppp的源码文件,这些文件就是新增的LL库文件。

使用CubeMX生产项目时,可以选择LL库 

HAL库最大的特点就是对底层进行了抽象。在此结构下,用户代码的处理主要分为三部分:

· 处理外设句柄(实现用户功能)

· 处理MSP

· 处理各种回调函数

相关知识如下:

· (1) 外设句柄定义  用户代码的第一大部分:对于外设句柄的处理。HAL库在结构上,对每个外设抽象成了一个称为ppp_HandleTypeDef的结构体,其中ppp就是每个外设的名字。*所有的函数都是工作在ppp_HandleTypeDef指针之下。  

1. 多实例支持:每个外设/模块实例都有自己的句柄。因此,实例资源是独立的 

2. 外围进程相互通信:该句柄用于管理进程例程之间的共享数据资源。下面,以ADC为例

/** * @brief ADC handle Structure definition */ typedef struct{ ADC_TypeDef *Instance; /*!《 Register base address */ ADC_InitTypeDef Init; /*!《 ADC required parameters */ __IO uint32_t NbrOfCurrentConversionRank; /*!《 ADC number of current conversion rank */ DMA_HandleTypeDef *DMA_Handle; /*!《 Pointer DMA Handler */ HAL_LockTypeDef Lock; /*!《 ADC locking object */ __IO uint32_t State; /*!《 ADC communication state */ __IO uint32_t ErrorCode; /*!《 ADC Error code */}ADC_HandleTypeDef;

从上面的定义可以看出,ADC_HandleTypeDef中包含了ADC可能出现的所有定义,对于用户想要使用ADC只要定义一个ADC_HandleTypeDef的变量,给每个变量赋好值,对应的外设就抽象完了。接下来就是具体使用了。  当然,对于那些共享型外设或者说系统外设来说,他们不需要进行以上这样的抽象,这些部分与原来的标准外设库函数基本一样。

例如以下外设:- GPIO - SYSTICK  - NVIC  - RCC  - FLASH以GPIO为例,对于HAL_GPIO_Init() 函数,其只需要GPIO 地址以及其初始化参数即可。

· (2) 三种编程方式  HAL库对所有的函数模型也进行了统一。在HAL库中,支持三种编程模式:轮询模式、中断模式、DMA模式(如果外设支持)。其分别对应如下三种类型的函数(以ADC为例):

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);

HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);

其中,带_IT的表示工作在中断模式下;带_DMA的工作在DMA模式下(注意:DMA模式下也是开中断的);什么都没带的就是轮询模式(没有开启中断的)。至于使用者使用何种方式,就看自己的选择了。  此外,新的HAL库架构下统一采用宏的形式对各种中断等进行配置(原来标准外设库一般都是各种函数)。针对每种外设主要由以下宏:

__HAL_PPP_ENABLE_IT(HANDLE, INTERRUPT): 使能一个指定的外设中断__HAL_PPP_DISABLE_IT(HANDLE, INTERRUPT):失能一个指定的外设中断__HAL_PPP_GET_IT (HANDLE, __ INTERRUPT __):获得一个指定的外设中断状态__HAL_PPP_CLEAR_IT (HANDLE, __ INTERRUPT __):清除一个指定的外设的中断状态__HAL_PPP_GET_FLAG (HANDLE, FLAG):获取一个指定的外设的标志状态__HAL_PPP_CLEAR_FLAG (HANDLE, FLAG):清除一个指定的外设的标志状态__HAL_PPP_ENABLE(HANDLE) :使能外设__HAL_PPP_DISABLE(HANDLE) :失能外设__HAL_PPP_XXXX (HANDLE, PARAM) :指定外设的宏定义_HAL_PPP_GET IT_SOURCE (HANDLE, __ INTERRUPT __):检查中断源

· (3)三大回调函数  在HAL库的源码中,到处可见一些以__weak开头的函数,而且这些函数,有些已经被实现了,比如:

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority){ /*Configure the SysTick to have interrupt in 1ms time basis*/ HAL_SYSTICK_Config(SystemCoreClock/1000U); /*Configure the SysTick IRQ priority */ HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U); /* Return function status */ return HAL_OK;}

有些则没有被实现,例如:

__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi){ /* Prevent unused argument(s) compilation warning */ UNUSED(hspi); /* NOTE : This function should not be modified, when the callback is needed,the HAL_SPI_TxCpltCallback should be implemented in the user file */}

所有带有__weak关键字的函数表示,就可以由用户自己来实现。如果出现了同名函数,且不带__weak关键字,那么连接器就会采用外部实现的同名函数。通常来说,HAL库负责整个处理和MCU外设的处理逻辑,并将必要部分以回调函数的形式给出到用户,用户只需要在对应的回调函数中做修改即可。HAL库包含如下三种用户级别回调函数(PPP为外设名):

1. 外设系统级初始化/解除初始化回调函数(用户代码的第二大部分:对于MSP的处理):HAL_PPP_MspInit()和 HAL_PPP_MspDeInit** 例如:__weak voidHAL_SPI_MspInit(SPI_HandleTypeDef *hspi)。在HAL_PPP_Init() 函数中被调用,用来初始化底层相关的设备(GPIOs, clock, DMA, interrupt)

2.处理完成回调函数:HAL_PPP_ProcessCpltCallback*(Process指具体某种处理,如UART的Tx),例如:__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)。当外设或者DMA工作完成后时,触发中断,该回调函数会在外设中断处理函数或者DMA的中断处理函数中被调用

3.错误处理回调函数:HAL_PPP_ErrorCallback例如:__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)**。当外设或者DMA出现错误时,触发终端,该回调函数会在外设中断处理函数或者DMA的中断处理函数中被调用

绝大多数用户代码均在以上三大回调函数中实现。

HAL库结构中,在每次初始化前(尤其是在多次调用初始化前),先调用对应的反初始化(DeInit)函数是非常有必要的。某些外设多次初始化时不调用返回会导致初始化失败。完成回调函数有多种,例如串口的完成回调函数有HAL_UART_TxCpltCallback 和 HAL_UART_TxHalfCpltCallback等(用户代码的第三大部分:对于上面第二点和第三点的各种回调函数的处理)在实际使用中,发现HAL仍有不少问题,例如在使用USB时,其库配置存在问题

05HAL库移植使用

基本步骤

1.复制stm32f2xx_hal_msp_template.c,参照该模板,依次实现用到的外设的HAL_PPP_MspInit()和 HAL_PPP_MspDeInit。

2.复制stm32f2xx_hal_conf_template.h,用户可以在此文件中自由裁剪,配置HAL库。

3.在使用HAL库时,必须先调用函数:HAL_StatusTypeDef HAL_Init(void)(该函数在stm32f2xx_hal.c中定义,也就意味着第一点中,必须首先实现HAL_MspInit(void)和HAL_MspDeInit(void))

4.HAL库与STD库不同,HAL库使用RCC中的函数来配置系统时钟,用户需要单独写时钟配置函数(STD库默认在system_stm32f2xx.c中)

5.关于中断,HAL提供了中断处理函数,只需要调用HAL提供的中断处理函数。用户自己的代码,不建议先写到中断中,而应该写到HAL提供的回调函数中。

6.对于每一个外设,HAL都提供了回调函数,回调函数用来实现用户自己的代码。整个调用结构由HAL库自己完成。例如:Uart中,HAL提供了void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);函数,用户只需要触发中断后,用户只需要调用该函数即可,同时,自己的代码写在对应的回调函数中即可!如下:

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);

使用了哪种就用哪个回调函数即可!

基本结构 综上所述,使用HAL库编写程序(针对某个外设)的基本结构(以串口为例)如下:

1.配置外设句柄 例如,建立UartConfig.c,在其中定义串口句柄 UART_HandleTypeDef huart;,接着使用初始化句柄(HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef huart))

2.编写Msp 例如,建立UartMsp.c,在其中实现void HAL_UART_MspInit(UART_HandleTypeDef huart) 和 void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)

3.实现对应的回调函数 例如,建立UartCallBack.c,在其中实现上文所说明的三大回调函数中的完成回调函数和错误回调函数

编辑:jq

原文标题:STM32 HAL的超全知识总结

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

STM32的ADC代码例程

STM32的ADC代码例程(普德新星电源技术有限公司怎么样)- STM32的ADC代码例程,有5个例....
发表于 09-23 09:53 2次 阅读
STM32的ADC代码例程

STM32之独立看门狗概述

stm32独立看门狗的喂狗是什么意思? stm32独立看门狗的示例程序是怎样的? ...
发表于 09-23 09:35 0次 阅读

STM32电机的PID参数整定

如何去实现STM32电机的PID参数整定? 如何去编写STM32电机的PID参数整定的代码? ...
发表于 09-23 08:07 0次 阅读

新手要如何去学习STM32呢

新手要如何去学习STM32呢? 学习STM32的目的是什么? ...
发表于 09-23 07:56 0次 阅读

独立看门狗与窗口看门狗两者之间有何不同

独立看门狗与窗口看门狗两者之间有何不同? 独立看门狗与窗口看门狗分别有几个函数? ...
发表于 09-23 07:46 0次 阅读

基于CubeIDE独立看门狗的开发笔记

怎样去开发一种基于CubeIDE的独立看门狗? 在基于CubeIDE的独立看门狗对应位置加入喂狗函数会怎样? ...
发表于 09-23 07:42 0次 阅读

如何设计出一个利用PPM控制无人机动作的四轴无人机?

如何设计出一个利用PPM控制无人机动作的四轴无人机?...
发表于 09-23 06:47 0次 阅读

如何在在RISCV中使用DSP指令

1.概述 DSP有相关的专业芯片,能够专门实现计算功能,相比于通用处理器,DSP芯片专门用于计算,可....
的头像 嵌入式IoT 发表于 09-22 14:28 738次 阅读

浅析离散时间信号与系统

理论必须结合实际!因此在2018年就有了第六部分的讲解,目的就是让同学们看到学到的理论知识怎么在计算....
的头像 通信工程师专辑 发表于 09-22 11:30 211次 阅读
浅析离散时间信号与系统

51单片机的启动代码究竟里面写了什么

在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:   keil创建新项目时,....
的头像 strongerHuang 发表于 09-22 10:15 116次 阅读
51单片机的启动代码究竟里面写了什么

【视频】 stm32 uart硬件实现及深入探讨4

大家上午好!   今天来为大家深入讲解STM32 uart,视频为一个系列,请持续关注,会持续进行更新!有问题留言交流...
发表于 09-22 09:24 0次 阅读

YC8000-CP转以太网模块有何功能

YC8000-CP转以太网模块是什么? YC8000-CP转以太网模块有何功能? ...
发表于 09-22 09:11 0次 阅读

如何去C++实现接口呢

接口分为哪几种?分别有什么作用? 如何去C++实现接口呢?...
发表于 09-22 08:49 0次 阅读

怎样通过使用库函数的方法启用窗口看门狗

为什么需要看门狗? 独立看门狗与窗口看门狗的区别在哪? 怎样去启动STM32的独立看门狗? 怎样通过使用库函数的方法启用窗...
发表于 09-22 06:55 0次 阅读

stm32用什么软件写程序

stm32用什么软件写程序?STM32单片机在编程时可以使用库函数和使用配置寄存器的方式来进行程序的....
发表于 09-21 16:00 175次 阅读

stm32烧录的程序为什么会丢失呢

你要弄清楚自己的在线烧录是通过什么方法烧录的,只有先搞明白这个问题,你才好对症下药。
的头像 工程师邓生 发表于 09-20 17:06 64次 阅读

介绍3种方法跨时钟域处理方法

跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者....
的头像 FPGA设计论坛 发表于 09-18 11:33 1199次 阅读
介绍3种方法跨时钟域处理方法

Jlink在MDK下使用J-link_J-trace模式开发STM32的说明

Jlink在MDK下使用J-link_J-trace模式开发STM32的说明(开关电源技术教程张占松....
发表于 09-18 10:35 16次 阅读
Jlink在MDK下使用J-link_J-trace模式开发STM32的说明

基于STM32的无刷直流电机矢量控制系统设计.pdf

基于STM32的无刷直流电机矢量控制系统设计.pdf(肇庆理士电源技术有限公司)-基于STM32的无....
发表于 09-17 14:39 24次 阅读
基于STM32的无刷直流电机矢量控制系统设计.pdf

STM32库开发实战指南-M4:30-ADC—电压采集

STM32库开发实战指南-M4:30-ADC—电压采集(村田电源技术(上海有限公司 (研发中心)-下....
发表于 09-17 10:18 18次 阅读
STM32库开发实战指南-M4:30-ADC—电压采集

STM32Trust的12项安全功能

导语:STM32Trust是一项关注设备安全性的多级综合策略,将安全知识、工具和ST原厂开箱可用软件....
的头像 STM32单片机 发表于 09-17 09:52 73次 阅读

基于STM32单片机智能电表无线WIFI插座APP交流电压电流检测设计

基于STM32单片机智能电表无线WIFI插座APP交流电压电流检测设计(现代电源技术实训报告)-代码....
发表于 09-16 13:53 18次 阅读
基于STM32单片机智能电表无线WIFI插座APP交流电压电流检测设计

盘点主流步进电机主控芯片​内核硬,性能高

电子发烧友网报道(文/李宁远)说到电机主控芯片,市面上国内国外对应的产品都非常多,很难用好或者不好来....
的头像 电子发烧友网 发表于 09-16 10:38 166次 阅读
盘点主流步进电机主控芯片​内核硬,性能高

ADI公司发布集成精密库仑计数器的纳安级功耗原电池SoH监控器

ADI今天推出集成精密库仑计数器的纳安级功耗原电池(不可充电)健康状态(SoH)监控器LTC3337....
发表于 09-16 10:34 794次 阅读
ADI公司发布集成精密库仑计数器的纳安级功耗原电池SoH监控器

C语言中struct的用法有哪些

定义结构体变量       下面举一个例子来说明怎样定义结构体变量。                ....
的头像 STM32嵌入式开发 发表于 09-15 09:41 819次 阅读

STM32G0简易示波器与信号发生器项目

写在前面 今年寒假我完成了硬禾学堂的STM32G0简易示波器与信号发生器项目(网址:https://....
的头像 电子森林 发表于 09-14 09:47 149次 阅读
STM32G0简易示波器与信号发生器项目

博世ESP芯片黑市交易遭曝光:原价13元,要价4000元

时下,汽车缺芯已经不是什么热门话题,网络上到处充斥着因为缺芯导致车厂产能受影响,甚至是关停产线的新闻....
的头像 Felix分析 发表于 09-14 09:07 1228次 阅读
博世ESP芯片黑市交易遭曝光:原价13元,要价4000元

增量式PID算法的STM32实现 分析比例、积分、微分三个环节

虽然PID不是什么牛逼的东西,但是真心希望以后刚刚接触这块的人能尽快进入状态。特地分享一些自己如何实....
发表于 09-13 16:37 708次 阅读
增量式PID算法的STM32实现 分析比例、积分、微分三个环节

STM32系列单片机芯片UM1718用户手册

STM32系列单片机芯片UM1718用户手册
发表于 09-12 10:09 46次 阅读

如何使用STM32G431芯片做DAC应用

有人使用STM32G431芯片做DAC应用,具体来说就是通过DMA将数据从指定内存传送给DAC数据寄....
的头像 茶话MCU 发表于 09-12 10:08 342次 阅读

C++基础语法友元类和友元函数

本期是C++基础语法分享的第五节,今天给大家来分享一下: (1)explicit(显式)关键字; (....
的头像 C语言编程学习基地 发表于 09-12 09:52 204次 阅读

STM32开发板中如何点亮一个LCD

网络上配套STM32开发板有很多LCD例程,主要是TFT LCD跟OLED的。从这些例程,大家都能学....
的头像 嵌入式ARM 发表于 09-12 09:39 311次 阅读

基于STM32+LoRa的点对点通信源代码

基于STM32+LoRa的点对点通信源代码
发表于 09-09 10:56 30次 阅读

LoRa Kit系列之STM32L151+LoRa开发板

LoRa Kit系列之STM32L151+LoRa开发板
发表于 09-09 10:54 26次 阅读

在STM32G4片内不同存储空间运行的速度差异

最近有人问起程序在STM32G4片内不同存储空间运行的速度差异。说实在的,这个很难说死或说出个绝对的....
的头像 茶话MCU 发表于 09-09 09:57 249次 阅读
在STM32G4片内不同存储空间运行的速度差异

C++基础语法之inline 内联函数

上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下....
的头像 C语言编程学习基地 发表于 09-09 09:38 164次 阅读

如何使用C++语法中的volatile

volatile volatile int i = 10; volatile 关键字是一种类型修饰符....
的头像 C语言编程学习基地 发表于 09-09 09:38 230次 阅读

C++语法中的inline内联函数详解

上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下....
的头像 C语言编程学习基地 发表于 09-09 09:33 1067次 阅读

Kitronik ARCADE游戏手柄实现连连看

连连看相信大家都玩过,但这个用Kitronik AR CADE游戏手柄来玩连连看的项目你相信是一个高....
的头像 电子森林 发表于 09-08 11:47 239次 阅读
Kitronik ARCADE游戏手柄实现连连看

函数信号发生器的功能及优势

函数信号发生器是一种信号发生装置,能产生某些特定的周期性时间函数波形 ( 正弦波、方波、三角波、锯齿....
发表于 09-08 11:35 121次 阅读

ST 和Exagan开启GaN发展新篇章

工程师想要说服管理者采用GaN,就必须证明GaN的价值主张。理论参数固然重要,但决策者更看重现实价值....
发表于 09-07 11:52 232次 阅读
ST 和Exagan开启GaN发展新篇章

Spark SQL的概念及查询方式

一、Spark SQL的概念理解 Spark SQL是spark套件中一个模板,它将数据的计算任务通....
的头像 数据分析与开发 发表于 09-02 15:44 186次 阅读
Spark SQL的概念及查询方式

STM32与51单片机的区别与取舍之处

分享本文,简单分析STM32与51单片机的区别与取舍之处。 单片微型计算机简称单片机,简单来说就是集....
的头像 STM32嵌入式开发 发表于 09-02 15:17 1335次 阅读

5个大主题方向的开发板项目开发

华为天才少年—稚晖君,相信大家一定不陌生,作为技术宅UP主,他的自动驾驶自行车可谓是超级硬核!B站、....
的头像 电子森林 发表于 09-02 14:58 2150次 阅读

你们知道指针和引用正确的使用场景吗

先解决两个疑问 ◆ 指针和引用的不同之处是什么? ◆ 何时用用指针?何时用引用? 指针和引用的不同之....
的头像 STM32嵌入式开发 发表于 09-02 14:37 188次 阅读
你们知道指针和引用正确的使用场景吗

为什么要进行单相机标定

为什么要进行单相机标定? 广义:畸变矫正和一维和二维测量 畸变矫正: 在几何光学和阴极射线管(CRT....
的头像 新机器视觉 发表于 09-02 09:45 227次 阅读

分享一个最新的的Python对象序列化方式

许多Python标准库都有一些未被赏识的精华。其中之一是允许简单优雅的基于参数类型的函数分发。这一特....
的头像 马哥Linux运维 发表于 09-01 15:19 710次 阅读
分享一个最新的的Python对象序列化方式

深入理解Linux系统零拷贝技术

内存拷贝是比较耗时操作,零拷贝是常用优化手段,今天分享的文章就是Linux系统零拷贝技术,Kafka....
的头像 Linux爱好者 发表于 09-01 15:12 681次 阅读

CPU的内部组成部分有哪些 CPU 的主要功能

CPU的中文全称为中央处理器,英文为Central processing unit,简称CPU。作为....
的头像 Les 发表于 08-31 11:29 634次 阅读

HFSS-API常用的基本形状和布尔操作函数

摘要: 上节HFSS-API入门第一弹:画个Box主要是分享了调用改良hfssapi新建工程和设计文....
的头像 知社学术圈 发表于 08-27 15:38 202次 阅读

四个方面全面解析Linux 下 C++ 编译&链接

【导读】:编译与链接对CC++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译与链接过程,陌生在于大....
的头像 开关电源芯片 发表于 08-27 09:36 2840次 阅读
四个方面全面解析Linux 下 C++ 编译&链接

STM32的串口通信原理介绍

介绍串口通信 按照数据传送方向分类 单工:数据传输只支持数据在一个方向上传输 半双工:允许数据在两个....
的头像 奈因PCB电路板设计 发表于 08-26 09:23 2241次 阅读

基于STM32的交流电压、电流、功率和电量采集系统

教程的源代码链接:https://pan.baidu.com/s/1rx4tQ_7dYXMAbpy_....
发表于 08-25 15:31 105次 阅读

意法半导体的STM32U5通用MCU取得PSA 3级和SESIP3安全认证

意法半导体的STM32U585*通用安全MCU通过PSA 3级和SESIP[1]3安全认证,通过了逻....
发表于 08-25 14:13 1255次 阅读
意法半导体的STM32U5通用MCU取得PSA 3级和SESIP3安全认证

央视痛批大数据杀熟就是商业欺诈;小米决定接盘恒大汽车?

小米接盘恒大汽车?双方回应未达成任何意向 近日,恒大集团、恒大物业、恒大汽车同时发布公告称,中国恒大....
的头像 微流控科技 发表于 08-25 11:14 837次 阅读

STM32串口通信的重要性

刚开始学单片机的你,是不是会因用程序把LED点亮而感到高兴,会因用程序把数码管点亮而感到高兴。这是好....
的头像 高速PCB硬件设计 发表于 08-24 14:51 1720次 阅读

意法半导体STM32Cube.AI生态系统加强对高效机器学习的支持

意法半导体STM32Cube.AI开发环境为用户提供各种机器学习技术,为他们尽可能高效地解决分类、聚....
发表于 08-24 09:10 320次 阅读
意法半导体STM32Cube.AI生态系统加强对高效机器学习的支持

如何调试设计中的时钟域交汇问题

本篇博文中的分析是根据客户真实问题撰写的,该客户发现即使时序已得到满足的情况下,硬件功能仍出现错误。....
的头像 思佳讯SkyworksSolutions 发表于 08-20 09:32 3018次 阅读
如何调试设计中的时钟域交汇问题

stm32单片机和51单片机区别是什么

单片机也就是单片微型计算机,和集CPU、RAM、ROM、输入输出设备、中断系统在同一个芯片上的器件。....
的头像 璟琰乀 发表于 08-19 18:21 940次 阅读

stm32最小系统组成及作用

最小系统是单片机工作时的最低要求,不包含外设控制,原理比较简单,下面我们一起来看看stm32最小系统....
的头像 璟琰乀 发表于 08-19 17:18 436次 阅读

T1050-8G-TR STMicroelectronics 标准和Snubberless™三端双向可控硅

oelectronics标准和Snubberless™三端双向可控硅可采用通孔或表面贴装封装,适用于通用电源交流开关。它们可以用作静态继电器、加热调节或感应电机启动电路等应用的开/关功能。由于Snubberless版本具有高换向性能,特别推荐用于感性负载。 特性 中等电流三端双向可控硅 夹子结合,热阻低 用于绝缘BTA的低热阻绝缘陶瓷 BTA系列UL1557认证(文件参考号:81734) 高换向 (4Q) 或非常高换向 (3Q, Snubberless™) 能力 封装符合RoHS (2002/95/EC) 指令 ...
发表于 11-20 09:07 91次 阅读

LED1642GWXTTR STMicroelectronics LED1642GW 16通道LED驱动器

oelectronics LED1642GW 16通道LED驱动器是低电压40mA、16通道驱动器,设计用于LED面板显示屏。LED1642GW确保20V的输出驱动能力,用户可以以串联方式连接若干个LED。在输出级,16个稳压电流源提供从3mA到40mA的恒定电流,来驱动LED。电流通过外部电阻器进行设定,并可以由一个7位电流增益寄存器在两个子范围进行调整。各通道亮度可通过12/16位灰阶控制分开进行调整。电源电压范围从3V到5.5V。 特性 16个恒定电流输出通道 输出电流:从3mA到40mA 电流可编程通过外部电阻 两个范围内的7位全局电流增益调整 12/16位PWM灰度亮度控制 可编程输出开启/关闭时间 错误检测模式(打开和短路-LED) 可编程短路LED检测阈值 自动节电/自动唤醒 可选择的SDO同步在CLK下降边缘 拉杜尔输出延迟(可选) 供电电压:3V至5.5V 热停机和超温报警 30MHz 4线接口 20V电流发生器分级电压 ...
发表于 11-13 09:07 102次 阅读

STLUX385A STMicroelectronics STLUX385A Digital LED Lighting Driver

relectronics STLUX385A 数字 LED 照明驱动器是 ST MASTERLUX™ 数字器件系列产品,专门用于照明和电源转换。STLUX385A 成功集成了多种架构和应用,从用于 LED 驱动的简单降压转换器、用于功率因数校正的升压转换器、用于可调光 LED 灯串的半桥谐振转换器,一直到 HID 灯镇流器中的全桥控制、无线电源充电器及电视电源等各种应用。 SMED SMED是由内部或外部事件触发的硬件状态机。 例如,在电源应用中,SMED可以关闭调节回路,当它检测到过流或短路时自动关闭电路,从而保护电路。 由于SMED是嵌入的,它们保证了比标准中断驱动微处理器提供的事件反应时间短。 特性 6SMED控制的PWM提供任何功率转换阶段(状态机事件驱动)的完全控制) 集成DALI(数字可寻址照明接口),实现控制、通信和监控功能 集成数字核心,使STLUX易于使用和可编程 新的...
发表于 11-11 09:07 99次 阅读

STSPIN32F0ATR STMicroelectronics 无刷电机驱动器

oelectronics无刷电机驱动器是采用三相桥式配置的功率驱动器。其中包括用于霍尔效应传感器、PWM电流控制器和微控制器、DSP或FPGA的内置解码逻辑。这些器件包括针对过热、过流和欠压条件的保护和诊断特性。这样即可实现稳健可靠的设计。这些驱动器采用多种节省空间的散热增强型封装。STSPIN 3相BLDC电机驱动器IC为电机和运动控制提供了即用型解决方案。 视频 长使用寿命承诺 查看 特色产品 ...
发表于 11-10 09:07 185次 阅读

LDK220U50R STMicroelectronics LDK220 低压差稳压器

oelectronics LDK220 低压差稳压器以 2.5V 到 13.2V 范围的输入电压,提供 最大为 200mA 的输出电流 ,而典型压差仅为 100mV。它通过 输出上的陶瓷电容保持稳定。启用逻辑控制功能 可将 LDK220 置于关闭模式,从而实现 低于 1μA 的总电流消耗。该器件还包含短路恒定 电流限制和热保护。 LDK220 极低的压降、低静态电流和低噪声的特性,使其非常适合电池供电应用。 特性 输入电压从2.5到13.2V 非常低的下降电压(100米V型。 @100米负荷) Low quiescent current (typ. 40μA, 1μA in off mode) 低噪音 Output voltage tolerance: ±2.0% @ 25°C 保证输出电流200mA 可根据要求提供宽范围的输出电压:从1.2V固定到12V,有100MV的步进和可调 逻辑控制的电子关机 Compatible with ceramic capacitor COUT = 1μF 内部电流和热极限 可在SOT23-5L、SOT323-5L和DFN6-1.2x1.3包中使用 Temperature range: -40°C to 125°C ...
发表于 11-09 12:07 122次 阅读

STPSC2H065B-TR STMicroelectronics STPSC 650V肖特基碳化硅二极管

oelectronics STPSC 650V肖特基碳化硅二极管是一款超高性能功率肖特基二极管。该器件采用宽带隙材料,可以设计具有650V额定电压的肖特基二极管结构。得益于肖特基结构,在关闭时不会显示恢复,且振铃模式可以忽略不计。即使是最轻微的电容式关断特性也不受温度影响。这些器件特别适用于PFC应用,它们可以提高硬开关条件下的性能。高正向浪涌能力确保在瞬态阶段具有良好的稳健性。 STPSC12065-Y和STPSC20065-Y器件符合AEC-Q101标准,可用于汽车应用。STPSC12065-Y和STPSC20065-Y是支持PPAP且符合ECOPACK®2标准的元件。 特性 无反向恢复或可忽略不&...
发表于 11-09 12:07 107次 阅读

PWD5F60TR STMicroelectronics PWD5F60高密度功率驱动器

oelectronics PWD5F60高密度功率驱动器在单一紧凑型系统级封装 (SiP) 中集成了栅极驱动器和四个N通道功率MOSFET,采用双半桥配置。集成式功率MOSFET的漏源导通电阻或RDS (ON) 为1.38Ω,漏源击穿电压为600V。嵌入式栅极驱动器的高侧可方便地通过集成自举二极管供电。PWD5F60功率驱动器的集成度高,因此能在空间受限的应用中高效地驱动负载。 PWD5F60接受在10V至20V宽范围内的电源电压 (VCC),在上、下驱动部分均具有欠压闭锁 (UVLO) 保护功能,以防电源开关在低效率或危险条件下工作。PWD5F60具有宽输入电压范围,因此可轻&...
发表于 11-09 12:07 90次 阅读

STM32L4P5AGI6 STMicroelectronics STM32L4P5/STM32L4Q5 32位微控制器 (MCU)

oelectronics STM32L4P5/STM32L4Q5 32位微控制器 (MCU) 不仅扩展了超低功耗产品组合,还提高了产品性能,采用Arm® 树皮-M4内核(具有DSP和浮点单元 (FPU),频率为120MHz)。STM32L4P5产品组合具有512KB至1MB闪存,采用48-169引脚封装。STM32L4Q5具有1MB闪存,提供额外加密加速器引擎(AES、HASH和PKA)。 特性 超低功率,灵活功率控制 电源:1.71V至3.6V 温度范围:-40°C至85°C或-40°C至125°C 批量采集模式(BAM) VBAT模块中150nA:为RTC和32x32位储备寄存器供电 关断模式下,22nA(5个唤醒引脚ʌ...
发表于 11-06 09:07 172次 阅读

ST715C50R STMicroelectronics 低静态电流LDO线性稳压器

oelectronics低静态电流LDO线性稳压器经过优化提供超低静态电流 (I)。I比其供电的平均负载电流低,或者相当。该功能对于电力有限的应用非常有必要,例如电池供电的设备或长时间待机、符合环保标准的设备。这延长了电池寿命,降低了整体功耗。 这些低静态电流LDO稳压器非常适合用于便携式消费类电子设备,例如智能手机、智能手表、蓝牙耳机和可穿戴设备。工业、智能建筑和智能家居传感器还得益于超低静态电流(工作和禁用(待机) 模式下...
发表于 11-05 17:07 78次 阅读

LD56100DPU33R STMicroelectronics LD56100超低噪声线性稳压器

oelectronics LD56100超低噪声线性稳压器在1.8-5.5V输入电压范围内提供1A电流,典型压差为120mV。LD56100采用DFN8 (1.2x1.6mm) 封装,在最大程度上节约空间。该器件通过输出上的陶瓷电容保持稳定。LD56100适合用于低功耗电池供电应用,具有超低压差、低静态电流、快速瞬态响应和内部软启动电路等功能。 特性 输入电压:1.8V至5.5V 超低压差(120mV典型值,1A负载和VOUT=3.3V时) 非常低的静态电流(无负载时的典型值为100μA,断开模式下典型值为0.03μA) 输出电压容差:±1%(-40°C至+85°C) 超低噪声ʍ...
发表于 11-05 17:07 124次 阅读

VN7000AYTR STMicroelectronicsVND70x0汽车用高侧驱动器

半导体 VND70x0 车用高侧驱动器是单或双通道高侧驱动器,采用 ST 专有 VIPower® M0-7 技术制造,并采用 SO-8、PowerSSO-12 和 PowerSSO-16 封装形式。这些器件用于通过 3V 和 5V CMOS 兼容型接口驱动 12V 汽车接地负载。 特性 极低电压操作,用于深冷分级应用 合格汽车 综合的普遍的一般常规 单通道或双通道智能高侧驱动器与多感觉或电流感觉模拟反馈 非常低的待机电流 兼容3V和5VCMOS输出 多感官诊断功能 多路/电流感知模拟反馈:高精度比例电流镜负载电流、VCC电源电压和TCHIP器件温度 过载和短到地面(功率限制)指示 热停机指示 OFF-状态开负载检测 输出短到VCC检测 感觉启用/禁用 贸易保护措施(向歹徒缴纳的)保护费 未压缩关机 高压钳 负载电流限制 快速热瞬变的自限制 具有专用故障复位引脚的超温或功率限制的可配置闭锁 地面损失和VCC损失 带有外部组件的反向电池 静电放电保护 ...
发表于 10-30 14:06 99次 阅读

PWD13F60 STMicroelectronics PWD13F60栅极驱动器

oelectronics PWD13F60栅极驱动器是一款高密度电源驱动器和高压全桥,带集成栅极驱动器。PWD13F60器件接受电源电压范围广,受低压UVLO检测保护。这些PWD13F60栅极驱动器电源系统级封装和高压功率MOSFET具有低R (320mΩ) 和600V漏源击穿电压。PWD13F60栅极驱动器轻松连接微控制器和DSP单位或霍尔效应传感器,输入引脚范围广。这些PWD13F60栅极驱动器还具有宽驱动器电源电压、内部自举二极管,输出与输入同步,让设计更加灵活、简单和快速。PWD13F60采用10mmx13mmx1.0mm VFQFPN封装。典型应用包括工厂自动化、电机驱动器(用于工业和家用电器)、风扇和泵以及电源装置。 特性 电力系统级封装集成栅极驱动器和高压功率MOSFET 低R DS(开启)=320mΩ BVDSS =600伏 适合用作 全桥 双独立半...
发表于 10-30 14:06 128次 阅读

LDLN025M18R STMicroelectronics LDLN025 250mA超低噪声LDO

oelectronics LDLN025 250mA超低噪声LDO的输入电压范围为1.5V至5.5V,250mA负载下的压差极低。LDLN025可延长需要长待机时间应用的电池寿命。该LDO的静态电流非常低,空载时仅12μA。LDLN025提供非常干净的输出,得益于其超低噪声值和高电源抑制比 (PSRR) 特性,非常适合用于超敏感型负载。该LDO采用陶瓷电容器,因此性能稳定。 特性 超低输出噪声:6.5μ VRMS 工作输入电压范围:1.5V至5.5V 输出电流高达250mA 非常低的静态电流:空载时为12μA 超低压差:250mV (250mA) 极高PSRR:80dB@100Hz、60dB@100kHz 线路、负载和温度范围内...
发表于 10-30 14:06 71次 阅读

LDL212PV33R STMicroelectronics LDL212 1.2A低压降线性稳压器IC

oelectronics LDL212 1.2A低压降线性稳压器IC可在2.5V至18V输入电压范围内提供最大1.2A电流。LDL212在1.2A电流下的典型压差值为350mV。LDL212适合用于在SMPS中实现直接稳压和在直流-直流转换器中实现二次线性稳压。该 IC 在 120Hz 时具有 87dB 的高电源抑制比,100kHz 时为 40dB。LDL212 采用使能逻辑控制功能实现关断模式,从而降低总电流消耗。该器件还具有限流、SOA和热保护功能。 特性 输入电压范围:1.6V至5.5V 极低压差(1A负载下的典型值为300mV) 低静态电流(无负载时的典型值为35μA,断开模式下的典型值为1μA) 输出电压容差:±2...
发表于 10-30 11:06 89次 阅读

LED2001PHR STMicroelectronics LED200x Monolithic Step-Down DC-DC Converters

oelectronics LED200x单片步进式DC-DC转换器是850k Hz的转换器,设计成精确的恒流源,可调节的电流能力可达4ADC。 嵌入式PWM调光电路提供LED亮度控制。 由于高开关频率和陶瓷输出电容兼容性,整体应用的尺寸被最小化。 器保护,防止热过热,过流和输出短路。 特性 3V到18V工作输入电压范围 850千赫兹固定开关频率 100mV类型。 电流感电压下降 PWM调光 ± 7% output current accuracy 同步整改 95mΩ HS / 69mΩ LS typical R DS(开启) 峰电流模式架构 嵌入式补偿网络 内部限流 陶瓷输出电容器兼容 热停机 申请 高亮度LED驱动 一般照明 卤素子弹再置术 签名 ...
发表于 10-30 11:06 71次 阅读

STSPIN32F0B STMicroelectronics STSPIN32F0B高级单分流BLDC控制器

oelectronics STSPIN32F0B高级单分流BLDC控制器是一款系统级封装器件,提供的集成解决方案适用于使用不同驱动模式驱动三相无刷电机。STSPIN32F0B控制器内置三个半桥栅极驱动器,能够驱动功率MOSFET,电流能力为600mA(拉电流和灌电流)。得益于集成联锁功能,不能同时驱动相同半桥的高侧和低侧开关。 该器件设有内部直流/直流降压转换器,可提供3.3V电压,适合为MCU和外部元件供电。另外,内部LDO线性稳压器可为栅极驱动器提供电源电压。集成运算放大器可用于信号调理,从而在&#...
发表于 10-30 10:06 177次 阅读

STCMB1TR STMicroelectronics STCMB1转换模式 (TM) PFC

oelectronics STCMB1转换模式 (TM) PFC包含高电压双端控制器、高达800V额定电压部分以及监视这三块运行的胶合逻辑。PFC部分采用专有的恒定导通时间控制方法,无需正弦输入参考。这可减少系统成本和外部零部件数量。 特性 一般特性 SO20W封装 800V高压启动,带集成输入电压检测 有源输入滤波电容放电电路,可降低待机功耗,通过IEC 62368-1和UL Demko认证 适用于两款转换器的独立调试模式 PFC控制器特性 增强型恒定导通时间PFCʌ...
发表于 10-30 10:06 95次 阅读

LD39100PU18RY STMicroelectronics LD39100低噪声稳压器

oelectronics LD39100低噪声稳压器最大电流为1A, 输入电压范围为1.5-5.5V,典型压差为200mV。该器件的输入和输出采用陶瓷电容器,具有超低压差、低静态电流和低噪声等特点。这些特性让LD39100非常适合低功率电池供电应用。电源抑制在低频率时为70dB,在10kHz时开始滚降。通过使能逻辑控制功能,LD39100可在消耗总电流低于1μA时处于关断模式。该器件还具有短路恒流限制和热保护功能。LD39100还提供符合AEC-Q100标准的版本,采用侧面可湿的DFN6 (3x3mm) 封装。 特性 符合AEC-Q100标准 输入电压范围:1.5V至5.5V 超低压差(1A负载时的典型值为200mV) 极低静态电流(无负载时的典型值为20μA,1A负载时的典ࣁ...
发表于 10-30 10:06 123次 阅读

L6498DTR STMicroelectronics L6498高压半桥驱动器

oelectronics L6498高压半桥驱动器是采用BCD6“离线”技术制造的高压器件。该驱动器是用于N通道功率MOSFET或IGBT的单芯片半桥栅极驱动器。高侧(浮动)截面设计承受高达500V的直流电压轨,具有600V瞬态耐受电压。逻辑输入端兼容CMOS/TTL,低至3.3V,可轻松连接微控制器或DSP等控制单元。 两个器件输出实现灌2.5A和源2A电流,因此L6498特别适合用于中大容量功率MOSFET/IGBT。由于集成联锁功能,所以输出不能同时驱动高位。位于下、上驱动部分的独立UVLO保护电路防止在低效率或...
发表于 10-30 10:06 128次 阅读

L6494LDTR STMicroelectronics L6494高压高侧/低侧2A栅极驱动器

oelectronics L6494高压高/低侧2A栅极驱动器是用于N通道功率MOSFET或IGBT的单芯片半桥栅极驱动器。这些高压器件采用BCD6“离线”技术制造。高侧(浮动)截面设计承受高达500V的直流电压轨,具有600V瞬态耐受电压。逻辑输入端兼容CMOS/TTL,低至3.3V,可轻松连接微控制器或DSP等控制单元。 该器件是单输入栅极驱动器,具有可编程死区时间,并设有低电平有效关断引脚。L6494特别适合中、高容量功率MOSFET/IGBT。两个器件输出实现灌2.5A和源2A电流, 位于下、上驱动部分的独立UV...
发表于 10-29 13:06 54次 阅读