STM32F1 HAL库笔记0

发布于:2024-09-05 ⋅ 阅读:(127) ⋅ 点赞:(0)

参考UM1850  Description of STM32F1 HAL and low-layer drivers

1、STM32Cube 包括:

        • STM32CubeMX,图形软件配置工具,使用图形向导生成 C 初始化代码。

        • 嵌入式软件平台,按系列提供(例如用于STM32F1的STM32CubeF1),包括:

        ——STM32Cube HAL,STM32抽象层嵌入式软件,确保在STM32产品组合中实现最大的可移植性。HAL API 可用于所有外围设备。

        ——低层 API (LL) 提供快速、轻量级、面向专家的层,比 HAL 更接近硬件。LL API 仅适用于一组外围设备。

        —— 一组一致的中间件组件,例如 RTOS、USB、TCP/IP 和图形。

        ——所有嵌入式软件实用程序,随附全套示例。

!!!以上的意思,写STM32的程序的方法是,通过使用STM32CubeMX生产初始代码,调用HAL APIs、LL APIs或者搭配RTOS来完成开发工作。有示例程序可参考的。

2、HAL的特征

        HAL针对功能模块,不是外设器件。啥意思?例如,一个USART 外设会存在这么几个模块:UART 驱动程序模块、USART 驱动程序模块、SMARTCARD 驱动程序模块和 IRDA 驱动程序模块。模块,在程序里理解为C语言数据结构struct,或者C++的类,使用时实例化为实例instance。

        API分为通用API和扩展API(也就是当初没设计,后来又设计了一些特殊功能)。

        三种 API 编程模型:轮询、中断和 DMA。(API里有不同的后缀区分)

        API 符合 RTOS 标准:完全可重入的 API (RTOS不同线程调用同一API,不会死锁);在轮询模式下系统地使用超时(阻塞延时,RTOS可以重新调度运行其它线程)。

        支持外设多实例,允许对给定外设的多个实例(USART1、USART2...)进行并发 API 调用。

        三种用户回调函数(写程序只用启动,然后写好回调函数就行):

                ——初始化外设 Init/DeInit回调函数,执行外设系统级初始化/取消初始化(一般操作这些:时钟、GPIO、中断、DMA)

                ——外设中断事件回调,中断处理函数里已经清除中断标志,直接写业务逻辑

                —— 错误事件回调

        对象锁定机制:安全的硬件访问,防止对共享资源的多次虚假访问。

        用于所有阻塞进程的超时:超时可以是简单的计数器或时基。超时和延时在HAL里很重要,一般默认为systick为时基。

3、HAL数据结构

        有三种,外设句柄结构、初始化和配置结构、处理流程结构。

        ——外设句柄结构:PPP_HandleTypeDef  *handle;每个外设/模块实例都有自己的句柄,实例资源是独立的。外设进程通信:句柄结构有通信资源,全局指针、DMA 句柄、状态机。存储:句柄可以有全局变量,存储数据。

        例子:usart句柄,可以实例化为USART1、USART2......结构体有发送接收过程的buffer,有DMA的句柄,状态机,出错控制等。还有初始化句柄。

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;

        多实例特性意味着应用程序中使用的所有 API 都是可重入的,例子???

        GPIO、SYSTICK、NVIC、PWR、RCC、FLASH这些共享外设,不适用句柄结构来描述,直接使用HAL函数。

        ——初始化和配置结构,这个好理解,例如UART_InitTypeDef、HAL_ADC_ConfigChannel (ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)。

        ——处理流程结构,例如:HAL_PPP_Process (PPP_HandleTypeDef* hadc,PPP_ProcessConfig* sConfig)。

4、API分类

        通用APIs

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);

        扩展APIs

系列特定API
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc, uint32_t Sing
leDiff); uint32_t HAL_ADCEx_Calibration_GetValue(ADC_HandleTypeDef* hadc, uint32_t S
ingleDiff);
指定型号API
HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_tLengt
h);
HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef *hadc);

未完待续


网站公告

今日签到

点亮在社区的每一天
去签到