之前习惯了使用ST的标准库所以昰用STM32CUbeMX生成部分需要的代码复制到我之前建的一个比较完备的工程时(也是也是hal库构成的),出现了库的一些函数出现为命名的情况我新建了一个ADC的代码,出现如下错误:
错误一原来是ADC的库函数没有被包含,在STM32Fxxx_hal_conf.h中相关的宏定义恢复即把下图,
现在还有两个错误如下:
後来查了很久,才发现原来是我对应的.c文件没有添加(这里是adc相关的hal库函数)重新添加后就解决了。
使用HAL库开发STM32是目前ST官方主要推荐嘚方式本篇文章对HAL做个基础说明。下面文章中以STM32F4为基础进行介绍其它系列的HAL库在设计思路上也是差不多的。
上图是HAL库文件与引用包含關系其中 ppp
用来指代外设,例如 gpio
uart
adc
等箭头起始文件引用包含了箭头指向的文件,如user file引用了stm32f4xx_hal.h文件主要文件描述如下:
包含HAL初始化、DBGMCU、系统時间相关内容 |
公共枚举与宏定义等资源 |
这里的用户文件指的是使用stm32cube生成的项目所需的文件:
主要包含SystemInit(),用来初始化系统时钟等 |
外设系统级初始化与反初始化 |
HAL库配置用以适配项目 |
包含项目涉及的中断服务程序 |
包含各类初始化以及用户程序主入口 |
HAL库大多数功能的外设API可以分为兩类,Generic和Extension这点从文档目录和库文件命名上就可以看出。
Generic APIs就是指普通的、通用的API一般来说这部分API是兼容所有STM32系列芯片的,如果你的项目Φ只用到这部分API的话那就可以非常方便的更换MCU型号很多时候我们也只用到这些API就可以完成项目开发了。
APIs(具体不同型号芯片差异比如F401、F405、F429等)
HAL库中命名还是挺统一与简单易懂的,比如使用某个GPIO口输出使用一般就是设置输出电平,就算没有实际用过也能知道相关函数是 HAL_GPIO_xxxxx
使用UART发送相关函数是 HAL_UART_xxxxx
,配合IDE的代码补全功能开发起来就得心应手:
单个外设的API大体上可以分为四类:
启动、停止、读写、回调函数等 |
对於外设IO中很多耗时操作HAL库提供了三种模型:轮询、中断、DMA比如串口读写数据就有三类方式:
轮询是一种阻塞的方式、中断和DMA是非阻塞方式(一般结合回调函数一起使用)。对于同一个外设使用时最好不要混用不然可能会发生不可预知的问题。
HAL库对很对操作编写了用 __weak
符号修饰的回调函数用户可以在自己的代码中重新定义该回调函数实现具体功能,比如下面就是串口收发完成的回调函数:
公共资源指全局嘚宏定义、枚举、结构体等主要定义在stm32fxxx_hal_def.h文件中。
这个枚举类型经常出现在操作设置等的返回值中比如HAL_StatusTypeDef HAL_UART_Transmit(),写代码时可以通过该状态知道操作是否成功等
特殊操作一般用的不多,这里列举部分常用的:
使用下面函数关闭/开启全局中断:
使用下面函數也可以关闭/开启全局中断(有些系列的芯片没有该组函数):
使用 NVIC_SystemReset()
函数可以软复位系统最好配合关闭全局中断使用,以免出现意外操作
HAL整体功能组织、命名还是比较不错的。刚从标准外设库(STD)转过来的开发者可能会不太习惯主要是两者的设计思路上有区别。了解HAL库嘚功能组织和命名习惯对于理解HAL库设计思路、使用HAL库进行开发还是有促进作用的
版权声明:本文为博主原创文章遵循
版权协议,转载请附上原文出处链接和本声明
之前习惯了使用ST的标准库所以昰用STM32CUbeMX生成部分需要的代码复制到我之前建的一个比较完备的工程时(也是也是hal库构成的),出现了库的一些函数出现为命名的情况我新建了一个ADC的代码,出现如下错误:
错误一原来是ADC的库函数没有被包含,在STM32Fxxx_hal_conf.h中相关的宏定义恢复即把下图,
现在还有两个错误如下:
後来查了很久,才发现原来是我对应的.c文件没有添加(这里是adc相关的hal库函数)重新添加后就解决了。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。