上期讲述了搭建工程让MCU在AMetal平台运行起来,为后续开发外设驱动奠定基础。接下来可以进入下一步的通用驱动外设开发工作,本次向大家介绍开发通用外设的一般流程与规范。
外设驱动开发的过程主要包括硬件层驱动函数的编写、驱动层函数的实现、通用示例程序的编写及其相关外设的配置文件开发。
图1 AMetal架构
基于AMetal驱动架构,带大家来了解一下通用外设驱动开发的主要流程,如下所示:
了解标准函数接口
对于通用MCU而言,AMetal提供了各个通用外设的标准层接口,开发者不需要额外开发,只需了解标准外设的接口函数即可。通用外设一般是多实例设备,标准接口层函数的第一个参数均为外设标准服务操作句柄handle。虽然标准函数接口不需要用户编写,但用户还是需要充分了解标准接口层,才能够清楚驱动层需要开发的内容——即如何实现函数接口等。AMetal提供的所有标准层驱动文件均在{SDK}\interface路径下,标准接口层包含的文件如下所示:
图2 标准接口层文件
通用外设硬件层开发
通过对标准层的了解,我们知道标准层实现的函数功能,以及需要驱动层提供的函数。但驱动层并不是凌空搭建的,驱动层介乎于HW层和标准接口层之间,简单来说就是调用HW层的函数来提供给标准层,所以在完成驱动层开发前,要先来实现HW层的接口函数。
HW层对应到具体的外设,其提供的API基本上是直接操作寄存器的内联函数,其效率最高,内联函数直接定义在.h文件中。硬件层中所有的符号及函数命名均以amhw_/AMHW_开头。通常情况下,HW层只有.h文件,只有当某些硬件功能设置较为复杂时,才提供对应的非内联函数,存放在.c文件中。
开发HW层前,我们需要根据芯片用户手册,来大概了解一下该芯片外设的寄存器。从而对外设功能有一定的了解之后再开始开发,其流程如下:
添加寄存器列表,以确保硬件层接口的完整和准确性;
编写寄存器相关操作函数:对该外设的所有寄存器提供操作函数;
查漏补缺:检查补充所需功能函数;
添加指向寄存器块的指针,方便用户或驱动层使用。
以ZLG116为例,如下图所示为开发通用外设过程中各个驱动文件所存放的位置。
图3 芯片外设驱动文件
外设驱动层开发
通过对标准接口层文件的分析与理解,清楚了驱动层需要为标准接口层提供哪些具体内容,加上驱动层本身应该提供给用户的初始化函数和解初始化函数。因此,外设驱动层需要编写的总体内容如下:
编写好标准接口层需要使用的基本函数;
驱动初始化函数;
驱动解初始化函数;
外设用户配置文件开发。
由于用户调用驱动层的初始化函数时,需要传入设备地址和设备信息地址作为参数。为了方便用户使用,我们需要将设备变量和设备信息常量定义好;从而用户调用驱动的初始化函数时,只需要使用已经定义好的设备变量和设备信息常量即可,不需要再额外定义。因此,我们把这个用于存放设备变量和设备常量信息和驱动初始化函数的文件称之为外设用户配置文件。通常情况下,AMetal平台为每一个外设均提供了一个独立的用户配置文件。
开发完驱动层我们知道,用户使用一个外设的过程是,先调用驱动初始化函数,该函数返回一个handle,后续的所有操作,用户直接使用该handle作为参数调用标准接口层函数即可。这样一来,可以实现数据与代码的分离,即达到驱动复用的效果。以I²C外设为例,在操作该外设时,四个I²C的操作方式完全一样,仅仅是引脚、中断号、寄存器基地址不同的区别而已:
图4 驱动的可复用性
外设例程文件开发
开发完驱动文件之后,最后是编写例程文件。例程文件开发主要分为两个部分:基于硬件层实现的HW例程、基于标准层实现的STD例程以及在板测试的板级例程。为了将外设所有的例程(包括HW例程和STD例程)统一管理,例程统一存放{SDK}\examples\board\xxx_core\peripheral_name路径。HW层的实现与标准层的实现,在文件上的命名,分别采用hw与std作为关键字。到了这一步,我们就需要依托硬件测试验证我们的代码功能,最终即可实现通用外设的开发。
以上就是基于AMetal开发通用外设的流程与规范的全部内容,相信大家熟悉了AMetal平台上开发MCU通用外设的流程。
全部0条评论
快来发表一下你的评论吧 !