APP下载

开源平台Arduino硬件生态扩充研究

2019-07-02邱博文刘近贞

实验室研究与探索 2019年6期
关键词:开发板微控制器文件夹

熊 慧, 邱博文, 刘近贞

(天津工业大学 电气工程与自动化学院, 天津 300387)

0 引 言

Arduino自2005年由David Cuartielles和Massimo Banzi等人创建以来在开源社区就具有很大的影响力,其丰富的开源库以及硬件开源模板为实验教学及电子爱好者们学习、开发提供了极大的帮助。Arduino作为典型的开源电子原型平台由软件Arduino集成开发环境 (Integrated Development Environment, IDE)和硬件Arduino板两部分组成[1-4]。

Arduino IDE是以Pocessing多媒体编程环境为基础建立起来的,其由Java语言编写而成,并具有很强的跨平台性。其类似Java,C语言的开发环境和简洁,友好的编程界面非常适合初学者学习。目前大部分的Arduino板使用的是传统的8位AVR单片机作为微控制器[5-7],虽然降低了Arduino板的成本但这在一定程度上也限制了Arduino的发展。

伴随着未来实验教学及电子设计的复杂化,智能化[8],势必会需要使用更高性能的Arduino板。本文以32位微控制器LPC5411x为例,通过新建文件系统,Arduino库开发和配置文档说明介绍了把其移植入Arduino平台的过程,并通过具体例程验证了本文方法的正确性。

1 硬件平台概述

本文所使用的硬件平台以32位LPC5411x作为微控制器,它以Cortex-M4为主核,以Cortex-M0+内核为协处理器。LPC5411x双核运行频率都可达到100 MHz,且具有浮点运算单元,高速数字信号处理等功能。它主要被用于物联网,智能传感等领域。

使用的开发板型号为LPC54114-Lite,其具有Arduino板型架构,板载调试器和常用的外设扩展,通过该开发板可以非常方便地进行移植效果的评估。

2 Arduino整体架构

针对所移植的微控制器可以把Arduino整体架构进行分层处理,根据LPC5411x的具体特性来进行系统架构的分层和描述。

在LPC5411x 硬件和软件开发包(Software Development Kit,SDK)的基础上,如图1所示可把Arduino整体架构分为5层,分别是硬件层,CMSIS (Cortex Microcontroller Software Interface Standard)层,SDK层,Arduino库层和应用层。每一层为上层提供统一的接口服务,以屏蔽各层之间的差异性,保证本层及以下层发生变化不会影响到上层,通过这种分层结构可极大地降低系统学习难度和移植的复杂度。

图1 Arduino系统架构图

各层所包含的内容及具体职责如下:

(1) 硬件层主要是指由Cortex-M内核和一些外设组成的微控制器硬件平台。

(2) CMSIS层也称为硬件抽象层,是Cortex-M微控制器的软件接口标准。该标准的目的是为芯片厂商和中间件供应商提供连续的、简单的处理器软件接口,保证内核层次上的一致性,简化软件复用,降低系统移植时间,提高开发效率[9-10]。

(3) SDK层是微控制器供应商为方便开发者使用所提供的软件开发包,该层可以让开发者灵活配置外设,而且提供了许多例程供开发者参考。除此之外有些供应商还提供已经移植好的实时操作系统让用户更方便地开发出实时性较好的应用。

(4) Arduino库是对SDK的二次封装,早期的库是由C语言编写而成,后期引入了C++语言来进行面向对象的编程[11]。Arduino库为用户提供了简单易懂的编程接口,用户只需掌握对库函数的使用,便可以简单高效地开发出所需要的应用程序。

(5) 应用层由类似于C和C++的wirting语言编写而成,编写的源码被称为Sketch。用户可以方便地在Arduino IDE上找到许多应用示例进行参考,而且开源社区和官方网址也提供了大量的源代码支持[12]。

由Arduino的整体架构可知,Arduino库是通过SDK层实现对硬件的支持,所以必须针对LPC5411x的SDK接口函数来重新编写Arduino库。

3 移植流程

Arduino IDE通过底层的配置文档来识别每个板子的库文件,及其编译和下载方式。本章节将对如何添加LPC54114-Lite的文件目录,如何开发Arduino库及如何编写配置文档进行说明。

3.1 文件系统移植

3.1.1 hardware文件目录介绍

Arduino IDE (版本 1.5.5)安装目录下面存放着所有基本编程所需要的文件和工具。与硬件平台紧密相关的库文件,编译下载工具分别存放在hardware/arduino和hardware/tools目录下。

在hardware/arduino目录下面存放着不同系例微控制器的子目录,目前主要有avr和sam两个系列。两个系列的目录下都包含了各自微控制器平台的配置文档以及针对本系列微控制器编写的库文件。其中cores文件夹包含了所需要的库文件,variants文件夹包含了与开发板比较相关的声明文件。boards.txt和platform.txt是两个比较重要的配置文档,将在下文中进行说明。

在hardware/tools目录下面存放着需要使用的编译器及下载工具,本文使用的编译器具体版本为“g++_arm_none_eabi_2014q3”。所使用的在线编程(In System Programmability,ISP)工具是Flash Magic中的命令行工具“FM.EXE”。

3.1.2 添加文件目录

首先需要在hardware/arduino目录下新建一个以移植目标板所属系列名命名的文件夹。根据本文所移植的目标板,此文件夹命名为“LPC”。

在新建好的文件夹下面新建“cores”“libraries”“system”“variants”4个文件夹,再新建“boards”“platform”两个文本文档。

3.2 Arduino库开发

3.2.1 开发环境搭建

考虑到编写库文件的便利性及可调试性,本文采用Keil MDK作为开发调试平台,库文件经过编写调试成功后再移植到Arduino IDE相应的目录下。同时也要清楚的认识到Keil MDK所使用的编译器Armcc与ARM-GCC的差异性,以防在Arduino IDE下编译时出现不必要的错误[13-14]。

在Keil MDK上新建一个LPC54114工程,并参考上文中提到的目录结构进行工程目录的搭建,也可以在SDK中找到相应的CMSIS文件和库文件进行初始化的搭建。

3.2.2 库文件的编写

进行库文件的编写时,先把Arduino IDE中avr系列的main.cpp和Arduino.h文件添加到已创建的工程目录下。除此之外还必须新建一个名为loop.cpp的文件,并新建setup()和loop()两个函数,以此来仿照Arduino IDE的编程结构。

在进行相应外设库文件编写时,先在主函数中对开发板进行统一的初始化,然后依照相应外设头文件中函数的声明,在源文件中基于SDK接口完成对此函数的实现。

3.2.3 库文件的移植

把编写,调试好的库文件添加到新建好的cores文件夹中。libraries文件夹用于存放串行外设接口(Serial Peripheral Interface,SPI)和Wire等扩展库文件。variants文件夹用于存放编写库文件时与开发板密切相关的引脚声明文件,除此之外还需要把SDK中的CMSIS文件和lib库文件添加到system文件夹中。

3.3 配置文档

3.3.1 编译与下载流程分析

配置文档的最终目的是定义Arduino IDE如何对源码进行编译及下载,所以熟知这些流程将更有利于对配置文档的编写。

本文使用ARM-GCC进行源程序的编译,使用ISP方式进行程序下载。具体编译下载流程[6]如图2所示:

此过程分为两个步骤,① 把源文件生成hex或者bin文件;② 执行下载操作。下面将对这两个过程进行具体说明:

(1) Sketch文件是一个以ino为扩展名的文件,该文件先转化为.cpp文件,而后同Arduino IDE文件

图2 编译下载流程框图

系统中的库文件及启动文件分别编译为各自的.o文件。生成的众多.o文件被链接成为名为cores.a的静态库。lib.a文件是由SDK中的库函数编译,链接生成的静态库,这两个静态库在.ld链接脚本文件的参与下生成相应的.elf可执行文件。最后转化为hex或者bin文件并计算其占Flash的大小[7]。

(2) 把生成的hex或者bin文件通过ISP或者其他方式下载到微控制器的Flash中[15]。

3.3.2 board.txt

本文档包含了许多与硬件相关的定义及与编译,下载有关的宏定义,这些定义大部分将在platform.txt中用到,使用的每一个板子都应该在此文档中声明自己的名称及硬件相关信息。根据LPC54114-Lite板的功能特点,部分配置信息如下:

[……]

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会在目标板的选项中出现该目标板的名称,具体效果见图3。

3.3.3 platform.txt

platform.txt 文档用来定义目标板分类,IDE版本,源码编译及下载流程。

(1) 目标板分类及IDE版本。合理的目标板分类及IDE版本声明有利于未来的维护,升级。本文使用的IDE版本为1.5.5,定义目标板类别为“LPC (32-bits) Boards”,具体书写内容如下:

name=LPC (32-bits) Boards

version=1.5.5

(2) 变量声明。正如C和C++中的那样,在platform.txt中也可以定义自己的变量,其变量名中通常有逗号进行分隔。以“compiler.c.cmd=arm-none-eabi-gcc” 为例,其中 “compiler.c.cmd”为声明的变量,“arm-none-eabi-gcc”为给此变量赋的值。引用变量时需要在变量名两边加上“{}”。

(3) 编译及下载流程。编译过程是由一系列recipe命令来实现的,通过对不同的recipe命令赋值,控制不同文件的编译,链接方式。以“recipe.c.o.pattern”命令为例,其用于控制将*.c文件翻译成*.o文件的过程,赋值格式如下所示:

recipe.c.o.pattern={变量} {变量}……

下载流程是由tools命令来实现的,通过对“tools.FM.upload.pattern”的赋值,来控制具体的下载操作,其中FM为下载工具的名称。

根据上文中提到的编译,下载流程,分别完成对recipe和tools命令的赋值,便可实现对编译及下载流程的控制。

4 移植效果验证

以Arduino IDE自带的Blink例程来验证移植方法的正确性,测试流程如下:

(1) 如图3所示,选中Arduino IDE开发板选项卡中的“LPC54114-Lite”。

图3 开发板选项

(2) 加载“Example”中Blink例程,进行编译,IDE打印编译结果如图4所示,可执行文件的大小被成功计算出,验证了编译过程的正确性。

图4 编译结果图

(3) 开发板在ISP的模式下与电脑进行连接,在IDE上选择对应的COM端口并进行下载操作,IDE上打印出的结果信息如图5所示,由打印出的信息可知可执行文件被成功下载。

图5 下载结果图

(4) 重新设置开发板为Flash启动模式,上电后Blink例程成功运行。

通过该测试流程可以验证本文移植方法的正确性,在不断完善库文件的情况下,可以通过Arduino IDE对LPC54114-Lite开发板进行正常的嵌入式开发。

5 结 语

为了满足未来实验教学及电子设计领域向复杂化和智能化发展对硬件的需求,本文以LPC5411x微控制器为例介绍了扩充Arduino硬件生态的一种方法。分析了Arduino整体架构并对其进行分层描述,通过在Arduino IDE底层添加文件目录,库文件及配置文档可以实现其对LPC5411x微控制器的支持。通过具体例程验证了本文方法的正确性,为扩充Arduino硬件生态和开源平台的应用范围提供了重要参考。

猜你喜欢

开发板微控制器文件夹
Fast Folders,让你的文件夹四通八达
基于STM32H7的FDCAN通信系统设计与实现∗
TASKING针对英飞凌第三代AURIX微控制器推出多核开发环境
物联网技术在微控制器实验教学中的应用
用于高品质电动汽车的分布式并行计算
摸清超标源头 大文件夹这样处理
调动右键 解决文件夹管理三大难题
浅析单片机开发板的设计与制作
ARM宣布mbed Enabled Freescale FRDM—K64F开发板通过微软认证
不容忽视的空文件夹