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提供了完全可以訪問底層的函數,建議不要頻繁使用彙編