<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 設計應用 > 了解和使用no-OS及平臺驅動(dòng)程序

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

作者:Mahesh Phalke(亞德諾半導體 高級軟件工程師) 時(shí)間:2022-04-11 來(lái)源:電子產(chǎn)品世界 收藏
編者按:快速發(fā)展的技術(shù)需要軟件支持(固件驅動(dòng)程序和代碼示例)來(lái)簡(jiǎn)化設計導入過(guò)程。本文介紹如何利用no-OS(無(wú)操作系統)驅動(dòng)程序和平臺驅動(dòng)程序來(lái)構建ADI(亞德諾半導體)公司精密模數轉換器和數模轉換器的應用固件,這些器件在速度、功耗、尺寸和分辨率方面提供高水平的性能。

公司提供基于 驅動(dòng)程序的嵌入式固件示例來(lái)支持精密轉換器。驅動(dòng)程序負責器件配置、轉換器數據采集、執行校準等,而基于 驅動(dòng)程序的固件示例則便于將數據傳輸到主機進(jìn)行顯示、存儲和進(jìn)一步處理。

本文引用地址:http://dyxdggzs.com/article/202204/432918.htm

1   no-OS和平臺驅動(dòng)程序簡(jiǎn)介

顧名思義,no-OS 驅動(dòng)程序設計用于通用(或無(wú)特定)操作系統。該名稱(chēng)還意味著(zhù)這些驅動(dòng)程序可以用在沒(méi)有任何OS 支持的裸機(BareMetal,亦稱(chēng)裸金屬主機) 系統上。no-OS 驅動(dòng)程序旨在為給定精密轉換器的數字接口訪(fǎng)問(wèn)提供高API(Application Programming Interface,應用程序接口),如圖1 所示。no-OS 驅動(dòng)程序使用器件的這些API 接口訪(fǎng)問(wèn)、配置、讀取、寫(xiě)入數據,而無(wú)需知道寄存器地址(存儲器映射)及其內容。

no-OS 驅動(dòng)程序利用平臺驅動(dòng)程序層來(lái)支持跨多個(gè)硬件/ 軟件平臺復用相同的no-OS 驅動(dòng)程序, 使固件高度可移植。平臺驅動(dòng)程序層的使用將no-OS 驅動(dòng)程序隔絕開(kāi)來(lái),后者無(wú)需知道平臺特定接口(如SPI(Serial Peripheral Interface,串行外設接口)、I2C(Inter-Integrated Circuit,集成電路總線(xiàn))、GPIO(通用輸入輸出)等)的低級細節,因此no-OS 驅動(dòng)程序不需要修改就能跨多個(gè)平臺復用。

371622-fig-01.jpg

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

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

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

1649658487100661.jpg

圖2 no-OS驅動(dòng)程序代碼結構

1649658519284245.jpg

圖3 器件配置枚舉、結構和API

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

典型的no-OS驅動(dòng)程序圍繞一組常見(jiàn)功能來(lái)構建。

1)器件特定寄存器地址、位掩碼宏、器件配置枚舉、讀/ 寫(xiě)器件特定參數(如過(guò)采樣、增益、基準電壓等)的結構的聲明。

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

3)使用器件寄存器讀/ 寫(xiě)函數訪(fǎng)問(wèn)器件存儲器映射或寄存器詳細信息,例如adxxxx_read_register() 或adxxxx_write_register()。

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

1)使用器件特定地址、位掩碼、參數配置枚舉和結構

如前所述,adxxxx.h 頭文件包含所有器件特定枚舉和結構的聲明,這些枚舉和結構被傳遞到器件特定的函數或API 以配置或訪(fǎng)問(wèn)器件參數。具體情況如圖3 所示。

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

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

2)使用no-OS 驅動(dòng)程序結構和初始化函數初始化器件

1649658548943854.jpg

圖4 器件初始化和驅動(dòng)程序結構的聲明

除了器件配置枚舉和結構之外,no-OS 驅動(dòng)程序還提供以下兩個(gè)結構:器件初始化結構和設備驅動(dòng)程序結構。器件初始化結構允許用戶(hù)在用戶(hù)應用程序代碼中定義器件特定的參數和配置。初始化結構包含其他器件特定的參數結構和枚舉的成員。圖5 顯示了器件初始化結構的定義。

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

以下步驟說(shuō)明典型的器件初始化函數和初始化流程。

第1 步:在應用程序中創(chuàng )建器件初始化結構的定義(或實(shí)例)(例如struct adxxxx_init_params),以初始化用戶(hù)特定的器件參數和平臺相關(guān)的驅動(dòng)程序參數。參數在編譯期間定義。

注意:初始化結構中定義的參數因器件而異。

1649658595156754.jpg

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

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

1649658623376956.jpg

第3 步:調用器件初始化函數以初始化器件和其他平臺特定的外設。

1649658655656897.jpg

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

3)通過(guò)器件寄存器讀/ 寫(xiě)函數訪(fǎng)問(wèn)存儲器映射(寄存器內容)

用戶(hù)可以通過(guò)no-OS 驅動(dòng)程序器件特定的adxxx_read/write() 函數訪(fǎng)問(wèn)器件寄存器內容(例如產(chǎn)品ID、暫存區值、OSR 等),如圖6 所示。

大多數情況下,用戶(hù)不會(huì )直接使用寄存器訪(fǎng)問(wèn)函數。器件特定的函數通過(guò)這些寄存器訪(fǎng)問(wèn)函數(如adxxxx_spi_reg_read/write())來(lái)調用。如果可能,建議使用器件配置和狀態(tài)API 來(lái)訪(fǎng)問(wèn)器件存儲器映射,而不要使用直接寄存器訪(fǎng)問(wèn)函數,因為這樣能確保器件驅動(dòng)程序結構與器件中的配置保持同步。

4   平臺驅動(dòng)程序

平臺驅動(dòng)程序是包裝平臺特定API 的硬件抽象層(HAL) 之一。它們由no-OS 器件驅動(dòng)程序或用戶(hù)應用程序代碼調用,使后者可以獨立于底層硬件和軟件平臺。平臺驅動(dòng)程序包裝了平臺特定的低級硬件功能,例如SPI / I2C 初始化和讀/ 寫(xiě)、GPIO 初始化和讀/ 寫(xiě)、UART(Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)傳輸器) 初始化和接收/ 發(fā)送、用戶(hù)特定的延遲、中斷等。

1649658691300016.jpg

圖5 用戶(hù)應用程序中的器件初始化結構定義

image.png

圖6 訪(fǎng)問(wèn)寄存器內容

SPI平臺驅動(dòng)程序模塊的典型文件結構如圖7所示。

1649654850142408.png

圖7 SPI平臺驅動(dòng)程序代碼結構

5   使用平臺驅動(dòng)程序

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

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

初始化和器件結構中聲明的所有參數對任何平臺上的SPI接口都是通用的。器件初始化結構中使用的void *extra 參數允許用戶(hù)傳遞額外的參數,這些參數可以是所用平臺特定的。SPI 驅動(dòng)程序結構和SPI 初始化結構中聲明的參數幾乎完全相同。SPI 驅動(dòng)程序結構是SPI 初始化結構的運行時(shí)版本。

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

圖9 詳細說(shuō)明了Mbed 平臺的SPI 接口,并顯示了如何使用這些接口和器件初始化/驅動(dòng)程序結構來(lái)初始化SPI 和讀/ 寫(xiě)數據。

1649658794759216.jpg

圖8 SPI初始化和驅動(dòng)程序結構

1649654924669952.png

圖9 SPI API或函數注意:增加的spi_init()和spi_write_and_read()代碼是節略代碼,為清楚起見(jiàn)而省略了細節

1649658754531768.jpg

圖10 SPI額外的初始化和驅動(dòng)程序結構

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

6   移植平臺驅動(dòng)程序

平臺驅動(dòng)程序可以從一個(gè)平臺(微控制器)移植到另一個(gè)平臺;若要移植,通常需要創(chuàng )建平臺特定的.cpp/.c 和_extra.h 文件。平臺驅動(dòng)程序駐留在微控制器單元供應商提供的器件特定硬件抽象層(HAL) 之上的一層。

因此,為將平臺驅動(dòng)程序從一個(gè)平臺移植到另一個(gè)平臺,與調用供應商提供的HAL 中存在的函數或API 相關(guān)的平臺驅動(dòng)程序代碼需要做一些細微改動(dòng)。

圖12 區分了基于Mbed 的SPI 平臺驅動(dòng)程序和ADuCM410 SPI平臺驅動(dòng)程序。no-OS 存儲庫和平臺驅動(dòng)程序的GitHub 源代碼鏈接可在 公司W(wǎng)iki 和GitHub 頁(yè)面上找到。

image.png

圖11 Mbed平臺特定的SPI初始化實(shí)現

image.png

圖12 平臺驅動(dòng)程序差異

7   為no-OS驅動(dòng)程序做貢獻

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

有許多示例項目可以在Linux 和/ 或Windows 環(huán)境中運行。許多示例項目是用硬件描述性語(yǔ)言(HDL) 開(kāi)發(fā)的,以便在Xilinx、Intel 等公司開(kāi)發(fā)的FPGA(FieldProgrammable Gate Array,現場(chǎng)可編程門(mén)陣列)以及由不同供應商開(kāi)發(fā)的目標處理器上運行。

(本文來(lái)源于《電子產(chǎn)品世界》雜志2022年3月期)



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>