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

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

3天内不再提示

no-OS及平台驱动程序的了解和使用

li5236 来源:ADI 作者:ADI 2022-04-12 14:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

快速发展的技术需要软件支持(固件驱动程序和代码示例)来简化设计导入过程。本文介绍如何利用no-OS(无操作系统)驱动程序和平台驱动程序来构建ADI公司精密模数转换器数模转换器的应用固件,这些器件在速度、功耗、尺寸和分辨率方面提供高水平的性能。

ADI公司提供基于no-OS驱动程序的嵌入式固件示例来支持精密变换器。no-OS驱动程序负责器件配置、转换器数据采集、执行校准等,而基于no-OS驱动程序的固件示例则便于将数据传输到主机进行显示、存储和进一步处理。

no-OS和平台驱动程序简介

顾名思义,no-OS驱动程序设计用于通用(或无特定)操作系统。该名称还意味着这些驱动程序可以用在没有任何OS支持的裸机(BareMetal)系统上。no-OS驱动程序旨在为给定精密转换器的数字接口访问提供高级API。no-OS驱动程序使用器件的这些API接口访问、配置、读取、写入数据,而无需知道寄存器地址(存储器映射)及其内容。

no-OS驱动程序利用平台驱动程序层来支持跨多个硬件/软件平台复用相同的no-OS驱动程序,使固件高度可移植。平台驱动程序层的使用将no-OS驱动程序隔绝开来,后者无需知道平台特定接口(如SPI、I2C、GPIO等)的低级细节,因此no-OS驱动程序不需要修改就能跨多个平台复用。

poYBAGJVHGWAKAETAABC-YEmmMs388.jpg

图1.精密转换器固件协议栈

使用no-OS驱动程序

图2显示了no-OS驱动程序的典型代码结构。

pYYBAGJVHGWAKKmoAABOxRt7JJA320.jpg

图2.no-OS驱动程序代码结构

poYBAGJVHGWAb1iuAABNRtCvkX8998.jpg

图3.器件配置枚举、结构和API

精密转换器的no-OS驱动程序代码通常包含在两个以C编程语言编写的源文件中:adxxxx.c和adxxxx.h,其中xxxx代表器件名称(例如AD7606、AD7124等)。器件头文件(adxxxx.h)包含器件特定结构、枚举、寄存器地址和位掩码的公共编程接口,将此文件包含到所需的源文件中便可使用这些公开访问接口。器件源文件(adxxxx.c)包含接口的实现,用于初始化和移除器件、读/写器件寄存器、从器件读取数据、获取/设置器件特定参数等。

典型的no-OS驱动程序围绕一组常见功能来构建:

►器件特定寄存器地址、位掩码宏、器件配置枚举、读/写器件特定参数(如过采样、增益、基准电压等)的结构的声明。

►通过no-OS驱动程序的器件初始化/移除函数以及器件特定的初始化和驱动程序结构与描述符初始化物理器件/解除器件初始化。

►使用器件寄存器读/写函数访问器件存储器映射或寄存器详细信息,例如adxxxx_read_register()或adxxxx_write_register()。

no-OS驱动程序代码使用

使用器件特定地址、位掩码、参数配置枚举和结构:

如前所述,adxxxx.h头文件包含所有器件特定枚举和结构的声明,这些枚举和结构被传递到器件特定的函数或API以配置或访问器件参数。具体情况如图3所示。

图3中显示的adxxxx_config结构允许用户选择多路复用器通道并为其设置过采样率。此结构的成员(afe_mux_channel和oversampling)是存在于同一头文件中的枚举,其包含这两个字段的所有可能值的数字常量,用户可以选择。

adxxxx.c文件中定义的adxxxx_set_adc_config()函数通过配置结构获取用户传递的配置/参数,并进一步调用adxxxx_spi_reg_write()函数,通过数字接口(在上例中是SPI)将数据写入ADXXXX_REG_CONFIG器件寄存器。

使用no-OS驱动程序结构和初始化函数初始化器件:

pYYBAGJVHGWAZx2tAABL2bYDErw095.jpg

图4.器件初始化和驱动程序结构的声明

除了器件配置枚举和结构之外,no-OS驱动程序还提供以下两个结构:

►器件初始化结构。

►设备驱动程序结构。

器件初始化结构允许用户在用户应用程序代码中定义器件特定的参数和配置。初始化结构包含其他器件特定的参数结构和枚举的成员。图5显示了器件初始化结构的定义。

器件驱动程序结构通过器件初始化函数adxxxx_init()加载器件初始化参数。器件驱动程序结构是在运行时(动态)从堆空间中分配内存。器件驱动程序结构和器件初始化结构中声明的参数几乎完全相同。器件驱动程序结构是器件初始化结构的运行时版本。

以下步骤说明典型的器件初始化函数和初始化流程:

►第1步:在应用程序中创建器件初始化结构的定义(或实例)(例如struct adxxxx_init_params),以初始化用户特定的器件参数和平台相关的驱动程序参数。参数在编译期间定义。

注意:初始化结构中定义的参数因器件而异。

poYBAGJVHGWAcvjwAAAQnW7dm7I922.jpg

►第2步:在应用程序代码中创建器件驱动程序结构的指针实例(变量)。

用户应用程序需要创建器件驱动程序结构的单个指针实例。将此实例传递给所有no-OS驱动程序API/函数以访问器件特定参数。应用程序代码中定义的此指针实例指向堆中动态分配的内存,这是通过no-OS驱动程序中定义的器件初始化函数(如adxxxx_init())完成的。

pYYBAGJVHGWAWlyaAAASbpghT_4661.jpg

►第3步:调用器件初始化函数以初始化器件和其他平台特定的外设。

pYYBAGJVHGWAJUOJAAAsT4pHePE463.jpg

no-OS驱动程序中定义的adxxxx_init()函数用adxxx_init_param结构传递的用户特定参数初始化器件。器件驱动程序结构的指针实例和器件初始化结构的实例作为两个参数传递给此初始化函数。用户应用程序代码可以多次调用adxxxx_init()函数,只要调用初始化函数之后再调用器件移除函数来平衡。

通过器件寄存器读/写函数访问存储器映射(寄存器内容)如图6所示

用户可以通过no-OS驱动程序器件特定的adxxx_read/write()函数访问器件寄存器内容(例如产品ID、暂存区值、OSR等)。

大多数情况下,用户不会直接使用寄存器访问函数。器件特定的函数通过这些寄存器访问函数(如adxxxx_spi_reg_read/write())来调用。如果可能,建议使用器件配置和状态API来访问器件存储器映射,而不要使用直接寄存器访问函数,因为这样能确保器件驱动程序结构与器件中的配置保持同步。

平台驱动程序

平台驱动程序是包装平台特定API的硬件抽象层(HAL)之一。它们由no-OS器件驱动程序或用户应用程序代码调用,使后者可以独立于底层硬件和软件平台。平台驱动程序包装了平台特定的低级硬件功能,例如SPI/I2C初始化和读/写、GPIO初始化和读/写、UART初始化和接收/发送、用户特定的延迟、中断等。

poYBAGJVHGWAHsrcAABAc03-L9Q171.jpg

图5.用户应用程序中的器件初始化结构定义

pYYBAGJVHGWANg5NAAA3XhKTKaU502.jpg

图6.访问寄存器内容

SPI平台驱动程序模块的典型文件结构如图7所示。

使用平台驱动程序

平台驱动程序代码通常包含在以C/C++编程语言编写的三个源文件中。

1) spi.h:这是一个与平台无关的文件,包含SPI功能所需的器件结构和枚举。此头文件中定义的C编程接口没有平台依赖性。

初始化和器件结构中声明的所有参数对任何平台上的SPI接口都是通用的。

器件初始化结构中使用的void *extra参数允许用户传递额外的参数,这些参数可以是所用平台特定的。

SPI驱动程序结构和SPI初始化结构中声明的参数几乎完全相同。SPI驱动程序结构是SPI初始化结构的运行时版本。

2) spi.cpp/.c:此文件包含spi.h文件中声明的函数的实现,这些函数用于初始化特定平台的SPI外设以及读/写数据。广义的“平台”是指硬件微控制器(目标器件)和软件(如RTOS或Mbed-OS)的组合。此文件依赖于平台,移植到其他平台时需要修改。

图9详细说明了Mbed平台的SPI接口,并显示了如何使用这些接口和器件初始化/驱动程序结构来初始化SPI和读/写数据。

poYBAGJVHGWAfkn2AAA5o9vQyC0051.jpg

图7.SPI平台驱动程序代码结构

pYYBAGJVHGaAbiGeAAA9ZVL9Tz0942.jpg

图8.SPI初始化和驱动程序结构

poYBAGJVHGaAMdOkAABH4mQQqJw347.jpg

图9.SPI API或函数注意:增加的spi_init()和spi_write_and_read()代码是节略代码,

为清楚起见而省略了细节。

pYYBAGJVHGaAbYy_AAA6OndrnWk685.jpg

图10.SPI额外的初始化和驱动程序结构

3) spi_extra.h:此文件包含其他器件结构或枚举,其特定于给定平台。它允许用户应用程序代码提供通用spi.h文件中未涉及的配置。例如,SPI引脚可能随平台而异,因此可以作为这些平台特定的额外结构的一部分添加。

移植平台驱动程序

平台驱动程序可以从一个平台(微控制器)移植到另一个平台;若要移植,通常需要创建平台特定的.cpp/.c和_extra.h文件。平台驱动程序驻留在微控制器单元供应商提供的器件特定硬件抽象层(HAL)之上的一层。因此,为将平台驱动程序从一个平台移植到另一个平台,与调用供应商提供的HAL中存在的函数或API相关的平台驱动程序代码需要做一些细微改动。

图12区分了基于Mbed的SPI平台驱动程序和ADuCM410 SPI平台驱动程序。

ADI no-OS存储库和平台驱动程序的GitHub源代码链接可在ADI公司Wiki和GitHub页面上找到。

为no-OS驱动程序做贡献

ADI no-OS驱动程序已开源并托管在GitHub上。驱动程序不仅支持精密转换器,也支持许多其他ADI产品,如加速度计、收发器光电器件等。任何熟悉源代码的人都可以为这些驱动程序做贡献,方式是提交变更和创建拉取请求来审核这些变更。

有许多示例项目可以在Linux和/或Windows环境中运行。许多示例项目是用硬件描述性语言(HDL)开发的,以便在Xilinx®、Intel®等公司开发的FPGA以及由不同供应商开发的目标处理器上运行。

如需无操作系统的系统的no-OS软件驱动程序(用C编写),请访问ADI公司no-OS GitHub存储库。

ADI公司Wiki页面提供了使用Mbed和ADuCMxxx平台为精密转换器开发的示例。

poYBAGJVHGaAHA3BAABvio1saXQ195.jpg

图11.Mbed平台特定的SPI初始化实现

pYYBAGJVHGaATCyfAABeE33tMj8987.jpg

图12.平台驱动程序差异

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

    关注

    27

    文章

    9365

    浏览量

    155102
  • 数据采集
    +关注

    关注

    40

    文章

    7800

    浏览量

    119833
  • 驱动程序
    +关注

    关注

    19

    文章

    868

    浏览量

    49953
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为FreeRTOS增加新的设备驱动程序

    如果你正在使用FreeRTOS构建嵌入式系统,并且考虑添加新的设备驱动程序,那么这篇文章很适合你。高效的设备集成不仅仅是让设备功能正常运行——更关乎模块化、可靠性和安全性。
    的头像 发表于 08-06 15:44 737次阅读
    为FreeRTOS增加新的设备<b class='flag-5'>驱动程序</b>

    zephyr设备驱动程序模型

        1:Zephyr 内核支持多种设备驱动程序驱动程序是否可用取决于board 和驱动程序。 Zephyr 设备模型为配置作为系统一部分的驱动程序提供了一致的设备模型。设备型号负
    的头像 发表于 07-29 10:34 461次阅读
    zephyr设备<b class='flag-5'>驱动程序</b>模型

    Linux环境再升级:PLIN驱动程序正式发布

    PLIN驱动程序现已正式发布,本文将展示如何安装PLIN驱动程序,以及如何在Linux环境下进行基本的PLIN通信操作,确保您能够快速掌握并应用这一新工具。
    的头像 发表于 04-21 15:29 792次阅读
    Linux环境再升级:PLIN<b class='flag-5'>驱动程序</b>正式发布

    RTC芯片有Linux PCA2131驱动程序吗?

    RTC 芯片有 Linux PCA2131驱动程序吗? 1) 如果没有,我可以使用任何兼容的驱动程序驱动这个 RTC 芯片吗? 2) 如果是,我在哪里可以找到它?
    发表于 03-31 06:22

    适用于SQLite的dbExpress数据库驱动程序

    驱动程序作为独立库。由于数据访问层薄而简单,dbExpress 提供高性能数据库连接性,并且更加易于部署。 适用于 SQLite 的 dbExpress 驱动程序提供对 SQLite 数据库的直接高性能访问。 与 SQLite 的原生连接 基
    的头像 发表于 02-09 09:45 763次阅读

    AN3761-KSZ DSA驱动程序的使用

    电子发烧友网站提供《AN3761-KSZ DSA驱动程序的使用.pdf》资料免费下载
    发表于 01-22 16:28 0次下载
    AN3761-KSZ DSA<b class='flag-5'>驱动程序</b>的使用

    用于InterBase的ODBC驱动程序:可与多个第三方工具兼容

    用于 InterBase 的 ODBC 驱动程序 Devart ODBC Driver for InterBase 是一款高性能连接工具,具有企业级功能,可在 32 位和 64 位 Windows
    的头像 发表于 01-22 09:57 835次阅读
    用于InterBase的ODBC<b class='flag-5'>驱动程序</b>:可与多个第三方工具兼容

    摩尔线程发布图形显卡驱动程序v280.90.2

    1月20日,摩尔线程发布最新图形显卡驱动程序v280.90.2。
    的头像 发表于 01-21 10:07 881次阅读

    适用于MySQL的dbExpress驱动程序:提供对MySQL的快速访问

    (包括社区版)快速访问 MySQL,以及 macOS(32 位和 64 位)和 Linux(64 位)平台。对于此服务器,dbExpress 将驱动程序作为实现通用 dbExpress 的独立库,提供用于
    的头像 发表于 01-21 09:52 668次阅读

    适用于Oracle的ODBC驱动程序

    适用于 Oracle 的 ODBC 驱动程序 Devart ODBC Driver for Oracle 是一种高性能连接解决方案,具有企业级功能,可用于从32位和64位 Windows、macOS
    的头像 发表于 01-13 09:17 848次阅读

    适用于Oracle的dbExpress驱动程序

    (包括社区版)快速访问 Oracle macOS(32 位和 64 位)和 Linux(64 位)平台。对于此服务器,dbExpress 将驱动程序作为实现通用 dbExpress 的独立库提供 用于
    的头像 发表于 01-09 16:04 684次阅读
    适用于Oracle的dbExpress<b class='flag-5'>驱动程序</b>

    EE-315:更改Blackfin处理器以太网驱动程序中的PHY

    电子发烧友网站提供《EE-315:更改Blackfin处理器以太网驱动程序中的PHY.pdf》资料免费下载
    发表于 01-07 14:15 0次下载
    EE-315:更改Blackfin处理器以太网<b class='flag-5'>驱动程序</b>中的PHY

    DRV8601ZQVEVM ERM/LRA驱动程序评估模块

    电子发烧友网站提供《DRV8601ZQVEVM ERM/LRA驱动程序评估模块.pdf》资料免费下载
    发表于 12-23 15:04 0次下载
    DRV8601ZQVEVM ERM/LRA<b class='flag-5'>驱动程序</b>评估模块

    USB音频过滤器驱动程序安装

    电子发烧友网站提供《USB音频过滤器驱动程序安装.pdf》资料免费下载
    发表于 12-19 14:28 0次下载
    USB音频过滤器<b class='flag-5'>驱动程序</b>安装

    AT32F403A_407固件库驱动程序发行说明

    电子发烧友网站提供《AT32F403A_407固件库驱动程序发行说明.zip》资料免费下载
    发表于 12-10 15:57 3次下载