外设驱动框架

驱动源文件结构

驱动源文件分为两部分

  • 外设IP相关,在peripheral目录下,包括外设模块寄存器声明,HAL功能源码和API接口文件

  • 芯片平台相关,在soc目录下,包括外设基地址定义和外设MSP(MCU Specific Package)源文件

同一外设IP在不同芯片平台下,功能特性保持一致,而其复位、时钟、芯片级中断控制及入口各不相同。所以同一外设,不同芯片平台下,其功能逻辑代码使用同一份,而芯片级支持代码则因芯片而异,分散在各自芯片目录下。

HAL驱动

HAL驱动提供了外设常用功能的一种易用接口,可以使开发者更关注应用功能的实现,而非寄存器的具体配置。

IO复用初始化、反初始化

对于使用IO管脚的外设,在HAL驱动初始化之前和HAL驱动反初始化之后,分别需要调用IO外设复用功能初始化和反初始化。

IO外设复用功能初始化函数会将IO的复用功能配置为对应外设接口,并将该IO在GPIO状态下的输入输出配置为与对应外设接口输入输出一致的状态。

IO外设复用功能反初始化函数会将IO的复用功能配置恢复为GPIO。这样在IO复用反初始化后,芯片管脚输入输出维持不变,可确保芯片进入LP0后,IO不会因片内外设电源域掉电,而丢失状态,引起漏电。

HAL初始化、反初始化

初始化流程:

  • MSP初始化

    • 模块软件复位

    • 注册中断处理函数

    • 清除中断、使能中断

    • 开启模块时钟

  • 忙状态置位

  • 外设模块寄存器初始化、全局状态初始化

反初始化流程:

  • MSP反初始化

    • 关闭模块时钟

    • 禁用中断

  • 忙状态清零

数据传输类外设HAL驱动接口

典型的数据传输类外设包括UART、SPI、IIC。HAL库通常实现了轮询、中断和DMA三种传输接口。

轮询

阻塞传输,等待传输完成后,函数返回。

中断

函数调用后立刻返回,在中断里收发数据,以中断回调的方式通知传输完成。

DMA

函数调用后立刻返回,数据搬运由DMA负责,不需要CPU参与,以中断回调的方式通知传输完成。