你的位置:首頁 > 測試測量 > 正文

了解和使用no-OS及平臺(tái)驅(qū)動(dòng)程序

發(fā)布時(shí)間:2022-04-20 來源:ADI,Mahesh Phalke 責(zé)任編輯:wenwei

【導(dǎo)讀】快速發(fā)展的技術(shù)需要軟件支持(固件驅(qū)動(dòng)程序和代碼示例)來簡化設(shè)計(jì)導(dǎo)入過程。本文介紹如何利用no-OS(無操作系統(tǒng))驅(qū)動(dòng)程序和平臺(tái)驅(qū)動(dòng)程序來構(gòu)建ADI公司精密模數(shù)轉(zhuǎn)換器和數(shù)模轉(zhuǎn)換器的應(yīng)用固件,這些器件在速度、功耗、尺寸和分辨率方面提供高水平的性能。


ADI公司提供基于no-OS驅(qū)動(dòng)程序的嵌入式固件示例來支持精密變換器。no-OS驅(qū)動(dòng)程序負(fù)責(zé)器件配置、轉(zhuǎn)換器數(shù)據(jù)采集、執(zhí)行校準(zhǔn)等,而基于no-OS驅(qū)動(dòng)程序的固件示例則便于將數(shù)據(jù)傳輸?shù)街鳈C(jī)進(jìn)行顯示、存儲(chǔ)和進(jìn)一步處理。


no-OS和平臺(tái)驅(qū)動(dòng)程序簡介


顧名思義,no-OS驅(qū)動(dòng)程序設(shè)計(jì)用于通用(或無特定)操作系統(tǒng)。該名稱還意味著這些驅(qū)動(dòng)程序可以用在沒有任何OS支持的裸機(jī)(BareMetal)系統(tǒng)上。no-OS驅(qū)動(dòng)程序旨在為給定精密轉(zhuǎn)換器的數(shù)字接口訪問提供高級API。no-OS驅(qū)動(dòng)程序使用器件的這些API接口訪問、配置、讀取、寫入數(shù)據(jù),而無需知道寄存器地址(存儲(chǔ)器映射)及其內(nèi)容。


no-OS驅(qū)動(dòng)程序利用平臺(tái)驅(qū)動(dòng)程序?qū)觼碇С挚缍鄠€(gè)硬件/軟件平臺(tái)復(fù)用相同的no-OS驅(qū)動(dòng)程序,使固件高度可移植。平臺(tái)驅(qū)動(dòng)程序?qū)拥氖褂脤o-OS驅(qū)動(dòng)程序隔絕開來,后者無需知道平臺(tái)特定接口(如SPI、I2C、GPIO等)的低級細(xì)節(jié),因此no-OS驅(qū)動(dòng)程序不需要修改就能跨多個(gè)平臺(tái)復(fù)用。


1.jpg

圖1.精密轉(zhuǎn)換器固件協(xié)議棧


使用no-OS驅(qū)動(dòng)程序


圖2顯示了no-OS驅(qū)動(dòng)程序的典型代碼結(jié)構(gòu)。


2.jpg

圖2.no-OS驅(qū)動(dòng)程序代碼結(jié)構(gòu)


3.jpg

圖3.器件配置枚舉、結(jié)構(gòu)和API


精密轉(zhuǎn)換器的no-OS驅(qū)動(dòng)程序代碼通常包含在兩個(gè)以C編程語言編寫的源文件中:adxxxx.c和adxxxx.h,其中xxxx代表器件名稱(例如AD7606、AD7124等)。器件頭文件(adxxxx.h)包含器件特定結(jié)構(gòu)、枚舉、寄存器地址和位掩碼的公共編程接口,將此文件包含到所需的源文件中便可使用這些公開訪問接口。器件源文件(adxxxx.c)包含接口的實(shí)現(xiàn),用于初始化和移除器件、讀/寫器件寄存器、從器件讀取數(shù)據(jù)、獲取/設(shè)置器件特定參數(shù)等。


典型的no-OS驅(qū)動(dòng)程序圍繞一組常見功能來構(gòu)建:


器件特定寄存器地址、位掩碼宏、器件配置枚舉、讀/寫器件特定參數(shù)(如過采樣、增益、基準(zhǔn)電壓等)的結(jié)構(gòu)的聲明。


通過no-OS驅(qū)動(dòng)程序的器件初始化/移除函數(shù)以及器件特定的初始化和驅(qū)動(dòng)程序結(jié)構(gòu)與描述符初始化物理器件/解除器件初始化。


使用器件寄存器讀/寫函數(shù)訪問器件存儲(chǔ)器映射或寄存器詳細(xì)信息,例如adxxxx_read_register()或adxxxx_write_register()。


no-OS驅(qū)動(dòng)程序代碼使用


使用器件特定地址、位掩碼、參數(shù)配置枚舉和結(jié)構(gòu):


如前所述,adxxxx.h頭文件包含所有器件特定枚舉和結(jié)構(gòu)的聲明,這些枚舉和結(jié)構(gòu)被傳遞到器件特定的函數(shù)或API以配置或訪問器件參數(shù)。具體情況如圖3所示。


圖3中顯示的adxxxx_config結(jié)構(gòu)允許用戶選擇多路復(fù)用器通道并為其設(shè)置過采樣率。此結(jié)構(gòu)的成員(afe_mux_channel和oversampling)是存在于同一頭文件中的枚舉,其包含這兩個(gè)字段的所有可能值的數(shù)字常量,用戶可以選擇。


adxxxx.c文件中定義的adxxxx_set_adc_config()函數(shù)通過配置結(jié)構(gòu)獲取用戶傳遞的配置/參數(shù),并進(jìn)一步調(diào)用adxxxx_spi_reg_write()函數(shù),通過數(shù)字接口(在上例中是SPI)將數(shù)據(jù)寫入ADXXXX_REG_CONFIG器件寄存器。


使用no-OS驅(qū)動(dòng)程序結(jié)構(gòu)和初始化函數(shù)初始化器件:


4.jpg

圖4.器件初始化和驅(qū)動(dòng)程序結(jié)構(gòu)的聲明


除了器件配置枚舉和結(jié)構(gòu)之外,no-OS驅(qū)動(dòng)程序還提供以下兩個(gè)結(jié)構(gòu):


器件初始化結(jié)構(gòu)。


設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)。


器件初始化結(jié)構(gòu)允許用戶在用戶應(yīng)用程序代碼中定義器件特定的參數(shù)和配置。初始化結(jié)構(gòu)包含其他器件特定的參數(shù)結(jié)構(gòu)和枚舉的成員。圖5顯示了器件初始化結(jié)構(gòu)的定義。


器件驅(qū)動(dòng)程序結(jié)構(gòu)通過器件初始化函數(shù)adxxxx_init()加載器件初始化參數(shù)。器件驅(qū)動(dòng)程序結(jié)構(gòu)是在運(yùn)行時(shí)(動(dòng)態(tài))從堆空間中分配內(nèi)存。器件驅(qū)動(dòng)程序結(jié)構(gòu)和器件初始化結(jié)構(gòu)中聲明的參數(shù)幾乎完全相同。器件驅(qū)動(dòng)程序結(jié)構(gòu)是器件初始化結(jié)構(gòu)的運(yùn)行時(shí)版本。


以下步驟說明典型的器件初始化函數(shù)和初始化流程:


第1步:在應(yīng)用程序中創(chuàng)建器件初始化結(jié)構(gòu)的定義(或?qū)嵗ɡ鐂truct adxxxx_init_params),以初始化用戶特定的器件參數(shù)和平臺(tái)相關(guān)的驅(qū)動(dòng)程序參數(shù)。參數(shù)在編譯期間定義。


注意:初始化結(jié)構(gòu)中定義的參數(shù)因器件而異。


5.jpg


第2步:在應(yīng)用程序代碼中創(chuàng)建器件驅(qū)動(dòng)程序結(jié)構(gòu)的指針實(shí)例(變量)。


用戶應(yīng)用程序需要?jiǎng)?chuàng)建器件驅(qū)動(dòng)程序結(jié)構(gòu)的單個(gè)指針實(shí)例。將此實(shí)例傳遞給所有no-OS驅(qū)動(dòng)程序API/函數(shù)以訪問器件特定參數(shù)。應(yīng)用程序代碼中定義的此指針實(shí)例指向堆中動(dòng)態(tài)分配的內(nèi)存,這是通過no-OS驅(qū)動(dòng)程序中定義的器件初始化函數(shù)(如adxxxx_init())完成的。


6.jpg


第3步:調(diào)用器件初始化函數(shù)以初始化器件和其他平臺(tái)特定的外設(shè)。


7.jpg


no-OS驅(qū)動(dòng)程序中定義的adxxxx_init()函數(shù)用adxxx_init_param結(jié)構(gòu)傳遞的用戶特定參數(shù)初始化器件。器件驅(qū)動(dòng)程序結(jié)構(gòu)的指針實(shí)例和器件初始化結(jié)構(gòu)的實(shí)例作為兩個(gè)參數(shù)傳遞給此初始化函數(shù)。用戶應(yīng)用程序代碼可以多次調(diào)用adxxxx_init()函數(shù),只要調(diào)用初始化函數(shù)之后再調(diào)用器件移除函數(shù)來平衡。


通過器件寄存器讀/寫函數(shù)訪問存儲(chǔ)器映射(寄存器內(nèi)容)如圖6所示


用戶可以通過no-OS驅(qū)動(dòng)程序器件特定的adxxx_read/write()函數(shù)訪問器件寄存器內(nèi)容(例如產(chǎn)品ID、暫存區(qū)值、OSR等)。


大多數(shù)情況下,用戶不會(huì)直接使用寄存器訪問函數(shù)。器件特定的函數(shù)通過這些寄存器訪問函數(shù)(如adxxxx_spi_reg_read/write())來調(diào)用。如果可能,建議使用器件配置和狀態(tài)API來訪問器件存儲(chǔ)器映射,而不要使用直接寄存器訪問函數(shù),因?yàn)檫@樣能確保器件驅(qū)動(dòng)程序結(jié)構(gòu)與器件中的配置保持同步。


平臺(tái)驅(qū)動(dòng)程序


平臺(tái)驅(qū)動(dòng)程序是包裝平臺(tái)特定API的硬件抽象層(HAL)之一。它們由no-OS器件驅(qū)動(dòng)程序或用戶應(yīng)用程序代碼調(diào)用,使后者可以獨(dú)立于底層硬件和軟件平臺(tái)。平臺(tái)驅(qū)動(dòng)程序包裝了平臺(tái)特定的低級硬件功能,例如SPI/I2C初始化和讀/寫、GPIO初始化和讀/寫、UART初始化和接收/發(fā)送、用戶特定的延遲、中斷等。


8.jpg

圖5.用戶應(yīng)用程序中的器件初始化結(jié)構(gòu)定義


9.jpg

圖6.訪問寄存器內(nèi)容


SPI平臺(tái)驅(qū)動(dòng)程序模塊的典型文件結(jié)構(gòu)如圖7所示。


使用平臺(tái)驅(qū)動(dòng)程序


平臺(tái)驅(qū)動(dòng)程序代碼通常包含在以C/C++編程語言編寫的三個(gè)源文件中。


1) spi.h:這是一個(gè)與平臺(tái)無關(guān)的文件,包含SPI功能所需的器件結(jié)構(gòu)和枚舉。此頭文件中定義的C編程接口沒有平臺(tái)依賴性。


初始化和器件結(jié)構(gòu)中聲明的所有參數(shù)對任何平臺(tái)上的SPI接口都是通用的。


器件初始化結(jié)構(gòu)中使用的void *extra參數(shù)允許用戶傳遞額外的參數(shù),這些參數(shù)可以是所用平臺(tái)特定的。


SPI驅(qū)動(dòng)程序結(jié)構(gòu)和SPI初始化結(jié)構(gòu)中聲明的參數(shù)幾乎完全相同。SPI驅(qū)動(dòng)程序結(jié)構(gòu)是SPI初始化結(jié)構(gòu)的運(yùn)行時(shí)版本。


2) spi.cpp/.c:此文件包含spi.h文件中聲明的函數(shù)的實(shí)現(xiàn),這些函數(shù)用于初始化特定平臺(tái)的SPI外設(shè)以及讀/寫數(shù)據(jù)。廣義的“平臺(tái)”是指硬件微控制器(目標(biāo)器件)和軟件(如RTOS或Mbed-OS)的組合。此文件依賴于平臺(tái),移植到其他平臺(tái)時(shí)需要修改。


圖9詳細(xì)說明了Mbed平臺(tái)的SPI接口,并顯示了如何使用這些接口和器件初始化/驅(qū)動(dòng)程序結(jié)構(gòu)來初始化SPI和讀/寫數(shù)據(jù)。


10.jpg

圖7.SPI平臺(tái)驅(qū)動(dòng)程序代碼結(jié)構(gòu)


11.jpg

圖8.SPI初始化和驅(qū)動(dòng)程序結(jié)構(gòu)


12.jpg

圖9.SPI API或函數(shù)注意:增加的spi_init()和spi_write_and_read()代碼是節(jié)略代碼,


為清楚起見而省略了細(xì)節(jié)。


13.jpg

圖10.SPI額外的初始化和驅(qū)動(dòng)程序結(jié)構(gòu)


3) spi_extra.h:此文件包含其他器件結(jié)構(gòu)或枚舉,其特定于給定平臺(tái)。它允許用戶應(yīng)用程序代碼提供通用spi.h文件中未涉及的配置。例如,SPI引腳可能隨平臺(tái)而異,因此可以作為這些平臺(tái)特定的額外結(jié)構(gòu)的一部分添加。


移植平臺(tái)驅(qū)動(dòng)程序


平臺(tái)驅(qū)動(dòng)程序可以從一個(gè)平臺(tái)(微控制器)移植到另一個(gè)平臺(tái);若要移植,通常需要?jiǎng)?chuàng)建平臺(tái)特定的.cpp/.c和_extra.h文件。平臺(tái)驅(qū)動(dòng)程序駐留在微控制器單元供應(yīng)商提供的器件特定硬件抽象層(HAL)之上的一層。因此,為將平臺(tái)驅(qū)動(dòng)程序從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái),與調(diào)用供應(yīng)商提供的HAL中存在的函數(shù)或API相關(guān)的平臺(tái)驅(qū)動(dòng)程序代碼需要做一些細(xì)微改動(dòng)。


圖12區(qū)分了基于Mbed的SPI平臺(tái)驅(qū)動(dòng)程序和ADuCM410 SPI平臺(tái)驅(qū)動(dòng)程序。


ADI no-OS存儲(chǔ)庫和平臺(tái)驅(qū)動(dòng)程序的GitHub源代碼鏈接可在ADI公司W(wǎng)iki和GitHub頁面上找到。


為no-OS驅(qū)動(dòng)程序做貢獻(xiàn)


ADI no-OS驅(qū)動(dòng)程序已開源并托管在GitHub上。驅(qū)動(dòng)程序不僅支持精密轉(zhuǎn)換器,也支持許多其他ADI產(chǎn)品,如加速度計(jì)、收發(fā)器、光電器件等。任何熟悉源代碼的人都可以為這些驅(qū)動(dòng)程序做貢獻(xiàn),方式是提交變更和創(chuàng)建拉取請求來審核這些變更。


有許多示例項(xiàng)目可以在Linux和/或Windows環(huán)境中運(yùn)行。許多示例項(xiàng)目是用硬件描述性語言(HDL)開發(fā)的,以便在Xilinx?、Intel?等公司開發(fā)的FPGA以及由不同供應(yīng)商開發(fā)的目標(biāo)處理器上運(yùn)行。


如需無操作系統(tǒng)的系統(tǒng)的no-OS軟件驅(qū)動(dòng)程序(用C編寫),請?jiān)L問ADI公司no-OS GitHub存儲(chǔ)庫。


ADI公司W(wǎng)iki頁面提供了使用Mbed和ADuCMxxx平臺(tái)為精密轉(zhuǎn)換器開發(fā)的示例。


14.jpg

圖11.Mbed平臺(tái)特定的SPI初始化實(shí)現(xiàn)


15.jpg

圖12.平臺(tái)驅(qū)動(dòng)程序差異


作者簡介


Mahesh Phalke是ADI公司位于印度班加羅爾的精密轉(zhuǎn)換器技術(shù)軟件部門的高級軟件工程師。2011年畢業(yè)于瀑內(nèi)大學(xué),獲電子工程學(xué)士學(xué)位。聯(lián)系方式:mahesh.phalke@analog.com。



免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進(jìn)行處理。


推薦閱讀:


MPS首款消費(fèi)類PD協(xié)議芯片MP5031

開源、可重復(fù)使用的軟件堆棧助力實(shí)現(xiàn)實(shí)時(shí)處理和CbM算法開發(fā)

衛(wèi)星運(yùn)行狀況:航天級IC如何改進(jìn)遙測電路設(shè)計(jì)

用于狀態(tài)監(jiān)控的高保真振動(dòng)采集平臺(tái)

氮化鎵和碳化硅的區(qū)別在哪里?這篇指南送給你

特別推薦
技術(shù)文章更多>>
技術(shù)白皮書下載更多>>
熱門搜索
共模電感 固態(tài)盤 固體繼電器 光傳感器 光電池 光電傳感器 光電二極管 光電開關(guān) 光電模塊 光電耦合器 光電器件 光電顯示 光繼電器 光控可控硅 光敏電阻 光敏器件 光敏三極管 光收發(fā)器 光通訊器件 光纖連接器 軌道交通 國防航空 過流保護(hù)器 過熱保護(hù) 過壓保護(hù) 焊接設(shè)備 焊錫焊膏 恒溫振蕩器 恒壓變壓器 恒壓穩(wěn)壓器
?

關(guān)閉

?

關(guān)閉