熊 慧, 邱博文, 劉近貞
(天津工業(yè)大學(xué) 電氣工程與自動(dòng)化學(xué)院, 天津 300387)
Arduino自2005年由David Cuartielles和Massimo Banzi等人創(chuàng)建以來在開源社區(qū)就具有很大的影響力,其豐富的開源庫以及硬件開源模板為實(shí)驗(yàn)教學(xué)及電子愛好者們學(xué)習(xí)、開發(fā)提供了極大的幫助。Arduino作為典型的開源電子原型平臺(tái)由軟件Arduino集成開發(fā)環(huán)境 (Integrated Development Environment, IDE)和硬件Arduino板兩部分組成[1-4]。
Arduino IDE是以Pocessing多媒體編程環(huán)境為基礎(chǔ)建立起來的,其由Java語言編寫而成,并具有很強(qiáng)的跨平臺(tái)性。其類似Java,C語言的開發(fā)環(huán)境和簡(jiǎn)潔,友好的編程界面非常適合初學(xué)者學(xué)習(xí)。目前大部分的Arduino板使用的是傳統(tǒng)的8位AVR單片機(jī)作為微控制器[5-7],雖然降低了Arduino板的成本但這在一定程度上也限制了Arduino的發(fā)展。
伴隨著未來實(shí)驗(yàn)教學(xué)及電子設(shè)計(jì)的復(fù)雜化,智能化[8],勢(shì)必會(huì)需要使用更高性能的Arduino板。本文以32位微控制器LPC5411x為例,通過新建文件系統(tǒng),Arduino庫開發(fā)和配置文檔說明介紹了把其移植入Arduino平臺(tái)的過程,并通過具體例程驗(yàn)證了本文方法的正確性。
本文所使用的硬件平臺(tái)以32位LPC5411x作為微控制器,它以Cortex-M4為主核,以Cortex-M0+內(nèi)核為協(xié)處理器。LPC5411x雙核運(yùn)行頻率都可達(dá)到100 MHz,且具有浮點(diǎn)運(yùn)算單元,高速數(shù)字信號(hào)處理等功能。它主要被用于物聯(lián)網(wǎng),智能傳感等領(lǐng)域。
使用的開發(fā)板型號(hào)為LPC54114-Lite,其具有Arduino板型架構(gòu),板載調(diào)試器和常用的外設(shè)擴(kuò)展,通過該開發(fā)板可以非常方便地進(jìn)行移植效果的評(píng)估。
針對(duì)所移植的微控制器可以把Arduino整體架構(gòu)進(jìn)行分層處理,根據(jù)LPC5411x的具體特性來進(jìn)行系統(tǒng)架構(gòu)的分層和描述。
在LPC5411x 硬件和軟件開發(fā)包(Software Development Kit,SDK)的基礎(chǔ)上,如圖1所示可把Arduino整體架構(gòu)分為5層,分別是硬件層,CMSIS (Cortex Microcontroller Software Interface Standard)層,SDK層,Arduino庫層和應(yīng)用層。每一層為上層提供統(tǒng)一的接口服務(wù),以屏蔽各層之間的差異性,保證本層及以下層發(fā)生變化不會(huì)影響到上層,通過這種分層結(jié)構(gòu)可極大地降低系統(tǒng)學(xué)習(xí)難度和移植的復(fù)雜度。
圖1 Arduino系統(tǒng)架構(gòu)圖
各層所包含的內(nèi)容及具體職責(zé)如下:
(1) 硬件層主要是指由Cortex-M內(nèi)核和一些外設(shè)組成的微控制器硬件平臺(tái)。
(2) CMSIS層也稱為硬件抽象層,是Cortex-M微控制器的軟件接口標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)的目的是為芯片廠商和中間件供應(yīng)商提供連續(xù)的、簡(jiǎn)單的處理器軟件接口,保證內(nèi)核層次上的一致性,簡(jiǎn)化軟件復(fù)用,降低系統(tǒng)移植時(shí)間,提高開發(fā)效率[9-10]。
(3) SDK層是微控制器供應(yīng)商為方便開發(fā)者使用所提供的軟件開發(fā)包,該層可以讓開發(fā)者靈活配置外設(shè),而且提供了許多例程供開發(fā)者參考。除此之外有些供應(yīng)商還提供已經(jīng)移植好的實(shí)時(shí)操作系統(tǒng)讓用戶更方便地開發(fā)出實(shí)時(shí)性較好的應(yīng)用。
(4) Arduino庫是對(duì)SDK的二次封裝,早期的庫是由C語言編寫而成,后期引入了C++語言來進(jìn)行面向?qū)ο蟮木幊蘙11]。Arduino庫為用戶提供了簡(jiǎn)單易懂的編程接口,用戶只需掌握對(duì)庫函數(shù)的使用,便可以簡(jiǎn)單高效地開發(fā)出所需要的應(yīng)用程序。
(5) 應(yīng)用層由類似于C和C++的wirting語言編寫而成,編寫的源碼被稱為Sketch。用戶可以方便地在Arduino IDE上找到許多應(yīng)用示例進(jìn)行參考,而且開源社區(qū)和官方網(wǎng)址也提供了大量的源代碼支持[12]。
由Arduino的整體架構(gòu)可知,Arduino庫是通過SDK層實(shí)現(xiàn)對(duì)硬件的支持,所以必須針對(duì)LPC5411x的SDK接口函數(shù)來重新編寫Arduino庫。
Arduino IDE通過底層的配置文檔來識(shí)別每個(gè)板子的庫文件,及其編譯和下載方式。本章節(jié)將對(duì)如何添加LPC54114-Lite的文件目錄,如何開發(fā)Arduino庫及如何編寫配置文檔進(jìn)行說明。
3.1.1 hardware文件目錄介紹
Arduino IDE (版本 1.5.5)安裝目錄下面存放著所有基本編程所需要的文件和工具。與硬件平臺(tái)緊密相關(guān)的庫文件,編譯下載工具分別存放在hardware/arduino和hardware/tools目錄下。
在hardware/arduino目錄下面存放著不同系例微控制器的子目錄,目前主要有avr和sam兩個(gè)系列。兩個(gè)系列的目錄下都包含了各自微控制器平臺(tái)的配置文檔以及針對(duì)本系列微控制器編寫的庫文件。其中cores文件夾包含了所需要的庫文件,variants文件夾包含了與開發(fā)板比較相關(guān)的聲明文件。boards.txt和platform.txt是兩個(gè)比較重要的配置文檔,將在下文中進(jìn)行說明。
在hardware/tools目錄下面存放著需要使用的編譯器及下載工具,本文使用的編譯器具體版本為“g++_arm_none_eabi_2014q3”。所使用的在線編程(In System Programmability,ISP)工具是Flash Magic中的命令行工具“FM.EXE”。
3.1.2 添加文件目錄
首先需要在hardware/arduino目錄下新建一個(gè)以移植目標(biāo)板所屬系列名命名的文件夾。根據(jù)本文所移植的目標(biāo)板,此文件夾命名為“LPC”。
在新建好的文件夾下面新建“cores”“l(fā)ibraries”“system”“variants”4個(gè)文件夾,再新建“boards”“platform”兩個(gè)文本文檔。
3.2.1 開發(fā)環(huán)境搭建
考慮到編寫庫文件的便利性及可調(diào)試性,本文采用Keil MDK作為開發(fā)調(diào)試平臺(tái),庫文件經(jīng)過編寫調(diào)試成功后再移植到Arduino IDE相應(yīng)的目錄下。同時(shí)也要清楚的認(rèn)識(shí)到Keil MDK所使用的編譯器Armcc與ARM-GCC的差異性,以防在Arduino IDE下編譯時(shí)出現(xiàn)不必要的錯(cuò)誤[13-14]。
在Keil MDK上新建一個(gè)LPC54114工程,并參考上文中提到的目錄結(jié)構(gòu)進(jìn)行工程目錄的搭建,也可以在SDK中找到相應(yīng)的CMSIS文件和庫文件進(jìn)行初始化的搭建。
3.2.2 庫文件的編寫
進(jìn)行庫文件的編寫時(shí),先把Arduino IDE中avr系列的main.cpp和Arduino.h文件添加到已創(chuàng)建的工程目錄下。除此之外還必須新建一個(gè)名為loop.cpp的文件,并新建setup()和loop()兩個(gè)函數(shù),以此來仿照Arduino IDE的編程結(jié)構(gòu)。
在進(jìn)行相應(yīng)外設(shè)庫文件編寫時(shí),先在主函數(shù)中對(duì)開發(fā)板進(jìn)行統(tǒng)一的初始化,然后依照相應(yīng)外設(shè)頭文件中函數(shù)的聲明,在源文件中基于SDK接口完成對(duì)此函數(shù)的實(shí)現(xiàn)。
3.2.3 庫文件的移植
把編寫,調(diào)試好的庫文件添加到新建好的cores文件夾中。libraries文件夾用于存放串行外設(shè)接口(Serial Peripheral Interface,SPI)和Wire等擴(kuò)展庫文件。variants文件夾用于存放編寫庫文件時(shí)與開發(fā)板密切相關(guān)的引腳聲明文件,除此之外還需要把SDK中的CMSIS文件和lib庫文件添加到system文件夾中。
3.3.1 編譯與下載流程分析
配置文檔的最終目的是定義Arduino IDE如何對(duì)源碼進(jìn)行編譯及下載,所以熟知這些流程將更有利于對(duì)配置文檔的編寫。
本文使用ARM-GCC進(jìn)行源程序的編譯,使用ISP方式進(jìn)行程序下載。具體編譯下載流程[6]如圖2所示:
此過程分為兩個(gè)步驟,① 把源文件生成hex或者bin文件;② 執(zhí)行下載操作。下面將對(duì)這兩個(gè)過程進(jìn)行具體說明:
(1) Sketch文件是一個(gè)以ino為擴(kuò)展名的文件,該文件先轉(zhuǎn)化為.cpp文件,而后同Arduino IDE文件
圖2 編譯下載流程框圖
系統(tǒng)中的庫文件及啟動(dòng)文件分別編譯為各自的.o文件。生成的眾多.o文件被鏈接成為名為cores.a的靜態(tài)庫。lib.a文件是由SDK中的庫函數(shù)編譯,鏈接生成的靜態(tài)庫,這兩個(gè)靜態(tài)庫在.ld鏈接腳本文件的參與下生成相應(yīng)的.elf可執(zhí)行文件。最后轉(zhuǎn)化為hex或者bin文件并計(jì)算其占Flash的大小[7]。
(2) 把生成的hex或者bin文件通過ISP或者其他方式下載到微控制器的Flash中[15]。
3.3.2 board.txt
本文檔包含了許多與硬件相關(guān)的定義及與編譯,下載有關(guān)的宏定義,這些定義大部分將在platform.txt中用到,使用的每一個(gè)板子都應(yīng)該在此文檔中聲明自己的名稱及硬件相關(guān)信息。根據(jù)LPC54114-Lite板的功能特點(diǎn),部分配置信息如下:
[……]
LPC54114.name=LPC54114-Lite
LPC54114.build.mcu=cortex-m4
LPC54114.build.ldscript=LPC54114J256_cm4_flash.ld
LPC54114.upload.tool=FM.EXE
LPC54114.build.variant_system_lib=lib.a
LPC54114.build.f_cpu=48000000L
[……]
配置完成后,重啟IDE會(huì)在目標(biāo)板的選項(xiàng)中出現(xiàn)該目標(biāo)板的名稱,具體效果見圖3。
3.3.3 platform.txt
platform.txt 文檔用來定義目標(biāo)板分類,IDE版本,源碼編譯及下載流程。
(1) 目標(biāo)板分類及IDE版本。合理的目標(biāo)板分類及IDE版本聲明有利于未來的維護(hù),升級(jí)。本文使用的IDE版本為1.5.5,定義目標(biāo)板類別為“LPC (32-bits) Boards”,具體書寫內(nèi)容如下:
name=LPC (32-bits) Boards
version=1.5.5
(2) 變量聲明。正如C和C++中的那樣,在platform.txt中也可以定義自己的變量,其變量名中通常有逗號(hào)進(jìn)行分隔。以“compiler.c.cmd=arm-none-eabi-gcc” 為例,其中 “compiler.c.cmd”為聲明的變量,“arm-none-eabi-gcc”為給此變量賦的值。引用變量時(shí)需要在變量名兩邊加上“{}”。
(3) 編譯及下載流程。編譯過程是由一系列recipe命令來實(shí)現(xiàn)的,通過對(duì)不同的recipe命令賦值,控制不同文件的編譯,鏈接方式。以“recipe.c.o.pattern”命令為例,其用于控制將*.c文件翻譯成*.o文件的過程,賦值格式如下所示:
recipe.c.o.pattern={變量} {變量}……
下載流程是由tools命令來實(shí)現(xiàn)的,通過對(duì)“tools.FM.upload.pattern”的賦值,來控制具體的下載操作,其中FM為下載工具的名稱。
根據(jù)上文中提到的編譯,下載流程,分別完成對(duì)recipe和tools命令的賦值,便可實(shí)現(xiàn)對(duì)編譯及下載流程的控制。
以Arduino IDE自帶的Blink例程來驗(yàn)證移植方法的正確性,測(cè)試流程如下:
(1) 如圖3所示,選中Arduino IDE開發(fā)板選項(xiàng)卡中的“LPC54114-Lite”。
圖3 開發(fā)板選項(xiàng)
(2) 加載“Example”中Blink例程,進(jìn)行編譯,IDE打印編譯結(jié)果如圖4所示,可執(zhí)行文件的大小被成功計(jì)算出,驗(yàn)證了編譯過程的正確性。
圖4 編譯結(jié)果圖
(3) 開發(fā)板在ISP的模式下與電腦進(jìn)行連接,在IDE上選擇對(duì)應(yīng)的COM端口并進(jìn)行下載操作,IDE上打印出的結(jié)果信息如圖5所示,由打印出的信息可知可執(zhí)行文件被成功下載。
圖5 下載結(jié)果圖
(4) 重新設(shè)置開發(fā)板為Flash啟動(dòng)模式,上電后Blink例程成功運(yùn)行。
通過該測(cè)試流程可以驗(yàn)證本文移植方法的正確性,在不斷完善庫文件的情況下,可以通過Arduino IDE對(duì)LPC54114-Lite開發(fā)板進(jìn)行正常的嵌入式開發(fā)。
為了滿足未來實(shí)驗(yàn)教學(xué)及電子設(shè)計(jì)領(lǐng)域向復(fù)雜化和智能化發(fā)展對(duì)硬件的需求,本文以LPC5411x微控制器為例介紹了擴(kuò)充Arduino硬件生態(tài)的一種方法。分析了Arduino整體架構(gòu)并對(duì)其進(jìn)行分層描述,通過在Arduino IDE底層添加文件目錄,庫文件及配置文檔可以實(shí)現(xiàn)其對(duì)LPC5411x微控制器的支持。通過具體例程驗(yàn)證了本文方法的正確性,為擴(kuò)充Arduino硬件生態(tài)和開源平臺(tái)的應(yīng)用范圍提供了重要參考。