IAR_for_AVR

所需积分/C币:35 2013-03-26 22:26:12 211KB PDF
收藏 收藏
举报

IAR_for_AVR
ar for avr学习笔记(3)--位操作 3.1.在c语言里对位的操作如一般如下 PORTB|-(1<<2);/置 PORTB的第2位-1 PORTB&=(1<<2);//置 PORTB的第2位=0 PORTB|=(1<<2);//取反 PORTB的第2位 While( PORTE&(1<<2);//判断1 While(!( PORTB&(1<<2));//判断为0 3.2.IAR编译器对位的支持更强大,除了上面的方法外还有以下更简单的操作 方法: PorTB Bit2=1;//置 PORTB的第2位=1 PORTB Bit2-0;//置 PORTB的第2位=0 portb Bit2= POrTB Bit2;//取反 PORTB的第2位 While( PORTB Bit2);或者 while( PORTB Bit2=1);//判断1 while( porTB Bit2--0);//判断0 PORTO Bit4= PORTB Bit2;/把 PORTB的第2位传送到PORC的第4位 3.3.位变量定义 由于iar使用了扩展语言,它对位域的支持变为最小为char类型,我们可以很 方便地用米定义位变量 采用结构体来定义位变量: struc t unsigned char bit0: 1; unsigned char bit1: 1 unsigned char bit2: 1 unsigned char bit3: 1 unsigned char bit4: 1 unsigned char bit5: 1 unsigned char bit6: 1 unsigned char bit7: 1 }t; 然后就可以用以下位变量了 t, bit0=1 t bito=t bito 但是采用以上结构体做出来的位变量只可以访问讠的位,不能够直接访问变量t, 和标准的ⅠAR位操作也不一样。采用联合体来定义效果更佳。 t includeiom8. h> unl on unsigned char t struct unsigned char t bito: 1 t bitl: 1 t bit2: 1 L bit3: 1 t bit4: 1 tbit5:⊥ t bit6: 1 t bit7: 1 void main(void tbit0=1;//访问变量t的位 t bito=t bito PORTB-t;//直接访问变量t 位变暈也可以自接定义在工作寄存器里。 3.4bool数据类型在C++语言里是默认支持的。 如果你在C代码的头文件里包含 stool. h,bool数据类型也可以使用在C 语言里。也可以使用布尔值 false和true。不过是占用8位1个字节。 t inc ludesiom8. h> t include<stdbool. h> bool y-0;//定义位变量 void main(void) y=!y;//取反位变量 PORTB Bit3=y;//传递位变量 iar for aVR学习笔记(4)- Flash操作 FLASH常用类型的具体操作方法 4.1. FLASH区域数据存储。 用关键字 flash控制来存放, flash关键字写在数据类型前后效果一样 flash unsigned char a;//定义一个变量存放在 flash空间 unsigned char flash a;/效果同上 flash unsigned char p[];/定义一个数组存放在 flash空间 对亍 flash空间的变量的读操作同SRAM数据空间的操作方法样,编译器会自 动用 LPM,ELPM指令来操作。 例 t includeiom8. h> flash unsigned char p] flash unsi gned char a nain(Vo1 PORTB=p[1];//读 flash数组变量的操作 PORTB=a;//读 flash变量的操作 由于在正常的程序中,f1ash空间是只读的,所以没有赋值的变量是没有意义的 定义常数在 flash空问,只要给变量赋与初值就可以了。由于常数在 flash空 闾的地址是随机分配的,读取变呈才可以读取到常数值 10 IAR-AVR-C编译器简要指南 flash uni gned char a-9;//定义一个常数存放在 EEPROM空间 flash unsigned char p[=1, 2,3, 4,5,6,7,8 //定义一个组常数放在 flash空间 例 t includeiom8.. h> flash unsigned char p[]=[1, 2, 3, 1, 5, 6, 7, 81 flash unsi gned char a=g void main(void) PORTB=a;//读取 flash空间值9 PORTO=p[O];//读取 flash空间值 4.1.2 flash空间绝对地址定位 lash unsigned char a@0x8;//定义变量存放在 flash空间0X08单元f1 ash unsigned char p[]@0x22//定义数组存放在fash空间,开始地址为0X 22单元 flash unsigned char a@0x08=9;//定义常数存放在 flash空间0X0单元 flash unsigned char p[ 0x22=1,2,3, 4,5,6,7,8 /定义一个组常数存放在 EEPROM空间开始地址为0X22单元 由于常数在fash空间的地址是已经分配的,读取 flash空间值可以用变量和 地址 4.2.与 flash有关的指针操作。 flash关键字控制指针的存放和类型 4.2.1指向 flash空间的指针 flash指针(控制类型属性) unsigned char flash*p;//定义指向 flash空间地址的指针,8位。 unsigned int flash*p;/定义个指向 flash空间地址的指针,16位。 unsigned int farflash*p;//定义指向 flash空间地址的指针,24位 unsigned int hugeflash*p;/定义指向 flash空间地址的指针,24位。 unsigned char flash*p;/定义一个指向 flash室间地址的指针,指针本 身存放在SAM中。P的值代表 flash空间的某地址。*表示 flash空间该地 址单元存放的内容。例:假定p10,表示 flash空间地址10单元,而 flash m 空间10单元的内容就用*米读取。 例 t inc ludeiom8. h> char flash t( 0x10 char flash *p void main(void) PORTB=*p;//读取 flash空间10单元的值 PORTB=*(p43);/读取 flash空间0x13单元的值 4.2.2.存储于 flash空间的指针数据指针 就象存储与 flash空间的数据一样控制存储属性 flash unsi gned char*p;//定义指向SARM空间地址的指针,指针本身存 放在 flash中 4.3.控制数据和指针存放的 flash定义必须是全局变量,控制类型属性(好 像只有指针)可以是局部变量。 t include<iom8. h> flash unsigned char p;/控制存放 void main(void) unsigned char flash*t;//控制属性 PORTB=p PORTB=冰1 4.4.root关键字保证没有使用的函数或者变量也能够包含在目标代码中 定义存放在『lash空间的数据在程序编译时会自动生成代码嵌入到lash代 码中,对于程序没有使用也要求编译的数据(比如可以在代码中嵌入你的版本号, 时间等)必须加关键字root限制。 例 #<iom. h> root flash unsigned char p 0x10=0x56 oid main(void) 程序没有使用P变量,编译也会生成该代码。 020000020000FC 1000000016C018951895189518951895189518955F 10001000569518951895189518951895189518953A 10002000189518951895089500008895 FECFOFE94A 100030000DBFOOEOOEBFCOESDOEO03DOF4DFF4DF76 06004000F3CF0lE008957A 0400000300000000F9 00000001FF 1.5. flash操作宏数:在 comp a90. h intrinsics.h头文件里有详细说明。 flash空间具正常情况下有只读性能,对于读fash数据编译器会自动编译对 应的LPM,ELPM指令,但对丁 flash空间的自编程写命令SPM就没有对应的C指 令了,这里不讲解详细的自编程方法,只是讲解一下对f1ash的读写函数。 直接在程序屮读取 flash空间地址数据:要包含 intrinsics.h头文件 load program memory(const unsigned char flash *) //61K] /从指定 flash空间地址读数据。该函数在 intrinsics.h头文件里有详细说明 在 comp a90.h文件有它的简化书写LPM(ADDR)。注意汇编指令 LPm Rd,Z中的 是一个指针。所以用( const unsigned char flash*)来强制转换为指向fl ash空问地址指针。故该条宏函数的正确写法应该如下: load program memory((const uns igned char flash *)ADDR) 例 t includeiom8. h> include <intrinsics. h void main(void) i PORTB- load prograM Memory((const unsigned char flash *)0x12) 该条函数书写不方便,在 comp a90.h文件有简化: # define lpm(ADDR)1 oad program memory(ADDR)稍微方使一点。改为 #define LPM (addr) load program memory ((const unsigned char Clash水)ADDR就更方便了,直接使用数据就可以了。 例: t includesiom8. h> t inc lude<comp a90.h> t includesintrinsics void main(void) PORTB=LM(0x12);//从指定 flash空间地址单元0x12屮读数据 extended load program memory(const unsigned char farflash * +) //128K空间ELPM(ADR);//128K空间 参照上面的理解修改可以书写更简单。 4.6.自编程函数: SPM GET LOCKBITS(;//读取缩定位 SPM GET FUSEBITSO;//读取熔丝位 SPM ERASE(Addr);//16位页擦除 SPM FILLTEMP(Adr,Word);/16位页缓冲 SPM PAGEWRITE(Addr;)//16位页写入 SPM2 1 ERASE(Adr);//24位页擦除 SPM24 FILLTEMP(Addr,Data);//24位页缓冲 SPM24 PAGEWRITE(Addr)//24位页写入 iar for avr学习笔记(5)-SRAM操作 SARM数据类型的具体操作方法 SARM空间是AVR单片机最重要的部分,所有的操作必须依赖该部分来完成。 变量在SARM空间的存储模式有tiny, small large三种,也就是对应于tiny, near fαr三中存储属性。一旦选择为哪种存储模式,对应的数据默认属性 也就确定了,但可以采用tiny, near far关键字来更改。 对于程序屮的局部变量,编译器会自动处理的,我们也不可能加什么储存属性 但IAR提供了强大的外部变量定义 5.1.定义变量在工作寄存器 IAR编译器内部使用了部分工作寄存器,留给用户的只有R4R15供12个寄存器 供用户使用,要使用工作寄存器必须在工程选项里打开锁定选项 例 定义两个变量使用工作寄存器Rl4,R15。 #i ncludesiom8 h regvar no init char g@ 15 regvar no init char P@ 14 void main(void) g++ P 在工程选项里c/c++ complier>code里打开要使川的寄存器R14-R15。 Options for node Hh ategory Fac c tory settings Ⅳy General Options DC I List P-eproce Utilizat Bu|d点c v PLace strinz literals and constants in initialized F Link 厂点.买只点点点,,黑点用,mm D Force generation of all global and static E200 jTAGICE Register utilization JT|CEmk‖ Number of registers to lock for 2[R14.R1 SImulator d Use ICCA90 1 x calling convention Third-Party River Cancel 编译结果就如下,看看是不是直接使川了寄存器做为数据应川 / 4 void main(void) maln CFI Block cfiblocko using cficommonO CFI Function main //5{g++; REQUIRE Register R14 is global regvar REQUIRE ?Register Rls is global regvar INC RI5 /6P++;} INC R11 RET 注意:定义在寄存器里变量不能带冇初始值。最好不要使用超过9个寄存器变量, 不然可能引起潜在的危险,因为建立库的时候没有锁定任何寄存器。 5.2.定义变量的绝对地址没有特性的变量是随机分配的,要给变量分配地址 必须加以特性修饰注意在定义地址的时候干丿不要和片内寄存器地址重合了。 5.2.1定义没有存储特性的绝对地址变量必须加 no ini t或者 const对象特性 no init char t@0x65;//定义在I/0地址以外 const char t@0x65;//定义只读变量的地址 例 t include<ioin8 h1

...展开详情
试读 15P IAR_for_AVR
立即下载 低至0.43元/次 身份认证VIP会员低至7折
抢沙发
一个资源只可评论一次,评论内容不能少于5个字
上传资源赚积分or赚钱
最新推荐
IAR_for_AVR 35积分/C币 立即下载
1/15
IAR_for_AVR第1页
IAR_for_AVR第2页
IAR_for_AVR第3页

试读结束, 可继续读2页

35积分/C币 立即下载 >