自己动手搭建AVR系统板其实是一个既简单又有趣的过程,所需的材料也很易得。一片DIP40封装的ATmega32A单片机、一小块多孔电路板(俗称洞洞板),再配上一些电阻、电容、二极管、三极管、数码管等元器件即可成功搭建系统板。搭建AVR系统板的材料如图3-1所示,材料清单详见附录B。
材料准备好后,就可以动手搭建AVR的系统板了,系统板的电路原理图详见附录A。在搭建最小系统板时,你还需要电烙铁、万用表和镊子等工具以及焊锡丝、助焊剂等辅助材料,这些都可以在电子市场买到。搭建过程中一定要注意在板上预留ISP和JTAG接口,以便于连接基于ISP或JTAG接口的编程器或仿真器。作者自行搭建的AVR系统板如图3-2所示。
为了使板面更加简洁,我们已经将系统板的连线及部分元器件安放在了板的背面,系统板搭建好后,你需要再次认真对板的连线做一次检查,确认接线无误后就可以将单片机按照正确的引脚顺序安装到IC座上了。安装好单片机的AVR系统板及其各部分的功能如图3-3所示。你千万不要小看这样的一块系统板,它绝对可以帮助你完成本书全部内容的学习和代码测试工作。
为了确保代码的正确性,本书中所列的源代码均在AVR系统板和AVR开发平台AVR_bronco实验板上验证通过。AVR_bronco实验板是经优化的AVR单片机开发平台,可以适用于DIP40封装的megaAVR系列单片机做代码测试及开发工作,其核心同样是DIP40封装的ATmega32A单片机,实验板的外观详见附录D。
2 AVR单片机的编程
程序源代码在PC上经编译器编译后,生成可以被单片机执行的机器码。将机器码写入单片机的过程称为对单片机的编程或烧写,AVR单片机常用的编程方式有以下三种:
1.高压/并行编程
AVR系列单片机的高压/并行编程是较早出现的编程方法,因其编程时需要连接较多的引脚所以称其为“并行编程”;在编程过程中,需要在RESET引脚上施加12V电压,所以称之为“高压编程”。此种编程方式由于涉及的引脚较多,对于贴片封装的单片机十分不便,因此目前很少采用。
2.串行编程(ISP编程)
ISP是In System Programming的缩写,意为在线系统编程。AVR单片机允许通过串行SPI总线对片内的FLASH、E2PROM、熔丝位等进行编程。串行编程是通过单片机的SPI接口实现的,使用SCK、MOSI、MISO和RESET引脚完成对芯片代码的写入。在设计硬件电路时,可以先将上述四个引脚做适当预留,当产品量产时,可以先将单片机焊接于PCB板上,之后通过预留的接口向单片机片内下载程序,即所谓的在系统编程,这样可以大大方便产品的生产和后期系统固件的升级和维护。
基于ISP编程方式的编程器有很多种,最常见的莫过于AVRISP编程器了,它的市场价格不过十几元,但却能完成大部分AVR系列单片机的编程下载任务,是目前市场上最具性价比的一类编程器。但由于此编程器推出时间较早,也存在一些缺点,如在编程时需要第三方软件的支持、对Windows 7操作系统的兼容性不好、不能在Atmel Studio 6集成开发环境中使用等。AVRISP编程器如图3-4所示。
另一种ISP编程器是由ATMEL推出的STK500,采用了ATMEL官方的固件,使其可烧写全系列的AVR单片机,并且可以自动升级以支持未来更多的单片机型号。STK500烧写速度快,支持最新的Atmel Studio 6集成开发环境,但由于其不支持USB接口,所以会给使用笔记本的用户带来一些不便。
AVRISP mkⅡ编程器是ATMEL公司开发的基于ISP编程方式的第二代产品,支持全系列AVR以及部分其他内核(如S51)单片机的编程。该编程器使用USB接口连接PC进行程序的下载,因此特别适用于当前的电脑用户。AVRISP mkⅡ编程器体积小巧,结构紧密,可以自动升级固件,与Atmel Studio 6集成开发环境无缝连接,是一种非常适合初学者使用的编程器。本书将使用此款编程器,配合Atmel Studio 6集成开发环境进行代码的编写和下载。AVRISP mkⅡ编程器如图3-5所示。
3.JTAG编程
通过AVR单片机的JTAG接口,不仅可以实现片上调试、边界扫描和测试PCB等功能,还可以完成对FLASH、E2PROM、熔丝位和锁定位的编程任务。使用JTAG接口对AVR系统单片机编程时需要使用四个引脚,即TCK、TMS、TDI和TDO。此编程方式不需要额外的12V电压,相对于SPI编程,JTAG编程方式占用了更多的I/O端口,而且一旦JTAG接口被使能,这些端口只能专用于JTAG的调试和下载,对单片机的资源会造成一定程度的浪费。基于JTAG接口的编程/仿真器有JTAG ICE和JTAG ICE mk II等多种,本教程不作进一步介绍。
3 编程/仿真接口设计
我们已经知道,AVR单片机的编程和仿真是通过专用的接口实现的,其中ISP接口用于连接基于ISP下载方式的编程器,其接口引脚有其固定的定义,具体如图3-6所示。
ISP接口有两种不同的引脚组织形式,图中左侧的是10针的ISP接口,右侧的是6针的ISP接口,AVRISP mkⅡ编程器使用的是6针的ISP接口。在设计目标板时,如果MOSI、MISO或SCK引脚在完成ISP下载功能后还需要作为普通I/O口使用,那么就需要对这些I/O做适当的电气隔离。一个比较简单的办法就是将I/O口与驱动电路之间串联一个1kΩ左右的电阻,目标芯片与编程器引脚间则是直接连接。
另外,为了使目标芯片进入编程模式,ISP编程器在编程时需要拉低目标芯片的RESET引脚。因此,RESET引脚上外接的上拉电阻阻值应该不小于4.7kΩ,否则会导致目标芯片不能正确进入编程状态。
用于仿真调试功能的JTAG接口虽然在外观上与10针的ISP接口相同,但其引脚有自己特别的定义方式,具体如图3-7所示。
这里需要说明的是,JTAG接口的第7脚Vsupply是仿真器向目标板的供电引脚,而第4脚VTref则是目标板向仿真器反馈电压的引脚。在DIY系统板时,系统板的供电电压需要从VTref引脚反馈到仿真器,否则仿真器会因检测不到目标板的电压而提示错误信息。