HAL层介绍
Hal层一方面是给MCU层提供统一的接口。还有如下几点作用:
①提供心跳时间的查询
②提供微秒级和毫秒级延时函数
③提供通讯接口的数据结构
心跳时钟
使用BabyOS,需要给予一个心跳时钟。心跳时钟的频率在_config/b_config.h
里定义TICK_FRQ_HZ
,使用者自行实现一个定时器,并定时调用bHalIncSysTick
。应用代码中可根据bHalGetSysTick
获取心跳时钟计数值。
延时函数
提供bHalDelayMs
和bHalDelayUs
两个阻塞型延时函数。毫秒级延时是通过心跳计算的。微妙级函数是通过for循环阻塞。bHalInit
中会计算微秒级延时所用到的参数,以此尽量保证微秒级函数的精准性。
通讯接口
HAL层提供通讯接口的数据结构:
//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;