第4讲 第一个AVR程序

集成开发环境虽然具有强大的功能,但界面却很简洁,不会让你有心理上的恐惧感,你只要知道其中少数几个菜单和按钮的功能,就能轻松完成AVR单片机开发的全过程。

3.3.1

新建AVR项目

双击桌面上的Atmel Studio 6.1快捷方式图标,打开软件的运行窗口,如图3-24所示。

Atmel Studio 6.1软件运行后,界面与大多数的编译环境并没有太多的区别。窗口的上方是菜单栏,下面是输出(Output)窗口,中间部分左侧是开始页(Start Page),右侧是项目提示窗口。用鼠标单击取消勾选“Show page on startup”选项,并点击“Start Page”旁边的“×”形按钮,可关闭开始页。在菜单栏上点击“File”-“New”-“Project…”,新建一个AVR的开发项目,此时出现的对话框如图3-25所示。

在新建项目对话框中,用鼠标在左侧的“Installed Templates”中选择“C/C++”项。这里顺便说一下,使用汇编语言开发AVR的用户可以在这一步选择“Assembler”项;在窗口的中间位置选择“GCC C Executable Project”项,在窗口下方“Name”栏中输入项目名称“LED2”,这个名称既是所建项目的名称,也是为该项目自动添加的C源文件的名称;在“Location”栏中单击“Browse…”,选择项目的存放路径,本书所有的源代码均按章节顺序存放在D:\MEGA32目录下;在解决方案名称“Solution name”栏中使用默认的名称“LED2”,其他项使用默认设置。鼠标单击“OK”按钮,会出现器件选择对话框,如图3-26所示。

器件选择(Device Selection)对话框中的“Device Family”下拉列表中选择“megaAVR,8-bit”项,器件名称中选择“ATmega32A”,此时窗口右侧会出现ATmega32A的简单介绍和在本集成开发环境下支持的开发工具列表。鼠标单击“OK”按钮,一个名为LED2的项目就建好了,并且为该项目自动添加了名为LED2.c的源文件到该项目中。新建项目后的软件界面如图3-27所示。

在窗中的中间左侧部分,出现了一个名为“LED2.c”的页面,这就是所建项目中C源代码的编辑页面。在此页面中,软件已经自动添加了一些程序行和注释,这是GCC-AVR的程序模板功能,它可以帮助我们快速建立C源程序。窗口中间右侧部分是解决方案浏览器“Solution Explorer”,在这里可以观察到整个项目的构成情况,如图3-28所示。

从图3-21中我们看出,在解决方案“Solution‘LED2’”的下面建有一个项目(1

project),在名为LED2项目中,包含有如下部分:

·Dependencies项:包含了可能对本项目提供支持的头文件列表。

·Output Files项:列出的是项目所生成的文件。

·Libraries项:列出的是项目相关的程序库文件。

·LED2.c:这是我们刚刚建立的C源文件,并且已经添加到了项目中。

这一部分我们暂时不用做深入研究,目前要做的是如何写好第一个C程序,点亮一个LED发光二极管。回到“LED2.c”页面中,这里面已经由软件自动生成了一个C源程序,我们只要对这个程序做适当修改即可,软件自动生成的程序内容如图3-29所示。

如果你对显示的文本字体和大小不满意,可以将其更改。在“Tools”菜单中,选择“Options…”选项,弹出的对话框如图3-30所示。

在“Options”窗口的左侧,展开“Environment”项并选择“Fonts and Colors”,在窗口右侧的“Display items”项里选“Plain Text”,这时即可在“Font(bold type indicates fixed-width fonts)”下拉菜单里选择合适的字体,在“Size”下拉菜单里选择字体的大小,最后单击“OK”确认。

在软件自动生成的C源代码中,加入了对源文件的简单介绍,如文件名、创建时间等注释内容,这部分的代码如下:

/*

*

LED2.c *

*

Created: 2013/7/9

15:29:30

*

Author: GAO */

在程序行中,首先是使用预处理命令“#include ”,包含了一个名为io.h的头文件。“avr/io.h”前面的“avr/”表示的是该文件所在的文件夹名称。在默认的安装路径下,所有AVR单片机的头文件都保存在以下路径中:
c:\program files\atmel\atmel toolchain\avr8
gcc\native\3.4.2.1002\avr8-gnu-toolchain\avr\include\
而“io.h”头文件正是位于这个路径下的名为“avr”的文件夹中。
在Atmel Studio 6.1集成开发环境所附带的GCC编译器中,所有AVR单片机都只需包含同一个头文件“io.h”即可,编译器会根据所选单片机的型号,再次包含一个与该型号单片机相对应的头文件。例如本例中使用的单片机型号是ATmega32A,编译器在所包含的头文件“io.h”的基础上,会再次自动链接一个名为“iom32a.h”的头文件,不过这些都是由编译系统自动完成的。“iom32a.h”头文件的作用就是对ATmega32A单片机的寄存器进行规范化的定义,以方便程序的读取和使用。
另外,在自动生成的代码中,软件自动建立了一个名为“main”的主函数,其函数类型为整型,无入口参数。在主函数中还添加了主循环“while(1)”,这部分的代码内容如下:
#include 
int main(void)
{
while(1)
{
//TODO:: Please write your application code }
}
接下来我们就以此为基础进行修改,进而点亮一个LED灯。
3.3.2
程序的编辑和编译
点亮一个LED灯似乎是学习单片机的必经之路,我们也不例外。由于单片机是面对硬件的编程,所以在写程序之前还要看一下LED灯与单片机的连接方式。ATmega32A单片机驱动LED灯的原理如图3-31所示。
在图3-31中,两个LED发光二极管分别经限流电阻与单片机的I/O口PC0和PC1相连。当I/O口输出高电平时,LED灯会被点亮。接下来我们要做的就是让ATmega32A单片机的PC0端口输出高电平,点亮LED1。再次回到前面已经建立好的源程序中并将其修改,使其能按我们的要求工作,修改后的代码详见代码清单3-1。
代码清单3-1
点亮一个LED灯
/*
*
LED2.c *
Created: 2013/7/9
15:29:30
*
Author: GAO */
#include 
int main(void)
{
DDRC=0x0F; //
将PORTC 端口低四位设为输出
0000
1111
PORTC=0x01; //
使PORTC 端口最低位输出高电平
0000
0001
while(1)
{
}
}
程序写好后,需要对源程序进行编译。编译的过程就是将高级语言(如C语言)转化为可以被单片机识别的机器码。C源程序经编译后会生成一个扩展名为“.hex”的文件,将这个文件烧写到单片机中,程序即可在单片机中执行。接下来,我们就来编译前面写好的程序。在Atmel Studio 6.1集成开发环境的工具栏上,找到如图3-32中箭头所指的两个按钮。
这两个按钮的功能如下:
如果你在工具栏上并没有发现这两个按钮,你也可以从“Build”菜单栏中找到它们。单击“编译解决方案”按钮,这时编译器会对代码进行编译,编译完成后,在“Output”窗口中,会有编译成功的提示信息,详见图3-32下方的方框区域。
代码被成功编译后,在解决方案浏览器“Solution Explorer”中,展开各子项,你会发现其内容已经发生了变化,具体如图3-33所示。
在“Dependencies”项中列出了多个程序可能需要的头文件,这些头文件都可以在程序中被包含,从而扩展程序的功能。双击这些头文件可以在工作区打开并查看这些文件的内容,每一个头文件里都会有详细的软件说明;在“Output”项中则有多个以“LED2”为文件名的文件,你会发现“LED2.hex”文件也在此列,该文件就是下一步要烧写到单片机中的文件。
掌握这些文件的存放位置有助于我们更好地驾驭集成开发环境。编译生成的“.hex”文件位于我们先前建立的项目保存的路径下,本书中的存放路径为D:\MEGA32\chapter2\LED2\LED2\Debug。
为源程序提供支持的头文件的保存位置也可以用软件来查明。双击“Dependencies”项中名为“iom32a.h”的头文件,打开此文件,其存放位置如图3-34中方框内路径所示。
3.3.3
连接编程器和系统板
如果你暂时还搞不清hex文件的作用,或者也不想去文件夹里寻找它们,那也没关系,集成开发环境的好处就在于它是一个傻瓜型的系统,无需对过程太过留意,你只要关注结果即可。为了把在PC上编译生成的hex文件烧写到目标单片机中,需要做些必要的硬件连接。首先将编程器的一端通过USB线连接到PC的USB接口上,编程器的另一端通过一个6芯的编程线连接到AVR系统板上预留的六针ISP接口上,其连接的原理如图3-35所示。
将AVRISP mkⅡ编程器的USB接口连接至PC时,会有“正在安装设备驱动程序软件”的提示信息,如图3-36所示。
PC会自动为AVRISP mkⅡ安装驱动程序,因为此设备的驱动程序已经包含在集成开发环境中了。驱动安装好后,在设备管理器中会有新硬件出现,如图3-37所示。
由于AVRISP mkⅡ编程器没有向目标板供电的功能,所以在对目标板编程时需要有额外的5V电源向目标板供电。获取5V电源的方法有很多种,简易的方法是取自电脑的USB接口,通过杜邦线与我们DIY的系统板相连接。
3.3.4
编程目标单片机
编程器与PC及目标板正确连接后,在Atmel Studio 6.1集成开发环境的“Tools”菜单栏里,选择“Device Programming”项,弹出的对话框如图3-38所示。
在“Tools”下拉菜单中选择“AVRISP mkⅡ”,在“Device”下拉菜单中选择“ATmega32A”,鼠标单击“Apply”按钮,软件会自动与编程器建立连接,这时器件编程对话框内容会有更新,如图3-39所示。
1.界面设置项
在图3-39所示的器件编程窗口中,鼠标单击“Interface settings”项,右侧显示的是该选项的内容。“ISP Clock”是ISP编程的时钟速率,调整下面的滑块即可改变ISP编程的速度,理论上要求ISP编程频率必须小于目标芯片工作频率的1/4,为了安全起见,这里选择250kHz。在图中箭头所指位置是“Device signature”项,用鼠标单击下面的“Read”按钮,可以读取目标单片机的序号和供电电压。
2.开发工具信息项
鼠标单击“Tool information”项,列出的是与编程器相关的信息,如图3-40中方框所示。
3.器件信息项
鼠标单击“Deviceinformation”项,列出的是目标单片机的相关信息,如图3-41所示。
在图3-41所示窗口中,点击“Read”按钮,读取的器件信息如图3-42所示。窗口中列出了目标单片机的CPU类型、Flash存储器等内容。
4.存储器信息
鼠标单击“Memories”项,列出的是与单片机存储器相关的信息,如图3-43所示。
在“Memories”项中,“Device”对话框中的“Erase now”按钮用来擦除目标单片机的存储器;“Flash”对话框用于对单片机的Flash存储器进行编程、校验和读取;“E2PROM”对话框用于对单片机的E2PROM存储器进行编程、校验和读取。我们对目标单片机的编程就是通过这三个对话框来实现的。
这里需要注意的是,在“Flash”对话框中,引用了一个路径和文件名:D:\MEGA32\chapter2\LED2\LED2\Debug\LED2.elf。
这个路径与我们经编译生成的“.hex”文件存放路径是一致的,但文件名是“LED2.elf”,而不是我们想要的“LED2.hex”。这时,如果你单击“Flash”对话框中箭头所指的“…”按钮,在与“LED2.elf”文件相同的路径下,会找到名为LED2.hex的文件。
这里需要对“.elf”文件做些说明。大多数AVR单片机芯片内部都有如Flash、E2PROM、Fuses(熔丝位)、Lock bits(锁定位)等多个存储单元,这些存储器的内容都有可能在编程时作相应的修改。在编程时,往往希望只通过单一的动作来完成上述全部内容的编程。Atmel Studio 6.1集成开发环境已经考虑到了这一点,在编译代码时不仅生成了针对目标单片机Flash存储器的“.hex”文件,也同时生成了“.elf”文件,该文件将Flash、E2PROM、Fuses、Lock bits等需要保存到单片机中的内容合成在单一的文件中,并命名为“.elf”,烧写单片机时通过编程器调用“.elf”文件,就可以将上述不同种类的编程项分别提取并烧写到单片机的对应存储器中。
对于目前仅编程Flash存储器的应用来说,在图3-43的Flash对话框中选择“.elf”文件和“.hex”文件所产生的效果是相同的,在这里我们就使用默认的选项,选择“LED2.elf”文件即可,鼠标单击“Program”按钮,稍候片刻即可完成对目标单片机的编程,这时在“Device Programming”窗口下方会有编程成功的提示,如图3-43中窗口下方的方框所示。
5.熔丝位项
在“Fuses”项中,可对单片机熔丝位进行设定,如图3-44所示。
AVR单片机芯片的基础功能设定是通过熔丝位来实现的。关于熔丝位,我们会在后面的章节里详细介绍,在此我们只需更改一下时钟源的设置即可。AVR单片机在出厂时,默认的设置是使用频率为1MHz的片内时钟源,为了让单片机能使用外部的16MHz的晶体振荡器,就需要更改熔丝位以改变时钟设置。用鼠标单击“SUT_CKSEL”项右侧的三角形按钮,展开时钟源选择下拉列表,在列表中选择“EXTHIFXTALRES_258CK_4MS”项即可将时钟源切换到外部晶体振荡器上,暂时不要更改其他设置。
时钟源选项更改完毕后,单击“Program”按钮,即可完成对目标单片机熔丝位的改写,编程熔丝位成功的提示会在窗口的下方显示,具体如图3-45所示。
6.锁定位项
“Lock bits”项是锁定位,用于单片机的代码保护。与熔丝位一样,在本书的后面章节对锁定位会有详细介绍。
7.ELF工作文件项
“Production file”项,是使用ELF文件编程单片机的专属页面,如图3-46所示。
我们前面说过,“.elf”文件是AVR单片机所特有的一类文件,是Flash、E2PROM、Fuses(熔丝位)、Lock bits(锁定位)等内容的组合形式。在“Production file”项中,提供了对ELF文件更加灵活的操作,我们可以使用同一个“.elf”文件,单独完成对“Flash”或其他几个项目的编程。
例如我们在“Program device from ELF production file”对话框中单击“…”按钮调用一个“.elf”文件,假设该ELF文件中包含了目标芯片的Flash、E2PROM等多项内容,但如果只想使用这个ELF文件来编程目标单片机的Flash存储器部分,只要在窗口中勾选“Flash”项即可,单击“Program”按钮,就会完成对目标单片机“Flash”存储器的单独编程,其他部分保持不变。
通过本章的学习,我们知道了如何DIY系统板、编写编译C程序、使用编程器为目标单片机编程、更改熔丝位以及如何使用ELF文件等。当编程器工作时,会将目标单片机的RESET引脚拉低,使芯片处于复位状态。编程结束后,编程器会释放RESET引脚,所以一旦编程结束,程序就会在目标单片机上运行。好了,如果此时你的做法正确,那么在你的系统板上与PC0端口连接的LED灯就会点亮。怎么样,看到你亲手点亮的LED灯,是不是很有成就感!这虽然是你学习过程的一小步,但却是驾驭AVR所迈出的一大步!

 


评论:

AVR单片机基础教程

作者:高显生   共18讲

AVR系列单片机是8位单片机中第一个真正的RISC结构单片机,它采用了大型快速存取寄存器组、快速的单周期指令系统以及单级流水线等诸多先进技术,使得AVR单片机具备了高达1MIPS/MHz的运行处理能力。