## HAL层介绍 Hal层一方面是给MCU层提供统一的接口。还有如下几点作用: ①提供心跳时间的查询 ②提供微秒级和毫秒级延时函数 ③提供通讯接口的数据结构 ### 心跳时钟 使用BabyOS,需要给予一个心跳时钟。心跳时钟的频率在`_config/b_config.h`里定义`TICK_FRQ_HZ`,使用者自行实现一个定时器,并定时调用`bHalIncSysTick`。应用代码中可根据`bHalGetSysTick`获取心跳时钟计数值。 ### 延时函数 提供`bHalDelayMs`和`bHalDelayUs`两个阻塞型延时函数。毫秒级延时是通过心跳计算的。微妙级函数是通过for循环阻塞。`bHalInit`中会计算微秒级延时所用到的参数,以此尽量保证微秒级函数的精准性。 ### 通讯接口 HAL层提供通讯接口的数据结构: ```C //GPIO typedef struct { bHalGPIOPort_t port; bHalGPIOPin_t pin; } bHalGPIOInstance_t; //I2C typedef struct { uint8_t dev_addr; uint8_t is_simulation; union { bHalI2CNumber_t i2c; struct { bHalGPIOInstance_t clk; bHalGPIOInstance_t sda; } simulating_i2c; } _if; } bHalI2CIf_t; //SPI typedef struct { uint8_t is_simulation; union { bHalSPINumber_t spi; struct { bHalGPIOInstance_t miso; bHalGPIOInstance_t mosi; bHalGPIOInstance_t clk; uint8_t CPOL; uint8_t CPHA; } simulating_spi; } _if; bHalGPIOInstance_t cs; } bHalSPIIf_t; //UART typedef enum { B_HAL_UART_1, B_HAL_UART_2, .... B_HAL_UART_NUMBER } bHalUartNumber_t; //LCD typedef struct { union { uint32_t rw_addr; struct { bHalGPIOInstance_t data; bHalGPIOInstance_t rs; bHalGPIOInstance_t rd; bHalGPIOInstance_t wr; bHalGPIOInstance_t cs; } _io; struct { bHalGPIOInstance_t rs; bHalSPIIf_t _spi; } _spi; } _if; uint8_t if_type; // 0: _io 1: rw_addr 2: _spi } bLCD_HalIf_t; ```