精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

面向接口編程技術之平臺技術和開關量信號知識講解

UtFs_Zlgmcu7890 ? 來源:互聯網 ? 作者:佚名 ? 2017-12-07 07:08 ? 次閱讀

第四章為面向接口編程,本文內容包括:4.1 平臺技術、4.2 開關量信號

本章導讀:

在結構化程序設計中,由于高層模塊依賴底層模塊,通常一個變化會引出另外的問題發生改變,則變化的代價就會急劇上升。所以在引入接口時,一個重要的經濟考量是軟件的不可預測性,因為需求和技術都在以不可預測的方式變化,其目的就是為了降低依賴。

4.1 平臺技術

>>> 4.1.1 創新的窘境

雖然嵌入式系統和通用計算機系統同源,由于應用領域和研發人員的不同,嵌入式系統很早就走向了相對獨立的發展道路。通用計算機軟件幫助人們解決了各種繁雜的問題,隨著需求的提升,所面臨的問題越來越復雜,軟件領域的大師們對這些問題進行了深入研究和實踐,于是誕生了科學的軟件工程理論,無需多言通用計算機軟件的發展是我們有目共睹的。

再回過頭來看嵌入式系統的發展,其需求相對來說較為簡單,比如,通過熱電阻傳感器測溫、上下限報警與繼電器的動作,因此嵌入式系統的應用開發似乎沒有必要使用復雜的軟件工程方法,于是通用計算機系統和嵌入式系統走上了不同的發展道路。

當嵌入式系統發展到今天,所面對的問題也日益變得復雜起來,而編程模式卻沒有多大的進步,這就是所面臨的困境。相信大家都或多或少地感覺到了,嵌入式系統行業的環境已經開始發生了根本的改變,智能硬件工業互聯網等都讓人始料不及,危機感油然而生。

盡管企業投入巨資不遺余力地組建了龐大的開發團隊,當產品開發完成后,從原材料BOM 與制造成本角度來看,毛利還算不錯。當扣除研發投入和合理的營銷成本后,企業的利潤所剩無幾,即便這樣員工依然還是感到不滿意,這就是傳統企業管理者的窘境。

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

在開發同一系列高中低三個層次的產品時,通常會遇到這樣的問題,主芯片可能使用ARM9、雙核A9 和DSP,其操作系統分別為μC/OS-II、Linux 和SysBIOS。不僅驅動代碼不兼容,而且應用層代碼也不一樣,顯然浪費在這上面的開銷是不可想象的。

>>> 4.1.2 AWorks

在MCU 產業快速發展的今天,不同的MCU 外設的差異千差萬別。AWorks 對同一類外設進行了抽象,并設計了相應的標準接口與對應的中間層,使得不同廠商、型號的MCU 外設都能以標準的接口操作。

對于上層操作系統而言,對各個外設都需要編寫驅動。在編寫特定操作系統下的驅動時,必須熟悉特定的驅動平臺與操作系統調用,以至于程序員不得不花費大量的時間學習與此相關的知識。對于同一個外設而言,如果要支持多個操作系統,則需要編寫多個驅動,其實驅動底層對硬件的操作是有相通之處的,AWorks 的出現便是解決這里提到的問題。

1. AWorks 的特點

如圖4.1 所示是AWorks 的標識符,這是ZLG 經過十多年時間積累開發的IoT 物聯網生態系統,成功地應用到ZLG 的示波器、功率計、功率分析儀、電壓監測儀、電能質量分析儀、數據記錄儀與工業通訊等系列高性能儀器和工業IoT 產品中。

圖4.1 AWorks

雖然AWorks 內嵌了操作系統,但AWorks 中的操作系統如同一個驅動代碼一樣,僅僅是一個可以根據需要任意更換的組件。操作系統適配器直接駐留在操作系統接口之上,主要用于屏蔽各類操作系統和硬件接口的差異,從而增強了AWorks 的可移植性和可維護性,詳見圖4.2。

圖4.2 AMetal 與AWorks 的關系

AWorks 的核心是制定了統一的接口規范,可以“按需定制”提供各種各樣的高質量組件,以及圖形化配置工具,則開發者無需關心與MCU、外圍器件、OS有關的技術細節。如果要對底層硬件外設進行操作,也可以直接調用底層接口。

其目的是不依賴于具體的底層硬件,實現“一次編程、終生使用”和“跨平臺”,通過高度復用應用軟件組件,從而將程序員從苦海中釋放出來,使之聚焦于更有競爭力的需求分析、算法和用戶體驗等業務邏輯上。行業合作伙伴可以在該平臺上開發各種應用,通過有線接入和無線接入收集、管理和處理數據。

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

2. AMetal 的特點

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

  • 將外設操作標準化,無需再次開發上層軟件、驅動;

  • AMetal 作為AWorks 標準化的外設功能補充,可以直接調用;

  • 可作為獨立發布的軟件包。

其特點為:

  • 能獨立運行的AMetal,提供工程模板與demo,在此基礎上開發應用程序;

  • 不依賴操作系統服務,將外設的所有特性開放出來;

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

AMetal 在嵌入式軟件開發中的位置詳見圖4.3,它位于底層硬件和上層軟件之間,可以被應用程序與操作系統直接調用。AMetal 包括兩部分,即AMetal API 和AMetal 組件。

圖4.3 AMetal 在嵌入式軟件開發中位置

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

AMetal 提供的不僅僅是某個MCU 的軟件包,而是一套接口規范,因此只要遵循AMetal 標準化接口函數規約,無論所用的MCU 是ARM還是DSP 或其它的內核,則應用軟件均可實現復用。

如圖4.4 所示的AMetal 框架分為硬件層、驅動層和標準接口層,上層軟件根據需求調用合適的API 接口。三層都有對應的頭文件和用戶配置文件,供用戶引用相應的接口。雖然各大半導體公司針對各自的MCU,提供了類似AMetal 這樣的裸機API,但每個新的MCU,其API 的差異很大,因此很難做到復用應用軟件。

圖4.4 AMetal 框架

這里以GPIO 為例,給出相應的的文件結構圖,詳見圖4.5,AMetal 其相應的文件有:HW 層文件、驅動層文件和用戶配置文件。通常情況下,HW 層提供了直接操作硬件寄存器的接口,接口實現簡潔,往往以內聯函數的形式放在.h 文件中,因此,HW 層通常只包含.h文件,但當某些硬件功能設置較為復雜時,也會提供對應的非內聯函數,存放在.c文件中。驅動層作為中間層,其使用HW 層接口,實現了標準接口層中定義的接口,以便用戶使用標準API 訪問GPIO。用戶配置文件完成了相應驅動的配置,如引腳數目等。

圖4.5 GPIO 文件結構

標準接口層對常見外設的操作進行了抽象,提出了一套標準API 接口,可以保證在不同的硬件上,標準API 的行為都是一樣的。用戶使用一個GPIO 的過程:先調用驅動初始化函數,后續在編寫應用程序時僅需直接調用標準接口函數即可。可見,應用程序基于標準API 實現的,標準API 與硬件平臺無關,使得應用程序可以輕松的在不同的硬件平臺上運行。

4.2 開關量信號

>>> 4.2.1 I/O 輸入輸出

嵌入式系統的主要功能就是要實現對現實事件的監控,如同沒有配置顯示器、打印機或鍵盤的臺式計算機一樣,嵌入式系統必須具備輸入輸出(I/O)數字信號模擬信號的能力。LPC824 系列MCU 可用的GPIO 數目,具體取決于芯片的封裝類型,詳見表4.1。

表4.1 GPIO 引腳

其特性為:

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

(2)復位時所有GPIO引腳默認為輸入;

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

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

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

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

(2)設置為上拉模式時,讀取引腳的電平狀態為高電平;

(3)設置為下拉模式時,讀取引腳的電平狀態為低電平;

(4)設置為中繼模式時,如果引腳配置為輸入且不被外部驅動,那么它可以令輸入引腳保持上一種已知狀態。

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

>>> 4.2.2 新建工程

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

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

打開工程后,雖然在工程視圖的左側有很多分組(user_config 和user_code 等),每個分組下都有相應的文件。但先不用理會,只需要關心user_code 分組下的main.c 文件,就在該文件中的am_main()函數中添加應用程序。當MCU 無事可做時,不能讓它閑下來,因為am_main()函數結束標志整個應用程序結束,從而導致MCU 跑飛。因此,am_main()函數中通常都存在一個while(1)死循環。當工程建好后,即可編程了。

>>> 4.2.3 輸出控制

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

圖4.6 板載LED 電路

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

程序清單4.1 led.h 接口

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

程序清單4.2 點亮LED 范例程序

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

程序清單4.3 延時范例程序

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

按照前面的思路,在點亮燈之后,延時一段時間,讓“亮燈狀態”保持一段時間,再熄滅LED 燈,再延時一段時間,讓“熄滅狀態”保持一段時間,詳見程序清單4.4。

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

其實LED 不停地閃爍就是讓一個I/O 不斷翻轉的過程,而AMetal 軟件包針對LED 提供了翻轉LED 狀態的函數led_toggle(),優化后的代碼詳見程序清單4.5。

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

MiniPort-LED 模塊集成了8 個LED,均為低電平有效,分別通過PIO0_8~PIO0_15 控制,其中的R1~R8 為LED 的限流電阻,詳見圖4.7。

圖4.7 LED 模塊電路

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

圖4.8 LED 模塊實物與接口定義圖

下面將以LED 流水燈為例說明通用函數接口的應用開發方法。人們時常看到戶外動畫廣告,一會兒從左到右顯示,一會兒又從右到左顯示,這就是流水燈效果。現在用LED 流水燈來模擬戶外動畫廣告,使LED 順時針旋轉循環流動。假設上電初始化,將所有的GPIO 都配置為輸出,且初始化為高電平,即所有的LED 全部熄滅。首先點亮LED0,延時后熄滅LED0;接著點亮LED1,延時后熄滅LED1......;然后點亮LED7,延時后熄滅LED7;接著點亮LED0,延時后熄滅LED0……,周而復始形成了循環的圓環,詳見程序清單4.6。

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

流水燈實驗使用的是MiniPort-LED 的8 個LED,其對應的控制引腳與AM824-Core 上兩個LED 對應的控制引腳是不同的。當使用MiniPort-LED 時,需要將led.h 文件中的宏USE_MINIPORT_LED 對應的值修改為1,表明使用MiniPort-LED。該宏的默認值為0,使用AM824-Core 板載的兩個LED 燈。

顯然,LED 流水燈是一個典型的“首尾相接”算法,循環隊列與環形緩沖區等都屬于同一類問題,這是一種常用的軟件設計模式,優化后的代碼詳見程序清單4.7。

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

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

圖4.9 蜂鳴器電路圖

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

程序清單4.8 buzzer.h 接口

buzzer_init()會將發聲頻率設置為默認值:1KHz。如需修改發聲頻率為其它值,如:2.5KHz,則應調用發聲頻率設置函數,即“buzzer_freq_set(2500);”,詳見程序清單4.9。

程序清單4.9 蜂鳴器發聲范例程序

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

    關注

    0

    文章

    9

    瀏覽量

    8732
  • 開關量信號
    +關注

    關注

    0

    文章

    24

    瀏覽量

    2887

原文標題:周立功:面向接口的編程——平臺技術、開關量信號

文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    反向偏置霍爾效應開關的接近感應編程技術

    接近感應編程技術 本應用筆記假設用戶正在對Allegro?完全集成的反向偏置霍爾效應開關進行編程,或者用戶已經設計了合適的磁路來適應可編程單極霍爾效應
    的頭像 發表于 04-28 10:22 ?4556次閱讀
    反向偏置霍爾效應<b class='flag-5'>開關</b>的接近感應<b class='flag-5'>編程技術</b>

    vga使用編程技術

    vga使用編程技術
    發表于 03-21 19:04

    Labview高級編程技術(官方原版)

    Labview高級編程技術(官方英文原版) 希望對大家有幫助
    發表于 10-26 23:33

    labview6.1編程技術實用教程

    labview6.1編程技術實用教程
    發表于 12-17 09:19

    如何設計具有相似功能且基于SRAM編程技術的電路結構?

    CPLD的核心可編程結構是怎樣的?如何設計具有相似功能且基于SRAM編程技術的電路結構?基于SRAM編程技術的PLD電路結構是怎樣設計的?基于SRAM編程技術的P-Term電路結構是怎
    發表于 04-14 06:51

    基于嵌入式實時操作系統的編程技術資源同步介紹

    《基于嵌入式實時操作系統的編程技術》筆記清單:第三章任務劃分.《基于嵌入式實時操作系統的編程技術》筆記清單:第四章任務設計.《基于嵌入式實時操作系統的編程技術》筆記清單:第五章中斷服務程序設計
    發表于 12-22 06:30

    PLC控制系統的編程技術

    介紹了可編程序控制器控制系統開發過程中,PLC梯形圖編程要注意的問題及相應的編程技術。關鍵詞:可編程序控制器;控制系統;梯形圖;編程技術
    發表于 05-31 14:28 ?15次下載

    labview 6.1編程技術實用教程

    labview 6.1編程技術實用教程 本書共18章
    發表于 05-05 11:21 ?0次下載

    PHP編程技術文檔

    PHP編程技術文檔!資料來源網絡,如有侵權,敬請見諒
    發表于 11-20 14:49 ?0次下載

    Java編程技術文檔

    Java編程技術文檔!資料來源網絡,如有侵權,敬請見諒
    發表于 11-20 14:48 ?0次下載

    Dreamweaver編程技術文檔

    Dreamweaver編程技術文檔!資料來源網絡,如有侵權,敬請見諒
    發表于 11-20 15:14 ?0次下載

    Halcon9.0編程技術詳解

    Halcon9.0編程技術詳解Halcon9.0編程技術詳解
    發表于 12-22 15:20 ?0次下載

    鍵盤接口編程技術

    本文用通用性的實例對常用鍵盤接口編程問題作一個全面、細致的分析,并給出兩個通用的鍵盤編程模式,以幫助讀者對鍵盤編程技術有一個深刻的理解。
    發表于 03-28 17:59 ?8次下載

    Multicore多核編程技術

    Multicore多核編程技術,感興趣的可以看看。
    發表于 06-01 17:28 ?13次下載

    面向接口編程——平臺技術開關信號

    面向AMetal框架與接口編程(上)》一書對AMetal框架進行了詳細介紹,通過閱讀這本書,你可以學到高度復用的軟件設計原則和面向接口
    的頭像 發表于 10-20 14:55 ?4446次閱讀