6.1.中止函数:
在IAR编译器里用关键字来__interrupt来界说一个中止函数。用#pragma vector来供给中止函数的进口地址
#pragma vector=0x12//定时器0溢出中止进口地址
__interrupt void time0(void)
{
;
}
上面的进口地址写成#pragma vector=TIMER0_OVF_vect更直观,每种中止的进口地址在头文件里有描绘。函数称号time0可认为恣意称号。中止函数会主动维护局部变量,但不会维护全局变量。
6.2.内涵函数也能够称为本征函数
编译器自己编写的能够直接拜访处理器底层特征的函数。在intrinsics.h中有描绘完好类型在comp_a90.h里有进一步的简化书写方法
6.2.1延时函数,以周期为规范
__delay_cycles(unsigned long );
假如处理器频率为1M,延时100us,如下:
__delay_cycles(100 );
当然你也能够对该函数进行修正:
#define CPU_F 1000000
#define delay_us (unsigned long) __delay_cycles((unsigned long )*CPU_F)
#define delay_ms (unsigned long) __delay_cycles((unsigned long )*CPU_F/1000)
6.2.2中止指令
__disable_interrupt( );//刺进CLI指令, 也能够用_CLI();也能够SREG_Bit7=0;
__enable_interrupt( );// 刺进SEI指令,也能够用_SEI();也能够SREG_Bit7=1;
其实关于状态字的置位和清零只要BSET S 和BCLR S两条指令。像SEI不过是BSET 7;的另一个姓名罢了。AVR指令中还有许多相似的现象,如:ORI 和 SBR 指令彻底相同,声称130多条指令的AVR其实没有那么多指令的。
6.2.3从FLASH空间指定地址读取数据
__extended_load_program_memory(unsigned char __farflash *);
__load_program_memory(unsigned char __flash *);
该条指令以及正确的运用方法在4.5.flash 操作宏函数里具体解说,这儿不再重复
6.2.4乘法函数
__fracdtional_multiply_signed(signed char, signed char);
__fractional_multiply_signed_with_unsigned(signed char, unsigned char);
__fractional_multiply_unsigned(unsigned char, unsigned char);
//以上为定点小数乘法
__multiply_signed(signed char, signed char);//有符号数乘法
__multiply_signed_with_unsigned(signed char, unsigned char);
//有符号数和无符号数乘法
__multiply_unsigned(unsigned char, unsigned char);//无符号数乘法
6.2.4 半字节交流指令
__swap_nibbles(unsigned char);
6.2.5 MCU控制指令
__no_operation();//空操作指令
_NOP();
__sleep();//休眠指令
_SLEEP();
__watchdog_reset();//看门狗清零
_WDR();
IAR for AVR 学习笔记(7)–头文件意义
avr_macros.h里边包括了读写16位寄存器的简化书写,和几个位操作函数
comp_a90.h对很多的内涵函数做了扼要书写
ina90.h包括”inavr.h” “comp_A90.h”文件
intrinsics.h内涵函数供给最简略的操作处理器底层特征。休眠,看门狗,FLASH函数。
iomacro.H I/O寄存器界说文件样本。
iom8.h 包括I/O等寄存器界说
IAR for AVR 学习笔记(8)–汇编嵌入方法
嵌入汇编语言
在线汇编:运用asm或许__asm,引荐运用__asm。
#i nclude
void main()
{
asm(“NOP \n”
“CLH \n”
“OR R16,R17 \n”);
}
不过IAR供给了彻底能够拜访底层的函数,主张不要频频运用汇编