其他博客地址

主力博客:https://tonghuix.io

2012年12月28日星期五

难孚众望的 Arduino Due


(本文已经发表在2013年第1期《无线电》杂志,未经原作者授权不得转载)
半年前Arduino官方放出消息表示正在开发基于ARM Cortex-M3的32位微控制器板Due,笔者及与笔者一样的很多Geek(极客)和创客们都摩拳擦掌跃跃欲试,急迫的想亲自动手玩玩这款新微控制器板。直到10月22日,Arduino官方终于发布了这款期待已久的创新产品,笔者也终于在第一时间幸运的得到一块,并且利用几乎全部时间投入到新板子的试玩中。
Arduino Due选用了基于ARM Cortex-M3架构的Atmel SAM3X8E微控制器,这是Arduino第一次使用32位微控制器,与其他8位微控制器有很大区别。这块Due主频可达84MHz,引出了54个数字引脚(芯片总共有100个IO引脚),其中12个可以用来连接PWM,另有12个模拟输入/输出引脚,4个串行接口UART,2个 DAC(数模转换)引脚,2个TWI(双线接口)引脚,1个SPI插针,1个JTAG兼容调试引脚。

新的变化

与其他Arduino控制板的区别最主要有如下几点:
  1. 3.3V供电取代5V供电,内部电路也都是3.3V。虽然如此,但是Arduino官方的Shield都是兼容的。其他制造商的产品可就不敢保证了,如果输入大于3.3V的电压,可能会损坏芯片!
  2. 32位84MHz主频远超原先的8位16MHz主频,且ARM Cortex-M3内核使用Thumb-2指令集和NVIC(嵌套向量中断控制器),使得任务响应速度大幅提高,已经达到硬实时标准。
  3. 片内RTC实时时钟,这样就不需要外部再添加RTC模块了,但是这块板没提供RTC时钟所用的纽扣电池槽,甚是遗憾。
  4. CAN总线支持,这是芯片支持的,也在板子上引出了相应的引脚,但是Arduino的API不支持,如果想用CAN总线,只能直接读写寄存器了。
  5. DMA(直接存储器访问)支持,这样可以在使用如网络、外部FLASH读写等操作时进一步节省CPU时间,只是Arduino官方API亦不支持。
  6. 多通道ADC(模数转换)和DAC(数模转换),这是Due的一个亮点,因此官方新版的Arduino IDE 1.5版中特意增加了一个播放SD卡中音乐的示例程序。
  7. 硬件随机数发生器(TRNG)也是一个亮点。这样系统就可以直接使用硬件随机数,而不用API仿真出了。
  8. Due的最大亮点在支持USB Host以及Google ADK(Android Develop Kit)支持,板子上有两个USB插口,一个是编程用(Programming),而另一个就是作为USB Host(Native USB)使用的。这样就可以不用另购ADK接插件和相应的设备了,极大的方便了基于智能手机的控制,外加32位支持,对Geek群体是一个利好消息!

快了,也慢了!

主频增加到了84Mhz,速度大幅提高,笔者通过分析Arduino IDE的源代码发现其内部使用了一种由Leaflabs开发的ARM交叉编译工具链,这款交叉编译工具链是基于Codesourcey的4.4版改造开源而成的,对大多数Cortex-M3有很好的支持,包括NXP的LPC系列和ST的STM32系列。这款编译器符合EABI(嵌入式应用二进制接口)标准以及ARM官方的针对Cortex M系列内核制定的CMSIS代码封装,可以从Github上找到并直接使用。
开源编译器加速了编译速度,但是依然不能与AVR编译器的快速编译相媲美,笔者平时使用Linux系统来编程和开源硬件开发,图片也取自Linux系统下。向片内Flash上传程序的时候需要先将FLASH按页擦除,然后再按页写入,这变得相当缓慢,即使最小的程序也需要至少20页左右。我想这个速度会让很多心急的人难以忍受吧。
慢了的不仅有上传速度,还有官方文档的更新很慢,且示例程序错漏百出,实在让笔者甚是恼火。

独树一帜的兼容性

基于如此多的变化,特别是相较于以前Arduino控制板的巨大差别,我们不禁要对其兼容性提出一些疑问,我们以前的那些模块和Shield还能正常使用么?为此笔者使用了一个酒精检测传感器MQ3和几个最常用的Shield搭建了一个酒精检测超量报警装置。首先从引脚上说,Due与Arduino Mega 1280/2560的引脚基本一致,由于是ARM架构,所以去掉了ICSP引脚,取而代之的是SPI引出插针,另外还有JTAG引脚支持。
在Shield的兼容性方面,大多数的Shield支持还是非常好的,我试了由DFrobot出品的按键和LCD Shield、L298电机驱动板以及传感器扩展板,大部分可以完美支持,代码可以几乎无修改直接移植使用。但是由于SPI接口的改变以及引入了32位特性,这使得很多与SPI相关的Shield和代码要做大规模修改,比如网卡接口板、WIFI接口板和SD卡接口板等等。引入的32位特性会极大影响整型数值的精度,众所周知在Arduino其他控制板里普通的int类型是2个字节16位的,而在Due中由于使用了32位ARM架构,普通的int类型则变为了4个字节32位,在这种情况下很多传感器相关的程序可能会出现读数错误。为了避免这种情况建议所有Arduino相关的程序在使用int类型时采用类似int16_t这样的方式定义变量,避免跨平台多架构移植的时候出现问题。
另一个兼容性问题来自于电压的改变,即从5V降为3.3V,按照官方文档的说法,若此时在IO 接口上接入3.3V电压有损坏Due。同时输出电压变小使得很多外接设备或者传感器工作异常。 因此电压的改变对电路设计提出了更加严苛的要求,众多模块设计者需要进一步针对Due的电压改变来修改甚至是重新设计产品,可以说这次Due的横空出世,带来的惊喜远小于它所带来的麻烦!

仓促起步,后期乏力

笔者一直追踪Due的开发,可以说Due是在很多社区如Leaflabs推出基于STM32F103的Maple板以后,迫于市场上日益增长的竞争压力以及对ARM微控制器的需求而仓促开发的,另外也有人猜测,Due是Atmel公司为了推广其在市场上缺乏性价比优势的SAM3X系列微控制器而邀请Arduino推出的。不管流言和猜测如何,从错漏百出的示例程序和更新缓慢的官方文档上可以看出,显然Arduino还没有做好准备迎接32位ARM Cortex-M3微控制器的到来,这样的仓促上马,对很多下级分销商以及模块设计机构提出了兼容性的巨大挑战,更为产品的进一步推广造成困难。
实际上,笔者很期待Arduino官方能够支持开源的RTOS(实时操作系统),比如Leaflabs开发的Maple板已经支持了FreeRTOS,而且Atmel官方也支持在SAM3X上移植BeRTOS,可是Arduino的API对此却没有足够的支持和实现,没有发挥出32位ARM高速微控制器的性能优势。
因此对Arduino来说,以Due为代表的32位ARM Cortex-M3微控制器未来的发展可能颇为艰难,从性价比上说SAM3X不如STM32系列有优势,远远不如Leaflabs的Maple系列控制板(基于STM32F103),而从API和用户体验和兼容性角度看,短时间内又不能与其他Arudino控制板完成兼容修改。不过也要看到毕竟这是Arduino第一次大规模突破,推出32位ARM微控制器板,第一次将高端控制器需求引入到产品中,因此未来还有非常长的路要走,希望“乘风破浪会有时,直挂云帆济沧海”!