新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機中的中斷嵌套

        AVR單片機中的中斷嵌套

        作者: 時間:2016-11-24 來源:網絡 收藏
        AVR響應中斷后,由硬件自動清零全局中斷標志位,此時任何中斷都無法響應。直到中斷響應程序執行完畢后,全局中斷自動打開。因此,若不作特別處理,AVR單片機是無法實現中斷嵌套的。
        但,如果在中斷服務程序中開放全局中斷,一旦有中斷(包括中斷級別較低的,或者是自己本身)申請,AVR將立即響應中斷,打斷當前正在執行的任何程序(包括正在執行中斷服務程序),進入新的中斷服務程序,從而實現中斷嵌套。此時如有多個中斷申請同時存在,MCU響應高優先權的中斷。
        可見,AVR單片機中,若軟件合理設計,即可實現中斷嵌套。
        和MCS51特別不同的是,AVR中斷嵌套不僅可處理優先級更高的中斷,也可以處理同優先級甚至優先級較低的中斷。這能滿足一些特殊的設計,但是也容易引起混亂。在軟件設計過程中,這一點設計者需特別注意。
        具體實驗:

        interrupt [iv_INT1] void USB_Link_Int(void)

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

        {

        //顯示提示信息,提示進入INT1中斷處理程序

        DispScreen(scr_info_of_int1,true,null);

        //延遲3秒,使得屏幕提示可以看清

        //注意:延遲過程中產生iv_TIMER0_COMP中斷,該中斷的優先級低于iv_INT1

        Timer0_Start(0,3); //注:此函數中使用sei()開放中斷

        while (Timer0_IsRun());

        Timer0_Stop();

        //允許INT3(ENTER)鍵按下產生中斷

        EIMSK &= 0xf7; //禁止INT3產生中斷

        EICRA |= 0x80;

        EICRA &= 0xbf; //INT3中斷方式:下降沿產生異步中斷

        EIFR |= 0x08;//清INT3中斷標志

        EIMSK |= 0x08;//允許INT3產生中斷

        //禁止INT1,防止重入,專等INT3

        EIMSK &= ~( 1 << INT1 );//禁止INT1產生中斷

        //等待INT3中斷

        //注意:iv_INT3中斷的優先級低于iv_INT1

        while(true);

        }

        //按ENTER鍵后產生INT3中斷

        interrupt [iv_INT3] void EnterKey_Int(void)

        {

        //顯示提示信息,提示進入INT3中斷處理程序

        DispScreen(scr_info_of_int3,true,null);

        //延遲3秒,使得屏幕提示可以看清

        //注意:延遲過程中產生iv_TIMER0_COMP中斷,該中斷的優先級低于iv_INT3

        Timer0_Start(0,3); //注:此函數中使用sei()開放中斷

        while (Timer0_IsRun());

        Timer0_Stop();

        //啟動看門狗,等待復位

        watch_dog_reset_cpu();

        }

        實驗結果:iv_TIMER0_COMP中斷、iv_INT3中斷如期發生。

        由此可見,AVR單片機中,進入中斷處理程序適時開放全局中斷,不僅可以使用中斷嵌套,而且高級別中斷中可響應任何級別(包括更低級別的)的中斷。




        關鍵詞: AVR單片機中斷嵌

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 汉阴县| 那曲县| 阜南县| 大足县| 商洛市| 屯门区| 获嘉县| 昌平区| 平顶山市| 沈阳市| 孝昌县| 忻州市| 夏邑县| 曲靖市| 阜康市| 泰和县| 光泽县| 汝城县| 寿光市| 辉县市| 辉南县| 临泉县| 绥芬河市| 射阳县| 洱源县| 兴仁县| 永城市| 临沂市| 扬州市| 佳木斯市| 滦平县| 大关县| 长泰县| 高雄县| 新干县| 冕宁县| 西城区| 安远县| 襄城县| 定西市| 英吉沙县|