AVR1000XMEGA的C语言代码编写入门

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

8-bit8位Microcontrollers微处理器ApplicationNote应用注释AVR1000:GettingStartedWritingC-codeforXMEGAAVR1000:XMEGA的C语言代码编写入门Features特点:•Namingconventions命名约定-Registernames寄存器名-Bitnames位名•C-codenamesC-代码名-Bitandgroupmasks位与组掩码-Groupconfigurationmasks组配置掩码•Methodsforaccessingregisters访问寄存器的方法•Methodsforwritingreusablemodulefunctions可多次使用模块功能的写入方法1Introduction引言Shortdevelopmenttimesandhighqualityrequirementsonelectronicproductshasmadehigh-levelprogramminglanguagesarequirement.ThemainreasonisthatHighlevellanguagesmakeiteasiertomaintainandreusecodeduetobetterportabilityandreadability.由于电子产品的开发时间短,质量要求高,因此需要高层次的编程语言。最主要的原因是,高级语言具有更好的可移植性和可读性,使其更易于维护和重复使用代码。Thechoiceofprogramminglanguagealonedoesnotensurehighreadabilityandreusability;goodcodingstyledoes.ThereforetheXMEGA™peripherals,headerfilesanddriversaredesignedwiththisinmind.编程语言的选择本身并非是能确保具有较高的可读性和可重复使用性的唯一条件,还必须有良好的编码风格。因此XMEGA™的外围设备,头文件和驱动程序的设计都是基于这方面考虑的。Themostwidelyusedhigh-levellanguageforAVR®microcontrollersisC,andthisapplicationnotethereforefocusesonCprogramming.TosupportmostoftheAVRCcompilersthatareavailable,thecodeexamplesareasfaraspossiblewritteninANSIC.AfewexamplesarespecifictoIAREmbeddedWorkbench®,buttheideasandmethodscanbeusedforothercompilerswithminorchanges.IARspecificexamplesareclearlymarked.AVR®微控制器使用的最广泛的高级语言就是C语言,因此本应用注释的重点是C语言编程。为了支持大多数可用的AVRC语言编译器,我们尽可能把代码示例编写在ANSIC语言的规范中。有些例子是IAREmbeddedWorkbench®专用的,但其思路和方法可用于与其他变化不大的编译器。IAR专用的示例都有清晰的标示。2XMEGAModulesXMEGA模块AnAVRXMEGAiscomposedofseveralbuildingblocks:AnAVRCPUcore,SRAM,Flash,EEPROMandanumberofperipheralmodules.Thesebuildingblocksarecalled“moduletypes”.AnXMEGAcanhaveoneormoreinstancesofagivenmoduletype.Allinstancesofamoduletypehavethesamefeaturesandfunctions.一个AVRXMEGA由数个结构块组成:一个AVRCPU芯片,一个SRAM,一个闪存,一个EEPROM以及若干外设模块。这些结构块被称为“模块类型”。XMEGA可以有一个或多个给定模块类型的实例。一个模块类型的所有实例都具有相同的特性和功能。Somemoduletypescanbeasubsetofothermoduletypes.Theseinheritasubsetofthefeatures(andregisters)ofthesupertype,allinheritedfeaturesarefullycompatible.Thisappliestoe.g.timersandIOports.Thesubsetofamoduletypecanforatimermeanthatithasfewercompareandcapturechannelsthanafulltimermodule.Similarly,anIOportmayhavelessthaneightpins.有些模块类型可以是其他模块类型的子集。这些(模块类型)继承了特大模块类型的某个子集的特征(和寄存器),其继承的所有特征都完全兼容。这适用于比如计时器和IO端口。用于计时器的模块类型的子集可能意味着它所能得到的比较和捕获通道比完整的计时器模块的要少。同样,一个IO端口的管脚可能不足八个。Amoduletypecanbea“USART”,whilethemoduleinstanceise.g.“USARTC0”,wherethe“C0”suffixindicatestheinstanceis“USARTnumber0onportC”.Forsimplicity,amoduleinstancewillbereferredtoasamodulethroughoutthisdocument,unlessthereisaneedtodifferentiate.一个模块类型可以是“USART”的,如果这个模块实例比如是“USARTC0”,其中的“C0”后缀表示这个实例是“端口C上的USART编号为0”。为了简单起见,一个模块实例将被称为这整个文件中的一个模块,除非是有必要另作区分。Eachmodulehasanumberofregistersthatcontaincontrolorstatusbits.Allmodulesofagiventypecontainthesameset(orsubset)ofregisters,andalltheseregisterscontainthesameset(orsubset)ofcontrolandstatusbits.每个模块都有若干寄存器,这些寄存器都包含控制位或状态位。一个给定类型的所有模块都包含相同的寄存器集合(或子集),并且所有这些寄存器包含相同的控制位和状态位的集合(或子集)。Figure2-1.Moduletypes,instances,registersandbits.图2-1.模块类型,实例,寄存器和位EachmodulehasafixedbaseaddressintheIOmemorymapandallregisterscontainedinthemodulehavefixedoffsetaddressesrelativetothemodulebaseaddress.ThiswayeachregisterwillnotonlyhaveanabsoluteaddressintheIOmemoryspace,butalsoarelativeaddressdefinedbyitsoffset.Theregisteroffsetaddressesareequalforallinstancesofamoduletype,simplifyingthetaskofwritingdriversthatcanbeusedforallmodulesofaspecifictype.在IO内存图里,每个模块都有一个固定的基础地址,并且该模块中的所有寄存器都有固定的偏移地址(这是相对于模块的基地址而言)。如此这样,每个寄存器不仅会在IO内存空间有一个绝对地址,而且还有一个根据其偏移量定义的相对地址。一个模块类型的所有实例中的寄存器偏移地址都是平等的,这样就简化了编写能够适用于某个特定类型的所有模块的驱动程序的任务。2.1RegisterNamingConvention2.1.寄存器命名约定Registerareroughlyspeakingdividedintocontrol,statusanddataregistersandthenamingofregistersreflectthis.Ageneral-purposecontrolregisterofthemoduleisnamedCTRL.Ifmultiplegeneral-purposecontrolregistersexistsinamoduletheyhaveasuffixcharacter.InthiscasethecontrolregisterswouldbenamedCTRLA,CTRLB,CTRLCandsoon.ThisalsoappliestoSTATUSregisters.大致说来,寄存器有控制寄存器、状态寄存器和数据寄存器之分,这从寄存器的命名就可看出。模块的一个通用的控制寄存器被命名为CTRL。如果在一个模块中存在多个通用控制寄存器,他们都有一个后缀字符。在这种情况下,控制寄存器将被命名为CTRLA、CTRLB、CTRLC等。这方法也适用于状态寄存器。Forregistersthathaveaspecificfunctionthenamereflectsthisfunctionality.Forexample,acontrolregisterthatcontrolstheinterruptlevelofamoduleisnamedINTCTRL.对于具有特定功能的的寄存器,它们的命名会反映其功能性。例如,一个控制寄存器,控制一个模块的中断级别,它就被命名为INTCTRL。SincetheAVRdatabuswidthis8bit,largerregistersareimplementedusingseveral8-bitregisters.Fora16-bitregister,thehighandlowbytesareaccessedbyappending“H”and“L”respectivelytotheregistername.Forexample,the16-bitTimer/CountercountregisterisnamedCNT.ThetwobytesarenamedCNTLandCNTH.由于AVR的数据总线宽度为8位,较大的寄存器得使用几个8位寄存器才能生效。对于一个16位寄存器,要访问其高8位元组和低8位元组,得在这个寄存器的命名上分别附加“H”和“L”。例如,16位计时器/计数器的计数寄存器被命名为CNT,其两个8位元组就被命名为CNTL和CNTH。Foraregisterlargerthan16bit,thebytesarenumberedfromtheleastsignificantbyte.Forexample,the32-bitADCcalibrationregisterisnamedCAL.ThefourbytesarenamedCAL0,CAL1,CAL2andCAL3(fromleasttomostsignificantbyte).对于大于16位的寄存器,其8位元组的编号是从最低有效的8位元组开始。例如,32位的ADC校准寄存器被命名为CAL,其四个8位元组(从最低到最高有效8位元组)就被分别命名为CAL0,CAL1,CAL2和CAL3。MostCcompilersofferautomati

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功