加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 AVR+单片机GCC+程序设计

AVR+单片机GCC+程序设计.pdf

AVR+单片机GCC+程序设计

songdj
2010-03-30 0人阅读 举报 0 0 暂无简介

简介:本文档为《AVR+单片机GCC+程序设计pdf》,可适用于IT/计算机领域

芯艺作品AVR单片机GCC程序设计芯艺芯艺作品请到http:wwwchipartnet或http:chipartklnet下载最新版本和示例程序问题反馈:Email:chipartchipartnetchangfutongsinacomOICQ:感谢您的支持!芯艺作品目录前言第一章概述AVR单片机GCC开发概述一个简单的例子用MAKEFILE管理项目开发环境的配置实验板CAM第二章存储器操作编程AVR单片机存储器组织结构IO寄存器操作SRAM内变量的使用在程序中访问FLASH程序存储器EEPROM数据存储器操作avrgcc段结构与再定位外部RAM存储器操作堆应用第三章GCCC编译器的使用编译基础生成静态连接库第四章AVR功能模块应用实验中断服务程序定时器计数器应用看门狗应用UART应用PWM功能编程模拟比较器AD转换模块编程数码管显示程序设计键盘程序设计蜂鸣器控制第五章使用C语言标准IO流调试程序avrlibc标准IO流描述利用标准I流调试程序最小化的格式化的打印函数第六章CAM上实现ATS编程器的实现芯艺作品编程原理LuckyProg概述ATSisp功能简介下位机程序设计第七章硬件TWI端口编程TWI模块概述主控模式操作实时时钟DS两个Mega间的TWI通信第八章BootLoader功能应用BootLoader功能介绍avrlibc对BootLoader的支持BootLoader应用实例基于LuckyProg的BootLoader程序第九章汇编语言支持C代码中内联汇编程序独立的汇编语言支持C与汇编混合编程第十章C语言支持附录avrgcc选项附录IntelHEX文件格式描述芯艺作品5前言年在学校我第一次接触Linux那时在班里学习做网页的气氛较浓我也是为了学习PHP才认识Linux的。PHP解析器的安装过程让我多多少少对GCC有了些认识不过当时我并没有意识到它还可以用于嵌入式系统编程上至于Linux、认为用处只在于架构一个免费的WEB站点。年在公司我第一次接触了AVR当时公司只有一个ICC序列号导致我和一个同事经常抢用一台机器不过这种状况没有持续多久我在浏览双龙的数据光盘时发现一个叫“如何使用AVRGCC”的PDF文档上面没有署名我想我应该感谢该文的作者。我发现这个免费的编译软件远比ICC好用。今天我把使用AVRGCC两年来的体会写在这里愿更多的人了解和使用GCC及自由软件。水平有限错误和缺陷在所难免请广大读者批评指正。作者:芯艺于内蒙古包头芯艺作品6声明:内容中所有的示例均在硬件上调试通过请不要编辑内容和示例程序发现错误和作者联系所有的引用请注明出处对使用本软件后的一切后果本人不负任何责任芯艺作品1第一章概述AVR单片机GCC开发概述一AVR单片机介绍诞生:年ATMEL公司挪威设计中心的A先生和V先生出于市场需求的考虑推出了全新配置的位精减指令集微处理器(RISCReducedInstrctionSotCPU)。起名为AVR。系列和主流:AVR是一种指令内核的统称它内部又分ATtiny、ATS和ATmega三大系列分别对应AVR的低、中、高档产品。Attiny系列中常用的有Attiny、Attiny等产品ATS系列中常用的有ATS、ATS、ATS等。ATS引脚兼容ATC而ATS的引脚则兼容单片机在设计中很容易的替代单片机。但是到目前ATS系列的绝大部分已停产当某一个ATS系列芯片停产时ATMEL通常会在ATMega或ATtiny系列中推出一个新的替代产品替代产品往往在引脚兼容的基础上内部资源和性能得到加强。例如Attiny作为ATs的替代产品在ATS的基础上增加了片内标定振荡器、增强型上电复位、可编程的掉电检测等等多种功能。类似的ATMega和ATMega分别作为ATS和ATS的替代产品继承了很多Mega系列的特性。ATMega、ATMega、ATMega、ATMega、ATMega和ATMega是ATMega系列的主流产品。值得关注的是ATMega这一款单片机它以丰富的片内资源、低廉的价格深受广大设计人员的喜爱并在国内得到了较好的推广。然而ATMega作为它的兼容产品为用户提供更多功能的选择。ATMega也是个用量较多的器件它的引脚兼容ATS可以取代产品中的芯片。相对ATMega它除了IO引脚多之外内部集成了ATMega两倍(K)的FLASH程序存储器。随着国内AVR用户的增多ATMEL也开始了主流器件数据手册的中文翻译工作。从网络上可以找到Attiny、ATMega、ATMega、ATMega、ATMega、ATMega等器件的官方翻译中文数据手册。这对学习和使用AVR器件提供了很大的帮助。硬件结构:有关AVR硬件结构各功能模块的描述请参考数据手册或相关的书籍。开发工具:更适合采用高级语言开发是AVR单片机最初设计时的目的之一。目前AVR单片机高级语言发发工具主要有IARC、WINAVR、ICCAVR、CodeVision、BASCOMAVR(BASIC语言)。IAR是与AVR内核协同开发的很多对AVR更适合C语言开发方面的改进是根据IAR开发过程的它也是ATMEL公司推荐的C语言编译器但它的价格几呼让人难以接受达到上万元人民币。ICCAVR是国内AVR主要推广单位双龙公司代理的C编译器它价格低廉性能也XX友好的界面把很多烦琐的项目管理和编译设置隐藏了起来为此它受部分开发人员的欢迎。CodeVision也是个很不错的C编译器目前在国内也有一定数量的用户。Winavr是个免费的AVR开发程序集它以著名的自由软件GCC为CC编译器。下面所芯艺作品2有章节我都会介绍如何使用WINAVR开发AVR单片机。学习GCC的意义绝不仅仅是为了开发AVR程序正如ICBBS上一位网友所说:“如果其它编译器是一棵树那么GCC就是个树林”GCC支持多种处理器包括ARM、DSP、X等位CPU。它的历史足以说明它是个成熟的编译器。如果不是个业余的程序开发人员我不会建议你使用BASIC编写AVR程序因为我们在编写与硬件密切相关的单片机程序时通常需要想象编译器是如何将这些代码翻译成汇编程序的而C更适合我们去这样做。二GCC编译器UNIX上最原始的C编译器叫CC(CCompilerC编译器)源于此GNU的C编译器叫作GCC(GNUCCompiler)然而随着GCC支持语言的增加GCC这个缩写的意义已演变成了GNU编译器集合(GNUCompilerCollection)它是GNU项目的一个产品是个开放源代码软件。GCC可编译多种语言目前支持的语言有C、C、ObjectiveC、Fortran、java和Ada。这些高级语言程序通过编译程序前端(frontend)后产生解析树之后与器件相关的后端(backend)程序将它们解释成实际的可执行指令集。前端与后端是完全分开的解析树是它们中间的产物。GCC这样的设计使得任何一种语言只要通过合适的语法解析器产生符合格式的解析树就可以产生GCC后端程序所支持的所有器件上的可执行指令集。同样的任何一种器件只要将树结构翻译成汇编就可以使用GCC前端所支持的所有语言。要承认的是以上描述是理论化的便于理解实际操作并没有想象的那么简单。事实上前端和后端都不是孤立的。幸运的是AVR的确得到了GCC的支持它也是GCC支持的唯一一种位处理器。不仅如此我们还可以在WINDOWS平台上安装程序包WINAVR来使用GCC的AVRCC编译程序。WINAVR是一组开放源代码的程序集用于ATMEL公司AVR系列单片机的开发它主要包含:GNU程序包BinutilsGNUBinutils非常庞大WINAVR仅包含与AVR相关的部分有AVR汇编器、连接器以及与机器指令相关的一些工具GNUGCC的C和C编译器。AVRLIBCAVRLIBC是AVR单片机C运行时库它是为应用程序提供标准C函数的连接时定位库。另外WINAVR还包含软件调试器、器件编程软件、文件格式转换工具等多个有用工具这里不一一列出请参考WINAVR说明文档。WINAVR项目的WEB地址是http:sourceforgenetprojectswinavr这里可以下载最新的版本并可订阅邮件组。邮件组是获取WINAVR相关帮助信息的重要途径。芯艺作品3一个简单的例子为了先有一个感性的认识我们首先看一下如下一段程序和它的编译、连接过程。文件democ:#include<avrioh>intmain(void){unsignedchari,j,k,led=DDRB=xFFwhile(){if(led)PORTB|=XelsePORTB=XFEled=!led延时for(i=i<i)for(j=j<j)k}}这是一个使接在PB口的LED发光管闪烁的程序。有了源程序文件democ我们就可以编译它了。通过点击菜单开始>运行在弹出的对话框中输入“command”来打开控制台窗口并在命令行输入:avrgcc–mmcu=ats–cdemoc如图所示。必需告诉编译器程序的MCU类型这是我们通过命令行选项mmcu来指定的我们指定的器件为ats。c选项告诉编译器编译完成后不连接。图控制台窗口芯艺作品4编译完成后在工作目录新生成了一个文件:demoo它是我们的目标文件,我们再使用连接器将它连接成可在器件上执行的二进制代码。在命令行输入:avrgcc–mmcu=ats–odemoelfdemoo之后我们会在工作目录看见连接器生成的demoelf。gcc的连接后生成的文件为ELF格式在命令行我们通常用elf指定其扩展名。ELF格式文件除了包含不同存储器的二进制格式内容外还包含一些调试信息所以我们还要借助一个有用工具avrobjcopy来提取单片机程序存储器内容。命令行输入:avrobjcopyjtextjdataOihexdemoelfdemohexgcc把不同类型的数据分到不同的段落相关程序存储器的段有text和data我们用选项–j指定了要提取的段。选项–O用来指定输出格式这里我们指定为ihex(intelHEXfile)。到此我们得到了最终可以写入单片机SFLASH存储器的demohex文件。用编程器将demohex内容写入到单片机便可看到接在PB口的LED不断的闪烁。以上对一次编译过程的描述只是为了说明gcc编译一个C源程序的步骤在实际的应用中我们很少用这种方式编译每一个源程序和每一个更新后的程序。而是借助一个叫make的项目管理工具来进行编译操作。Make由下一节介绍。芯艺作品5用MAKEFILE管理项目在我看来通常一个编译器(泛指高级语言编译器、汇编器、连接器等等)、项目管理器和文本编辑器构成一个完整的编程环境。其中项目管理器负责为每一个源程序文件调用编译器生成目标文件后用连接器将它们组合在一起生成可执行文件。例如KeiluVision进行编译时将项目中的每一个源程序文件进行编译后生成对应的obj文件之后将这些目标文件连接到一起生成可执行(例如iHex格式)文件。这是对编译过程的粗略的描述KeiluVision掩盖了很多的细节使用过早期C编译器的读者对此一定有所了解。WINAVR没有像KeiluVision那样集成项目管理器的IDE所以我们需要写一个叫做makefile的文件来管理程序的编译连接。makefile是个脚本文件一个标准的(应该说经典的)可执行文件makeexe负责解析它并根据脚本内容来调用编译器、连接器或其它的工具最终生成可执行代码文件。每次调用make时它会比较目标文件与源文件的更新时间如果源文件比目标文件还要新它会执行makefile内的相关指令更新目标文件如果目标文件与源文件一样新它就跳开这个源文件的编译避免重复工作这对于一个较大的工程是个节省时间的有效方法。make的使用Make指令的用法是:Makeffilenamenames方括号表示括号里边的内容可以省略。其中filename代表make所使用的项目描述文件如果此项省略则从当前目录下按下列顺序寻找默认的项目描述文件GNUmakefilemakefileMakefile(当然、在WINDOWS下不份大小写文件名也就无所谓了)names指定目标名或宏名。若不指定目标名则make命令总是把在makefile文件中遇到的第一个目标当作默认目标。了解makefile脚本内容是非常有用的但这不是必需的因为WINAVR中一个小工具Mfile可以为我们生成功能够用的makefile样本。所以如果对makefile不太感兴趣可以跳过下面的小节。Makefile项目描述文件一目标make命令引入了目标(targets)的概念。Makefile描述文件便是它的第一个目标make命令必须处理至少一个目标否则不会得出任何结果。正如我们在一个没有默认描述文件的当前目录下敲入make一样make会输出以下的结果:芯艺作品6MAKE:***NotargetsspecifiedandnomakefilefoundStop在项目描述文件中定义目标一个目标通常从一行的开头开始并后跟一个冒号。最简单的MAKEFILE#当前目录D:AVRGCCTESTall:echohello!#Endmakefileall:便是第一个目标调用此描述文件结果:D:AVRGCCTEST>makehello!默认目标(goal)在上面提到过如果调用make时不指定目标名则make总是假设在描述文件中遇到的第一个目标是默认目标。以下示例可以非常好的说明这一问题。具有三个目标的makefile#当前目录DAVRGCCTESTone:echooneTwo:echotwoThree:echothree#Endmakefile调用:D:AVRGCCTEST>makeone由于在命令行没有指定目标make从makefile中找到第一个目标(one)并执行后既退出。调用:D:AVRGCCTEST>maketwotwo由于在命令行明确指定了要执行的目标(two),make在makefile中找到指定的目标并执行后退出。调用:D:AVRGCCTESTmakethreeonetwothreeone芯艺作品7two命令行指定了三个目标make一一寻找并执行。在makefile中非默认的目标称为可替换的目标只有默认的目标与它们存在直接或间接的依赖关系时它们才有可能被调用。二.依赖关系makefile文件按如下格式指定依赖关系:目标目标…::依赖依赖…命令如下例#当前目录D:AVRGCCTESTone:TwoechooneTwo:echotwo#Endmakefile执行结果是:d:avrgcctest>maketwooneMake首先找到第一个目标one之后发现目标one依赖目标Two就先执行Two后才执行one中的命令。三.Makefile内容makefile内容可分为如下五种类型①规则定义语法:目标:依赖命令其中目标为一个文件名或以空格分开的多个文件名可含通配符。例如:o:cavrgccc$<o$以上规则定义了任意一个以o结尾的文件依赖于相同前缀且以c结尾的文件。并执行下边的命令获得。规则中目标和依赖分别为o和c在目标通配符“”代表任意的字符串而在依赖中代表与目标中代表的对应字符串。芯艺作品8②隐含规则隐含规则是make预先定义的规则用选项–r可取消所有的隐含规则。例如对于C程序o可以自动的从c通过命令$(CC)c$(CPPFLAGS)$(CFLAGS)'生成。③变量变量是在makefile中描述一字符串的的名称。变量可用在目标、依赖、命令和makefile其它部分中。变量名由除‘:’、‘#’、‘=’之外的字符组成对大小写敏感。变量的定义并赋值格式:变量名=变量代表字符串变量的引用格式:$(变量名)例如:CC=avrgcco:c$(CC)c$<o$④命令命令部分是由make传递到系统的字符格式的命令行的组合在目标被创建时它们按顺序一行一行传递到系统并执行。字符‘’开始的命令在系统的输出中不显示本次的指令行。⑤注释字符‘#’开头的行为注释行如果注释需要换行需在行尾加‘’除包含其它MAKEFIEL外在行的任意处可插入注释。四自动变量在makefile中有一组预定义的变量当每一规则被执行时根据目标和依赖重新计算其值叫作自动变量。下面列出了常用的几个自动变量$:在规则中代表目标名如果规则含有多个目标名它将列举所有目标。$:仅在目标是存档文件的成员时起作用代表目标。如目标fooa(baro)中$代表fooa$代表baro$<:在规则中代表第一个依赖文件名$:代表在规则中所有以空格隔开的依赖文件名如果依赖是存档文件的成员则只有成员名被列出。芯艺作品9$^:代表在规则中所有以空格隔开的依赖文件名如果依赖是存档文件的成员则只有成员名被列出。使用Mfile生成合适的makefileWINAVR包中有一种简单的makefile文件生成工具叫mfile它的运行界面如图利用它我们可方便的生成合适的makefile。《Mainfilename…》菜单指定主程序文件它将决定主源程序文件名及输出文件名。《Outputformat》菜单项用于选择最终生成的可指行代码格式根据编程器支持格式选择即可。《Optimizationleave》指定C代码的优化级s代表按最小代码量编译。《CCsourcefile(s)》和《Assemblersourcefiles(s)》用于在项目中添加其它C、C、和汇编程序源文件。图mfile生成makefile通常我们选择了以上几项就可以了。在编写程序的过程中往往需要在项目中添加源文件这时只需在生成makefile中SRC变量后列出源文件名即可。Mfile生成的makefile有四个目标分别是:all:编译程序生成可执行文件。这也是默认的目标即在命令行当前目录下一个没有任何选项的make命令将执行这一目标。芯艺作品10clean:在当前目录清除编译生成的所有文件。coff:将ELF格式的调试文件转换成AVRStudiox中可以调试的AVRCOFF格式。extcoff:将ELF格式的调试文件转换成AVRStudio扩展COFF格式。另外C源文件名的后缀改成“s”后的目标指示将生成该源文件编译后的汇编代码文件(以“s”结尾)。开发环境的配置一.软件环境UltraEditWinAVR打造超级开发IDEUltraEdit是个文本编辑器它支持C代码的高亮显示、项目管理及外部工具配置等功能。首先要安装UltraEdit和WinAVR。()UltraEdit的个性化设置:下面是我个人习惯的设置视图>颜色设置光标所在行文本设置成黑,光标所在行背景设置成白高级>配置>编辑制表符宽度值和缩进空格娄均设成。高级>配置>备份保存时备份文件里选择不备份。视图>查看列表选中函数列表()创建编译用的文件先在硬盘上创建一个目录作为设计大本营这里假设为d:devdirUltraEdit写主程序文件保存到此文件夹中这里设为democ用mfile生成一个合适的makefile保存到d:devdirUltraEdit创建一项目负责管理文件项目>新建项目目录选d:devdir输入项目名称(这里假设为prj)在接下来的文件设置对话框中的项目文件目录区输入或选择d:devdir选中相对路径复选按钮通过添加文件按钮将刚才的makefile和democ添加到项目中之后按关闭。()在UltraEdit中make我的项目高级>工具配置在命令行区输入make在工作目录区输入d:devdir在菜单项目名称区输入一个任意的菜单名称选中输出到列表框和捕获输出两个选择按钮后单击插入按钮确定。至此你就可以在UltraEdit内就可以make你的程序了☺如果不愿意每次编译时找菜单可用快捷键Ctrlshift。记得要在你的项目里添加源程序时,除了在UltraEdit项目>文件设置里添加外还要在makefile的SRC变量后列出来才可编译哦☺芯艺作品11到此我们的超级无敌AVR编程环境打造完成如图。图配置后的UltraEdit外观二.硬件环境SIProgPonyProg实现最廉价的下载实验器AVR系列单片机提供对程序存储器(FLASH)和数据存储器(EEPROM)的串行编程功能(ISP)使它的程序烧写变得方便。AVR系列器件内部FLASH存储器的编程次数通常可达到次以上所以使用多次烧写的方式调试程序时不必担心器件的损坏。ISP功能占用三个IO端口(MOSI、MISO、SCK)与外部编程逻辑通信编程逻辑按指定时序将程序数据串行方式发送到器件器件内的ISP功能模块负责将数据写入到FLASH或EEPROM。在实际应用中通常利用PC机的并行口或串行口加一个下载适配器(下载线)实现一个编程硬件AVR的下载线有很多种这里向大家推荐SIProgSIProg具有制作方便(只需几个分立元件)、接线少(通过PC针串行口编程),支持软件成熟(PonyProg)等特点。siprog的完整电路可到http:wwwLancOScom下载。图芯艺作品12为简化后的电路原理图。PonyPorg是个串行器件编程软件支持AVR在内的多种器件的串行编程。该软件可到http:wwwLanOScom下载。图SIProg电路原理图有了一台安装有PonyPorg的PC机和SIProg就可以将程序写入到实际器件来验证了想一想此方案的成本和一个AVR芯片能烧写的次数是不是觉得很值☺实验板CAM特性:„实验器件为有代表性的AVR单片机ATMega„三个位拨码开关实现板上电路与MCUIO脚间的连接与断开„HC驱动的两位数码管显示电路„两个可由IO口控制的LED发光管„两个可连接Mega中断口的按钮开关„可由IO口控制的蜂鸣电路„可选的外部MHz或Hz晶振„UART与RS间的电平转换电路实现与计算机间的串行通信„用于对板上器件编程或可引出的SIProg下载编程电路„用于测试片内ADC的电位器调压电路„配合LuckyProg对其它ISP器件编程用的接口引出„可选的外部按键复位源电路„简洁的稳压电路及指示电路芯艺作品13设计目的:.为本书多数例题提供可用的测试硬件.为在校的不满足于MCS知识、且注重实践的电子类专业学者提供廉价而完整的AVR学习硬件为那些非电子、自动化相关专业的单片机爱好者,并在单位里没有较好条件的人员提供廉价而实用的学习开发板.为LuckyProg提供标准的硬件电路,因此拥有CAM的最初目的可能是用于学习开发而最终可能经常当作编程器使用电路原理图见第页图配置:在CAM上三个路拨码开关将板上功能电路与ATMEGA的IO引脚隔开为此使用板上电路做实验时应当配置好这些拨码开关。表列出了ATMEGA与板上功能电路间的这一对应关系。表CAM配置开关一览表拨动开关ATMEGAIO引脚板上功能电路备注SPB(XTAL)SPB(XTAL)外部MHz晶振使用外部晶振时使用SPB(TOSC)SPB(TOSC)Hz晶振使用实时时钟功能时使用SPDSERSPDRCKSPDHC三个控制端口SCKSPB蜂鸣器驱动电路高电平有响声SPC(RESET)复位电路SSCKSMISOSMOSISIProg下载线ISP下载程序时使用SRXDSTXDMAX电平转换电路与计算机串行通信时使用SINT按键SSINT按键SSPCRSTSPCMISOSPCSCKSPC对其它器件串行编程操作端口MOSISAREFVCCSPC(ADC)电位器调压电路SPB红色发光管低电平亮SPB黄色发光管低电平亮芯艺作品14时钟源选择:内部时钟:当通过熔丝位选择内部时钟时应当将S~S断开外头部MHz:开通S和S并将将熔丝位设置成外部晶振此时S,S应断开。外部低频晶振(Hz):开通S和S并将将熔丝位设置成低频晶振此时S,S应断开。复位源选择:当使用板上复位按钮或SIProg下载程序时不仅需打开S还要使用J插座的ERS和RST两个脚用短路块短接。使用板上下载线对器件编程:使用板上SIProg下载程序时应当将S~S开通。上位机软件建议使用PonyProgPonyProg执行界面如图所示:图PonyProg执行界面J是SIProg引出的单排插座,可以使用此接口对其它AVR器件进行ISP编程。配置时的几点注意事项:.当S和S打开时不能打开S和S.当S和S打开时不能在程序中将PD和PD设置为输出高电平芯艺作品15.当S打开时不能选择内部ADC电压基准实物照片:如图所示图CAM实物照片下载更多的示例程序或购买CAM请到http:wwwchipartnet或http:chipartklnet这里有关于CAM更多的信息。读到这里你也许还没有感觉到我其实一直在唱导一种开发模式那就是:使用C等高级语言开发,利用现代单片机多次烧写特性和ISP编程功能等特点通过将程序写入到实际单片机来验证。我们不需要仿真器甚至软件仿真都不需要。CAM作为一个开发板就是个典型的例子。你赞同这种开发模式吗?请继续阅读。ABCDDCBAPC(RST)PD(RXD)PD(TXD)PD(INT)PD(INT)PD(T)VCCGNDPB(XTTS)PB(XTTS)PD(T)PD(AIN)PD(AIN)PB(ICE)PB(OCA)PB(OCBSS)PB(MOSIOC)PB(MISO)PB(SCK)AVCCAREFGNDPC(ADC)PC(ADC)PC(ADC)PC(ADC)PC(ADCSDA)PC(ADCSCL)ATMEGASSSSPCPCPCPCADCADCAREFPBPBPBPBLEDRPCPDPDPDPDPDPBPBPDPDLEDYRSTOMISOOSCKOMOSIOAREFADINLEDRLEDYPCPBPBPBPDPDPDPDVCCGNDPBPBPBPBPDPDPBPDBBELLRKRKRKRQSSYCpFCpFHzYCuFMHzVCCERSGNDVCCVCCDLEDREDDLEDYELRVCCRKQRRKSCKINMISOINMOSIINRXDTXDSRSERSRRCKSRSCKPCPCPCPCPDVCCCnFRKRSTAREFJRSTVinGNDVoutULMCnFCnFCuFCuFBVCCDLEDGRNRJVACCVCCCVToutRinRoutTinTinRoutRinToutGNDVCCMAXCuFCuFCuFCuFCuFTXDRXDVCCJDBRKZVZVRKRKRKRKQVCCMISOINMOSIINSCKINERSRSTOUARTSiProgSERSRCLKSRCLRRCLKEOOOOOOOOQUHCSERSRCLKSRCLRRCLKEOOOOOOOOQUHCabfcgdeDPYabcdefgdpdpGNDQSEGabfcgdeDPYabcdefgdpdpGNDQSEGRPXRPXDisplaySRSERSRSCKSRRCKSRSCKSRRCKVCCVCCPower芯艺作品17第二章存储器操作AVR单片机存储器组织结构AVR系列单片机内部有三种类型的被独立编址的存储器它们分别为:Flash程序存储器、内部SRAM数据存储器和EEPROM数据存储器。Flash存储器为K~K字节支持并行编程和串行下载,下载寿命通常可达,次。由于AVR指令都为位或位程序计数器对它按字进行寻址因此FLASH存储器按字组织的但在程序中访问FLASH存储区时专用指令LPM可分别读取指定地址的高低字节。寄存器堆(R~R)、IO寄存器和SRAM被统一编址。所以对寄存器和IO口的操作使用与访问内部SRAM同样的指令。其组织结构如图所示。图AVRSRAM组织个通用寄存器被编址到最前,IO寄存器占用接下来的个地址。从X开始为内部SRAM。外部SRAM被编址到内部SRAM后。芯艺作品18AVR单片机的内部有~K字节的EEPROM数据存储器它们被独立编址按字节组织。擦写寿命可达次。IO寄存器操作IO专用寄存器(SFR)被编址到与内部SRAM同一个地址空间为此对它的操作和SRAM变量操作类似。avrlibc对SFR定义了符号使用这些符号需包含头文件ioh包含方式如下:#include<avrioh>ioh文件在编译器包含路径下的avr目录下由于AVR各器件间存在同名寄存器地址有不同的问题ioh文件不直接定义SFR寄存器宏它根据在命令行给出的–mmcu选项再包含合适的ioxxxxh文件。在器件对应的ioxxxxh文件中定义了器件SFR的预处理宏在程序中直接对它赋值或引用的方式读写SFR如:PORTB=XFFVal=PINB从ioh和其总包含的头文件sfrdefsh可以追溯宏PORTB的本来的面目例如我们可以在ioh中找到PORTB的定义如下:#definePORTBSFRIO(x)而在sfrdefsh中可以找到如下两个定义:#defineSFRIO(ioaddr)MMIOBYTE((ioaddr)x)#defineMMIOBYTE(memaddr)(*(volatileuintt*)(memaddr))这样PORTB=XFF就等同于*(volatileunsignedchar*)(x)=xff而x正是寄存器PORTB在器件ATS中是的地址。这进一步说明了SFR与SRAM操作的相同之处。在C程序中我们可以将符号PORTB看作是绑定到寄存器PORTB的变量。关键字volatile确保本条指令不会因C编译器的优化而被省略。另外宏BV(bit)是我们操作IO寄存器时频繁用到的avrlibc建议使用这一宏进行寄存器的位操作它在文件sfrdefsh中定义如下:#defineBV(bit)(<<(bit))芯艺作品19以下是它的使用示例:DDRB=BV(PB)|BV(PB)ioh中定义PB:PB:它等同于DDRB=X这样写的目的是为了提高程序的可读性。不要担心它会生成比DDRB=X更大的代码编译器会处理这种事情最终会输出与DDRB=X同样的结果。SRAM内变量的使用在C程序中一个没有其它属性(arrribute)修饰的全局或静态变量将被指定到内部SRAM而局部(自动)变量则用寄存器或栈来处理当程序被解析到汇编时这些全局或静态变量名转换成全局的符号这些符号标识了内部SRAM地址而局部变量没有这种符号。avrlibc建议使用一组数据类型符号这些数据类型的定义在头文件inttypeh中头文件的包含形式如下:#include<inttypeh>其中定义了常用的整数类型如下表所示:定义值长度(字节)值范围intt~uintt~intt~uintt~intt~uintt~intt*^~*^uintt~*^定义、初始化和引用如下示例:uinttval=定义了一个SRAM变量并初始化成val=改变变量值constuinttval=定义SRAM区常量registeruinttval=定义寄存器变量在程序中访问FLASH程序存储器avrlibc对FLASH存储器的读写支持API和宏在头文件pgmspaceh中定义在源文件芯艺作品20中的包含形式如下:#include<avrpgmspaceh>在程序存储器内的数据定义使用关键字attribute((progmem))。在pgmspaceh中它被定义成符号PROGMEM。.FLASH区整数变量应用定义格式:数据类型变量名PROGMEM=值如:charvalPROGMEM=intvalPROGMEM=longvalPROGMEM=对于不同长度的整数类型avrlibc提供对应的读取函数:pgmreadbyte(progvoid*addr)pgmreadword(prgvoid*addr)pgmreaddword(prgvoid*addr)另外在pgmspaceh中定义的位整数类型progcharproguchar分别指定在FLASH内的位有符号整数和位无符号整数。应用方式如下:charramvalram内的变量constprogcharflashval=flash内变量voidfn(void){ramval=pgmreadbyte(flashval)读flash变量值到RAM变量…

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/34

AVR+单片机GCC+程序设计

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利