上期讲述了开发通用外设之实战TIM的流程,让大家逐步深入了解如何开发通用外设的驱动。接下来将继续进行通用外设开发的实战篇,本次向大家介绍开发通用外设之GPIO。
按照如下步骤开发通用外设GPIO驱动:
了解通用外设标准接口层、外设硬件层开发、外设驱动层开发、外设用户配置文件开发。
图1 通用外设文件结构
标准层了解
1、标准接口相关类型定义
如下所示为GPIO的标准接口文件中对GPIO引脚功能、引脚模式、输出电平以及中断触发方式等的定义。
图2 GPIO标准接口文件宏定义
2、标准接口函数
如下所示为GPIO标准层的函数接口,通过传入引脚编号、配置功能标志、回调函数等对应的参数,即可实现GPIO引脚的功能配置。在了解GPIO外设标准层数据类型和接口函数之后,就明确了驱动层需要为标准层所提供的内容。
图3 GPIO标准层函数接口
外设HW层开发
HW层对应到具体的外设,其提供的API基本上是直接操作寄存器的内联函数。根据芯片手册来添加外设的寄存器列表;并编写寄存器相关操作的内联函数。以某款芯片的GPIO为例,如下所示为GPIO的寄存器列表,从而来明确各个寄存器的功能。
图4 GPIO寄存器列表
根据寄存器列表,我们了解并分析了各个寄存器功能以及要配置的各个功能,其他寄存器位该如何配合等。如下所示为GPIO寄存器结构体定义。
图5 GPIO寄存器块结构体定义
接下来编写每个寄存器的功能操作函数即可完成外设硬件层的开发。以GPIO的端口位清除寄存器brr为例,来编写该寄存器的硬件层函数接口,如下所示:
图6 GPIO_BRR寄存器操作函数
在每个寄存器的操作函数编写完毕后,可能硬件层的接口还有所欠缺,需要提供一些方便用户使用的简单的功能性函数。在后续开发时,若发现有需要,可以反过来再添加。
外设驱动层开发
1、定义设备信息结构体和设备结构体
驱动层首先应该搭建好相关结构,再去实现外设的功能函数。在AMetal中,每个设备都应该有与之对应的设备结构体和设备信息结构体。
设备结构体主要用于内存分配,与设备相关的变量都应该定义在设备结构体中。
设备信息结构体通常至少包含一个硬件层定义的指向寄存器基地址的指针类型成员,除此之外,还包含一些设备的初始化配置信息,如中断号、外设信息等成员。
图7 GPIO设备信息结构体和设备结构体定义
2、驱动函数实现
驱动函数主要包括两部分:一部分是提供给标准层的驱动函数,另一部分是面向用户的初始化、解初始化函数。
我们可根据标准接口层函数来搭建相应的GPIO外设的驱动层功能函数框架;进一步通过芯片用户手册中对应操作说明来完成GPIO的驱动层功能函数驱动。
如下所示为GPIO初始化函数和解初始化函数;初始化函数主要是为了初始化设备中的标准服务和硬件相关设置;解初始化函数是为了释放内存资源和硬件资源。
图8 GPIO初始化函数和解初始化函数
外设用户配置文件开发
开发完驱动层我们知道,用户使用一个外设的过程是,先调用驱动初始化函数,该函数返回一个handle,后续的所有操作,用户直接使用该handle作为参数调用标准接口层函数即可。
以某款芯片的GPIO为例,如下所示为GPIO的用户配置文件,主要包含设备信息结构体、设备实例结构体及其平台初始化函数与解初始化函数。
图9 GPIO用户配置文件
外设例程文件
外设的例程文件主要分为HW层示例和STD示例。
对于STD示例,调用标准层函数和实例初始化函数来实现外设功能。
对于HW示例,通过调用硬件层的函数完成相应的配置,以此实现功能。如下所示为通过硬件层驱动来实现按键切换LED状态的示例。
图10 GPIO_HW层示例
至此,我们完成了一个通用外设GPIO驱动的开发。
来源:立功科技
全部0条评论
快来发表一下你的评论吧 !