快速发展的技术需要软件支持(固件驱动程序和示例代码)来简化过程中的设计。本文介绍如何使用no-OS(无操作系统)驱动程序和平台驱动程序,通过ADI公司的精密模数转换器和数模转换器构建应用固件,这些转换器在速度、功耗、尺寸和分辨率方面具有高水平的性能。
ADI提供基于no-OS驱动程序的嵌入式固件示例,以支持精密转换器。No-OS驱动程序负责设备配置、从转换器捕获数据、执行校准等,而基于no-OS驱动程序的固件示例有助于将数据传输到主机PC进行显示、存储和进一步处理。
无操作系统和平台驱动程序简介
顾名思义,no-OS 驱动程序旨在与通用(或无特定)操作系统一起使用。该名称还意味着这些驱动程序可以在没有任何操作系统支持的情况下在裸机系统上使用。No-OS驱动程序旨在为给定精密转换器的数字接口访问提供高级API。使用这些 API 的 No-OS 驱动程序与设备接口,以访问、配置、读取和写入数据,而无需了解寄存器地址(内存映射)及其内容。
No-OS驱动程序利用平台驱动程序层,允许在多个硬件/软件平台上重复使用相同的no-OS驱动程序,从而使您的固件具有高度可移植性。使用平台驱动程序层使无操作系统驱动程序无法了解平台特定接口(如 SPI、I 等)的低级细节2C、GPIO 等,这使得无操作系统驱动程序可以在多个平台上重用,而无需更改它们。
图1.精密转换器固件堆栈。
使用无操作系统驱动程序
图 2 显示了无操作系统驱动程序的典型代码结构。
图2.无操作系统驱动程序代码结构。
图3.设备配置枚举、结构和 API。
精密转换器的无操作系统驱动程序代码通常合并在两个用C编程语言编写的源文件中:adxxxx.c和adxxxx.h,其中xxxx代表器件名称(例如,AD7606、AD7124等)。器件头文件 (adxxxx.h) 包含器件特定结构、枚举、寄存器地址和位掩码的公共编程接口,通过将该文件包含在所需的源文件中,可供公众访问。器件源文件 (adxxxx.c) 包含用于初始化和移除器件、读/写器件寄存器、从器件读取数据、获取/设置器件特定参数等的接口实现。
典型的无操作系统驱动程序围绕一组通用功能构建:
声明器件特定的寄存器地址、位掩码宏、器件配置枚举以及用于读/写器件特定参数(例如,过采样、增益、基准等)的结构。
通过no-OS驱动程序的设备初始化/取消初始化物理设备初始化/删除函数以及设备特定的初始化和驱动程序结构和描述符。
使用设备寄存器读/写功能访问设备存储器映射或寄存器详细信息;例如,adxxxx_read_register() 或 adxxxx_write_register()。
无操作系统驱动程序代码使用
使用设备特定的地址、位掩码以及参数配置枚举和结构:
如前所述,adxxxx.h 头文件包含所有特定于器件的枚举和结构的声明,这些枚举和结构将传递给特定于器件的函数或 API 以配置或访问器件参数。如图 3 所示。
图3所示的adxxxx_config结构允许用户选择多路复用器通道并为其设置过采样速率。此结构的两个成员(afe_mux_channel和过采样)都是存在于同一头文件中的枚举,该文件包含用户可以选择的两个字段的所有可能值的数字常量。
adxxxx.c 文件中定义的 adxxxx_set_adc_config() 函数通过配置结构获取用户传递的配置/参数,并进一步调用 adxxxx_spi_reg_write() 函数,通过数字接口将数据写入ADXXXX_REG_CONFIG器件寄存器(在前一种情况下为 SPI)。
使用no-OS驱动程序设备结构和初始化功能初始化设备:
图4.设备初始化和驱动程序结构的声明。
除了设备配置枚举和结构外,no-OS 驱动程序还提供两个附加结构:
设备初始化结构。
设备驱动程序结构。
设备 init 结构允许用户在用户应用程序代码中定义特定于设备的参数和配置。init 结构包含其他特定于设备的参数结构和枚举的成员。图 5 显示了如何定义设备 init 结构。
图5.用户应用程序中的设备初始化结构定义。
设备驱动程序结构通过设备 init 函数 adxxxx_init() 加载设备初始化参数。设备驱动程序结构在运行时(动态)内存中从堆空间分配。在设备驱动程序结构和设备 init 结构中声明的参数几乎彼此相同。设备驱动程序结构是设备 init 结构的运行时版本。
典型的设备初始化函数和初始化流程如下所述:
步骤 1:在应用程序中创建设备 init 结构的定义(或实例)(例如结构 adxxxx_init_params),以初始化用户特定的设备参数和与平台相关的驱动程序参数。参数是在编译时定义的。
注意:init 结构中定义的参数因设备而异。
步骤 2:在应用程序代码中创建设备驱动程序结构的指针实例(变量)。
用户应用程序需要创建设备驱动程序结构的单个指针实例。此实例将传递给所有无操作系统驱动程序 API/函数,以访问设备特定的参数。应用程序代码中定义的此指针实例指向堆中动态分配的内存,该内存通过设备 init 函数(如 adxxxx_init())完成,该函数在 no-OS 驱动程序中定义。
第 3 步:通过调用设备 init 函数初始化设备和其他特定于平台的外设。
no-OS 驱动程序中定义的 adxxxx_init() 函数使用通过adxxx_init_param结构传递的用户特定参数初始化设备。设备驱动程序结构的指针实例和设备 init 结构的实例作为两个参数传递给此 init 函数。用户应用程序代码可以多次调用 adxxxx_init() 函数,前提是 init 调用通过调用设备删除函数来平衡。
通过器件寄存器读/写功能访问存储器映射(寄存器内容)如图6所示
图6.访问寄存器内容。
用户可以通过无操作系统驱动程序设备特定的adxxx_read/write()函数访问设备寄存器内容(如产品ID、暂存器值、OSR等)。
大多数情况下,用户不直接使用注册访问功能。设备特定函数通过这些寄存器访问函数(如 adxxxx_ spi_reg_read/write())调用。建议尽可能使用设备配置和状态 API 访问设备内存映射,而不是使用直接寄存器访问函数,因为这可确保设备驱动程序结构与设备中的配置保持同步。
平台驱动程序
平台驱动程序是包装特定于平台的 API 的硬件抽象层 (HAL) 之一。它们由无操作系统设备驱动程序或用户应用程序代码调用,以提供独立于底层硬件和软件平台的功能。平台驱动程序包装了特定于平台的低级硬件功能,如 SPI/I2C 初始化和读/写、GPIO 初始化和读/写、UART 初始化和接收/发送、用户特定的延迟、中断等。
SPI 平台驱动程序模块的典型文件结构如图 7 所示。
图7.SPI 平台驱动程序代码结构。
使用平台驱动程序
平台驱动程序代码通常合并在用 C/C++ 编程语言编写的三个源文件中。
1) spi.h:这是一个与平台无关的文件,其中包含 SPI 功能所需的设备结构和枚举。此标头中定义的 C 编程接口没有平台依赖项。
在 init 和设备结构中声明的所有参数对于任何平台上的 SPI 接口都是通用的。
设备 init 结构中使用的 void *extra 参数允许用户传递其他(额外)参数,这些参数可能特定于所使用的平台。
在 SPI 驱动程序结构和 SPI 初始化结构中声明的参数几乎彼此相同。SPI 驱动程序结构是 SPI 初始化结构的运行时版本。
2) spi.cpp/.c:该文件包含在spi.h文件中声明的函数的实现,这些函数用于初始化SPI外设并从中为特定平台读取/写入数据。术语“平台”在广义上是指硬件微控制器(目标设备)和软件(例如,RTOS或Mbed-OS)的组合。此文件依赖于平台,在移植到其他平台上时需要修改。
图 9 详细介绍了 Mbed 平台的 SPI 接口,并显示了如何使用这些接口和器件初始化/驱动程序结构初始化 SPI 和读/写数据。
图8.SPI 初始化和驱动程序结构。
图9.SPI API 或函数。注意:spi_init() 和 spi_write_and_read() 添加的代码是缩写代码,为清楚起见,省略了详细信息。
图 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页面上找到。
为无操作系统驱动程序做出贡献
ADI no-OS 驱动程序是开源的,托管在 GitHub 上。这些驱动器不仅支持精密转换器,还支持许多其他ADI公司产品,如加速度计、收发器、光电器件等。熟悉源代码的任何人都可以通过提交更改并创建拉取请求来查看这些更改,从而为这些驱动程序做出贡献。
有许多示例项目可以在 Linux 和/或 Windows 环境中运行。许多示例项目都是使用硬件描述性语言 (HDL) 开发的,可在 Xilinx、Intel 等开发的 FPGA 上运行,并且针对不同供应商开发的处理器。®®
对于没有操作系统的系统,可以在ADI公司的no-OS GitHub存储库中访问C语言中的No-OS软件驱动程序。
ADI公司维基提供了为使用Mbed和ADuCMxxx平台的精密转换器开发的示例。
图 11.特定于 mbed 平台的 SPI 初始化实现。
图 12.平台驱动程序差异。
-
转换器
+关注
关注
27文章
8653浏览量
146944 -
寄存器
+关注
关注
31文章
5328浏览量
120116 -
操作系统
+关注
关注
37文章
6753浏览量
123223
发布评论请先 登录
相关推荐
评论