现阶段学习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库:
综合概述(一):
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驱动程序支持的设备
综合概述(二):
5 HAL驱动规则
6 HAL通用API
7 HAL扩展API
8文件包含方式
综合概述(三):
9 HAL公共资源
10 HAL配置
11 HAL系统外设处理
12 如何使用HAL驱动程序
1 HAL库常用名词缩写及HAL库用户应用程序文件
1.1常用名词缩写与定义
ADC | 模数转换器 |
ANSI | 美国国家标准协会 |
API | 应用程序接口 |
BSP | 板级支持包 |
CAN | 控制器局域网模块 |
CEC | 单总线协议 |
CMSIS | 微控制器软件接口标准 |
CPU | 中央处理器 |
CRC | 循环冗余校验码 |
DAC | 数模转换器 |
DMA | 直接内存存取控制器 |
ETH | 以太网 |
EXTI | 外部中断事件控制器 |
FLASH | 闪存存储器 |
GPIO | 通用输入输出 |
HAL | hal库 |
HCD | 高对比显示屏 |
I2C | 内部集成电路 |
I2S | 集成电路内置音频总线 |
IRDA | 红外线数据协议 |
IWDG | 独立看门狗 |
LCD | 已经显示器 |
MSP | msp函数 |
NAND |
闪存存储器 |
NOR | 闪存存储器 |
NVIC | 嵌套中断向量列表控制器 |
PCD | USB外设控制器 |
PWR | 电源/功耗控制 |
RCC | 复位与时钟控制器 |
RTC | 实时时钟 |
SD | SD存储卡 |
SRAM | 静态随机存取存储器 |
SMARTCARD | 智能卡 |
SPI | 串行外设接口 |
SysTick | 系统嘀嗒定时器 |
TIM | 通用定时器 |
UART | 通用异步接收发射端 |
USART | 通用同步异步接收发射端 |
WWDG | 窗口看门狗 |
USB | 通用串行总线 |
PPP | 所有外设统称 |
1.2HAL和用户应用程序文件
接下来说一下HAL库的文件组成,HAL库用户应用程序文件分为两部分,一部分是HAL库驱动程序文件,另一部分是用户应用程序文件。
1.2.1 hal库驱动程序文件
文件名 | 描述 |
---|---|
stm32f1xx_hal_ppp.c |
主要外设/驱动文件,它包括所有STM32设备通用的API。 例如:stm32f1xx_hal_adc.c(ADC驱动) |
stm32f1xx_hal_ppp.h |
主要外设/驱动C文件的头文件 ,它包括公共数据、句柄和枚举结构, 定义语句和宏,以及导出的泛型API。 例如:stm32f1xx_hal_adc.h, stm32f1xx_hal_irda.h,… |
stm32f1xx_hal_ppp_ex.c |
外设/模块驱动程序的扩展文件。它包括特定的API的给定零件号或系列,以及新定义的API覆盖默认泛型API,如果内部流程以不同的方式实现。 例如:stm32f1 xx_hal_adc_ex.c, stm32f1xx_hal_dma_ex.c,… |
stm32f1xx_hal_ppp_ex.h |
扩展名C文件的头文件,它包括具体的数据和枚举结构,定义语句和宏,以及导出的设备部分许多特定API。 例如:stm32f1xx_hal_adc_ex.h, stm32f1xx_hal_dma_ex.h,… |
stm32f1xx_hal.c |
该文件用于HAL初始化,包含DBGMCU,基于SysTick API的Remap和Time Delay。 |
stm32f1xx_hal.h | stm32f1xx_hal.c的头文件。 |
stm32f1xx_hal_msp_template.c |
模板文件要复制到用户应用程序文件夹,它包含MSP初始化和反初始化(主例程) 以及回调的用户应用程序中使用的外设。 |
stm32f1xx_hal_conf_template.h |
允许自定义给定驱动程序的模板文件应用程序。 |
stm32f1xx_hal_def.h |
公共HAL资源,如公共定义语句、枚举、结构和宏。 |
1.2.2 用户应用程序文件
文件名 | 描述 |
system_stm32f1xx.c |
这个文件包含SystemInit(),它在启动时被调用,就在重置和在分支到主程序之前。不配置系统启动时的时钟(与标准库相反)。这是要用的用户文件中的HAL API。 它允许在内部SRAM中重新定位向量表。 |
startup_stm32f1xx.s |
包含重置处理程序和异常向量的工具链特定文件。对于一些工具链,它允许调整堆栈/堆大小以适应应用程序的需求。 |
stm32f1xx_flash.icf (optional) |
链接器文件的EWARM工具链允许主要适应堆栈/堆尺寸要符合应用要求。 |
stm32f1xx_hal_msp.c |
这个文件包含MSP初始化和反初始化(主例程)和回调)的用户应用程序中使用的外设。 |
stm32f1xx_hal_conf.h |
这个文件允许用户定制特定的HAL驱动程序应用程序。 不是必须修改此配置。 应用程序可以使用默认配置,不作任何修改。 |
stm32f1xx_it.c/.h | 这个文件包含异常处理程序和外围设备中断服务例程,并定期调用HAL_IncTick()来增加本地变量(在stm32f1xx_hal.c中声明)用作HAL时间基数。 通过默认情况下,该函数在Systick ISR中每1ms被调用一次。
PPP_IRQHandler()例程必须在在应用程序中使用基于中断的进程。 |
main.c/.h |
这个文件包含主程序例程,主要是: 1.调用HAL_Init() 2.assert_failed()实现 3.系统时钟配置 4.外设HAL初始化和用户应用程序代码。 |
STM32Cube包附带了现成的项目模板,每个模板对应一个型号的支持。 每个项目包含上面列出的文件和一个预先配置的项目用于支持的工具链。每个项目模板的main()中都提供了空的主循环函数,可以作为开始点来熟悉STM32Cube的项目设置。 他们的特点是:
1. 它包含HAL, CMSIS和BSP驱动的来源是最小的组件来在给定的开发板上开发代码。
2. 它包含所有固件组件的包含路径。
3. 它定义了支持的STM32设备,并允许配置CMSIS和HAL相应的驱动程序。
4. 它提供了准备使用预先配置如下定义的用户文件:
—-HAL初始化
—-实现HAL_Delay()的SysTick ISR
—-系统时钟配置为设备的最大频率
2 HAL库数据结构
每个HAL驱动程序可以包含以下数据结构:
—-外围处理结构
—-初始化和配置结构
—-特定的流程结构
2.1外围处理结构
这些API有一个模块化的通用多实例体系结构,允许使用同时存在多个IP实例。
PPP_HandleTypeDef *句柄是HAL中实现的主要结构驱动程序。 它处理外设/模块配置,寄存器和嵌入所有的遵循外围设备流程所需的结构和变量。
外围句柄用于以下目的:
—-多实例支持:每个外设/模块实例都有自己的句柄。 作为一个结果实例资源是独立的。
—-外围进程间通信:句柄用于管理共享数据流程例程之间的资源。
例如:全局指针,DMA句柄,状态机。
—-存储:这个句柄也用于管理给定HAL驱动中的全局变量。
外围结构示例如下:
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;
1)多实例特性意味着应用程序中使用的所有api都是重入并避免使用全局变量,因为子例程可能无法重入如果它们依赖于一个全局变量保持不变,但那个变量是在递归调用子例程时修改。 由于这个原因,下面尊重规则:
—-可重入代码不包含任何静态(或全局)非常量数据函数可以处理全局数据。 例如,可重入对象 中断服务程序可以获取一块硬件状态来进行工作它不仅是全局的,而且是volatile的。 不过,典型的不建议使用静态变量和全局数据在这些变量中应该使用原子的读-修改-写指令。 它在执行过程中是否不可能出现中断或信号这样的指令。
—-可重入代码不修改它自己的代码。
2)当一个外设可以同时管理多个进程使用的DMA(全双工情况),每个进程的DMA接口句柄被添加到PPP_HandleTypeDef。
3)对于共享和系统外围设备,不使用句柄或实例对象。
这个例外所涉及的外围设备如下:
● GPIO
● SYSTICK
● NVIC
● PWR
● RCC
● FLASH.
2.2 初始化和配置结构
这些结构在通用驱动头文件中定义,当它对所有部分都是通用的数字。 当它们可以从一个零件号码转换到另一个时,结构是在每个零件号的扩展头文件中定义。
typedef struct
{uint32_t BaudRate; /*!< This member configures the UART communication baudrate.*/uint32_t WordLength; /*!< Specifies the number of data bits transmittedor 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 isenabled or disabled.*/uint32_t HwFlowCtl; /*!< Specifies wether the hardware flow control modeis enabled or disabled.*/uint32_t OverSampling; /*!< Specifies wether the Over sampling 8 isenabled or disabled,to achieve higher speed (up to fPCLK/8).*/
}UART_InitTypeDef;
配置结构用于初始化子模块或子实例。 看到下面的例子:
HAL_ADC_ConfigChannel (ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
2.3具体的工艺结构
特定的流程结构用于特定的流程(通用API),他们是在通用驱动头文件中定义。
例如:
HAL_PPP_Process (PPP_HandleTypeDef* hadc,PPP_ProcessConfig* sConfig)
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);
● 扩展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);
—-设备部件号特定的api:这些api在扩展文件,并由相对于给定部分的特定定义语句分隔号码。
#if defined (STM32F101xG) || defined (STM32F103x6)|| defined (STM32F103xB) ||
defined (STM32F105xC) || defined (STM32F107xC) || defined (STM32F103xE) || defined
(STM32F103xG) /* ADC multimode */
HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t
*pData, uint32_tLength);
HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef *hadc);
#endif
/* STM32F101xG || defined STM32F103x6 || defined STM32F103xB || defined STM32F105xC
|| defined STM32F107xC || defined STM32F103xE || defined STM32F103xG */
与特定API相关的数据结构由设备部分分隔数定义语句。 它位于相应的扩展头C中文件。
4 HAL驱动程序支持的设备
以下是来自st官网HAL库手册的图片,详细的说明了HAL库中的驱动程序文件所支持的芯片型号。
以上就是STM32F1xx HAL库驱动程序概述的前4小节内容,剩下的部分将在综合概述(二)和综合概述(三)中更新。
第一次发文,希望大家多多支持,一起学习,一起进步!!!