打印
[STM32F1]

STM32F1xx HAL库 中文详解 之 综合概述

[复制链接]
944|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
    现阶段学习hal库,发现网上竟然没有对HAL库全面详细的解析,在学习的过程中把我所学到的记录下来,分享给大家,一起学习,一起进步!第一次写博文,有不足之处希望大家能在评论区指出。
HAL库驱动程序概述:

        HAL驱动程序被设计成提供一套丰富的API,并且易于与上层应用程序。每个驱动程序由一组函数组成,涵盖了最常见的外围设备特性。每个驱动程序的开发都是由一个通用的API驱动的,该API对驱动程序进行了标准化结构、函数和参数名称。  

        HAL驱动程序包括一组驱动模块,每个模块连接到一个独立的模块外围。 然而,在某些情况下,模块链接到外围功能模式。例如,USART外围设备有几个模块:UART驱动模块、USART驱动模块,智能卡驱动模块,IRDA驱动模块。HAL的主要特点如下:  

● 跨家族的可移植API集,涵盖了常见的外围功能扩展API用于特定的外围特性。

● 三种API编程模型:轮询、中断和DMA:  

    ----API是RTOS兼容的完全可重入的API

    ----轮询模式中超时的系统使用情况  

● 支持外设多实例,允许多个并发API调用给定外围设备的实例(USART1, USART2…)  

● 所有HAL API都实现用户回调函数机制:  

    ----外设Init/DeInit HAL api可以调用用户回调函数来执行初始化/去初始化(时钟,gpio,中断,DMA)

    ----外设中断事件错误的事件。  

● 对象锁定机制:安全硬件访问,防止多重伪访问共享资源。

● 用于所有阻塞进程的超时:超时可以是一个简单的计数器或时基。  

        本文重点对hal库做一个综合的概述,后续还会更新其他外设!

        本文将从以下几个方面介绍HAL库:

使用特权

评论回复
评论
hehhehee 2023-3-29 11:02 回复TA
———————————————— 版权声明:本文为CSDN博主「逆行者Fy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37255752/article/details/120069694 
沙发
hehhehee|  楼主 | 2023-3-29 11:02 | 只看该作者
综合概述(一):

HAL库驱动程序概述:

综合概述(一):

1 HAL库常用名词缩写及HAL库用户应用程序文件

1.1常用名词缩写与定义

1.2HAL和用户应用程序文件

1.2.1 hal库驱动程序文件

1.2.2 用户应用程序文件

2 HAL库数据结构

2.1外围处理结构

2.2 初始化和配置结构

2.3具体的工艺结构  

3 PAI的分类

4 HAL驱动程序支持的设备

使用特权

评论回复
板凳
hehhehee|  楼主 | 2023-3-29 11:02 | 只看该作者
综合概述(二):

5 HAL驱动规则

6 HAL通用API

7 HAL扩展API

8文件包含方式

综合概述(三):

9 HAL公共资源

10 HAL配置

11 HAL系统外设处理

12 如何使用HAL驱动程序

使用特权

评论回复
地板
hehhehee|  楼主 | 2023-3-29 11:03 | 只看该作者
1 HAL库常用名词缩写及HAL库用户应用程序文件
1.1常用名词缩写与定义

使用特权

评论回复
5
hehhehee|  楼主 | 2023-3-29 11:04 | 只看该作者
1.2HAL和用户应用程序文件

        接下来说一下HAL库的文件组成,HAL库用户应用程序文件分为两部分,一部分是HAL库驱动程序文件,另一部分是用户应用程序文件。

使用特权

评论回复
6
hehhehee|  楼主 | 2023-3-29 11:04 | 只看该作者
1.2.1 hal库驱动程序文件

使用特权

评论回复
7
hehhehee|  楼主 | 2023-3-29 11:05 | 只看该作者
1.2.2 用户应用程序文件

使用特权

评论回复
8
hehhehee|  楼主 | 2023-3-29 11:05 | 只看该作者
  STM32Cube包附带了现成的项目模板,每个模板对应一个型号的支持。 每个项目包含上面列出的文件和一个预先配置的项目用于支持的工具链。每个项目模板的main()中都提供了空的主循环函数,可以作为开始点来熟悉STM32Cube的项目设置。 他们的特点是:  

        1. 它包含HAL, CMSIS和BSP驱动的来源是最小的组件来在给定的开发板上开发代码。  

        2. 它包含所有固件组件的包含路径。  

        3. 它定义了支持的STM32设备,并允许配置CMSIS和HAL相应的驱动程序。  

        4. 它提供了准备使用预先配置如下定义的用户文件:  

                    ----HAL初始化  

                    ----实现HAL_Delay()的SysTick ISR  

                   ----系统时钟配置为设备的最大频率  

使用特权

评论回复
9
hehhehee|  楼主 | 2023-3-29 11:05 | 只看该作者
2 HAL库数据结构

每个HAL驱动程序可以包含以下数据结构:  

        ----外围处理结构  

        ----初始化和配置结构  

        ----特定的流程结构

使用特权

评论回复
10
hehhehee|  楼主 | 2023-3-29 11:05 | 只看该作者
2.1外围处理结构

这些API有一个模块化的通用多实例体系结构,允许使用同时存在多个IP实例。  

PPP_HandleTypeDef *句柄是HAL中实现的主要结构驱动程序。 它处理外设/模块配置,寄存器和嵌入所有的遵循外围设备流程所需的结构和变量。

使用特权

评论回复
11
hehhehee|  楼主 | 2023-3-29 11:05 | 只看该作者
外围句柄用于以下目的:  

        ----多实例支持:每个外设/模块实例都有自己的句柄。 作为一个结果实例资源是独立的。  

        ----外围进程间通信:句柄用于管理共享数据流程例程之间的资源。  

                例如:全局指针,DMA句柄,状态机。  

        ----存储:这个句柄也用于管理给定HAL驱动中的全局变量。  

使用特权

评论回复
12
hehhehee|  楼主 | 2023-3-29 11:06 | 只看该作者
外围结构示例如下:  
typedef struct

{
    USART_TypeDef *Instance; /* USART registers base address */
    USART_InitTypeDef Init; /* Usart communication parameters */
    uint8_t *pTxBuffPtr;/* Pointer to Usart Tx transfer Buffer */
    uint16_t TxXferSize; /* Usart Tx Transfer size */
    __IO uint16_t TxXferCount;/* Usart Tx Transfer Counter */
    uint8_t *pRxBuffPtr;/* Pointer to Usart Rx transfer Buffer */
    uint16_t RxXferSize; /* Usart Rx Transfer size */
    __IO uint16_t RxXferCount; /* Usart Rx Transfer Counter */
    DMA_HandleTypeDef *hdmatx; /* Usart Tx DMA Handle parameters */
    DMA_HandleTypeDef *hdmarx; /* Usart Rx DMA Handle parameters */
    HAL_LockTypeDef Lock; /* Locking object */
    __IO HAL_USART_StateTypeDef State; /* Usart communication state */
    __IO HAL_USART_ErrorTypeDef ErrorCode;/* USART Error code */

}USART_HandleTypeDef;

使用特权

评论回复
13
hehhehee|  楼主 | 2023-3-29 11:19 | 只看该作者
1)多实例特性意味着应用程序中使用的所有api都是重入并避免使用全局变量,因为子例程可能无法重入如果它们依赖于一个全局变量保持不变,但那个变量是在递归调用子例程时修改。 由于这个原因,下面尊重规则:  

        ----可重入代码不包含任何静态(或全局)非常量数据函数可以处理全局数据。 例如,可重入对象  中断服务程序可以获取一块硬件状态来进行工作它不仅是全局的,而且是volatile的。 不过,典型的不建议使用静态变量和全局数据在这些变量中应该使用原子的读-修改-写指令。 它在执行过程中是否不可能出现中断或信号这样的指令。  

        ----可重入代码不修改它自己的代码。

使用特权

评论回复
14
hehhehee|  楼主 | 2023-3-29 11:19 | 只看该作者
2)当一个外设可以同时管理多个进程使用的DMA(全双工情况),每个进程的DMA接口句柄被添加到PPP_HandleTypeDef。  

使用特权

评论回复
15
hehhehee|  楼主 | 2023-3-29 11:19 | 只看该作者
3)对于共享和系统外围设备,不使用句柄或实例对象。

这个例外所涉及的外围设备如下:  

       ● GPIO
       ● SYSTICK
       ● NVIC
       ● PWR
       ● RCC
       ● FLASH.

使用特权

评论回复
16
hehhehee|  楼主 | 2023-3-29 11:19 | 只看该作者
2.2 初始化和配置结构

这些结构在通用驱动头文件中定义,当它对所有部分都是通用的数字。 当它们可以从一个零件号码转换到另一个时,结构是在每个零件号的扩展头文件中定义。
typedef struct
{
    uint32_t BaudRate; /*!< This member configures the UART communication baudrate.*/
    uint32_t WordLength; /*!< Specifies the number of data bits transmitted
                         or received in a frame.*/
    uint32_t StopBits; /*!< Specifies the number of stop bits transmitted.*/
    uint32_t Parity; /*!< Specifies the parity mode. */
    uint32_t Mode; /*!< Specifies wether the Receive or Transmit mode is
                         enabled or disabled.*/
    uint32_t HwFlowCtl; /*!< Specifies wether the hardware flow control mode
                         is enabled or disabled.*/
    uint32_t OverSampling; /*!< Specifies wether the Over sampling 8 is
                     enabled or disabled,to achieve higher speed (up to fPCLK/8).*/
}UART_InitTypeDef;

使用特权

评论回复
17
hehhehee|  楼主 | 2023-3-29 11:20 | 只看该作者
配置结构用于初始化子模块或子实例。 看到下面的例子:  

HAL_ADC_ConfigChannel (ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)

使用特权

评论回复
18
hehhehee|  楼主 | 2023-3-29 11:20 | 只看该作者
2.3具体的工艺结构  

特定的流程结构用于特定的流程(通用API),他们是在通用驱动头文件中定义。  

例如:

HAL_PPP_Process (PPP_HandleTypeDef* hadc,PPP_ProcessConfig* sConfig)

使用特权

评论回复
19
hehhehee|  楼主 | 2023-3-29 11:20 | 只看该作者
3 PAI的分类

HAL api分为三类:  

       ● 通用api:应用于所有STM32设备的通用api。 这些api是因此出现在所有STM32微控制器的通用HAL驱动文件中。  

    HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc);
    HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc);
    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);
    void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);

使用特权

评论回复
20
hehhehee|  楼主 | 2023-3-29 11:21 | 只看该作者
扩展API:这组API分为两个子类:  

                ----特定于家族的api:应用于给定家族的api。 它们位于扩展HAL驱动文件(参见下面与ADC相关的示例)。  

    HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc,
                                                    uint32_t SingleDiff);
    uint32_t HAL_ADCEx_Calibration_GetValue(ADC_HandleTypeDef* hadc,
                                                uint32_t SingleDiff);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

796

帖子

0

粉丝