8位微控制器实践(0) - 绪论
微控制器 (MCU) 也叫单片机,指把处理器、内存、各种外设集成在一块芯片内的计算机。现在的个人计算机的数据总线宽度已经达到64位,而微控制器一般还停留在8/16/32位。可见,微控制器的功能相对有限,但对于一些简单的控制系统来说已经足够。由于微控制器价格低廉、简单易用,它也常常被用在一些业余硬件项目中。
这个系列将要讨论的是8位微控制器,属于微控制器中的底层。常见的8位微控制器有:
- Microchip的PIC系列。它的出货量非常大。
- Atmel(已被Microchip收购)的AVR系列。它为流行的Arduino平台所采用。
- 各种基于8051的微控制器。
随着半导体技术的发展,功能强大很多的基于ARM架构的32位微控制器已经越来越廉价,逐渐流行并取代8位微控制器。8位微控制器因为有比较简单的封装(例如:8/14/20/28脚双列直插),在简单的项目中仍然有一定用处。
我将使用8位微控制器做一些简单的硬件项目,体会一下开发流程。我使用的是PIC的基于Enhanced Mid-range架构的微处理器,芯片代码是PIC16F1XXXXX。这些芯片非常便宜,而且双列直插的封装很适合基于面包板的项目。
在一个我使用的微控制器中,集成了如下各种组件:
- 时钟发生器
- 处理器,主频可达32MHz
- 程序内存(Flash),大概3-16KB
- 数据内存(SRAM),大概0.5-4KB
- 持久存储(EEPROM),大概0-1KB
- 通用输入输出(GPIO)引脚,6-25个左右
- 定时器
- PWM发生器
- 模拟/数字信号转换器(ADC/DAC)
- 串行通信模块:UART/SPI/I²C收发器
- ……
相对现代个人计算机来说,性能参数落后了很多个时代,但是“麻雀虽小,五脏俱全”,在微控制器的应用场合里往往已经够用。
8位PIC有一些架构上的缺陷:
- 每个指令需要4个时钟周期。例如,当主频=32MHz时,实际的指令频率只有8MHz。
- 数据内存的地址空间是分片(banked)的。这导致汇编程序比较难写。
- 较浅的硬件调用栈(只有2-16层)。编译器不支持递归。
另外,Microchip提供的工具链也常为人诟病:
- 集成开发环境MPLAB X响应较慢。
- 新版的汇编程序pic-as代替旧的MPASM,有很多不便使用之处。
- C编译器XC8需要购买PRO许可证启用更强的优化选项,免费版本的优化能力非常差(我使用的2.40版本是这样的)。
这看起来是Microchip推销付费版XC8 PRO(需要支付 $43.95/月)的商业策略:汇编比较难写,而C程序的性能有待改善。
相对而言,AVR微控制器的架构更加合理,并且有完全开放的工具链。这也许是开放硬件平台Arduino采用AVR系列微控制器的原因。
当然,编译器的优化不够好未必是问题。即使是不够优化的程序,只要足够实际使用即可。
网络上的现有资料往往使用MPASM对8位PIC进行编程。我曾经用MPASM在PIC12F675上写过几个简单的程序。这一次,我将使用最新版本的开发环境,MPLAB X 6.0和XC8 v2.40,看一看有哪些新的坑可以踩。