新聞中心

        AVR中斷詳解

        作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
        一、中斷信號(hào)往往是電信號(hào)的某種變化形式,如

        脈沖的上升沿或下降沿
        高電平或低電平
        電平變化
        二、中斷向量
        中斷請(qǐng)求被cpu檢測(cè)到之后,如果中斷控制系統(tǒng)允許,cpu會(huì)自動(dòng)轉(zhuǎn)移,執(zhí)行一個(gè)固定的程序空間地址的指令。
        這個(gè)固定地址叫做中斷入口地址,也叫中斷向量。而這個(gè)地址是有單片機(jī)的硬件來(lái)決定的。
        一般這個(gè)地址不放置具體的程序,只放置一條跳轉(zhuǎn)指令,轉(zhuǎn)向真正的中斷服務(wù)程序。
        三、AVR不支持軟件改變中斷優(yōu)先級(jí),即其優(yōu)先級(jí)是固定的。
        四、中斷源分為三類
        1.非屏蔽中斷,如reset中斷,無(wú)法屏蔽
        2.屏蔽中斷,大部分中斷都是可屏蔽的
        3.軟件中斷,AVR不支持,好像ARM里面有,可以作為操作系統(tǒng)的中斷調(diào)用。
        五、中斷響應(yīng)條件
        響應(yīng)A中斷 = 全局中斷允許標(biāo)志 AND 中斷A允許標(biāo)志 AND 中斷A標(biāo)志
        全局中斷允許標(biāo)志對(duì)于AVR就是其標(biāo)志寄存器SREG的I位,SREG.7,gcc中打開和關(guān)閉的方法為sei()和cli()
        中斷允許標(biāo)志,一般來(lái)說每個(gè)中斷都會(huì)有單獨(dú)的允許標(biāo)志位,放置在某個(gè)相關(guān)的寄存器中,通過單獨(dú)設(shè)置那一位可以打開或關(guān)閉相應(yīng)的中斷。
        中斷標(biāo)志,一般說來(lái)這個(gè)標(biāo)志都是硬件觸發(fā)的,就是一旦滿足那個(gè)條件,這個(gè)標(biāo)志自動(dòng)為1,不需要手動(dòng)設(shè)置。
        六、中斷向量區(qū)大小 = 中斷源個(gè)數(shù) x 每個(gè)中斷向量所占的字?jǐn)?shù)
        七、中斷標(biāo)志位一般會(huì)在cpu響應(yīng)中斷后自動(dòng)清除,或在中斷服務(wù)程序中通過讀寫專門的寄存器而自動(dòng)清除。
        當(dāng)然也可以對(duì)其進(jìn)行軟件清除,清除方法是對(duì)其寫1(這點(diǎn)比較怪)
        八、中斷標(biāo)志會(huì)一直保持,如果中斷被禁止或者是cpu不能馬上響應(yīng)的話。這是稱作“掛起”,一旦cpu可以響應(yīng)了,則馬上按優(yōu)先級(jí)處理中斷。
        九、個(gè)別中斷不帶中斷標(biāo)志,比如配置為低電平觸發(fā)的外部中斷。只要滿足條件就會(huì)向cpu一直發(fā)送中斷申請(qǐng)。
        這里就會(huì)出現(xiàn)這樣的問題:
        1.cpu暫時(shí)沒響應(yīng)中斷,低電平?jīng)]有了,這樣就少了一次服務(wù)
        2.cpu響應(yīng)了,響應(yīng)完事,低電平還在,又多服務(wù)了一次
        所以設(shè)計(jì)的時(shí)候要注意
        一般這種低電平觸發(fā)中斷方式用于喚醒處于休眠模式的cpu,可參考具體方案。
        十、AVR響應(yīng)中斷時(shí)會(huì)將全局中斷允許位關(guān)掉,不響應(yīng)其它中斷,所以也就不允許中斷的嵌套。
        當(dāng)然可以在中斷服務(wù)程序中,將其開啟,但是這樣做是非常危險(xiǎn)的,不提倡。
        十一、中斷響應(yīng)的過程如下
        1.清零全局中斷
        2.將具體被響應(yīng)的中斷標(biāo)志位清零
        3.中斷斷點(diǎn)地址壓入堆棧,同時(shí)SP減2
        4.自動(dòng)將中斷向量地址壓入PC,強(qiáng)制執(zhí)行。
        以上均由硬件自動(dòng)完成,軟件需要做的事情如下:
        1.中斷入口處指令:rjmp reset
        2.中斷服務(wù)程序
        3.返回指令 reti
        十二、
        非常要注意的是中斷只保存和恢復(fù)了斷點(diǎn)的PC值,對(duì)其它的寄存器均沒有保護(hù),所以如果在中斷服務(wù)程序中要是改變了某些寄存器的值的話就容易出現(xiàn)問題。
        所以,中斷服務(wù)程序要盡量短,不做多余的操作,并且一旦對(duì)sreg有破壞的話,一定要在先將其壓入堆棧。
        十三、技巧
        在使能一個(gè)中斷允許位之前,最好將改中斷的中斷標(biāo)志位清除,然后馬上使能允許位。
        這樣可以避免一些不必要的錯(cuò)誤,如果之前改標(biāo)志為1的話,就會(huì)產(chǎn)生一個(gè)錯(cuò)誤的中斷。
        再說一次,清除標(biāo)志位的方法是對(duì)其寫1

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

        GCC的中斷程序?qū)懛ǎ@里不說了,參考相關(guān)書籍

        AVR-MEGA16的外部中斷
        其它的cpu也大同小異
        中斷方式的設(shè)置在MCUCR和MCUCSR兩個(gè)寄存器里,找到對(duì)應(yīng)的INT的兩位ISC1和ISC0,具體參考datasheet
        中斷允許在GICR寄存器里
        中斷標(biāo)志位在GIFR寄存器中

        書中由一個(gè)利用外部中斷實(shí)現(xiàn)系統(tǒng)斷電保護(hù)的電路實(shí)例,還不錯(cuò),以后用到的時(shí)候可以找一下。



        關(guān)鍵詞: AVR中斷詳解電信

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 阳西县| 介休市| 两当县| 乌拉特前旗| 格尔木市| 彭泽县| 新营市| 五常市| 荣成市| 乳山市| 高清| 彭州市| 江北区| 富蕴县| 金川县| 钟山县| 慈溪市| 宁阳县| 武邑县| 轮台县| 安乡县| 绥中县| 蓬安县| 镇江市| 从江县| 阿鲁科尔沁旗| 武乡县| 山东省| 兴文县| 彰化市| 辉南县| 雷山县| 宜君县| 屯门区| 额济纳旗| 若尔盖县| 湘西| 临漳县| 尼勒克县| 城步| 平谷区|