AVR单片机IAR开发环境使用注意事项

demi的头像

头文件含义

avr_macros.h里面包含了读写16位寄存器的简化书写,和几个位操作函数

comp_a90.h对大量的内在函数做了简要书写

ina90.h包含"inavr.h""comp_A90.h"文件

intrinsics.h内在函数提供最简单的操作处理器底层特征。休眠,看门狗,FLASH函数。

iomacro.HI/O寄存器定义文件样本。

iom8.h包含I/O等寄存器定义

位操作

在c语言里对位的操作如一般如下:

PORTB|=(1<<2); //置PORTB的第2位=1

PORTB&=~(1<<2); //置PORTB的第2位=0

PORTB^|=(1<<2); //取反PORTB的第2位

While(PORTB&(1<<2)); //判断1

While(!(PORTB&(1<<2))); //判断为0

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

PORTC_Bit4=PORTB_Bit2;//把PORTB的第2位传送到PORTC的第4位

位变量定义:

由于iar使用了扩展语言,它对位域的支持变为最小为char类型,我们可以很方便地用来定义位变量。

采用结构体来定义位变量:

struct

{

unsignedcharbit0:1;

unsignedcharbit1:1;

unsignedcharbit2:1;

unsignedcharbit3:1;

unsignedcharbit4:1;

unsignedcharbit5:1;

unsignedcharbit6:1;

unsignedcharbit7:1;

}t;

然后就可以用以下位变量

t.bit0=1;

t.bit0=~t.bit0;

但是采用以上结构体做出来的位变量只可以访问t的位,不能够直接访问变量t,和标准的IAR位操作也不一样,可以采用联合体来定义。

#include<iom16.h>

union

{

unsignedchart;

struct

{unsignedchart_bit0:1,

t_bit1:1,

t_bit2:1,

t_bit3:1,

t_bit4:1,

t_bit5:1,

t_bit6:1,

t_bit7:1;

};

};

voidmain(void)

{

t_bit0=1;//访问变量t的位

t_bit0=~t_bit0;

PORTB=t;//直接访问变量t

}

延时函数

__delay_cycles(unsignedlong);

如果处理器频率为1M,延时100us,如下:

__delay_cycles(100);

延时任意时间

#define CPU_F 8000000

#define delay_us(x) __delay_cycles(CPU_F*x/1000000)

#define delay_ms(x) __delay_cycles(CPU_F*x/1000)

中断函数:

在IAR编译器里用关键字来__interrupt来定义一个中断函数,用#pragmavector来提供中断函数的入口地址

#pragmavector=0x12 //定时器0溢出中断入口地址

__interruptvoidtime0(void)

{

;

}

上面的入口地址写成#pragmavector=TIMER0_OVF_vect更直观,每种中断的入口地址在头文件里有描述。

中断指令

__disable_interrupt(); //也可以用_CLI();也可以SREG_Bit7=0;

__enable_interrupt(); //也可以用_SEI();也可以SREG_Bit7=1;

MCU控制指令

__no_operation(); //空操作指令

_NOP();

__sleep(); //休眠指令

_SLEEP();

__watchdog_reset(); //看门狗清零

_WDR();

来源:畅学电子