電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 52|回復(fù): 0
收起左側(cè)

單片機中斷允許兩種形式的中斷請求

[復(fù)制鏈接]

359

主題

359

帖子

3318

積分

四級會員

Rank: 4

積分
3318
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-14 11:45:00 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
關(guān)注+星標(biāo)公眾,不錯過精彩內(nèi)容素材來源 | 極術(shù)社區(qū)
Cortex-M0處理器允許兩種形式的中斷請求:電平觸發(fā)和脈沖輸入。
電平觸發(fā)是外設(shè)的中斷請求有持續(xù)的電平信號,若電平信號在處理器從ISR返回之前沒有被取消,則中斷返回后將再次觸發(fā)已經(jīng)服務(wù)過的中斷。
脈沖中斷是在信號的上升沿同步采樣的中斷信號,為了確保NVIC檢測到中斷,外設(shè)必須維持中斷信號至少一個時鐘周期,在此期間,NVIC檢測脈沖和鎖存中斷。后續(xù)的脈沖可以將暫掛狀態(tài)加到活動中斷中,使?fàn)顟B(tài)為中斷活動且掛起。然而,在有限周期內(nèi)發(fā)生的多個脈沖只登記作為中斷調(diào)度的單個事件。
哪些中斷是電平觸發(fā)的,哪些是脈沖觸發(fā)的,具體選擇哪一種是根據(jù)芯片設(shè)計來決定,不過大多數(shù)的外設(shè)使用電平觸發(fā)中斷輸出。
1. 電平觸發(fā)和脈沖輸入
Cortex-M0處理器鎖存所有中斷,外圍中斷成為等待其中一個原因是:
  • NVIC檢測到中斷信號被置位并且對應(yīng)的中斷不是active
  • NVIC檢測到中斷信號的上升沿
  • 軟件寫入相應(yīng)的中斷集掛起寄存器位
    掛起的中斷將一直掛起,直到下列情況之一發(fā)生:
  • 處理器為中斷進入ISR,這將改變中斷的狀態(tài)等待活躍:
    對于電平觸發(fā)型中斷,當(dāng)處理器從ISR返回時,NVIC采樣中斷信號。如果中斷信號仍然有效,表示中斷的狀態(tài)更改為pending,這可能會導(dǎo)致處理器立即重新進入ISR。否則,中斷的狀態(tài)將變?yōu)榉腔顒訝顟B(tài)。
    對于脈沖觸發(fā)型中斷,NVIC繼續(xù)監(jiān)視中斷信號,如果這樣觸發(fā)時,中斷狀態(tài)變?yōu)閽炱鸷突顒訝顟B(tài)。在這種情況下,當(dāng)處理器從ISR返回中斷狀態(tài)時,中斷狀態(tài)變?yōu)閽炱馉顟B(tài)可能會導(dǎo)致處理器立即重新進入ISR。如果中斷信號不是脈沖而處理器是在ISR,當(dāng)處理器從ISR返回中斷狀態(tài)變?yōu)榉腔顒訝顟B(tài)。

  • 軟件寫入相應(yīng)的中斷清除寄存器位。
    對于電平觸發(fā)型中斷,如果中斷信號仍然有效,則中斷的狀態(tài)中斷不會改變。否則,中斷的狀態(tài)將變?yōu)榉腔顒訝顟B(tài)。對于脈沖中斷,中斷狀態(tài)變?yōu)椋?u>inactive,如果狀態(tài)是pendingactive,如果狀態(tài)是活動的和掛起的2. 中斷處理
    當(dāng)中斷事件發(fā)生時,由于外設(shè)連接到了NVIC上,中斷信號就會得到確認(rèn)。在處理器執(zhí)行中斷服務(wù)并且沒有清除外設(shè)的中斷的信號以前,該信號會保持高電平。在NVIC內(nèi)部,當(dāng)檢測到有中斷發(fā)生時,該中斷的掛起狀態(tài)會被置位,當(dāng)處理器接受該中斷并且開始執(zhí)行中斷服務(wù)后,掛起狀態(tài)就會被清除。

    針對脈沖輸入的中斷請求,這種情況下,在中斷得到服務(wù)之前,掛起狀態(tài)寄存器將會一直保持該請求。

    如果中斷請求沒有立即執(zhí)行,并且在確認(rèn)之前被軟件清除了,處理器將會忽略掉本次請求,并且不會執(zhí)行中斷處理。
    如果在軟件清除掛起狀態(tài)時,外設(shè)仍然保持著中斷請求,掛起狀態(tài)寄存器還會立即生成。3. 中斷等待
    通常情況下,處理器的中斷等待時間為16個周期,這個等待時間從中斷確認(rèn)的處理器時鐘周期開始,一直到中斷處理開始執(zhí)行結(jié)束。計算中斷等待需具備以下前提:
  • 該中斷使能并沒有PRIMASK或者其他正在執(zhí)行的異常處理所屏蔽
  • 存儲器系統(tǒng)沒有任何等待狀態(tài),在中斷處理、壓棧、取向量表或者中斷處理開始時取指都會用到總線傳輸,如果存儲器系統(tǒng)需要等待,那么總線傳輸時產(chǎn)生的等待狀態(tài)則可能使得中斷延遲。
    下面幾種情況可能會導(dǎo)致不同的中斷等待:
  • 中斷的咬尾連鎖,如果一個中斷返回時立即產(chǎn)生另外一個中斷請求,處理器就會跳過出棧和壓棧時間,減少了中斷等待時間。
  • 延遲到達(dá),如果中斷發(fā)生時,另外一個低優(yōu)先級中斷正在進行壓棧處理,由于延遲到達(dá),高優(yōu)先級的中斷就會立即執(zhí)行,這樣會導(dǎo)致高優(yōu)先級的中斷等待時間減少。
    4. 異常屏蔽寄存器PRIMASK
    有些對時間敏感的應(yīng)用,需要在短時間內(nèi)禁止響應(yīng)所有的中斷,對于這種應(yīng)用,處理器不是直接使用中斷使能、禁止控制寄存器來禁止所有中斷再恢復(fù),而是一個單獨的特殊寄存器 - PRIMASK,通過它可以屏蔽掉除了NMI和HardFault異常的其他的所有的中斷和系統(tǒng)異常。PRIMASK寄存器只有1位有效,并且在復(fù)位后默認(rèn)為0。該寄存器為0時,所有的中斷和異常都處于允許狀態(tài),設(shè)置為1后,只有NMI和HardFault處于使能狀態(tài)。MOVS R0, #0x1         ;  //中斷#2
    MSR PRIMASK , R0       ;  //將R0的值送到PRIMASKNVIC編程提示軟件使用CPSIE i和CPSID i指令來啟用和禁用中斷。CPSIE i                 ;  //清除 PRIMASK(使能中斷)
    CPSID i                 ;  //設(shè)置 PRIMASK(不響應(yīng)中斷)CMSIS設(shè)備驅(qū)動庫提供了C語言的實現(xiàn)函數(shù),用戶可以直接使用函數(shù)來設(shè)置和清除PRIMASK寄存器:void __disable_irq(void) //不響應(yīng)中斷
    void __enable_irq(void)  //啟用中斷在對時間敏感的程序完成后,應(yīng)該清除PRIMASK。要不然即使在中斷處理中使用\_\_disable\_irq()函數(shù),處理器將停止接受新的中斷請求。主要原因是PRIMASK寄存器和Xpsr是相互獨立的,因此異常返回不會影響中斷屏蔽狀態(tài)。5. NVIC使用提示
    確保軟件使用正確對齊的寄存器訪問,處理器不支持對 NVIC 寄存器的未對齊訪問。
    即使中斷被禁用,它也可以進入掛起狀態(tài)。禁用中斷只能防止處理器處理中斷。在對中斷向量表重定義之前,必須包含所有的異常中斷,例如 NMI、HardFault 和外設(shè)中斷等。聲明:本文素材來源網(wǎng)絡(luò),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請與我聯(lián)系刪除。
    ------------ END ------------

    ●專欄《嵌入式工具●專欄《嵌入式開發(fā)》●專欄《Keil教程》●嵌入式專欄精選教程
    關(guān)注公眾號回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。點擊“閱讀原文”查看更多分享。
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表