硬件抽象层
硬件抽象层(HAL)是提供硬件服务而又不涉及太多硬件细节的层,为应用提供访问GPIO、UART、ADC等硬件的接口。
硬件抽象层文件目录
硬件抽象层文件目录包括HAL驱动和HAL相关文件的头文件,HAL文件存放在三个不同的目录下,如下图:
HAL Common文件夹
该文件夹包含协议栈、MAC和驱动中使用到的相关配置文件。其中“hal_drivers.c”文件包含所有驱动初始化及相关事件处理机制。主要包括以下三个函数:
1.Hal_Init() :它由“osalInitTasks”函数调用,以便在OSAL中注册HAL的驱动。
2.HalDriverInit():它由“main()”函数调用来初始化硬件驱动。大家可以根据需要在这里添加硬件相关的初始化,所有这些初始化工作会在协议栈开始运行时完成。
3.Hal_ProcessEvent():这个函数用来处理OSAL中HAL相关的驱动事件,例如按键、LED、LCD、蜂鸣器、休眠定时等。大家也可以根据自己的需求自定义HAL事件,需要注意的是,事件的ID必须是唯一的,并且要在“hal_driver.h”文件中定义。
HAL Include 文件夹
该文件夹包含HAL驱动及HAL相关文件的头文件。如下表:
HAL Target文件夹
该文件夹下的Drivers包含所有HAL驱动的“.c”文件。可以根据需要修改“.c”文件中的内容来适应不同的硬件平台。
硬件抽象层驱动编译
特定的驱动在编译的时候由特定的编译选项来控制,如果某个驱动不想编译,就将控制它的编译选项设置为“FALSE”,反之,设置为“TRUE”。下面罗列了部分驱动及编译选项的对应关系:
以SimpleBLEPeripheral工程为例,“Options->C/C++ Compiler->Preprocessor”选项卡中可以看到“Defined symbol”,里面就是预编译内容,通过键入“HAL_XXX=TRUE”,可以将对应的驱动加入编译;通过键入“HAL_XXX=FALSE”,可以将对应的驱动取消编译。如下:
自定义驱动
HAL驱动具有很大的灵活性,大家可以根据自己的需要修改现有的驱动或者添加自定义的驱动,以适应特定的需求。
当需要修改现有驱动时,应该遵循以下规则:
1.所有的Include中的头文件要保持不变,因为这些原型被程序其他部分使用,不能随意改变。
2.每个驱动程序的内容通过修改Drivers文件夹下面的“.c”文件来改变。
3.驱动硬件配置需要修改“hal_board_cfg.h”。
当需要添加新的驱动以适应不同的硬件平台时,应该遵循以下步骤添加:
1.在Include文件夹中增加新的头文件。
2.将新增的驱动内容添加到Drivers文件夹下面的“.c”文件中。
3.检查“hal_board_cfg.h”,查看GPIO等是否正确配置,如果管脚冲突或者不需要,可以按照前面说过的方法对不需要的驱动编出。
注意:在开发过程中,很多人会选取协议栈中的某个demo作为自己代码工程的起始版,比如,要做一个心率计的产品时,我们为了开发的进度和简易性,往往会选取协议栈中心率计的demo作为我们开发的软件工程的起始版。这个时候,大家一定要注意引脚的使用,除了根据自己产品的硬件设计对应相应的引脚之外,还要避免协议栈demo中对一些引脚的使用和初始化,有可能某个引脚我们用来采集数据,但是这个引脚却在按键驱动中被初始化并进行了设置,这个时候就会导致我们采集数据时出现问题。所以,在配置引脚时,最好在工程中全局搜索一下,将不符合自己硬件设计的引脚初始化及配置进行屏蔽或者删除。