第1章Maple简介
1.1Maple与Arduino的关系
Maple是由麻省理工学院的学生所组成的Leaflab实验室开发的,其目的是让科技不再局限于高投入的实验室,将低成本、易开发的嵌入式设备推广开来。
在设计上,Maple对Arduino有很高的兼容性,例如,部分引脚的排列和功能、提供的操作函数(除了Arduino中的tone()与pluseIn()函数不支持)。Maple与Arduino最大的不同在于它所使用的处理器是32位的ARM处理器,而Arduino采用的是8位的AVR处理器。与AVR处理器相比,ARM处理器在处理速度、RAM容量、Flash容量、引脚数量、成本上都有很大的优势。
尽管性能上不如Maple,但是与Maple相比,Arduino出现得更早,更加成熟,有更多的扩展和库。
1.2Maple的衍生版本
和Arduino一样,在发展的过程中,Maple也出现了为不同目标应用设计的不同版本,这里简单介绍下Maple Rev5以外的版本。
1.2.1Maple RET6
Maple RET6是Maple Rev5的改进版本。硬件上,它与Maple Rev5的区别是它使用的是STM32F103RET6处理器。与Maple Rev5所使用的STM32F103RBT6(只有一个字符的差别)相比,RET6多了两路DAC输出,片上Flash与SRAM储存器容量分别由128 KB和20 KB提升为512 KB与64 KB,其他方面差别不大。
1.2.2Maple Mini
Maple Mini具有兼容面包板的双列直插外形,如图1-1所示,可以直接用于面包板。外形只有51.3 cm×1.82 cm,也非常适合于对于尺寸和重量有较高限制的场合。例如,微型4轴飞行器、微型机器人等。Maple Mini 采用的处理器为STM32F103CBT6,与Maple相比,GPIO(General Purpose Input Output, 通用输入输出)数有所减少。如果需要作为便携设备使用,Maple Mini是首选。
1.2.3Maple Native
Maple Native是为了充分发挥处理器性能而设计的高性能开发板,使用了高端STM32F103处理器。与Maple相比,Maple Native具有两倍于Maple 的GPIO数并提供外部扩展SRAM,能够应对高要求的应用。Maple Native具有DAC,能够真正实现高精度的模拟输出(Maple和Arduino只能通过PWM来输出模拟量)。同时,与其他的高性能开发板相比,在顾及高性能的设计之外,Maple Native仍然提供与Arduino类似的库。
1.3Maple的硬件资源
Maple采用的是意法半导体集团生产的STM32F103RBT处理器,这款处理器是以ARM Cortex-M3为核心,工作在72 MHz的频率下。与Arduino所使用的8位处理器相比,Maple的处理器性能和硬件资源有了很大的提升,但是却有相近的成本,为电子积木拓宽了应用的空间。Maple及其衍生版本与Arduino的性能对比如表1-1所示。Maple的布局如图1-2所示。
表1-1Maple及其衍生版本与Arduino性能对比
比 较 项Maple Rev5Maple MiniMaple NativeArduino UNO
处理器型号STM32F103RBT6STM32F103CBT6STM32F103ZET6AtMega328
处理器时钟72 MHz72 MHz72 MHz16~20 MHz
SRAM20 KB20 KB64 KB+1 MB(EXT)2 KB
. Flash128 KB128 KB512 KB32 KB
EEPROMFlash虚拟Flash虚拟Flash虚拟1 KB
可用GPIO433410614
ADC15(12位分辨率)9(12位分辨率)21(12位分辨率)6(10位分辨率)
PWM15(16位分辨率)12(16位分辨率)17(16位分辨率)6(8位分辨率)
硬件SPI2231
硬件I2C2221
硬件USART3331
硬件USB111无
中断42个共用16通道106个共用16通道2个
DAC002(12位分辨率)0
图1-2Maple 的布局
1.4libmaple简介
libmaple是由Leaflab开发的,用于STM32库,对STM32底层操作进行了重新封装,大幅提高了操作的简便性。
libmaple分为两部分:第一部分,以C程序编写的底层库,将其称为libmaple,提供对硬件高度灵活的操作,是严格意义上的libmaple,也是本章将要介绍的libmaple,在源码中的/libmaple目录下;第二部分,以C++编写的Wiring风格的API,该部分提供对第2章中介绍的Arduino兼容库部分的支持,位于源码中的/wirish目录下。
libmaple的源码位于GitHub上,可以在https://github.com/leaflabs/libmaple中找到。
libmaple附随于Maple IDE中,可以直接在Maple IDE的代码中加入对libmaple头文件的引用,同时libmaple也可以用于其他开发平台包,给习惯使用专业嵌入式开发IDE的用户使用。
1.5Maple IDE的安装和使用
1.5.1下载Maple IDE
目前Maple IDE支持Mac、Windows和Linux,可以在其官方网站http://leaflabs.com/docs/maple-ide-install.html下载到最新版本的Maple IDE。将下载的ZIP文件解压到合适的位置。
1.5.2安装Maple IDE
1.Windows环境下安装Maple IDE
在Windows 环境下,Maple IDE无需安装,但是需要为其安装DFU和虚拟串口两个驱动程序。首先按照如下步骤安装DFU驱动(用于上传程序到Maple)程序:
1)将Maple连接到计算机的USB接口。
2)按下左下角的复位键(印有“REST”),这时蓝色指示灯会快速闪烁6次,然后慢闪烁几次。
3)再次按下复位键,这次在蓝色指示灯快速闪烁6次期间按下另一个键(右上角,印有“BUT”)并保持不放,直到指示灯开始慢闪烁时放开。
4)这时Maple会处于永久Bootloader状态(Perpetual Bootloader Mode),蓝色指示灯会一直闪烁,使你有机会安装DFU驱动程序。
5)Windows会提示你需要驱动程序,人工指定驱动程序所在目录位置,选择Maple IDE文件夹中的drivers\mapleDrv\dfu。
下一步安装虚拟串口驱动程序(用于通过USB与Maple进行串口通信):
1)复位Maple,等待蓝色指示灯停止闪烁(退出bootloader转而运行用户程序,新的Maple会运行制造时预留的测试程序)。
2)一旦Maple运行了用户程序,Windows会提示安装驱动程序,同样,人工指定驱动程序所在目录为Maple IDE文件夹中的drivers\mapleDrv\serial。
现在可以双击Maple IDE程序运行Maple IDE了。
2.Linux环境下安装Maple IDE
在Linux环境下安装Maple IDE的步骤如下:
1)首先确认是否已经安装了JRE,如果没有,可以通过如下命令安装:
sudo aptitude install openjdk-6-jre
2)解压压缩文件到合适的位置(例如桌面)。
3)打开解压压缩文件得到的文件夹,运行其中的install-udev-rules.sh,出现要求输入用于获得管理员权限的密码的提示。
4)用“sudo restart udev”命令重启udev。
5)双击程序运行Maple IDE。
3. Mac环境下安装Maple IDE
在Mac环境下安装Maple IDE的步骤如下:
1)双击你所下载的DMG文件使该镜像被加载。
2)拖动Maple IDE按钮到应用程序文件夹。
3)运行Maple IDE。
1.5.3第一个程序
我们从File→Examples→Digital中选择一个简单的例程Blink,如图1-3所示,这个程序会让蓝色指示灯闪烁。
图1-3打开例程“Blink”
然后进入Tools→Board→LeafLabs Maple ... to Flash(根据你所选使用的型号选择),如图1-4所示。每种型号的Maple都有两个选项to Flash和to RAM。to RAM会将程序上传到Maple的RAM存储器,与上传到Flash相比,上传速度更快,并且通过简单的复位或者重新上电就可以清除程序。但是Flash空间更大,并且是可以在掉电后存储程序的唯一选择。如果需要调试程序,那么to RAM模式能够提高你的效率。
现在,可以单击左上角的(Verify)按钮来编译程序,编译的过程与结果会显示在底部的窗口中。该过程主要用于验证程序,检验程序是否有语法或函数引用错误。
现在,将Maple用USB Mini-B接口的USB线连接到计算机上。每次复位、重编程或接上USB,蓝色指示灯都会闪烁一段时间,表示它进入了bootloader状态。等到Maple开始执行用户程序,进入Tools→Serial Port选择Maple在你系统中所使用的串口设备,如图1-5所示。在不同的计算机不同的USB接口上,Maple会占用不同的串口,可以通过查看设备管理器来了解Maple所占用的串口。
图1-4选择目标所使用的Maple类型
图1-5选择Maple所使用的串口
单击(Upload)按钮开始上传程序,上传过程会在下方窗口显示。
Maple IDE是利用USB虚拟串口对Maple发送复位信号,复位后Maple会进入DFU模式片刻等待上传,如果没有上传程序,则会在数秒后开始执行原有的用户程序。
USB虚拟串口相关程序嵌入用户程序中,所以如果前一次上传程序出错,或者错误地选择了串口设备,都可能导致正常的下载操作无法进行。你可以在提示等待DFU设备的时候对Maple进行复位,或让Maple进入“永久bootloader状态”之后再进行下载,来规避由于USB虚拟串口通信问题造成的无法正常下载的问题。
最后,为了保证一切正常,我们可以上传一个通过USB虚拟串口发送文本“Hello,world!”的例程。单击File→Examples→Stubs→Helloworld打开该例程,单击(Upload)按钮将其上传到刚才已连接的Maple设备上。待Maple复位并进入用户程序(蓝色指示灯停止闪烁并听到第二声USB设备插入声),单击(Serial Monitor window)按钮打开串口监视器,如果你的串口设置正确,就可以看到Maple通过虚拟USB串口传回的文字。
1.5.4Maple IDE的使用
与Arduino IDE一样,Maple IDE也是在Processing IDE的基础上开发的,且简单易用,非常容易上手。下面对Maple IDE做一些简单的介绍。Maple IDE的界面主要有代码编辑区、工具栏和状态栏组成,如图1-6所示。
图1-6Maple IDE界面
Maple IDE的基本功能主要依靠上方的工具栏按钮来实现,如表1-2所示为工具栏按钮及其功能。
表1-2工具栏按钮及其功能
按钮功能
单击该按钮会对程序进行编译,在编译过程中检查程序错误,如果没有错误就会产生能在Maple上运行的程序
终止编译过程
新建一个项目
打开一个已经存在的项目
保存当前项目
将程序上传到Maple,该过程会重新编译项目
打开串口监视器(注意:串口监视器打开时不能进行上传,如果上传,窗口监视器会自动关闭。)
1.6Maple的开源协议
作为开源硬件的一员,Maple开发者给予Maple最宽松的协议,设计图以Creative Commons share-a-like 方式发布,任何人都可以任意地使用、修改、重新发布Maple的设计和代码。但Maple IDE中来源于Arduino与Processing项目的代码需要遵从它们开发者的协议。对开源协议的尊重和保护在保护开发者的利益的同时,能够提高开发者的积极性,让开源事业有更好的发展。
第2章Maple的Arduino兼容函数库
2.1基本程序结构
Maple的基本程序结构有两个入口函数,setup()与loop()。setup()中的代码只会在启动时执行一次, loop()中的代码会无限循环地执行下去。代码清单2-1为Maple的基本程序结构。
代码清单2-1Maple的基本程序结构
void setup(){
//这里是初始化使用的程序段,只在启动时执行一次
}
void loop(){
//主程序位于这里,在这个函数中的程序会无限循环地执行
}
Maple中,与底层相关的大量操作都被隐藏起来了,尽管Maple使用的是C++作为编程语言,但是几乎不会出现复杂的C++语法,使得它很适合于对编程与寄存器操作了解不多的初学者使用。
2.2Maple静态变量关键字
Maple中提供了一些静态变量关键字来替代一些常数和引脚,它们可以规避不同型号开发板所产生的兼容性问题。使用这些静态变量有助于提高程序的可移植性与可读性。如表2-1所示为静态变量关键字,如表2-2所示为串口相关的常量。
表2-1静态变量关键字
关 键 字说明
关 键 字说明
CYCLES_PER_MICROSECOND处理器每毫秒的循环次数。Maple中为72
CLOCK_SPEED_MHZ以兆赫兹为单位的处理器时钟频率
CLOCK_SPEED_HZ以赫兹为单位的处理器时钟频率
SYSTICK_RELOAD_VALSystick计数器重载次数
BOARD_BUTTON_PIN代表自带按键(标有“BUT”)所在的引脚
BOARD_LED_PIN代表LED所在引脚的编号
BOARD_NR_GPIO_PINS所有引出的GPIO引脚数量。某些引脚可能已经被占用(例如内置的LED和按键)。为了了解有哪些引脚被使用,可以使用 boardUsesPin()函数(或者 boardUsedPins)
BOARD_NR_PWM_PINS所有可以用于PWM输出的引脚数量
BOARD_NR_ADC_PINS 可用ADC引脚数量
BOARD_NR_USED_PINS 已使用的GPIO引脚数量
表2-2串口相关的常量
关 键 字说明
BOARD_USART1_TX_PIN,BOARD_USART2_TX_PIN, BOARD_USART3_TX_PIN3个USART串口的发送引脚
BOARD_USART1_RX_PIN,BOARD_USART2_RX_PIN, BOARD_USART3_RX_PIN3个USART串口的接收引脚
BOARD_UART4_TX_PIN, BOARD_UART5_TX_PINUSART4、5的发送引脚(例如Maple Native的)
BOARD_UART4_RX_PIN, BOARD_UART5_RX_PINUSART4、5的接收引脚(例如Maple Native的)
BOARD_NR_USARTS可用的USART串口数量
2.3通用输入输出
通用输入输出(GPIO)是Maple最基本、最常用的功能,用来实现基本的数字量输入和输出。GPIO的控制主要依赖pinMode()、digitalWrite()、digitalRead()三个函数。
由于Maple使用的STM32采用了更高的工艺生产,所以数字输出的电平为高电平——3.3 V的LTTL电平,而Arduino使用的是ATMGA系列芯片,制程较陈旧,输出为高电平——5 V的TTL电平。如果需要将5 V电平的芯片与Maple相接,则需要进行电平转换,否则5 V电平的信号直接输入Maple可能会造成芯片损坏(部分引脚能够容忍5 V电平,对5 V电平的数字信号进行读取或是利用开漏输出方式输出5 V电平的数字信号)。