首先是个人经历。
我是在高考前的某一天突然就认识单片机这种东西的。
那天高三难得的休假,我就用姐姐的电脑上网看电影。鼠标点来点去的不小心点到了淘宝的网页广告,页面跳转后我发现是一种叫做单片机的东西。继续向下滑,我发现宝贝详情介绍里列写了单片机的种种应用,甚至可以让一个屏幕显示字体!我当即就想,这是好东西。
其实那时候我接触电子都有些年头了,但主要是看模拟类的。比方说高二那年我爸让我做一个防盗报警设备,我就在网上搜了一张红外对射报警电路,在网上买齐了材料,自己开始做起来。没有模拟电子基础做这种东西很吃力,我记得红外发射是用555,接收是用红外一体化接收头,光这两个东西都研究了几个月。然后就是自己描图制版,一共做了十套。这前前后后用了一年多的时间。当然,最终的“产品”没有多大的实用价值被遗弃了。
高二一年的时间,和点亮一个屏幕所需的一天时间两相对比,我立刻就爱上了单片机。
之后的事情就顺理成章了。高三暑假打工的时候看单片机,大一看,大二也看。我接触的单片机从stc89c52,stc90c516到msp430f149,msp430 Launch pad,arduino uno,arduino nano,arduino due,现在是esp8266,stm32f103c8t6,stm32f4 discovery。
有时候会发现自己上瘾了,就是常常把自己拥有的板子拿出来看一看摸一摸,再翻一翻曾经让自己调过n遍的代码,会感觉很踏实。我不管单片机将来能做什么,也不管自己将来能做什么,只要当下能够予我欢乐,那么这些板子便是我的精神寄托。
说了这么多,回到正题,世界好大,没有stm32行不行?
我用过很多单片机,所以想来做一个对比。对比的对象为stc51内核,msp430内核,stm32内核,arduino系列。
在进行对比之前我来确定一下对比的范围。我要问一个问题,在一个项目的开发中,我们真正需要的什么?或者说我们为什么要用单片机?
我认为,我们使用单片机主要有两个原因,一是节省人力,二是拓展人的能力。节省人力很好说,比方说一个水塔自动上水系统,我们不用单片机的话,就必须安排两个人或者更多的人来做这件事。拓展人的能力不太简单,比方说一个mpu6050,能够以极高的频率检测平台姿态;再者,我们用的手机弥补了人类先天的不足,能够让信息传送更加便捷。
所以我们对单片机的要求就凸显出来了,一个是控制,一个是外设。起主要作用的是外设,就是各种传感器;其次是控制。外设包括片内外设和片外外设,控制包括程序员对单片机的控制和单片机对外设的控制,当然程序员对单片机的控制说的是编程难易,单片机对外设的控制就是单片机本身的处理能力和控制接口。
Stc51:入门级单片机,最盛行的型号为stc89c52和stc90c516。程序员对单片机的控制不难也不简单,寄存器级的编程。一共百十个寄存器,但是查寄存器手册实在有些费力气,曾经严重打消了我的积极性。单片机对外设的控制能力最弱,外设接口不多,处理能力有限。片内外设也只有几个定时器,uart,再没有别的了。
Msp430:主打低功耗的16位单片机。我问过我们老师,参加竞赛都用什么单片机,老师的答案是430和32.可见msp430的重要性。我见得比较多的是msp430f149,msp430G2。程序员对单片机的控制较好,用iar的话大多用寄存器编程,用ti自己的IDE的话可以自动生成代码(主要是对片内外设和时钟的配置)。单片机对外设的控制能力较好,片内有adc,定时器有输入捕获,还有其他的比如pwm功能。16位的单片机处理能力没定量计算过,不过看着16位的就比8位的好。就是RAM太太太小。
Arduino:主打生态,面向非电子专业的设计人员。程序员对单片机的控制能力就仁者见仁智者见智了。非专业人员可能觉得太好编程了,编程也就那么几句话而已。那种感觉就和javascript中几句话就能弹出一个对话框一样。但就我而言,虽然arduino生态系统相当强大,主流的片外外设都可以找到驱动库,片内外设更是全,其余的嵌入式软件或算法也很多,但就是不好用。总是感觉我控制不了arduino,尤其是在多外设实时控制中。举个例子来说,两个外设,两个库函数,他们都用了同一个定时器,那么你找出来bug了你就获得了单片机的控制权,找不出来就只能对着几千行代码发呆。Arduino IDE也是同样的,代码量少的时候很好用,多了就不行了。我曾经用arduino IDE写了四五千行代码,那感觉,酸爽。总的来说就是IDE没有工程文件的管理功能,对单片机控制能力好,但不是特别好,不能随心所欲。
主角stm32:请原谅我看见32位的单片机就倍感亲切,因为我现在打字用的电脑也只不过是32位的cpu,这意味着我向高端应用又近了一步。程序员对stm32的控制特别好,这个真的没有夸张。完整的片内外设库函数,我想调用那个就用哪个,移植也相当简单。更重要的是资料很全,官网上有各种资料,或寄存器手册,或应用手记。程序员对stm32的控制还体现在硬件调试方面。我在调试mpu6050的时候整个系统都是错乱的,不是没有串口输出就是一大堆无用的调试信息,正是靠着一个stlink我才发现了问题所在。说到stlink,两个字,便宜;四个字,不太好用。正是stlink才让我们加强了对单片机的控制能力,但是stlink的不稳定性又经常让我抓狂。或许只是个例,我有空换个stilnk试试。
Stm32对外设的控制也是好的没话说。众多的外设,我都不舍得用它来做东西,因为会有很多外设被浪费掉。大大大内存,用我同学的话来说就是“根本不用担心没RAM,直接往内存放东西就好”。当然这句话让我想起来用51的时候小心翼翼地计算数组的长度,现在我在stm32里面随心所欲地用着malloc和free还有printf。 富裕了生活就是要有点不一样嘛。
又说了这么多,那么到底没有stm32行不行?我的答案是不行。倘若没有stm32我就又要回到51那窘迫的生活中去,或者回到430繁杂的寄存器中了。我现在的习惯是新外设用arduino的库函数验证好坏与功能,用stm32做研究和多任务,用51和stm8做一些生活中的小东西(毕竟便宜不心疼),低功耗用430,偶尔用esp8266试试WIFI。