新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > IAR for AVR 學(xué)習(xí)筆記(6)--中斷及相關(guān)函數(shù)操作

        IAR for AVR 學(xué)習(xí)筆記(6)--中斷及相關(guān)函數(shù)操作

        作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
        6.1.中斷函數(shù):

        IAR編譯器里用關(guān)鍵字來__interrupt來定義一個(gè)中斷函數(shù)。用#pragma vector來提供中斷函數(shù)的入口地址
        #pragma vector=0x12//定時(shí)器0溢出中斷入口地址
        __interrupt void time0(void)
        {
        ;
        }
        上面的入口地址寫成#pragma vector=TIMER0_OVF_vect更直觀,每種中斷的入口地址在頭文件里有描述。函數(shù)名稱time0可以為任意名稱。中斷函數(shù)會(huì)自動(dòng)保護(hù)局部變量,但不會(huì)保護(hù)全局變量。

        本文引用地址:http://www.104case.com/article/201611/316461.htm

        6.2.內(nèi)在函數(shù)也可以稱為本征函數(shù)
        編譯器自己編寫的能夠直接訪問處理器底層特征的函數(shù)。在intrinsics.h中有描述完整類型在comp_a90.h里有進(jìn)一步的簡化書寫方式

        6.2.1延時(shí)函數(shù),以周期為標(biāo)準(zhǔn)
        __delay_cycles(unsigned long );
        如果處理器頻率為1M,延時(shí)100us,如下:
        __delay_cycles(100 );
        當(dāng)然你也可以對(duì)該函數(shù)進(jìn)行修改:
        #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;
        其實(shí)對(duì)于狀態(tài)字的置位和清零只有BSET S 和BCLR S兩條指令。像SEI不過是BSET 7;的另一個(gè)名字而已。AVR指令中還有很多類似的現(xiàn)象,如:ORI 和 SBR 指令完全一樣,號(hào)稱130多條指令的AVR其實(shí)沒有那么多指令的。

        6.2.3從FLASH空間指定地址讀取數(shù)據(jù)
        __extended_load_program_memory(unsigned char __farflash *);
        __load_program_memory(unsigned char __flash *);
        該條指令以及正確的使用方法在4.5.flash 操作宏函數(shù)里詳細(xì)講解,這里不再重復(fù)

        6.2.4乘法函數(shù)
        __fracdtional_multiply_signed(signed char, signed char);
        __fractional_multiply_signed_with_unsigned(signed char, unsigned char);
        __fractional_multiply_unsigned(unsigned char, unsigned char);
        //以上為定點(diǎn)小數(shù)乘法
        __multiply_signed(signed char, signed char);//有符號(hào)數(shù)乘法
        __multiply_signed_with_unsigned(signed char, unsigned char);
        //有符號(hào)數(shù)和無符號(hào)數(shù)乘法
        __multiply_unsigned(unsigned char, unsigned char);//無符號(hào)數(shù)乘法

        6.2.4 半字節(jié)交換指令
        __swap_nibbles(unsigned char);

        6.2.5 MCU控制指令
        __no_operation();//空操作指令
        _NOP();
        __sleep();//休眠指令
        _SLEEP();
        __watchdog_reset();//看門狗清零
        _WDR();

        IAR for AVR 學(xué)習(xí)筆記(7)--頭文件含義

        avr_macros.h里面包含了讀寫16位寄存器的簡化書寫,和幾個(gè)位操作函數(shù)


        comp_a90.h對(duì)大量的內(nèi)在函數(shù)做了簡要書寫


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


        intrinsics.h內(nèi)在函數(shù)提供最簡單的操作處理器底層特征。休眠,看門狗,F(xiàn)LASH函數(shù)。


        iomacro.H I/O寄存器定義文件樣本。


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

        IAR for AVR 學(xué)習(xí)筆記(8)--匯編嵌入方式

        嵌入?yún)R編語言
        在線匯編:使用asm或者_(dá)_asm,推薦使用__asm。
        #i nclude
        void main()
        {
        asm("NOP n"
        "CLH n"
        "OR R16,R17 n");
        }
        不過IAR提供了完全可以訪問底層的函數(shù),建議不要頻繁使用匯編



        關(guān)鍵詞: IARAVR中斷函數(shù)操

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 台前县| 柳林县| 永顺县| 河间市| 雷州市| 神农架林区| 周宁县| 吉林省| 潮州市| 大厂| 澎湖县| 淮南市| 英德市| 浦县| 罗山县| 犍为县| 特克斯县| 德惠市| 台东县| 三亚市| 观塘区| 犍为县| 龙游县| 绥棱县| 西宁市| 河南省| 环江| 华蓥市| 珲春市| 托里县| 鲁山县| 星座| 陆川县| 瑞丽市| 黄骅市| 三河市| 永定县| 中方县| 湖北省| 许昌县| 钟祥市|