問(wèn)題描述
在使用基于 ARM CORTEX-M3、M4 或 M7 系列的 STM32 芯片做產(chǎn)品開發(fā)時(shí),可能有人遇到過(guò)單次事件會(huì)觸發(fā)兩次中斷的情形。或許對(duì)異?,F(xiàn)象的表述不盡相同,比方有的人會(huì)說(shuō)怎么中斷請(qǐng)求標(biāo)志要清 2 次才行;由于中斷里有些執(zhí)行操作,有人會(huì)說(shuō)代碼里明明只執(zhí)行一次,可實(shí)際運(yùn)行時(shí)卻是兩次;有的人會(huì)說(shuō),有些執(zhí)行動(dòng)作放在中斷外執(zhí)行正常,放到中斷服務(wù)程序里又異常了等等。記得有一次,有個(gè) STM32 用戶反映,他的 SPI 實(shí)際發(fā)送效果跟程序代碼里設(shè)計(jì)的完全不一樣,明明是 8 位發(fā)送,硬生生變成了 16 位發(fā)送,詭異的很。諸如此類。
問(wèn)題分析
像上面提到的這些情況,他們的中斷服務(wù)程序代碼都有個(gè)共性。那就是他們把清外設(shè)中斷請(qǐng)求標(biāo)志的那行代碼放在中斷程序的結(jié)尾處。
問(wèn)題驗(yàn)證
其實(shí),當(dāng)執(zhí)行完那句清標(biāo)志的代碼后,按理 CPU 該做出棧操作了。但是,由于此時(shí)硬件檢測(cè)到剛才沒(méi)有實(shí)際清零的有效中斷請(qǐng)求標(biāo)志,立即做出了一個(gè)決定----不做出棧操作,而是馬上準(zhǔn)備響應(yīng)該中斷請(qǐng)求。這就是 ARM 為 Cortex-M 內(nèi)核中斷設(shè)計(jì)的咬尾機(jī)制。新的中斷響應(yīng)基于剛完成的中斷服務(wù)程序不做壓棧只稍作準(zhǔn)備后立即運(yùn)行新的中斷服務(wù)程序,當(dāng)然這里的“新”理解為新的一次比較合適。說(shuō)到這里,既然決定不做出棧操作了,至于出棧所需時(shí)間是多少個(gè) CLK已經(jīng)不重要了。
問(wèn)題小結(jié)
這里基于多個(gè)客戶共性話題,由淺入深地做了相應(yīng)分析和釋疑。拋磚引玉地就 ARMCortex-M4 內(nèi)核的咬尾中斷機(jī)制做了相關(guān)介紹,并基于具體測(cè)試代碼做了些直觀的體驗(yàn)。希望能對(duì)大家在未來(lái)的 STM32 應(yīng)用開發(fā)有所幫助。