全网最全STM32 HAL的知识总结

发布者:shengju最新更新时间:2023-07-11 来源: elecfans关键字:STM32  HAL  知识总结 手机看文章 扫描二维码
随时随地手机看文章

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.提供了一整套一致的中间件组件,如RTOS,USB,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字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例。

诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。

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来完成。

[1] [2]
关键字:STM32  HAL  知识总结 引用地址:全网最全STM32 HAL的知识总结

上一篇:STM32F767XX微控制器的功能及特性分析
下一篇:STM32串口波特率大小计算案例

推荐阅读最新更新时间:2024-11-09 13:09

国芯思辰|高灵敏度霍尔开关AH503可用于汽车天窗,替代HAL1503
现在汽车的“颜值”是一款车能否卖得好的一个重要因素,驾驶体验不仅来自于汽车内在的配置上,也由汽车的外饰内饰颜值决定。 汽车天窗和侧车窗一样,使用安全问题一定是要考虑到的,驾驶前一定要检查并关上天窗,防止高速行驶中乘客探出肢体,对人体造成损伤。此外,天窗的防夹功能也很重要,因为汽车天窗电机的作用力很大,如果在夹到人的肢体而没有及时停止的话,会对肢体造成很大的伤害,另外天窗电机也很容易损坏。那么如何才能防止这样的情况发生? 在汽车天窗设计中,绝大部分都使用了具有霍尔元件的智能电机作为天窗的驱动单元,中科阿尔法AH503是一款基于BCDMOS技术设计的高灵敏度单极霍尔开关芯片,可用于电机控制单元对其信号进行分析。通过霍尔的波形来
[嵌入式]
国芯思辰|高灵敏度霍尔开关AH503可用于汽车天窗,替代<font color='red'>HAL</font>1503
基于STM32芯片的电源监控器应用方案
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。因此,STM32 有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。 电源监控器 STM32芯片主要通过引脚 VDD 从外部获取电源,在它的内部具有电源监控器用于检测 VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行。
[单片机]
基于<font color='red'>STM32</font>芯片的电源监控器应用方案
STM32中IO口模拟串口输出的乱码现象
因为芯片串口不够用,只好用IO口模拟串口,在网上下载了个模拟串口的程序,可运行,但发现串口输出隔几个字符就会出现乱码,主要部分代码如下: [cpp] view plain copy#define OI_TXD PAout(12) #define OI_RXD PAin(11) #define BuadRate_9600 100 u8 len = 0; //接收计数 u8 USART_buf[11]; //接收缓冲区 u8 recvStat = COM_STOP_BIT; u8 recvData = 0; void IO_TXD(u8 Data) { u8 i = 0; OI_TXD = 0; delay_us(BuadRate
[单片机]
<font color='red'>STM32</font>中IO口模拟串口输出的乱码现象
直流无刷有感电机介绍以及STM32无刷电机轮速测量方案
无刷有感电机测速、速度闭环控制 0.前言 随着ROS移动机器人技术的发展,小伙伴们已经不在满足于低功率的差速小车了,希望可以搭建功率更高的ROS移动机器人平台。常见的高功率的移动机器人多是采用无刷轮毂电机,于是就出现了本篇文章,给大家提供一个轮毂电机的测速以及控制的思路。 1.直流无刷有感电机介绍 无刷直流 (Brushless Direct Current, BLDC)电机是一种正快速普及的电机类型,在移动机器人领域也有诸多应用,这里我们将对无刷直流电机的常见问题进行描述。 (1)工作原理 首先,我们来看一下无刷电机的工作原理,下图为三电极、二磁极、内转子无刷电机演示。 无刷电机不是传统的直流电机,模型虽然是直流电池供电,但
[单片机]
直流无刷有感电机介绍以及<font color='red'>STM32</font>无刷电机轮速测量方案
STM32的完整启动流程分析
关于STM32的启动流程,网上有的资料在讨论几种boot模式,有的在回答启动文件的内容,在查阅了很多资料后,本文给出一个比较全面的总结和回答。 1. 根据boot引脚决定三种启动模式 复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。BOOT0与BOOT1引脚的不同值指向了三种启动方式: 1)从主Flash启动。主Flash指的是STM32的内置Flash。选择该启动模式后,内置Flash的起始地址将被重映射到0x00000000地址,代码将在该处开始执行。一般我
[单片机]
<font color='red'>STM32</font>的完整启动流程分析
STM32单片机内存管理器实用代码解析与工程应用指南
本代码适用于无操作系统的STM32单片机开发,功能强大。 可申请到地址空间连续的不同大小的内存空间,且用户接口简单,使用方便。 直接复制粘贴如下代码即可: memory.h: #ifndef __MEMORY_H__ #define __MEMORY_H__ #include stdio.h #include string.h #include includes.h //用户使用 typedef struct { void *addr;//申请到的内存的起始地址 uint32_t size;//申请到的内存的大小,按照块大小分配,大于等于申请大小 uint16_t tb; //申请表序号,申
[单片机]
025_STM32之MDK5软件仿真之查看io口输出
(一)模拟仿真或者STLINK仿真那些就需要相应的配置对应的地方 DARMSTM.DLL-pSTM32F103ZE (二) 如果是模拟仿真的话注意要配置好时钟 (三) 配置监测的引脚 输入配置的引脚之后点击空白处就行了 PORTA.0 如果弹出unknown signal的话,看第一点是否配置好,或者所配置的型号是否支持仿真,如:F429是不支持的 (四) 点击右键,选择输出的类型,像我们PWM的话就选bit的类型的 (五)运行看运行状态,点击stop或者start
[单片机]
025_STM32之MDK5软件仿真之查看io口输出
STM32之PVD电压检测
如果VDD或者VDDA电压高于或低于PVD设定阈值都产生中断,表现为每中断一次,LED1就亮变灭或者灭变亮。 /******************************************************************************** * @file PWR/PVD/main.c * @author MCD Application Team * @version V3.4.0 * @date 10/15/2010 * @brief Main program body. *********************************************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved