0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AMetal适配:以TIM为例来展示如何开发通用驱动外设代码

海阔天空的专栏 来源:立功科技 作者:立功科技 2022-05-12 17:08 次阅读

基于定时器、RTC、WDT本质上均是计数器的共性,本次将这三种通用外设统一为TIM。以TIM为例,来展示如何开发通用驱动外设代码。对于AMetal所提供的标准层驱动文件,均存放于ametal\interface路径下。

如下图所示,开发通用外设驱动主要包含以下步骤:了解通用外设标准接口层、外设硬件层开发、外设驱动层开发、外设用户配置文件开发、外设例程文件开发。

poYBAGJ8zF6AYggjAAEZC_YKIIg997.png

图1 通用外设文件结构

了解通用外设标准层

1、通用外设标准接口相关类型定义

以WDT为例,如下所示为WDT的标准接口文件中对每个结构体和handle的详细介绍。

poYBAGJ8zIGALf0_AACXP2U9aZQ008.png

图2WDT标准接口文件结构体定义

以此类推,对于定时器和RTC,其标准接口文件中均定义了驱动函数结构体、标准服务结构体和外设标准服务操作句柄。

struct am_xxx_drv_funcs结构体

该驱动函数结构体表明了驱动层应该提供对应的函数;

typedef struct am_xxx_serv结构体

该标准服务结构体定义了标准的通用外设服务,从而包含了需要驱动层为标准接口层提供的全部内容。驱动层就只需定义这样一个结构体变量,然后赋好相应的值,再以某种方式提供给标准接口层即可。

am_xxx_handle_t的定义

这是一个标准的操作句柄,本质上就是标准服务结构体指针类型,驱动层的初始化函数需要返回该类型的handle给用户。当用户在使用标准接口层函数时,就可以将获取到的handle传递给标准层。那么,标准接口层就可以通过该handle访问到驱动层提供的函数了。

2、标准接口函数

以WDT为例,如下所示为WDT标准接口函数,通过内联函数来实现。这些函数就只是简单地调用驱动层提供的函数,本身并没有做什么事情。每个函数都有对应详细的注释,传入参数和返回值。从中可以看到,在调用驱动层提供的函数时,就是将外设标准服务操作句柄(本质上为标准服务结构体)中的p_drv成员作为第一个参数传递。

pYYBAGJ8zM6AYbo3AADe5vWJxAs584.png

图3WDT标准接口函数

外设HW层开发

HW 层对应到具体的外设,其提供的API基本上是直接操作寄存器的内联函数,效率最高,内联函数直接定义在.h 文件中。根据芯片手册,来添加外设的寄存器列表;并编写寄存器相关操作的内联函数。以某款芯片的WDT为例,如下所示为WDT的寄存器列表,从而来明确各个寄存器的功能。

poYBAGJ8zRKAEZWHAABFIsY0h1k150.png

图4WDT寄存器列表

根据寄存器列表,了解了各个寄存器需要配置的各项功能和其他寄存器位该如何配合等。如下所示为WDT寄存器结构体定义。

poYBAGJ8zUOAGc6wAAAipFDdAEY854.png

图5WDT寄存器块结构体定义

接下来需要编写每个寄存器的功能操作函数即可完成外设硬件层的开发。以WDT的控制寄存器cr为例,来编写该寄存器的硬件层函数接口,如下所示:

poYBAGJ8zWmATwQiAABU7VxlcfI928.png

图6WDT_CR寄存器操作函数

对于定时器、RTC的硬件层驱动开发亦是通过芯片手册来编写寄存器操作函数来完成驱动。

外设驱动层开发

1、定义设备信息结构体和设备结构体

在AMetal中,每个设备都应该有与之对应的设备结构体和设备信息结构体。设备结构体主要用于内存分配,与设备相关的变量都应该定义在设备结构体中。设备信息结构体主要包含该设备的一些相关信息。

pYYBAGJ8zYyAXhy1AABfaxRBxX0382.png

图7 WDT设备信息结构体和设备结构体定义

2、驱动函数实现

驱动函数主要包括两部分:提供给标准层的驱动函数和初始化、解初始化函数。

以WDT为例,如下所示为WDT外设的驱动层应该给标准接口层提供的函数,按照芯片手册中对应操作说明来完成看门狗的驱动层函数。

pYYBAGJ8zamAM-vuAABDAp1hnqs470.png

图8WDT提供给标准层函数定义

如下所示为WDT初始化函数和解初始化函数;初始化函数主要是为了初始化设备中的标准服务和硬件相关设置;解初始化函数是为了释放内存资源和硬件资源。

pYYBAGJ8zcuAPBCJAABZM1BE3-8482.png

图9 WDT初始化函数和解初始化函数

对于定时器和RTC的驱动层开发,其大致流程亦是如此。

外设用户配置文件开发

开发完驱动层我们知道,用户使用一个外设的过程是,先调用驱动初始化函数,该函数返回一个handle,后续的所有操作,用户直接使用该handle作为参数调用标准接口层函数即可。

以某款芯片的 WDT为例,如下所示为WDT的用户配置文件,主要包含设备信息结构体、设备实例结构体及其平台初始化函数与解初始化函数。定义好变量和函数后,在头文件中添加函数声明。用户在使用时,只需调用外设实例初始化函数,并保存其返回的handle,后续直接使用该handle作为标准接口的第一个参数来调用标准接口函数即可。

poYBAGJ8zfWAcY5cAACMWlSQyx4011.png

图10WDT用户配置文件

对于定时器和RTC的用户配置文件,配置其对应的设备信息,添加平台初始化函数与解初始化函数即可。

外设例程文件开发

外设的例程文件主要分为HW层示例和STD示例。

对于STD示例,调用标准层函数和实例初始化函数返回的handle作为参数传入,来实现外设功能。

对于HW示例,可参考驱动层函数来添加硬件层示例功能函数,最终实现外设功能。

至此,我们完成了一个通用外设驱动的开发。

来源:立功科技

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Tim
    Tim
    +关注

    关注

    0

    文章

    76

    浏览量

    17710
  • ametal
    +关注

    关注

    2

    文章

    24

    浏览量

    11352
收藏 人收藏

    评论

    相关推荐

    【HAL库每天一】第014TIM-通用定时器定时

    /1i574oPv 密码:r3s3(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-014. TIM-通用定时器定时
    发表于 05-19 08:53

    【HAL库每天一】第017TIM-通用定时器呼吸灯

    /1i574oPv 密码:r3s3(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-017. TIM-通用定时器呼吸灯
    发表于 05-22 10:42

    【HAL库每天一】第018TIM-通用定时器输入捕获(脉冲测量)

    /1i574oPv 密码:r3s3(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\TIM-通用定时器输入捕获(脉冲测量
    发表于 05-23 08:48

    redhat的github使用

    github上有许多开源的项目,你可以把代码下下来学习研究。或者你也可以自己创建个项目,用github做版本管理,比svn用起来方便多了啊。下面redhat
    发表于 07-16 06:07

    灵动微电子MM32 MCU正式入驻AMetal平台

    科技基于AMetal平台灵动微电子MM32 MCU适配了底层驱动及标准接口,用户使用时,可以完全脱离用户手册及繁杂的寄存器操作,直接调用AMeta
    发表于 01-16 11:38

    灵动微课堂 (第122讲) | 基于MM32 MCU的OS移植与应用:AMetal平台新建工程

    再重新发明轮子。我们今天将和大家一起实战操作基于立功科技的AMetal平台的MM32 MCU的新建工程。立功科技基于AMetal平台灵动微电子MM32 MCU适配了底层
    发表于 05-22 17:04

    灵动微课堂 (第123讲) | 基于MM32 MCU的OS移植与应用:AMetal LED灯控制

    快速开发应用程序。便于用户快速熟悉 AMetal,本节将以一个简单的示例——LED 闪烁展示运行一个应用程序需要经历的一些基础步骤。工
    发表于 05-28 16:19

    灵动微课堂 (第123讲) | 基于MM32 MCU的OS移植与应用:AMetal LED灯控制

    快速开发应用程序。便于用户快速熟悉 AMetal,本节将以一个简单的示例——LED 闪烁展示运行一个应用程序需要经历的一些基础步骤。工
    发表于 05-28 16:19

    TIM2通用定时器进行初始化

    本文章STM32F407ZGTx:STM32F407一共有14个定时器,其中有两个基本定时器(TIM6和TIM7)、十二个
    发表于 08-23 07:49

    linux 5.4.31介绍一下linux内核目录结构

    ,它是Linux内核的概述和编译命令说明。readme的说明更加针对X86等通用的平台,对于某些特殊的体系结构,可能有些特殊的地方。内核源码很复杂,包含多级目录,形成一个庞大的树状结构,通常称为Linux源码目录树。本章节linux 5.4.31
    发表于 02-16 07:30

    API设备驱动管理层与外设驱动适配层标准接口设计实现

    1、API 设备驱动管理层与外设驱动适配层标准接口实现bl_mcu_sdk 代码层次结构主要分为以下几层应用层:由用户自己编写的
    发表于 07-14 17:41

    SPI驱动展示如何使用ENV工具对BSP进行配置

    、SDIO、ADC 等,但是 BSP 工程默认没有开启这些外设驱动。RT-Thread 提供了 ENV 工具开启或关闭 BSP 的外设驱动
    发表于 07-15 10:55

    AMetal开发通用外设的流程与规范

    上期讲述了搭建工程让MCU在AMetal平台运行起来,为后续开发外设驱动奠定基础。接下来可以进入下一步的通用
    的头像 发表于 04-27 16:58 1465次阅读
    <b class='flag-5'>AMetal</b><b class='flag-5'>开发</b><b class='flag-5'>通用</b><b class='flag-5'>外设</b>的流程与规范

    AMetal开发通用外设GPIO驱动开发

    上期讲述了开发通用外设之实战TIM的流程,让大家逐步深入了解如何开发通用
    的头像 发表于 05-31 17:28 1750次阅读

    AMetal代码仓库使用说明

    本文档简述了 AMetal 代码仓库的使用、 TortoiseGit 的使用以及版本控制等。AMetal 是芯片级的裸机软件包,定义了跨平台的通用接口(使得基于
    发表于 10-12 16:06 1次下载