外设驱动框架
驱动源文件结构
驱动源文件分为两部分
外设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参与,以中断回调的方式通知传输完成。