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

上传资料

关闭

关闭

关闭

封号提示

内容

首页 winAVR中文教程

winAVR中文教程.pdf

winAVR中文教程

lingjun1015
2012-05-09 0人阅读 举报 0 0 暂无简介

简介:本文档为《winAVR中文教程pdf》,可适用于高等教育领域

AVR单片机与GCC编程V芯艺最新版本和示例程序请到http:bitfuzjcom下载欢迎通过如下方式交流:OICQ:MSN:changfutonghotmailcomEmail:changfutongsinacom感谢您指出错误和不足之处!目录第一章AVR单片机开发概述一个简简单的例子用MAKEFILE管理项目开发环境的配置第二章存储器器操作AVR单片机存储器组织结构IO寄存器操作SRAM内变量的使用在程序中访问FLASH程序存储器EEPROM数据存储器操作avrgcc段结构与再定位第三章功能模块编程示例中断服务程序定时器计数器应用看门狗应用UART应用PWM功能编程模拟比较器AD转换模块编程第四章使用C语言标准IO流调试程序avrlibc标准IO流描述利用标准I流调试程序第五章ATS下载编程器的制作LuckyProgS概述ATSISP功能简介程序设计第六章硬件TWI端口编程TWI模块概述主控模式操作实时时钟DS两个Mega间的TWI通信第七章BootLoader功能应用BootLoader功能介绍avrlibc对BootLoader的支持BootLoader应用实例第八章汇编语言支持C代码中内联汇编程序独立的汇编语言支持C与汇编混合编程第九章C语言支持结束语附录avrgcc选项附录ihex格式描述AVR单片机与GCC编程1第一章AVR单片机GCC程序设计WINAVR是一个ATMELAVR系列单片机的开发工具集它包含GNUC和C编译器GCC。一个简单的例子为了先有一个感性的认识我们首先看一下如下一段程序和它的编译、链接过程。文件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选项告诉编译器编译完成后不链接。AVR单片机与GCC编程2图控制台窗口编译完成后在工作目录新生成了一个文件: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由下一节介绍。AVR单片机与GCC编程3用MAKEFILE管理项目在我看来通常一个编译器(泛指高级语言编译器、汇编器、链接器等等)、项目管理器和文本编辑器构成一个完整的编程环境。WINAVR没有像KeiluVision那样的集成IDE所以我们需要写一个叫做makefile的文件来管理程序的编译链接。makefile是个脚本文件一个标准的(应该说经典的)可执行文件makeexe负责解析它并根据脚本内容来调用编译器、链接器或其它的工具。make的使用make能够自动记忆各源文件间的依赖关系避免重复编译。Make指令用法是:Makeffilenamenames方括号表示括号里边的内容可以省略。其中filename代表make所使用的项目描述文件如果此项省略则从当前目录下按下列顺序寻找默认的项目描述文件GNUmakefilemakefileMakefile(当然在WINDOWS下不份大小写文件名也就无所谓了)names指定目标名或宏名。若不指定目标名则make命令总是把在makefile文件中遇到的第一个目标当作默认目标。Makefile项目描述文件一目标make命令引入了目标(targets)的概念。Makefile描述文件便是它的第一个目标make命令必须处理至少一个目标否则不会得出任何结果。正如我们在一个没有默认描述文件的当前目录下敲入make一样make会输出以下的结果:MAKE:***NotargetsspecifiedandnomakefilefoundStop在项目描述文件中定义目标一个目标通常从一行的开头开始并后跟一个冒号。最简单的MAKEFILE#当前目录D:AVRGCCTESTall:echohello!#Endmakefileall:便是第一个目标调用此描述文件结果:D:AVRGCCTEST>makehello!AVR单片机与GCC编程4默认目标(goal)在上面提到过如果调用make时不指定目标名则make总是假设在描述文件中遇到的第一个目标是默认目标。以下示例可以非常好的说明这一问题。具有三个目标的makefile#当前目录DAVRGCCTESTone:echooneTwo:echotwoThree:echothree#Endmakefile调用:D:AVRGCCTEST>makeone由于在命令行没有指定目标make从makefile中找到第一个目标(one)并执行后既退出。调用:D:AVRGCCTEST>maketwotwo由于在命令行明确指定了要执行的目标(two),make在makefile中找到指定的目标并执行后退出。调用:D:AVRGCCTESTmakethreeonetwothreeonetwo命令行指定了三个目标make一一寻找并执行。在makefile中非默认的目标称为可替换的目标只有默认的目标与它们存在直接或间接的依赖关系时它们才有可能被调用。二.依赖关系makefile文件按如下格式指定依赖关系:目标目标…::依赖依赖…命令如下例#当前目录D:AVRGCCTESTAVR单片机与GCC编程5one:TwoechooneTwo:echotwo#Endmakefile执行结果是:d:avrgcctest>maketwooneMake首先找到第一个目标one之后发现目标one依赖目标Two就先执行Two后才执行one中的命令。三.Makefile内容makefile内容可分为如下五种类型①规则定义语法:目标:依赖命令其中目标为一个文件名或以空格分开的多个文件名可含通配符。例如:o:cavrgccc$<o$以上规则定义了任意一个以o结尾的文件依赖于相同前缀且以c结尾的文件。并执行下边的命令获得。规则中目标和依赖分别为o和c在目标通配符“”代表任意的字符串而在依赖中代表与目标中代表的对应字符串。②隐含规则隐含规则是make预先定义的规则用选项–r可取消所有的隐含规则。例如对于C程序o可以自动的从c通过命令$(CC)c$(CPPFLAGS)$(CFLAGS)'生成。③变量变量是在makefile中描述一字符串的的名称。变量可用在目标、依赖、命令和makefile其它部分中。变量名由除‘:’、‘#’、‘=’之外的字符组成对大小写敏感。变量的定义并赋值格式:变量名=变量代表字符串变量的引用格式:$(变量名)AVR单片机与GCC编程6例如:CC=avrgcco:c$(CC)c$<o$④命令命令部分是由make传递到系统的字符格式的命令行的组合在目标被创建时它们按顺序一行一行传递到系统并执行。字符‘’开始的命令在系统的输出中不显示本次的指令行。⑤注释字符‘#’开头的行为注释行如果注释需要换行需在行尾加‘’除包含其它MAKEFIEL外在行的任意处可插入注释。四自动变量在makefile中有一组预定义的变量当每一规则被执行时根据目标和依赖重新计算其值叫作自动变量。下面列出了常用的几个自动变量$:在规则中代表目标名如果规则含有多个目标名它将列举所有目标。$:仅在目标是存档文件的成员时起作用代表目标。如目标fooa(baro)中$代表fooa$代表baro$<:在规则中代表第一个依赖文件名$:代表在规则中所有以空格隔开的依赖文件名如果依赖是存档文件的成员则只有成员名被列出。$^:代表在规则中所有以空格隔开的依赖文件名如果依赖是存档文件的成员则只有成员名被列出。WINAVR提供一种简单makefile生成工具叫mfile如图利用它我们可方便的生成合适的makefile。Mainfilename…菜单指定主程序文件它将决定主源程序文件名及输出文件名。Outputformat菜单项用于选择最终生成的可指行代码格式根据编程器支持格式选择即可。Optimizationleave指定C代码的优化级s代表按最小代码量编译。CCsourcefile(s)和Assemblersourcefiles(s)用于在项目中添加其它C、C、和汇编程序文件。AVR单片机与GCC编程7图mfile生成makefile通常我们选择了以上几项便可编译了。AVR单片机与GCC编程8开发环境的配置一.软件环境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变量后列出来才可编译哦☺到此我们的超级无敌AVR编程环境打造完成如图。AVR单片机与GCC编程9图配置后的UltraEdit外观二.硬件环境SIProgPonyProg实现最廉价的下载实验器AVR系列单项机提供对程序存储器(FLASH)和数据存储器(EEPROM)的串行编程功能(ISP)使它的程序烧写变得方便。AVR系列器件内部FLASH存储器的编程次数通常可达到次以上所以使用多次烧写的方式调试程序时不必担心器件的损坏。ISP功能占用三个IO端口(MOSI、MISO、SCK)与外部编程逻辑通信编程逻辑按指定时序将程序数据串行方式发送到器件器件内的ISP功能模块负责将数据写入到FLASH或EEPROM。在实际应用中通常利用PC机的并行口或串行口加一个下载适配器(下载线)实现一个编程硬件AVR的下载线有很多种这里向大家推荐SIProgSIProg具有制作方便(只需几个分立元件)、接线少(通过PC针串行口编程),支持软件成熟(PonyProg)等特点。siprog的完整电路可到http:wwwLancOScom下载。图为简化后的电路原理图。PonyPorg是个串行器件编程软件支持AVR在内的多种器件的串行编程。该软件可到http:wwwLanOScom下载。AVR单片机与GCC编程10图SIProg电路原理图有了一台安装有PonyPorg的PC机和SIProg就可以将程序写入到实际器件来验证了想一想此方案的成本和一个AVR芯片能烧写的次数是不是觉得很值☺读到这里您对AVR单片机的开发和WINAVR编程应该有了一个基本的认识,也应当做好了开发或学习前软硬件的准备工作。从下一章开始我将进一步解析AVR的GCC程序设计。AVR单片机与GCC编程11第二章存储器操作AVR单片机存储器组织结构AVR系列单片机内部有三种类型的被独立编址的存储器它们分别为:Flash程序存储器、内部SRAM数据存储器和EEPROM数据存储器。Flash存储器为K~K字节支持并行编程和串行下载,下载寿命通常可达,次。由于AVR指令都为位或位程序计数器对它按字进行寻址因此FLASH存储器按字组织的但在程序中访问FLASH存储区时专用指令LPM可分别读取指定地址的高低字节。寄存器堆(R~R)、IO寄存器和SRAM被统一编址。所以对寄存器和IO口的操作使用与访问内部SRAM同样的指令。其组织结构如图所示。图AVRSRAM组织个通用寄存器被编址到最前,IO寄存器占用接下来的个地址。从X开始为内部SRAM。外部SRAM被编址到内部SRAM后。AVR单片机与GCC编程12AVR单片机的内部有~K的EEPROM数据存储器它们被独立编址按字节组织。擦写寿命可达次。IO寄存器操作IO专用寄存器(SFR)被编址到与内部SRAM同一个地址空间为此对它的操作和SRAM变量操作类似。SFR定义文件的包含:#include<avrioh>ioh文件在编译器包含路径下的avr目录下由于AVR各器件间存在同名寄存器地址有不同的问题ioh文件不直接定义SFR寄存器宏它根据在命令行给出的–mmcu选项再包含合适的ioxxxxh文件。在器件对应的ioxxxxh文件中定义了器件SFR的预处理宏在程序中直接对它赋值或引用的方式读写SFR如:PORTB=XFFVal=PINB从ioh和其总包含的头文件sfrdefsh可以追溯宏PORTB的原型在ioh中定义:#definePORTBSFRIO(x)在sfrdefsh中定义:#defineSFRIO(ioaddr)MMIOBYTE((ioaddr)x)#defineMMIOBYTE(memaddr)(*(volatileuintt*)(memaddr))这样PORTB=XFF就等同于*(volatileunsignedchar*)(x)=xffx在器件ATS中PORTB的地址对SFR的定义宏进一步说明了SFR与SRAM操作的相同点。关键字volatile确保本条指令不会因C编译器的优化而被省略。SRAM内变量的使用AVR单片机与GCC编程13一个没有其它属性修饰的C变量定义将被指定到内部SRAMavrlibc提供一个整数类型定义文件inttypeh其中定义了常用的整数类型如下表:定义值长度(字节)值范围intt~uintt~intt~uintt~intt~uintt~intt*^~*^uintt~*^根据习惯在程序中可使用以上的整数定义。定义、初始化和引用如下示例:uinttval=定义了一个SRAM变量并初始化成val=改变变量值constuinttval=定义SRAM区常量registeruinttval=定义寄存器变量在程序中访问FLASH程序存储器avrlibc支持头文件:pgmspaceh#include<avrpgmspaceh>在程序存储器内的数据定义使用关键字attribute((progmem))。在pgmspaceh中它被定义成符号PROGMEM。.FLASH区整数常量应用定义格式:数据类型常量名PROGMEM=值如:charvalPROGMEM=intvalPROGMEM=longvalPROGMEM=对于不同长度的整数类型avrlibc提供对应的读取函数:pgmreadbyte(progvoid*addr)AVR单片机与GCC编程14pgmreadword(prgvoid*addr)pgmreaddword(prgvoid*addr)另外在pgmspaceh中定义的位整数类型progcharproguchar分别指定在FLASH内的位有符号整数和位无符号整数。应用方式如下:charramvalram内的变量constprogcharflashval=flash内常量ramval=pgmreadbyte(flashval)读flash常量值到RAM变量对于应用程序FLASH常量是不可改变的因此定义时加关键字const是个好的习惯。FLASH区数组应用:定义:constprogucharflasharray={,,,,,,,,,}定义另外一种形式constunsignedcharflasharrayRROGMEM={,,,,,,,,,}读取示例:unsigendcharI,ramvalfor(I=I<I)循环读取每一字节{ramval=pgmreadbyte(flasharrayI)……处理}.FLASH区字符串常量的应用全局定义形式:constcharflashstrPROGMEM=“Hello,world!”函数内定义形式:constchar*flashstr=PSTR(“Hello,world!”)以下为一个FLASH字符串应用示例#include<avrioh>#include<avrpgmspaceh>#include<stdioh>constcharflashstr=“全局定义字符串”intmain(void)AVR单片机与GCC编程15{intIchar*flashstr=PSTR(“函数内定义字符串”)while(){scanf(“d”,I)printfP(flashstr)printf(“n”)printfP(flashstr)printf(“n”)}}EEPROM数据存储器操作#include<avreepromh>头文件声明了avrlibc提供的操作EEPROM存储器的API函数。这些函数有:eepromisready()EEPROM忙检测(返回EEWE位)eeprombusywait()查询等待EEPROM准备就绪uintteepromreadbyte(constuintt*addr)从指定地址读一字节uintteepromreadword(constuintt*addr)从指定地址一字voideepromreadblock(void*buf,constvoid*addr,sizetn)读块voideepromwritebyte(uintt*addr,uinttval)写一字节至指定地址voideepromwriteword(uintt*addr,uinttval)写一字到指定地址voideepromwriteblock(constvoid*buf,void*addr,sizetn)写块在程序中对EEPROM操作有两种方式方式一:直接指定EERPOM地址示例:*此程序将xaa写入到EEPROM存储器地址处再从地址处读一字节赋给RAM变量val*#include<avrioh>#include<avreepromh>intmain(void){unsignedcharvalAVR单片机与GCC编程16eeprombusywait()等待EEPROM读写就绪eepromwritebyte(,xaa)将xaa写入到EEPORM地址处eeprombusywait()val=eepromreadbyte()从EEPROM地址处读取一字节赋给RAM变量valwhile()}方式二:先定义EEPROM区变量法示例:#include<avrioh>#include<avreepromh>unsignedcharvalattribute((section("eeprom")))EEPROM变量定义方式intmain(void){unsignedcharvaleeprombusywait()eepromwritebyte(val,xAA)*写val*eeprombusywait()val=eepromreadbyte(val)*读val*while()}在这种方式下变量在EEPROM存储器内的具体地址由编译器自动分配。相对方式一数据在EEPROM中的具体位置是不透明的。为EEPROM变量赋的初始值编译时被分配到eeprom段中,可用avrobjcopy工具从elf文件中提取并产生ihex或binary等格式的文件。AVR单片机与GCC编程17avrgcc段(section)与再定位(relocation)粗略的讲,一个段代表一无缝隙的数据块(地址范围),一个段里存储的数据都为同一性质,如“只读”数据。as(汇编器)在编译局部程序时总假设从地址开始,并生成目标文件。最后ld(链接器)在连接多个目标文件时为每一个段分配运行时(runtime)统一地址。这虽然是个简单的解释却足以说明我门为为什么用段ld将这些数据块正确移动到它们运行时的地址。此过程非常严格,数据的内部顺序与长度均不能发生变化这样的数据单元叫做段为段分配运行时地址叫再定位此任务根据目标文件内的参考地址将段数据调整到运行时地址。Avrgcc中汇编器生成的目标文件(objectfile)至少包含四个段分别为:text段、data段、bss段和eeprom段它们包括了程序存储器(FLASH)代码内部RAM数据和EEPROM存储器内的数据。这些段的大小决定了程序存储器(FLASH)、数据存储器(RAM)、EEPROM存储器的使用量关系如下:程序存储器(FLASH)使用量=textdata数据存储器(RAM)使用量=databssnoinitstackheapEEPROM存储器使用量=eeprom一.text段text段包含程序实际执行代码。另外此段还包含initN和finiN两种段下面详细讨论。段initN和段finiN是个程序块它不会象函数那样返回所以汇编或C程序不能调用。initN、finN和绝对段(absolutesection提供中断向量)构成avrlibc应用程序运行框架用户编写的应用程序在此框架中运行。initN段此类段包含从复位到main()函数开始执行之间的启动(startup)代码。此类段共定义个分别是init到init。执行顺序是从init到init。init:此段绑定到函数init()。用户可重载init()复位后立即跳到该函数。init:未用用户可定义init:初始化堆栈的代码分配到此段init:未用用户可定义init:初始化data段(从FLASH复制全局或静态变量初始值到data)清零bss段。像UNIX一样data段直接从可执行文件中装入。Avrgcc将data段的初始值存储到flashrom里text段后init代码则负责将这些数据复制SRAM内data段。AVR单片机与GCC编程18init:未用用户可定义init:C代码未用C程序的构造代码init:未用用户可定义init:未用用户可定义init:跳到main()avrlibc包含一个启动模块(startupmodule)用于应用程序执行前的环境设置链接时它被分配到init和init中,负责提供缺省中断程序和向量、初始化堆栈、初始化data段和清零bss段等任务最后startup跳转到main函数执行用户程序。finiN段此类段包含main()函数退出后执行的代码。此类段可有到个,执行次序是从fini到fini。fini此段绑定到函数exit()。用户可重载exit()main函数一旦退出exit就会被执行。fini:未用用户可定义fini:未用用户可定义fini:C代码未用C程序的析构代码fini:未用用户可定义fini:未用用户可定义fini:未用用户可定义fini:未用用户可定义fini:未用用户可定义fini:进入一个无限循环。用户代码插入到initN或finiN示例如下:voidmyinitportb(void)attribute((naked))AVR单片机与GCC编程19attribute((section("init")))voidmyinitportb(void){outb(PORTB,xff)outb(DDRB,xff)}由于属性section(“init”)的指定编译后函数myinitportb生成的代码自动插入到init段中在main函数前就得到执行。naked属性确保编译后该函数不生成返回指令使下一个初始化段得以顺序的执行。二.data段data段包含程序中被初始化的RAM区全局或静态变量。而对于FLASH存储器此段包含在程序中定义变量的初始化数据。类似如下的代码将生成data段数据。charerrstr=”Yourprogramhasdiedahorribledeath!”structpointpt={,}可以将data在SRAM内的开始地址指定给连接器这是通过给avrgcc命令行添加Wl,Tdata,addr选项来实现的其中addr必须是X加SRAM实际地址。例如要将data段从x开始则addr要给出X。三.bss段没有被初始化的RAM区全局或静态变量被分配到此段在应用程序被执行前的startup过程中这些变量被清零。另外bss段有一个子段noinit,若变量被指定到noinit段中则在startup过程中不会被清零。将变量指定到noinit段的方法如下:intfooattribute((section(“noinit”)))由于指定到了noinit段中所以不能赋初值如同以下代码在编译时产生错误:intfolattribute((section(“noinit”)))=xff四.eeprom段此段存储EEPROM变量。Staticunsignedchareepbufferattribute((section(“eeprom”)))={,,}在链接选项中可指定段的开始地址如下的选项将noinit段指定位到RAM存储器AVR单片机与GCC编程20X地址处。avrgccWl,sectionstart=noinit=x要注意的是在编译时Avrgcc将FLASH、RAM和EEPROM内的段在一个统一的地址空间内处理flash存储器被定位到地址开始处RAM存储器被定位到x开始处eeprom存储器被定位到X处。所以在指定段开始地址时若是RAM内的段或eeprom内的段时要在实际存储器地址前分别加上x和X。除上述四个段外自定义段因需要而可被定义。由于编译器不知道这类段的开始地址又称它们为未定义段。必需在链接选项中指定自定义段的开始地址。如下例:voidMySection(void)attribute((section("mysection")))voidMySection(void){printf("helloavr!")}链接选项:avrgccWl,sectionstart=mysection=xc这样函数MySection被定位到了FLASH存储器XC处。AVR单片机与GCC编程21第三章功能模块编程示例中断服务程序avrgcc为中断提供缺省的入口例程这些例程的名字已固定用户可通过重载这些例程来处理中断。如果中断没有被用户重载说明正常情况下不会产生该中断缺省的中断例程将程序引导到地址处(既复位)。Avrgcc为重载中断例程提供两个宏来解决细节的问题它们是SIGNAL(signame)和INTERRUPT(signame)。参数signame为中断名称它的定义在ioh中包含。表列出了ATMega的signame定义其它器件的signame定义可查阅相应的ioxxxxh文件。表ATMega中断名称定义signame中断类型SIGINTERRUPT外部中断INTSIGINTERRUPT外部中断INTSIGOUTPUTCOMPARE定时器计数器比较匹配中断SIGOVERFLOW定时器计数器溢出中断SIGINPUTCAPTURE定时器计数器输入捕获中断SIGOUTPUTCOMPAREA定时器计数器比较匹配ASIGOUTPUTCOMPAREB定时器计数器比较匹配BSIGOVERFLOW定时器计数器溢出中断SIGOVERFLOW定时器计数器溢出中断SIGSPISPI操作完成中断SIGUARTRECVUSART接收完成SIGUARTDATAUSART寄存器空SIGUARTTRANSUSART发送完成SIGADCADC转换完成SIGEEPROMREADYEPROM准备就绪SIGCOMPARATOR模拟比较器中断SIGWIRESERIALTWI中断SIGSPMREADY写程序存储器准备好以下是个外部中断的重载示例:#include<avrioh>#include<avrinterrupth>#include<avrsignalh>SIGNAL(SIGINTERRUPT)AVR单片机与GCC编程22{中断处理程序}宏INTERRUPT的用法与SIGNAL类似区别在于SIGNAL执行时全局中断触发位被清除、其他中断被禁止INTERRUPT执行时全局中断触发位被置位、其他中断可嵌套执行。另外avrlibc提供两个API函数用于置位和清零全局中断触发位它们分别是:voidsei(void)和voidcli(void)。定时器计数器应用下面以定时器计数器为例说明定时器计数器的两种操作模式定时器计数器相关寄存器:TCCR:定时器计数器控制寄存器计数使能时钟源选择和CPU时钟预分频设置TCNT:定时器计数器计数值寄存器包含计数值(~)TIFR:定时器中断标志寄存器(TimerInterruptFlagRegister)TOV位为定时器寄存器溢出标志TIMSK:定时器中断屏蔽寄存器(TimerInterruptMaskRegister)TOIE位为定时器寄存器中断使能禁止控制位查询模式举例:*MCU:ATS时钟:MHz*#include<avrioh>#defineucharunsignedchar#defineSETLEDPORTD=XEFPD接发光管#defineCLRLEDPORTD|=Xintmain(void){uchari,j=DDRD=XPORTD=XAVR单片机与GCC编程23TCNT=TC开始值TCCR=预分频ck,计数允许while(){查询定时器方式等待一秒≈Hzfor(i=i<i){loopuntilbitisset(TIFR,TOV)sbi(TIFR,TOV)写入逻辑清零TOV位}if(j)反向LED控制脚SETLED,j=elseCLRLED,j=}}中断模式举例:*MCU:ATS时钟:MHz*#include<avrioh>#include<avrinterrupth>#include<avrsignalh>#defineucharunsignedchar#defineSETLEDPORTD=XEFPD接发光管#defineCLRLEDPORTD|=XstaticuchargbCount=中断计数器staticuchargbDirection=TC中断例程SIGNAL(SIGOVERFLOW){产生中断周期T=*MHzif(gbCount>)中断次约一秒{if(gbDirection)反向LED控制脚AVR单片机与GCC编程24SETLED,gbDirection=elseCLRLED,gbDirection=gbCount=}}intmain(void){DDRD=XPORTD=XTCNT=TC开始值TCCR=预分频ck,计数允许TIMSK=BV(TOIE)sei()while()}看门狗应用avrlibc提供三个API支持对器件内部Watchdog的操作它们分别是:wdtreset()Watchdog复位wdtenable(timeout)Watchdog使能wdtdisable()Watchdog禁止调用上述函数前要包含头文件wdthwdth中还定义Watchdog定时器超时符号常量它们用于为wdtenable函数提供timeout值。符号常量分别如下:符号常量值含意WDTOMSWatchdog定时器毫秒超时WDTOMSWatchdog定时器毫秒超时WDTOMSWatchdog定时器毫秒超时WDTOMSWatchdog定时器毫秒超时WDTOMSWatchdog定时器毫秒超时WDTOMSWatchdog定时器毫秒超时WDTOSWatchdog定时器秒超时WDTOSWatchdog定时器秒超时Watchdog测试程序:AVR单片机与GCC编程25*MCU:ATS

用户评价(0)

关闭

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

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

提示

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

文档小程序码

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

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/21

winAVR中文教程

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利