色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文讀懂ametal_hc595接口的學習要點

AGk5_ZLG_zhiyua ? 來源:互聯網 ? 作者:佚名 ? 2017-11-28 07:27 ? 次閱讀

第八章為深入理解AMetal,本文內容為8.2 HC595 接口

8.2 HC595 接口

HC595 是一種“串轉并”的外圍器件,可以通過GPIO 控制數據引腳和時鐘引腳實現數據的輸出。但在一些具有SPI 外設的MCU 中,往往使用SPI 控制HC595 輸出,使驅動程序更簡潔。為了屏蔽底層數據輸出方式的差異性,可以按照LED 通用接口的設計方法為HC595定義相關接口。

>>> 8.2.1 定義接口

1. 接口命名

由于操作的對象是HC595,因此接口命名以“am_hc595_”作為前綴。HC595 基本的操作是輸出并行數據,其相應的接口名為:

  • am_hc595_send

特別地,HC595 的輸出為三態輸出,其由OE 引腳控制,因此可以定義相應接口使能輸出(正常輸出數據)或禁能輸出(高阻狀態)。其相應的的接口名為:

  • am_hc595_enable

  • am_hc595_disable

2. 接口參數

在LED 通用接口的設計中,通常可能存在多個LED,因而使用了唯一ID 號led_id 對多個LED 進行區分。按照這種邏輯,是否也需要使用hc595_id 來區分不同的HC595 呢?

在LED 通用接口中,使用了ID 號區分不同的LED,這就要求在接口實現中完成led_id到對應LED 設備之間的轉換,即通過ID 號搜索到對應的LED 設備。顯然,隨著LED 設備的增加,搜索耗時也將增加。使用ID 號區分不同的LED,雖然簡潔易懂,但效率不高。

對于操作LED 而言,通常都是秒級的,不會以極快的速率操作LED。如果LED 變化太快,則肉眼無法觀察相應的現象是沒有意義的。因此搜索耗時的影響對于LED 來說,可以忽略不計。雖然HC595 輸出控制的具體器件是不確定的,但作為通用輸出器件,其輸出的效率應該盡可能高,不要因為驅動實現的策略而影響了輸出效率,比如,常見的GPIO 能夠以MHz 的速率輸出,這種變化是us 級別的,顯然此時搜索耗時會對輸出效率產生一定的影響。

為了達到快速輸出的目的,最好不存在任何搜索過程,直接操作相應的HC595 對象實現輸出。在這種情況下,使用指向對象的指針就是很好的解決辦法,只要具有指向對象的指針,就可以直接使用對象提供的方法。

顯然使用指向對象的指針,只是為了提高接口實現的效率,與用戶并無直接關系。對于用戶來說,其無需關心這個指針的具體類型。為了對用戶屏蔽“指針”的概念,可以為該指針單獨定義一個類型,這就是本書中常常提及的“句柄”概念。由于現在還不清楚HC595對象的指針類型,可以先定義一個無類型的指針類型作為句柄類型。比如:

該類型的句柄本質上是指向HC595 對象的指針,其本身就代表了系統中確定的一個HC595 對象。基于此,所有接口均使用該類型作為第一個參數,即:

  • am_hc595_enable (am_hc595_handle_t handle);

  • am_hc595_disable (am_hc595_handle_t handle);

  • am_hc595_send (am_hc595_handle_t handle);

特別地,對于am_hc595_send(),還需要使用參數指定發送的數據,往往使用一個指向數據首地址的指針和數據的字節數表示一段數據。即可為am_hc595_send()新增兩個參數:

  • am_hc595_send (am_hc595_handle_t handle, const void *p_data, size_t nbytes) ;

其中,p_data 指向了數據的首地址,使用void *類型,使其可以指向任意數據類型的首地址,使用const修飾符,表明本接口僅用于發送數據,不會改變數據內容;nbytes 指定了發送數據的字節數,若只有單個HC595,則輸出是單個字節(8 位),若有多個HC595 級聯,則輸出是n 個字節(n 為HC595 的個數,共計8×n 位)。

實際中,單個HC595 只能輸出8位數據,為了輸出更多位數的數據,可以使用級聯的方式將多個HC595級聯起來。因此,這里的HC595“句柄”代表的HC595 設備可能包含多個級聯的HC595,以實現多位數據的輸出。

3. 返回值

接口無特殊說明,直接將所有接口的返回值定義為int 類型的標準錯誤號。基于此,HC595 接口的完整定義詳見表8.4。其對應的類圖詳見圖8.5。

表8.4 HC595 通用接口(am_hc595.h)

圖8.5 HC595 對應的類圖

特別注意,當前接口中的am_hc595_handle_t 類型為void *類型,最終,其需要是指向對象的指針類型。隨著后文對接口實現的介紹,會定義相應的設備類型,到時再更新具體的定義。

>>> 8.2.2 實現接口

1. 抽象的HC595 設備類

與LED 通用接口的實現類似,為了屏蔽底層實現的差異性,可以將一些與底層硬件相關的功能進行抽象,根據三個接口,可以定義相應的三個抽象方法,并將其存放在一個虛函數表中。即:

類似地,將抽象方法和p_cookie 定義在一起,即為抽象的HC595 設備。比如:

顯然,具體的HC595 設備直接從抽象的HC595 設備派生,然后由具體的HC595 設備根據實際的硬件,實現3 個抽象方法。

與抽象LED 設備的定義相比可以發現,這里定義抽象設備的方法和抽象LED 設備定義的方法是完全一致的,可以將這種方法作為定義一種抽象設備的模板,即:首先,根據接口的定義,整理需要具體設備實現那些功能,然后將這些功能一一抽象為方法,并將它們存放在一個虛函數表中,這些抽象方法的第一個參數均為p_cookie。最后,將虛函數表和p_cookie整合在一個新的結構體中,該結構體類型即為抽象設備類型。偽代碼詳見程序清單8.18。

程序清單8.18 抽象設備定義的一般方法

偽代碼中,[name]表示當前模塊的具體名字,如led。當然,如果需要,可以在抽象籌備中添加其它需要的成員,如LED 設備中,使用鏈表管理多個LED 設備,因此還具有p_next指針成員。

在HC595 接口中,使用了handle 作為第一個參數,其本質上是指向設備的指針,由于所有具體設備的都是從抽象的HC595 設備派生的,因此,handle 的類型可以定義為:

如此一來,所有接口的實現都可以直接調用抽象方法實現,而抽象方法的具體實現是由具體的HC595 設備完成的。各HC595 接口的實現詳見程序清單8.19。

程序清單8.19 HC595 接口實現

由于handle 是直接指向設備的指針,可以通過handle 直接找到相應的方法,因此,在整個接口的實現過程中,沒有任何查詢搜索的過程,效率較高。除此之外,當handle 直接指向設備后,也就無需再集中對各個HC595 設備進行管理,如LED 設備,由于存在查詢搜索過程,因此不得不使用單向鏈表將系統中的各個LED 設備鏈起來,便于查找。

在接口實現中,沒有與硬件相關的實現代碼,僅僅是簡單的調用了抽象方法。抽象方法需要由具體的HC595 設備來完成。由于各個接口的實現非常簡單,往往將其實現直接以內聯函數的形式存放在.h 文件中。

為便于查閱,如程序清單8.20 所示展示了抽象HC59 設備接口文件(am_hc595.h)的內容。其對應的類圖詳見圖8.6。

程序清單8.20 am_hc595.h 文件內容

圖8.6 抽象的HC595 設備類

程序中,am_static_inline 是內聯函數的標識,其在am_types.h 文件中定義,定義的實際內容與編譯器相關,如使用GCC 編譯器,則其定義如下:

由于在不同編譯器中,內聯函數的標識不盡相同,為了使用戶使用統一的標識,AMetal統一將內聯標識符定義為了am_static_inline,使得用戶在任何編譯器中均可使用該標識作為內聯標識,無需關心與編譯器相關的細節問題。

2. 具體的HC595 設備類

以使用SPI 控制HC595 輸出數據為例,簡述具體HC595 設備的實現方法。首先應該基于抽象設備類派生一個具體的設備類,其類圖詳見圖8.7,

圖8.7 具體的HC595 設備類

可直接定義具體的HC595 設備類:

am_hc595_spi_dev_t 即為具體的HC595 設備類。具有該類型后,即可使用該類型定義一個具體的HC595 設備實例:

在使用SPI 控制HC595 時,需要知道HC595 相關的信息,如鎖存引腳、輸出使能引腳、SPI 時鐘頻率等信息。

特別地,當SPI 輸出數據時,可以指定數據輸出時的位順序:最高位先輸出或最低位先輸出。最先輸出的位決定了HC595 輸出端Q7 的電平,最后輸出的位決定了HC595 輸出端Q0 的電平。顯然,位的輸出順序直接影響了HC595 的輸出,因此,具體輸出順序應該是由用戶來決定的。

基于此,將需要由用戶提供的設備相關信息存放到一個新的設備信息結構體類型中:

若使用MiniPort-595,其與AM824-Core 聯合使用時,則其對應的設備實例信息可以定義如下:

同理,在設備類中需要維持一個指向設備信息的指針。此外,由于使用SPI 控制HC595時,HC595 相當于是一個SPI 從設備,為了使用SPI 接口與之通信,需要為HC595 定義一個與之對應的SPI 從設備,新增兩個成員,完整的HC595 設備定義即為:

顯然,在使用SPI 控制HC595 前,需要完成設備中各成員的賦值,這些工作通常在驅動的初始化函數中完成,定義初始化函數的原型為:

其中:

  • p_dev 為指向am_hc595_spi_dev_t 類型實例的指針;

  • p_info 為指向am_hc595_spi_info_t 類型實例信息的指針;

  • handle 為SPI 句柄,便于使用SPI 輸出數據,初始化函數的返回值即為HC595 句柄。基于前面定義的設備實例和實例信息,其調用形式如下:

返回值即為HC595 實例的句柄,可以作為HC595 通用接口的第一個參數(handle)的實參。初始化函數的實現范例詳見程序清單8.21。

程序清單8.21 初始化函數實現范例(SPI 控制HC595)

程序中,首先建立了標準的SPI 從設備,便于后續使用SPI 接口發送數據,然后初始化了p_info 成員,接著完成了抽象HC595 設備中p_funcs 和p_cookie 的賦值,最后,返回設備地址作為用戶操作HC595 的句柄。其中,pfuncs 賦值為了&__g_hc595_spi_drv_funcs,其中包含了3 個抽象方法的具體實現,完整定義詳見程序清單8.22。

程序清單8.22 抽象方法的實現(SPI 控制HC595)

由此可見,使用GPIO 接口am_gpio_set()控制OE 引腳的輸出電平實現了HC595 的使能和禁能函數,使用SPI 接口函數am_spi_write_then_write()實現了發送數據函數。

為了便于查閱,如程序清單8.23 所示展示了具體HC595 設備接口文件(am_hc595_spi.h)的內容。

程序清單8.23 am_hc595_spi.h 文件內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • hc595_id
    +關注

    關注

    0

    文章

    1

    瀏覽量

    1377

原文標題:周立功:深入理解AMetal——HC595 接口

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    在LED通用接口的設計中,HC595主要作用

    當前接口中的am_hc595_handle_t 類型為void *類型,最終,其需要是指向對象的指針類型。隨著后文對接口實現的介紹,會定義相應的設備類型,到時再更新具體的定義。
    的頭像 發表于 01-17 08:34 ?1.3w次閱讀
    在LED通用<b class='flag-5'>接口</b>的設計中,<b class='flag-5'>HC595</b>主要作用

    靈動微電子MM32 MCU正式入駐AMetal平臺

    高效、功能完善的服務組件,主要包括USB、Lora、Modbus、鏈表、環形緩沖區;以及常用器件的驅動,如:74HC595、LM75、EP24Cxx、MX25xx、DS1302 等;應用程序需要的
    發表于 01-16 11:38

    讀懂接口模塊的組合應用有哪些?

    讀懂接口模塊的組合應用有哪些?
    發表于 05-17 07:15

    讀懂什么是NEC協議

    讀懂什么是NEC協議?
    發表于 10-15 09:22

    74hc595資料

    74hc595資料 8位串行輸入
    發表于 01-11 23:55 ?2935次下載

    74hc595 pdf

    74hc595.pdf
    發表于 01-12 00:00 ?298次下載
    74<b class='flag-5'>hc595</b> pdf

    74HC595與AT89C2051單片機接口的顯示電路

    用AT89C2051與74HC595接口設計的顯示面板電路。
    發表于 04-18 11:47 ?4599次閱讀
    74<b class='flag-5'>HC595</b>與AT89C2051單片機<b class='flag-5'>接口</b>的顯示電路

    基于單片機74HC595去驅動點陣

    基于單片機74HC595去驅動點陣程序,喜歡的朋友下載來學習
    發表于 01-06 14:31 ?131次下載

    74HC595資料

    74HC595資料,很好的學習資料,快來下載吧
    發表于 01-18 18:10 ?21次下載

    74HC595手冊

    74HC595手冊
    發表于 11-05 18:21 ?43次下載

    74HC595資料

    74HC595技術參數中文版
    發表于 02-14 17:26 ?30次下載

    面向AMetal框架和接口的編程

    面向AMetal框架和接口的編程
    發表于 11-23 15:22 ?8次下載

    【下載】74hc595芯片中文資料分享

    74hc595資料
    發表于 12-20 15:42 ?535次下載

    MCU驅動74hc595

    MCU驅動74hc595下圖關于595數據手冊上的介紹,使用比較簡單兩片級聯控制擴展IO輸出端口,可以用最少三個GPIO控制16路輸出單片機驅動595/* 通訊控制信號 */#define
    發表于 12-05 10:36 ?61次下載
    MCU驅動74<b class='flag-5'>hc595</b>

    讀懂,什么是BLE?

    讀懂,什么是BLE?
    的頭像 發表于 11-27 17:11 ?2453次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>,什么是BLE?
    主站蜘蛛池模板: 亚洲精品国产第一区第二区 | 欲奴第一季在线观看全集 | 欧美GAY猛男GAYA片18禁 | 无码任你躁久久久久久老妇双奶 | 久久久久久亚洲精品影院 | 一品道门在线观看免费视频 | 精品熟女少妇AV免费观看 | 变形金刚7免费观看完整 | writeas雷狮直播 | 一个人的HD高清在线观看 | 亚洲高清一区二区三区电影 | 英国video性精品高清最新 | 野花日本大全免费观看3中文版 | 日本大尺码喷液过程视频 | 99久久国产综合精品国 | 日本xxx在线观看免费播放 | 性感尼姑风流寺 | 强壮的公次次弄得我高潮韩国电影 | 久久免费视频在线观看6 | 欧美gay69| 亚洲国产成人在线视频 | 小莹的性荡生活45章 | yellow在线观看免费观看大全 | 青草视频久久 | 色欲精品久久人妻AV中文字幕 | 花蝴蝶在线观看中字 | 国产精品免费观看视频播放 | 午夜伦理电影在线观免费 | 日本xxx片免费高清在线 | 香蕉久久日日躁夜夜嗓 | 亚洲AV久久婷婷蜜臀无码不卡 | 色吧电影院 | 黄色软件色多多 | 人妻中文字幕无码久久AV爆 | 99久久麻豆AV色婷婷综合 | 国产欧美日韩精品a在线观看高清 | 啊片色播电影 | 99久久蜜臀AV免费看蛮 | 亚洲精品伊人久久久久 | 国产成A人片在线观看 | 九九热久久只有精品2 |