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

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

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

面向接口的編程——平臺(tái)技術(shù)、開(kāi)關(guān)量信號(hào)

AGk5_ZLG_zhiyua ? 來(lái)源:未知 ? 作者:佚名 ? 2017-10-20 14:55 ? 次閱讀

周立功教授新書(shū)《面向AMetal框架與接口編程(上)》,對(duì)AMetal框架進(jìn)行了詳細(xì)介紹,通過(guò)閱讀這本書(shū),你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口編程的開(kāi)發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實(shí)現(xiàn)企業(yè)和個(gè)人的共同進(jìn)步。經(jīng)周立功教授授權(quán),即日起,致遠(yuǎn)電子公眾號(hào)將對(duì)該書(shū)內(nèi)容進(jìn)行連載,愿共勉之。

第四章為面向接口的編程,本文內(nèi)容包括:4.1 平臺(tái)技術(shù)、4.2 開(kāi)關(guān)量信號(hào)

本章導(dǎo)讀:

在結(jié)構(gòu)化程序設(shè)計(jì)中,由于高層模塊依賴底層模塊,通常一個(gè)變化會(huì)引出另外的問(wèn)題發(fā)生改變,則變化的代價(jià)就會(huì)急劇上升。所以在引入接口時(shí),一個(gè)重要的經(jīng)濟(jì)考量是軟件的不可預(yù)測(cè)性,因?yàn)樾枨蠛图夹g(shù)都在以不可預(yù)測(cè)的方式變化,其目的就是為了降低依賴。

4.1 平臺(tái)技術(shù)

>>> 4.1.1 創(chuàng)新的窘境

雖然嵌入式系統(tǒng)和通用計(jì)算機(jī)系統(tǒng)同源,由于應(yīng)用領(lǐng)域和研發(fā)人員的不同,嵌入式系統(tǒng)很早就走向了相對(duì)獨(dú)立的發(fā)展道路。通用計(jì)算機(jī)軟件幫助人們解決了各種繁雜的問(wèn)題,隨著需求的提升,所面臨的問(wèn)題越來(lái)越復(fù)雜,軟件領(lǐng)域的大師們對(duì)這些問(wèn)題進(jìn)行了深入研究和實(shí)踐,于是誕生了科學(xué)的軟件工程理論,無(wú)需多言通用計(jì)算機(jī)軟件的發(fā)展是我們有目共睹的。

再回過(guò)頭來(lái)看嵌入式系統(tǒng)的發(fā)展,其需求相對(duì)來(lái)說(shuō)較為簡(jiǎn)單,比如,通過(guò)熱電阻傳感器測(cè)溫、上下限報(bào)警與繼電器的動(dòng)作,因此嵌入式系統(tǒng)的應(yīng)用開(kāi)發(fā)似乎沒(méi)有必要使用復(fù)雜的軟件工程方法,于是通用計(jì)算機(jī)系統(tǒng)和嵌入式系統(tǒng)走上了不同的發(fā)展道路。

當(dāng)嵌入式系統(tǒng)發(fā)展到今天,所面對(duì)的問(wèn)題也日益變得復(fù)雜起來(lái),而編程模式卻沒(méi)有多大的進(jìn)步,這就是所面臨的困境。相信大家都或多或少地感覺(jué)到了,嵌入式系統(tǒng)行業(yè)的環(huán)境已經(jīng)開(kāi)始發(fā)生了根本的改變,智能硬件工業(yè)互聯(lián)網(wǎng)等都讓人始料不及,危機(jī)感油然而生。

盡管企業(yè)投入巨資不遺余力地組建了龐大的開(kāi)發(fā)團(tuán)隊(duì),當(dāng)產(chǎn)品開(kāi)發(fā)完成后,從原材料BOM 與制造成本角度來(lái)看,毛利還算不錯(cuò)。當(dāng)扣除研發(fā)投入和合理的營(yíng)銷成本后,企業(yè)的利潤(rùn)所剩無(wú)幾,即便這樣員工依然還是感到不滿意,這就是傳統(tǒng)企業(yè)管理者的窘境。

雖然ZLG 投入了大量的人力資源,但重復(fù)勞動(dòng)所造成的損耗以億元計(jì)。上千種MCU,由于缺乏平臺(tái)化的技術(shù),即便相同的外圍器件,幾乎都要重新編寫相應(yīng)的代碼和文檔并進(jìn)行測(cè)試,所有的應(yīng)用軟件很難做到完美地復(fù)用。

在開(kāi)發(fā)同一系列高中低三個(gè)層次的產(chǎn)品時(shí),通常會(huì)遇到這樣的問(wèn)題,主芯片可能使用ARM9、雙核A9 和DSP,其操作系統(tǒng)分別為μC/OS-II、Linux 和SysBIOS。不僅驅(qū)動(dòng)代碼不兼容,而且應(yīng)用層代碼也不一樣,顯然浪費(fèi)在這上面的開(kāi)銷是不可想象的。

>>> 4.1.2 AWorks

在MCU 產(chǎn)業(yè)快速發(fā)展的今天,不同的MCU 外設(shè)的差異千差萬(wàn)別。AWorks 對(duì)同一類外設(shè)進(jìn)行了抽象,并設(shè)計(jì)了相應(yīng)的標(biāo)準(zhǔn)接口與對(duì)應(yīng)的中間層,使得不同廠商、型號(hào)的MCU 外設(shè)都能以標(biāo)準(zhǔn)的接口操作。

對(duì)于上層操作系統(tǒng)而言,對(duì)各個(gè)外設(shè)都需要編寫驅(qū)動(dòng)。在編寫特定操作系統(tǒng)下的驅(qū)動(dòng)時(shí),必須熟悉特定的驅(qū)動(dòng)平臺(tái)與操作系統(tǒng)調(diào)用,以至于程序員不得不花費(fèi)大量的時(shí)間學(xué)習(xí)與此相關(guān)的知識(shí)。對(duì)于同一個(gè)外設(shè)而言,如果要支持多個(gè)操作系統(tǒng),則需要編寫多個(gè)驅(qū)動(dòng),其實(shí)驅(qū)動(dòng)底層對(duì)硬件的操作是有相通之處的,AWorks 的出現(xiàn)便是解決這里提到的問(wèn)題。

1. AWorks 的特點(diǎn)

如圖4.1 所示是AWorks 的標(biāo)識(shí)符,這是ZLG 經(jīng)過(guò)十多年時(shí)間積累開(kāi)發(fā)的IoT 物聯(lián)網(wǎng)生態(tài)系統(tǒng),成功地應(yīng)用到ZLG 的示波器、功率計(jì)、功率分析儀、電壓監(jiān)測(cè)儀、電能質(zhì)量分析儀、數(shù)據(jù)記錄儀與工業(yè)通訊等系列高性能儀器和工業(yè)IoT 產(chǎn)品中。

圖4.1 AWorks

雖然AWorks 內(nèi)嵌了操作系統(tǒng),但AWorks 中的操作系統(tǒng)如同一個(gè)驅(qū)動(dòng)代碼一樣,僅僅是一個(gè)可以根據(jù)需要任意更換的組件。操作系統(tǒng)適配器直接駐留在操作系統(tǒng)接口之上,主要用于屏蔽各類操作系統(tǒng)和硬件接口的差異,從而增強(qiáng)了AWorks 的可移植性和可維護(hù)性,詳見(jiàn)圖4.2。

圖4.2 AMetal 與AWorks 的關(guān)系

AWorks 的核心是制定了統(tǒng)一的接口規(guī)范,可以“按需定制”提供各種各樣的高質(zhì)量組件,以及圖形化配置工具,則開(kāi)發(fā)者無(wú)需關(guān)心與MCU、外圍器件、OS有關(guān)的技術(shù)細(xì)節(jié)。如果要對(duì)底層硬件外設(shè)進(jìn)行操作,也可以直接調(diào)用底層接口。

其目的是不依賴于具體的底層硬件,實(shí)現(xiàn)“一次編程、終生使用”和“跨平臺(tái)”,通過(guò)高度復(fù)用應(yīng)用軟件組件,從而將程序員從苦海中釋放出來(lái),使之聚焦于更有競(jìng)爭(zhēng)力的需求分析、算法和用戶體驗(yàn)等業(yè)務(wù)邏輯上。行業(yè)合作伙伴可以在該平臺(tái)上開(kāi)發(fā)各種應(yīng)用,通過(guò)有線接入和無(wú)線接入收集、管理和處理數(shù)據(jù)。

由于AWorks 提供的所有組件均使用靜態(tài)內(nèi)存,不使用malloc()等動(dòng)態(tài)內(nèi)存分配函數(shù),徹底避免了內(nèi)存泄漏。且程序編譯完成后,即可知道系統(tǒng)運(yùn)行需要占用多大的內(nèi)存。AWorks是輕量級(jí)的實(shí)時(shí)系統(tǒng),所有組件對(duì)初始化都進(jìn)行了優(yōu)化,系統(tǒng)能以極短的時(shí)間啟動(dòng),因此在絕大部分項(xiàng)目中,啟動(dòng)時(shí)間<1s。顯然系統(tǒng)運(yùn)行時(shí)的實(shí)時(shí)性,確定性得到了最大的保障。

2. AMetal 的特點(diǎn)

AMetal 是AWorks 的子集,它是以API 的形式提供的,但不依賴AWorks。即:

  • 將外設(shè)操作標(biāo)準(zhǔn)化,無(wú)需再次開(kāi)發(fā)上層軟件、驅(qū)動(dòng);

  • AMetal 作為AWorks 標(biāo)準(zhǔn)化的外設(shè)功能補(bǔ)充,可以直接調(diào)用;

  • 可作為獨(dú)立發(fā)布的軟件包。

其特點(diǎn)為:

  • 能獨(dú)立運(yùn)行的AMetal,提供工程模板與demo,在此基礎(chǔ)上開(kāi)發(fā)應(yīng)用程序;

  • 不依賴操作系統(tǒng)服務(wù),將外設(shè)的所有特性開(kāi)放出來(lái);

  • 封裝時(shí)將效率和變化部分放在第一位,用戶不看手冊(cè)也能使用。

AMetal 在嵌入式軟件開(kāi)發(fā)中的位置詳見(jiàn)圖4.3,它位于底層硬件和上層軟件之間,可以被應(yīng)用程序與操作系統(tǒng)直接調(diào)用。AMetal 包括兩部分,即AMetal API 和AMetal 組件。

圖4.3 AMetal 在嵌入式軟件開(kāi)發(fā)中位置

AMetal API 重在抽象MCU 本身的功能部件,比如,GPIO、SPI、UART、I2C 等,程序員再也不用查看芯片手冊(cè)就能編寫外圍器件驅(qū)動(dòng)程序。AMetal 組件重在抽象外圍擴(kuò)展接口器件,比如,E2PROM、SPI NOR Flash、PCF85063 RTC、zigbee、BLE、鍵盤掃描與LED顯示器電路等,程序員再也不用看原理圖和編寫外圍器件驅(qū)動(dòng)程序。

AMetal 提供的不僅僅是某個(gè)MCU 的軟件包,而是一套接口規(guī)范,因此只要遵循AMetal 標(biāo)準(zhǔn)化接口函數(shù)規(guī)約,無(wú)論所用的MCU 是ARM還是DSP 或其它的內(nèi)核,則應(yīng)用軟件均可實(shí)現(xiàn)復(fù)用。

如圖4.4 所示的AMetal 框架分為硬件層、驅(qū)動(dòng)層和標(biāo)準(zhǔn)接口層,上層軟件根據(jù)需求調(diào)用合適的API 接口。三層都有對(duì)應(yīng)的頭文件和用戶配置文件,供用戶引用相應(yīng)的接口。雖然各大半導(dǎo)體公司針對(duì)各自的MCU,提供了類似AMetal 這樣的裸機(jī)API,但每個(gè)新的MCU,其API 的差異很大,因此很難做到復(fù)用應(yīng)用軟件。

圖4.4 AMetal 框架

這里以GPIO 為例,給出相應(yīng)的的文件結(jié)構(gòu)圖,詳見(jiàn)圖4.5,AMetal 其相應(yīng)的文件有:HW 層文件、驅(qū)動(dòng)層文件和用戶配置文件。通常情況下,HW 層提供了直接操作硬件寄存器的接口,接口實(shí)現(xiàn)簡(jiǎn)潔,往往以內(nèi)聯(lián)函數(shù)的形式放在.h 文件中,因此,HW 層通常只包含.h文件,但當(dāng)某些硬件功能設(shè)置較為復(fù)雜時(shí),也會(huì)提供對(duì)應(yīng)的非內(nèi)聯(lián)函數(shù),存放在.c文件中。驅(qū)動(dòng)層作為中間層,其使用HW 層接口,實(shí)現(xiàn)了標(biāo)準(zhǔn)接口層中定義的接口,以便用戶使用標(biāo)準(zhǔn)API 訪問(wèn)GPIO。用戶配置文件完成了相應(yīng)驅(qū)動(dòng)的配置,如引腳數(shù)目等。

圖4.5 GPIO 文件結(jié)構(gòu)

標(biāo)準(zhǔn)接口層對(duì)常見(jiàn)外設(shè)的操作進(jìn)行了抽象,提出了一套標(biāo)準(zhǔn)API 接口,可以保證在不同的硬件上,標(biāo)準(zhǔn)API 的行為都是一樣的。用戶使用一個(gè)GPIO 的過(guò)程:先調(diào)用驅(qū)動(dòng)初始化函數(shù),后續(xù)在編寫應(yīng)用程序時(shí)僅需直接調(diào)用標(biāo)準(zhǔn)接口函數(shù)即可??梢?jiàn),應(yīng)用程序基于標(biāo)準(zhǔn)API 實(shí)現(xiàn)的,標(biāo)準(zhǔn)API 與硬件平臺(tái)無(wú)關(guān),使得應(yīng)用程序可以輕松的在不同的硬件平臺(tái)上運(yùn)行。

4.2 開(kāi)關(guān)量信號(hào)

>>> 4.2.1 I/O 輸入輸出

嵌入式系統(tǒng)的主要功能就是要實(shí)現(xiàn)對(duì)現(xiàn)實(shí)事件的監(jiān)控,如同沒(méi)有配置顯示器、打印機(jī)或鍵盤的臺(tái)式計(jì)算機(jī)一樣,嵌入式系統(tǒng)必須具備輸入輸出(I/O)數(shù)字信號(hào)模擬信號(hào)的能力。LPC824 系列MCU 可用的GPIO 數(shù)目,具體取決于芯片的封裝類型,詳見(jiàn)表4.1。

表4.1 GPIO 引腳

其特性為:

(1)每個(gè)GPIO 引腳均可通過(guò)軟件配置為輸入或輸出;

(2)復(fù)位時(shí)所有GPIO引腳默認(rèn)為輸入;

(3)引腳中斷寄存器允許單獨(dú)設(shè)置;

(4)可以獨(dú)立配置每個(gè)引腳的置高和置低。

當(dāng)LPC824 系列MCU 的I/O 口作為數(shù)字功能時(shí),可配置為上拉/下拉、開(kāi)漏和遲滯模式。在輸出模式下,無(wú)論配置為哪種模式,I/O 口都可輸出高/低電平。在輸入模式下,且引腳懸空時(shí),I/O 口設(shè)置為不同模式時(shí),其情況為:

(1)設(shè)置為高阻模式時(shí),讀取引腳的電平狀態(tài)不確定;

(2)設(shè)置為上拉模式時(shí),讀取引腳的電平狀態(tài)為高電平;

(3)設(shè)置為下拉模式時(shí),讀取引腳的電平狀態(tài)為低電平;

(4)設(shè)置為中繼模式時(shí),如果引腳配置為輸入且不被外部驅(qū)動(dòng),那么它可以令輸入引腳保持上一種已知狀態(tài)。

在默認(rèn)情況下,除I2C 總線P0_10 和P0_11 沒(méi)有可編程的上拉/下拉電阻和中繼模式外,其它所有GPIO 的上拉電阻都被使能。在默認(rèn)情況下,每個(gè)GPIO 僅分配給一個(gè)且僅一個(gè)外部引腳,外部引腳隨后便由其固定引腳GPIO 功能來(lái)標(biāo)識(shí)。但通過(guò)開(kāi)關(guān)矩陣可將內(nèi)部功能分配給除電源和接地引腳外的任意外部引腳,這些功能稱為可轉(zhuǎn)移功能。而晶體振蕩器引腳(XTALIN/XTALOUT)或模擬比較器輸入等某些功能僅可分配給具有適當(dāng)電氣特性的特定外部引腳,這些功能稱為固定引腳功能。如果某個(gè)固定引腳功能未被使用,則可將其替換為任意可轉(zhuǎn)移功能。對(duì)于固定引腳模擬功能,開(kāi)關(guān)矩陣可使能模擬輸入或輸出并禁用數(shù)字端口。

>>> 4.2.2 新建工程

在編程之前,必須先建立工程,然后才能將程序下載到開(kāi)發(fā)板上運(yùn)行。由于AMetal 已經(jīng)提供了模板工程,所以“新建工程”只需拷貝一下即可。

模板工程就是位于projects_keil5applications 目錄下的 template 文件夾。新建工程即將該文件夾重新復(fù)制一份,命名為led_blinking。接著打開(kāi)led_blinking 文件夾,將工程文件命名為led_blinking,然后雙擊led_blinking.uvprojx 工程文件打開(kāi)工程,更詳細(xì)的操作詳見(jiàn)配套開(kāi)發(fā)資料中的《快速入門手冊(cè)》。

打開(kāi)工程后,雖然在工程視圖的左側(cè)有很多分組(user_config 和user_code 等),每個(gè)分組下都有相應(yīng)的文件。但先不用理會(huì),只需要關(guān)心user_code 分組下的main.c 文件,就在該文件中的am_main()函數(shù)中添加應(yīng)用程序。當(dāng)MCU 無(wú)事可做時(shí),不能讓它閑下來(lái),因?yàn)閍m_main()函數(shù)結(jié)束標(biāo)志整個(gè)應(yīng)用程序結(jié)束,從而導(dǎo)致MCU 跑飛。因此,am_main()函數(shù)中通常都存在一個(gè)while(1)死循環(huán)。當(dāng)工程建好后,即可編程了。

>>> 4.2.3 輸出控制

如圖4.6 所示為AM824-Core 板載的2 個(gè)LED發(fā)光二極管,與MCU 的I/O 引腳通過(guò)J9 和J10 相連,其中的LED0 通過(guò)J9 與MCU 的PIO0_20 相連,LED1 通過(guò)J10 與MCU 的PIO0_21 相連。當(dāng)I/O 輸出低電平0 時(shí),由于LED 陽(yáng)極加了3.3V 電壓(高電平1),因而形成了電位差,所以有電流流動(dòng),則LED 發(fā)光二極管導(dǎo)通,即LED 發(fā)光;當(dāng)I/O 輸出高電平1 時(shí),由于無(wú)法形成電位差,則LED二極管不導(dǎo)通,即LED 熄滅。

圖4.6 板載LED 電路

電阻R3、R4 的作用是防止產(chǎn)生過(guò)電流而燒壞LED,這是由電源電壓和LED 的額定電流決定的LED 電學(xué)特性而接入的,當(dāng)LED 的電壓超過(guò)1.5V 時(shí),電流將急劇增加,所以必須避免出現(xiàn)這樣的情況。在數(shù)字電路中,當(dāng)輸出為高電位時(shí),則電流流到負(fù)載上;當(dāng)輸出為低電位時(shí),則從負(fù)載一側(cè)吸入電流。前者的電流叫作源電流,后者叫作吸收電流。顯然LED只有點(diǎn)亮、熄滅和翻轉(zhuǎn)3 種操作,可以直接調(diào)用接口函數(shù)實(shí)現(xiàn),led.h 接口文件的內(nèi)容詳見(jiàn)程序清單4.1(各接口具體的實(shí)現(xiàn)在第4 章中會(huì)詳細(xì)介紹)。

程序清單4.1 led.h 接口

其中,led_id 是LED 的編號(hào),AM824-Core 板載LED 的編號(hào)分別為0 和1。事實(shí)上程序設(shè)計(jì)的依賴倒置原則不一定要包含函數(shù)指針或抽象類型數(shù)據(jù),當(dāng)調(diào)用led_on()和led_off()點(diǎn)亮或熄滅LED 時(shí),就使用了依賴倒置原則。它本來(lái)可以與I/O 的內(nèi)存映射直接交互,卻將直接訪問(wèn)抽象成了接口。那么針對(duì)接口的編程不妨就從點(diǎn)亮LED 開(kāi)始,詳見(jiàn)程序清單4.2。

程序清單4.2 點(diǎn)亮LED 范例程序

LED 閃爍就是讓LED 不停的亮滅,因?yàn)橛?jì)算機(jī)指令的執(zhí)行速度非???,其執(zhí)行時(shí)間是微秒級(jí)的,所以在微秒之間點(diǎn)亮和熄滅LED,眼睛是看不到閃爍現(xiàn)象的。如果想讓人眼看到LED 閃爍,就必須將LED 點(diǎn)亮和熄滅的停頓時(shí)間擴(kuò)大近秒級(jí)別。如何實(shí)現(xiàn)停頓呢?點(diǎn)亮LED 后,先不要熄滅LED,而是先延時(shí)一會(huì)兒,讓“點(diǎn)亮LED 后,再保持一段時(shí)間”,然后再熄滅LED。在實(shí)驗(yàn)之前,我們需要延時(shí)函數(shù),它在C 語(yǔ)言中是怎么實(shí)現(xiàn)呢?很簡(jiǎn)單,就是讓MCU 執(zhí)行一些沒(méi)有任何實(shí)際意義的空循環(huán)指令,進(jìn)而等效于延時(shí)。延時(shí)范例程序詳見(jiàn)程序清單4.3,該程序中,MCU 大約就要執(zhí)行1000000 條空指令。

程序清單4.3 延時(shí)范例程序

這樣的延時(shí)函數(shù)好用嗎?由于MCU 運(yùn)行速率不同,因而導(dǎo)致實(shí)際的延時(shí)結(jié)果不同。如果要求不同的延時(shí)時(shí)間,則又需要不同的延時(shí)函數(shù)。顯然,該延時(shí)函數(shù)不僅通用性太差,而且延時(shí)時(shí)間也不精確。幸運(yùn)的是,AMetal 提供了使用定時(shí)器實(shí)現(xiàn)的高精度標(biāo)準(zhǔn)延時(shí)函數(shù),主要包含了2 個(gè)延時(shí)函數(shù),其函數(shù)原型(am_delay.h)如下:

按照前面的思路,在點(diǎn)亮燈之后,延時(shí)一段時(shí)間,讓“亮燈狀態(tài)”保持一段時(shí)間,再熄滅LED 燈,再延時(shí)一段時(shí)間,讓“熄滅狀態(tài)”保持一段時(shí)間,詳見(jiàn)程序清單4.4。

程序清單4.4 單個(gè)LED 閃爍范例程序(1)

其實(shí)LED 不停地閃爍就是讓一個(gè)I/O 不斷翻轉(zhuǎn)的過(guò)程,而AMetal 軟件包針對(duì)LED 提供了翻轉(zhuǎn)LED 狀態(tài)的函數(shù)led_toggle(),優(yōu)化后的代碼詳見(jiàn)程序清單4.5。

程序清單4.5 單個(gè)LED 閃爍范例程序(2)

MiniPort-LED 模塊集成了8 個(gè)LED,均為低電平有效,分別通過(guò)PIO0_8~PIO0_15 控制,其中的R1~R8 為L(zhǎng)ED 的限流電阻,詳見(jiàn)圖4.7。

圖4.7 LED 模塊電路

LED 模塊通過(guò)MiniPort B(排母)與AM824-Core相連,同時(shí)將其余不使用的I/O 通過(guò)MiniPort A(排針)引出,實(shí)現(xiàn)模塊的橫向堆疊,其對(duì)應(yīng)AM824-Core 的MiniPort 接口J4 的功能定義詳見(jiàn)圖4.8。

圖4.8 LED 模塊實(shí)物與接口定義圖

下面將以LED 流水燈為例說(shuō)明通用函數(shù)接口的應(yīng)用開(kāi)發(fā)方法。人們時(shí)常看到戶外動(dòng)畫(huà)廣告,一會(huì)兒從左到右顯示,一會(huì)兒又從右到左顯示,這就是流水燈效果?,F(xiàn)在用LED 流水燈來(lái)模擬戶外動(dòng)畫(huà)廣告,使LED 順時(shí)針旋轉(zhuǎn)循環(huán)流動(dòng)。假設(shè)上電初始化,將所有的GPIO 都配置為輸出,且初始化為高電平,即所有的LED 全部熄滅。首先點(diǎn)亮LED0,延時(shí)后熄滅LED0;接著點(diǎn)亮LED1,延時(shí)后熄滅LED1......;然后點(diǎn)亮LED7,延時(shí)后熄滅LED7;接著點(diǎn)亮LED0,延時(shí)后熄滅LED0……,周而復(fù)始形成了循環(huán)的圓環(huán),詳見(jiàn)程序清單4.6。

程序清單4.6 LED 流水燈范例程序(1)

流水燈實(shí)驗(yàn)使用的是MiniPort-LED 的8 個(gè)LED,其對(duì)應(yīng)的控制引腳與AM824-Core 上兩個(gè)LED 對(duì)應(yīng)的控制引腳是不同的。當(dāng)使用MiniPort-LED 時(shí),需要將led.h 文件中的宏USE_MINIPORT_LED 對(duì)應(yīng)的值修改為1,表明使用MiniPort-LED。該宏的默認(rèn)值為0,使用AM824-Core 板載的兩個(gè)LED 燈。

顯然,LED 流水燈是一個(gè)典型的“首尾相接”算法,循環(huán)隊(duì)列與環(huán)形緩沖區(qū)等都屬于同一類問(wèn)題,這是一種常用的軟件設(shè)計(jì)模式,優(yōu)化后的代碼詳見(jiàn)程序清單4.7。

程序清單4.7 LED 流水燈范例程序(2)

如圖4.9 所示為無(wú)源蜂鳴器電路原理圖,只要短接J7_1 與J7_2,則蜂鳴器接入PIO0_24。當(dāng)PIO0_24 輸出低電平時(shí),則三極管導(dǎo)通,向蜂鳴器供電;當(dāng)PIO0_24 輸出高電平時(shí),則三極管截止,停止向蜂鳴器供電。因此只需要輪流切換PIO0_24 的電平狀態(tài),就可以控制蜂鳴器的“通電”和“斷電”,即以一定的頻率翻轉(zhuǎn)PIO0_24 的輸出電平。其實(shí)接通和斷開(kāi)“一段時(shí)間”的總和就是蜂鳴器的振蕩周期,再稍作轉(zhuǎn)換就能夠得到確定的音頻脈沖頻率參數(shù)。從而產(chǎn)生機(jī)械振動(dòng)音,只要頻率在人耳聽(tīng)覺(jué)范圍內(nèi),即可聽(tīng)到蜂鳴器發(fā)聲。

圖4.9 蜂鳴器電路圖

顯然,通過(guò)翻轉(zhuǎn)引腳電平和延時(shí),也可以讓蜂鳴器發(fā)出固定頻率的聲音。假如使蜂鳴器發(fā)出1KHz 頻率的聲音,1KHz 頻率對(duì)應(yīng)的周期為:T=1/1000(s)=1(ms),由于一個(gè)周期是低電平(接通)時(shí)間和高電平(斷開(kāi))時(shí)間的總和,因此在一個(gè)周期內(nèi),高、低電平保持的的時(shí)間分別為500us。由此可見(jiàn),要使蜂鳴器不間斷地發(fā)聲,只要以500us 的時(shí)間間隔不斷的翻轉(zhuǎn)引腳的輸出電平即可。當(dāng)需要控制蜂鳴器時(shí),可直接調(diào)用蜂鳴器接口,buzzer.h文件內(nèi)容詳見(jiàn)程序清單4.8 buzzer.h 接口。

程序清單4.8 buzzer.h 接口

buzzer_init()會(huì)將發(fā)聲頻率設(shè)置為默認(rèn)值:1KHz。如需修改發(fā)聲頻率為其它值,如:2.5KHz,則應(yīng)調(diào)用發(fā)聲頻率設(shè)置函數(shù),即“buzzer_freq_set(2500);”,詳見(jiàn)程序清單4.9。

程序清單4.9 蜂鳴器發(fā)聲范例程序


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

    關(guān)注

    88

    文章

    3635

    瀏覽量

    93888

原文標(biāo)題:周立功:面向接口的編程——平臺(tái)技術(shù)、開(kāi)關(guān)量信號(hào)

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    依托面向接口編程開(kāi)發(fā)思想,聚焦LED通用設(shè)計(jì)

    面向通用接口編程使得應(yīng)用程序與具體硬件無(wú)關(guān),可以很容易地實(shí)現(xiàn)跨平臺(tái)復(fù)用。但究其本質(zhì)如何,具體是怎樣實(shí)現(xiàn)的呢?
    的頭像 發(fā)表于 01-15 09:59 ?8304次閱讀

    面向AMetal框架與接口編程原理和技巧

    面向AMetal框架與接口編程(上)》一書(shū)對(duì)AMetal框架進(jìn)行了詳細(xì)介紹,通過(guò)閱讀這本書(shū),你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口
    的頭像 發(fā)表于 10-24 18:15 ?6282次閱讀
    <b class='flag-5'>面向</b>AMetal框架與<b class='flag-5'>接口</b>的<b class='flag-5'>編程</b>原理和技巧

    面向ametal框架與接口編程ametal uart總線

    面向AMetal框架與接口編程(上)》一書(shū)對(duì)AMetal框架進(jìn)行了詳細(xì)介紹,通過(guò)閱讀這本書(shū),你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口
    的頭像 發(fā)表于 11-06 06:55 ?6340次閱讀
    <b class='flag-5'>面向</b>ametal框架與<b class='flag-5'>接口</b>的<b class='flag-5'>編程</b>ametal uart總線

    面向通用接口編程之溫度采集接口和鍵盤知識(shí)分享

    第七章為面向通用接口編程,本文內(nèi)容為7.4 溫度采集接口、7.5 鍵盤。
    的頭像 發(fā)表于 11-16 03:20 ?4465次閱讀
    <b class='flag-5'>面向</b>通用<b class='flag-5'>接口</b>的<b class='flag-5'>編程</b>之溫度采集<b class='flag-5'>接口</b>和鍵盤知識(shí)分享

    面向接口編程技術(shù)平臺(tái)技術(shù)開(kāi)關(guān)信號(hào)知識(shí)講解

    在結(jié)構(gòu)化程序設(shè)計(jì)中,由于高層模塊依賴底層模塊,通常一個(gè)變化會(huì)引出另外的問(wèn)題發(fā)生改變,則變化的代價(jià)就會(huì)急劇上升。所以在引入接口時(shí),一個(gè)重要的經(jīng)濟(jì)考量是軟件的不可預(yù)測(cè)性,因?yàn)樾枨蠛?b class='flag-5'>技術(shù)都在以不可預(yù)測(cè)的方式變化,其目的就是為了降低依賴。
    的頭像 發(fā)表于 12-07 07:08 ?4890次閱讀
    <b class='flag-5'>面向</b><b class='flag-5'>接口</b><b class='flag-5'>編程技術(shù)</b>之<b class='flag-5'>平臺(tái)</b><b class='flag-5'>技術(shù)</b>和<b class='flag-5'>開(kāi)關(guān)</b><b class='flag-5'>量</b><b class='flag-5'>信號(hào)</b>知識(shí)講解

    如何理解軟件設(shè)計(jì)原則和面向接口編程的開(kāi)發(fā)思想

    面向通用接口編程,雖然面向接口編程簡(jiǎn)單易懂,但無(wú)法做到最大程度上地重用應(yīng)用程序,這是導(dǎo)致軟件
    的頭像 發(fā)表于 01-22 09:11 ?1.1w次閱讀

    使用windows平臺(tái)實(shí)現(xiàn)向eelink平臺(tái)請(qǐng)求開(kāi)關(guān)狀態(tài)

    Yeelink平臺(tái)查詢開(kāi)關(guān)——套接字編程 Windows平臺(tái)
    發(fā)表于 04-28 06:38

    面向AMetal框架與接口編程(上)》周立功最新力作

    面向Ametal框架與接口編程
    發(fā)表于 08-21 13:49 ?52次下載
    《<b class='flag-5'>面向</b>AMetal框架與<b class='flag-5'>接口</b>的<b class='flag-5'>編程</b>(上)》周立功最新力作

    面向AMetal框架和接口編程

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

    開(kāi)關(guān)模擬同時(shí)采集 rs485/232通訊接口

    ● 八路4-20mA輸入Modbus RTU通訊協(xié)議 ● 四路開(kāi)關(guān)輸入,四路開(kāi)關(guān)輸出 ● 通過(guò)RS-485/232接口可以程控校準(zhǔn)模
    的頭像 發(fā)表于 04-19 10:58 ?1775次閱讀
    <b class='flag-5'>開(kāi)關(guān)</b><b class='flag-5'>量</b>模擬<b class='flag-5'>量</b>同時(shí)采集 rs485/232通訊<b class='flag-5'>接口</b>

    開(kāi)關(guān)信號(hào)隔離變送器

    開(kāi)關(guān)信號(hào)隔離變送器 型號(hào):JSD TAK-1001D捷晟達(dá)科技JSD TAK-1001D系列開(kāi)關(guān)
    發(fā)表于 09-02 01:18 ?0次下載

    PLC開(kāi)關(guān)信號(hào)和模擬信號(hào)如何轉(zhuǎn)換?

    PLC開(kāi)關(guān)信號(hào)和模擬信號(hào)的轉(zhuǎn)化問(wèn)題也是PLC的經(jīng)典應(yīng)用問(wèn)題。要說(shuō)清楚PLC開(kāi)關(guān)
    發(fā)表于 12-17 10:05 ?1908次閱讀
    PLC<b class='flag-5'>開(kāi)關(guān)</b><b class='flag-5'>量</b><b class='flag-5'>信號(hào)</b>和模擬<b class='flag-5'>量</b><b class='flag-5'>信號(hào)</b>如何轉(zhuǎn)換?

    如何在PLC系統(tǒng)中使用開(kāi)關(guān)信號(hào)

    開(kāi)關(guān)信號(hào),作為工業(yè)自動(dòng)化中不可或缺的一部分,廣泛應(yīng)用于PLC(可編程邏輯控制器)系統(tǒng)中,用于實(shí)現(xiàn)對(duì)設(shè)備、機(jī)器或過(guò)程的監(jiān)控和控制。本文將詳細(xì)闡述在PLC系統(tǒng)中如何使用
    的頭像 發(fā)表于 06-14 16:54 ?1555次閱讀

    PLC開(kāi)關(guān)輸出接口的類型及特點(diǎn)

    輸出接口控制外部設(shè)備的動(dòng)作。其中,開(kāi)關(guān)輸出接口是PLC與外部設(shè)備連接的關(guān)鍵環(huán)節(jié)之一。本文將詳細(xì)介紹PLC開(kāi)關(guān)
    的頭像 發(fā)表于 06-14 16:55 ?2116次閱讀

    plc開(kāi)關(guān)模擬的接線技巧

    PLC(可編程邏輯控制器)是工業(yè)自動(dòng)化領(lǐng)域中常用的一種控制設(shè)備。在實(shí)際應(yīng)用中,PLC需要與各種傳感器、執(zhí)行器等設(shè)備進(jìn)行連接,以實(shí)現(xiàn)對(duì)生產(chǎn)過(guò)程的控制。PLC的輸入輸出接口主要分為開(kāi)關(guān)
    的頭像 發(fā)表于 08-30 10:55 ?995次閱讀