0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在LED通用接口的設(shè)計(jì)中,HC595主要作用

UtFs_Zlgmcu7890 ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-01-17 08:34 ? 次閱讀

周立功教授新書《面向AMetal框架與接口編程(上)》,對AMetal框架進(jìn)行了詳細(xì)介紹,通過閱讀這本書,你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口編程的開發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實(shí)現(xiàn)企業(yè)和個(gè)人的共同進(jìn)步。

第八章為深入理解AMetal,本文內(nèi)容為8.2 HC595 接口。

8.2 HC595 接口

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

>>> 8.2.1 定義接口

1. 接口命名

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

  • am_hc595_send

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

  • am_hc595_enable

  • am_hc595_disable

2. 接口參數(shù)

在LED 通用接口的設(shè)計(jì)中,通??赡艽嬖诙鄠€(gè)LED,因而使用了唯一ID 號led_id 對多個(gè)LED 進(jìn)行區(qū)分。按照這種邏輯,是否也需要使用hc595_id 來區(qū)分不同的HC595 呢?

在LED 通用接口中,使用了ID 號區(qū)分不同的LED,這就要求在接口實(shí)現(xiàn)中完成led_id到對應(yīng)LED 設(shè)備之間的轉(zhuǎn)換,即通過ID 號搜索到對應(yīng)的LED 設(shè)備。顯然,隨著LED 設(shè)備的增加,搜索耗時(shí)也將增加。使用ID 號區(qū)分不同的LED,雖然簡潔易懂,但效率不高。

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

為了達(dá)到快速輸出的目的,最好不存在任何搜索過程,直接操作相應(yīng)的HC595 對象實(shí)現(xiàn)輸出。在這種情況下,使用指向?qū)ο蟮闹羔樉褪呛芎玫慕鉀Q辦法,只要具有指向?qū)ο蟮闹羔槪涂梢灾苯邮褂脤ο筇峁┑姆椒ā?/p>

顯然使用指向?qū)ο蟮闹羔?,只是為了提高接口?shí)現(xiàn)的效率,與用戶并無直接關(guān)系。對于用戶來說,其無需關(guān)心這個(gè)指針的具體類型。為了對用戶屏蔽“指針”的概念,可以為該指針單獨(dú)定義一個(gè)類型,這就是本書中常常提及的“句柄”概念。由于現(xiàn)在還不清楚HC595對象的指針類型,可以先定義一個(gè)無類型的指針類型作為句柄類型。比如:

該類型的句柄本質(zhì)上是指向HC595 對象的指針,其本身就代表了系統(tǒng)中確定的一個(gè)HC595 對象?;诖?,所有接口均使用該類型作為第一個(gè)參數(shù),即:

  • 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(),還需要使用參數(shù)指定發(fā)送的數(shù)據(jù),往往使用一個(gè)指向數(shù)據(jù)首地址的指針和數(shù)據(jù)的字節(jié)數(shù)表示一段數(shù)據(jù)。即可為am_hc595_send()新增兩個(gè)參數(shù):

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

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

實(shí)際中,單個(gè)HC595 只能輸出8位數(shù)據(jù),為了輸出更多位數(shù)的數(shù)據(jù),可以使用級聯(lián)的方式將多個(gè)HC595級聯(lián)起來。因此,這里的HC595“句柄”代表的HC595 設(shè)備可能包含多個(gè)級聯(lián)的HC595,以實(shí)現(xiàn)多位數(shù)據(jù)的輸出。

3. 返回值

接口無特殊說明,直接將所有接口的返回值定義為int 類型的標(biāo)準(zhǔn)錯(cuò)誤號?;诖?,HC595 接口的完整定義詳見表8.4。其對應(yīng)的類圖詳見圖8.5。

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

圖8.5 HC595 對應(yīng)的類圖

特別注意,當(dāng)前接口中的am_hc595_handle_t 類型為void *類型,最終,其需要是指向?qū)ο蟮闹羔橆愋?。隨著后文對接口實(shí)現(xiàn)的介紹,會定義相應(yīng)的設(shè)備類型,到時(shí)再更新具體的定義。

>>> 8.2.2 實(shí)現(xiàn)接口

1. 抽象的HC595 設(shè)備類

與LED 通用接口的實(shí)現(xiàn)類似,為了屏蔽底層實(shí)現(xiàn)的差異性,可以將一些與底層硬件相關(guān)的功能進(jìn)行抽象,根據(jù)三個(gè)接口,可以定義相應(yīng)的三個(gè)抽象方法,并將其存放在一個(gè)虛函數(shù)表中。即:

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

顯然,具體的HC595 設(shè)備直接從抽象的HC595 設(shè)備派生,然后由具體的HC595 設(shè)備根據(jù)實(shí)際的硬件,實(shí)現(xiàn)3 個(gè)抽象方法。

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

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

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

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

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

程序清單8.19 HC595 接口實(shí)現(xiàn)

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

在接口實(shí)現(xiàn)中,沒有與硬件相關(guān)的實(shí)現(xiàn)代碼,僅僅是簡單的調(diào)用了抽象方法。抽象方法需要由具體的HC595 設(shè)備來完成。由于各個(gè)接口的實(shí)現(xiàn)非常簡單,往往將其實(shí)現(xiàn)直接以內(nèi)聯(lián)函數(shù)的形式存放在.h 文件中。

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

程序清單8.20 am_hc595.h 文件內(nèi)容

圖8.6 抽象的HC595 設(shè)備類

程序中,am_static_inline 是內(nèi)聯(lián)函數(shù)的標(biāo)識,其在am_types.h 文件中定義,定義的實(shí)際內(nèi)容與編譯器相關(guān),如使用GCC 編譯器,則其定義如下:

由于在不同編譯器中,內(nèi)聯(lián)函數(shù)的標(biāo)識不盡相同,為了使用戶使用統(tǒng)一的標(biāo)識,AMetal統(tǒng)一將內(nèi)聯(lián)標(biāo)識符定義為了am_static_inline,使得用戶在任何編譯器中均可使用該標(biāo)識作為內(nèi)聯(lián)標(biāo)識,無需關(guān)心與編譯器相關(guān)的細(xì)節(jié)問題。

2. 具體的HC595 設(shè)備類

以使用SPI 控制HC595 輸出數(shù)據(jù)為例,簡述具體HC595 設(shè)備的實(shí)現(xiàn)方法。首先應(yīng)該基于抽象設(shè)備類派生一個(gè)具體的設(shè)備類,其類圖詳見圖8.7,

圖8.7 具體的HC595 設(shè)備類

可直接定義具體的HC595 設(shè)備類:

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

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

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

基于此,將需要由用戶提供的設(shè)備相關(guān)信息存放到一個(gè)新的設(shè)備信息結(jié)構(gòu)體類型中:

若使用MiniPort-595,其與AM824-Core 聯(lián)合使用時(shí),則其對應(yīng)的設(shè)備實(shí)例信息可以定義如下:

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

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

其中:

  • p_dev 為指向am_hc595_spi_dev_t 類型實(shí)例的指針;

  • p_info 為指向am_hc595_spi_info_t 類型實(shí)例信息的指針;

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

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

程序清單8.21 初始化函數(shù)實(shí)現(xiàn)范例(SPI 控制HC595)

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

程序清單8.22 抽象方法的實(shí)現(xiàn)(SPI 控制HC595)

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

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

程序清單8.23 am_hc595_spi.h 文件內(nèi)容

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    242

    文章

    23329

    瀏覽量

    662103
  • 周立功
    +關(guān)注

    關(guān)注

    38

    文章

    130

    瀏覽量

    37696
  • hc595
    +關(guān)注

    關(guān)注

    0

    文章

    1

    瀏覽量

    2646

原文標(biāo)題:周立功:深入理解AMetal——HC595 接口

文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    SPICONTROLE 4個(gè)HC595移位寄存器設(shè)置流水燈時(shí),SPIIINTIGRATIONED化了的時(shí)候,控制的HC595 LED跳了起來如何解決?

    采用 SPICONTROLE 4個(gè)HC595移位寄存器,設(shè)置流水燈的時(shí)候了,SPICONTROLLES正常,但是SPIIINTIGRATIONED化了的時(shí)候,控制的HC595
    發(fā)表于 01-29 08:06

    STM8如何控制HC595驅(qū)動8個(gè)LED

    STM8如何控制HC595驅(qū)動8個(gè)LED,希望大神們能發(fā)個(gè)程序上來看一下,謝謝!
    發(fā)表于 04-25 07:56

    HC595驅(qū)動數(shù)碼管的怪異現(xiàn)象

    我用HC595驅(qū)動數(shù)碼管 能正常顯示8 但有些數(shù)字卻顯示不正常 如9顯示成7這是什么問題???
    發(fā)表于 05-13 09:31

    74HC595(串入并出)基本原理和使用例程

    ] ********************************************************************************* *通過本例程了解 74HC595(串入并出)基本原理和使用 * *3個(gè)I/O擴(kuò)展8個(gè)輸出,通過片選可以串接更多74
    發(fā)表于 07-13 02:48

    stm32f4通過hc595控制96個(gè)LED

    stm32f4通過hc595控制96個(gè)LED,可通過修改數(shù)組數(shù)據(jù)修改點(diǎn)亮或者熄滅任意一個(gè)LED燈//初始化hc595參數(shù)uint8_t hc595
    發(fā)表于 08-30 10:24

    能控制7位7段LED顯示2 HC595

    我能控制7位7段LED顯示2 HC595嗎????如果是,那么它是怎樣的呢?請發(fā)送任何代碼的例子?。。。。。?!謝謝?。? 以上來自于百度翻譯 以下為原文 CAN I CONTROL 7DIGIT
    發(fā)表于 01-17 07:25

    利用51單片機(jī)+hc595芯片配合在led點(diǎn)陣上玩貪吃蛇

    利用51單片機(jī)+hc595芯片配合在led點(diǎn)陣上玩貪吃蛇~
    發(fā)表于 11-23 06:40

    單片機(jī)STM32 HAL IO擴(kuò)展74HC595例子代碼分享

    #include "74hc595.h"/******************功能:定義HC595的功能引腳備注:變更引腳,由MX配置完成
    發(fā)表于 12-07 06:29

    2片HC595怎樣驅(qū)動四位數(shù)碼管呢

    MicroPython-On-ESP8266——數(shù)碼管的使用,2片HC595驅(qū)動四位數(shù)碼管1. 背景前面使用四位數(shù)碼管時(shí),需要用來12個(gè)GPIO接口,結(jié)果咱micropython能驅(qū)動
    發(fā)表于 02-17 07:07

    HC164和HC595的區(qū)別是什么?

    HC164和HC595的區(qū)別是什么?HC164和HC595都有數(shù)據(jù)輸入端、數(shù)據(jù)時(shí)鐘端,而595有一個(gè)寄存器輸出刷新端,和單片機(jī)鏈接需要3根數(shù)
    發(fā)表于 11-28 22:40

    74hc595主要功能(74hc595引腳圖及功能_工作原理及電壓_典型應(yīng)用電路)

    本文主要介紹74hc595主要功能(74hc595引腳圖及功能_工作原理及電壓_典型應(yīng)用電路)。應(yīng)用電路:74HC595驅(qū)動
    發(fā)表于 12-08 15:37 ?29.4w次閱讀
    74<b class='flag-5'>hc595</b>的<b class='flag-5'>主要</b>功能(74<b class='flag-5'>hc595</b>引腳圖及功能_工作原理及電壓_典型應(yīng)用電路)

    利用51單片機(jī)+hc595芯片配合在led點(diǎn)陣上玩貪吃蛇 第三篇“相關(guān)決策函數(shù)”

    利用51單片機(jī)+hc595芯片配合在led點(diǎn)陣上玩貪吃蛇~
    發(fā)表于 11-15 10:51 ?11次下載
    利用51單片機(jī)+<b class='flag-5'>hc595</b>芯片配合在<b class='flag-5'>led</b>點(diǎn)陣上玩貪吃蛇 第三篇“相關(guān)決策函數(shù)”

    單片機(jī) MSP430 G2553 HC595 數(shù)碼管 SPI 通信

    模擬SPI接法是任意的://HC595//VCC-VCC GND-GND RCK-P21 SCK-P22 DIO-P20硬件SPI,調(diào)節(jié)成3線SPI模式 8bit就可以通信:P14 P12
    發(fā)表于 11-19 19:51 ?10次下載
    單片機(jī) MSP430 G2553 <b class='flag-5'>HC595</b> 數(shù)碼管  SPI 通信

    利用51單片機(jī)+hc595芯片配合在led點(diǎn)陣上玩貪吃蛇 第一篇“顯示貪吃蛇”

    利用51單片機(jī)+hc595芯片配合在led點(diǎn)陣上玩貪吃蛇~
    發(fā)表于 11-23 16:51 ?16次下載
    利用51單片機(jī)+<b class='flag-5'>hc595</b>芯片配合在<b class='flag-5'>led</b>點(diǎn)陣上玩貪吃蛇 第一篇“顯示貪吃蛇”

    單片機(jī) STM32 HAL IO擴(kuò)展 74HC595 例子代碼

    #include "74hc595.h"/******************功 能:定義HC595的功能引腳備 注:變更引腳,由MX配置完成
    發(fā)表于 11-24 09:36 ?22次下載
    單片機(jī) STM32 HAL IO擴(kuò)展 74<b class='flag-5'>HC595</b> 例子代碼