快速發展的技術需要軟件支持(固件驅動程序和示例代碼)來簡化過程中的設計。本文介紹如何使用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文章
8958瀏覽量
150736 -
寄存器
+關注
關注
31文章
5421瀏覽量
123331 -
操作系統
+關注
關注
37文章
7089瀏覽量
124948
發布評論請先 登錄
評論