在嵌入式系統(tǒng)中,中斷是一種重要的機(jī)制,用于處理來自外部設(shè)備的異步事件。STM32系列微控制器提供了強(qiáng)大的中斷控制器,可以方便地處理各種外部中斷和內(nèi)部中斷。本文將詳細(xì)介紹STM32中斷的結(jié)構(gòu)和使用方法。
1. 什么叫中斷
中斷是計(jì)算機(jī)系統(tǒng)中的一種機(jī)制,用于處理突發(fā)事件或異步事件。在計(jì)算機(jī)運(yùn)行過程中,CPU通常是按照指令的順序依次執(zhí)行的,但是當(dāng)發(fā)生某些特殊事件時(shí),如外部設(shè)備的輸入、定時(shí)器的溢出等,CPU需要立即中斷當(dāng)前的任務(wù),轉(zhuǎn)而處理這些事件。這樣可以提高系統(tǒng)的響應(yīng)速度和效率。
中斷可以看作是一種突然的打斷,類似于我們在做一件事情的時(shí)候突然收到了一個(gè)電話,需要立即停下手頭的工作去接聽電話。中斷可以分為硬件中斷和軟件中斷兩種類型。
硬件中斷是由外部設(shè)備觸發(fā)的,如鍵盤輸入、鼠標(biāo)點(diǎn)擊等。當(dāng)外部設(shè)備觸發(fā)了中斷信號時(shí),CPU會立即停止當(dāng)前的任務(wù),轉(zhuǎn)而執(zhí)行與中斷相關(guān)的處理程序。處理完中斷后,CPU會返回到之前被中斷的地方繼續(xù)執(zhí)行。
軟件中斷是由程序中的特殊指令觸發(fā)的。程序可以通過軟件中斷指令,主動請求CPU中斷當(dāng)前任務(wù),執(zhí)行與中斷相關(guān)的處理程序。軟件中斷可以用來實(shí)現(xiàn)特定的功能,如操作系統(tǒng)的系統(tǒng)調(diào)用。
2. 中斷優(yōu)先級
在STM32微控制器中,中斷優(yōu)先級是用來確定**中斷服務(wù)程序(ISR)**執(zhí)行的順序的。STM32系列微控制器支持多個(gè)中斷源,并且每個(gè)中斷源都有一個(gè)對應(yīng)的中斷優(yōu)先級。
中斷優(yōu)先級可以分為兩個(gè)級別:搶占優(yōu)先級和子優(yōu)先級。
- 搶占優(yōu)先級(Preemption Priority):搶占優(yōu)先級決定了當(dāng)多個(gè)中斷同時(shí)發(fā)生時(shí),哪個(gè)中斷可以中斷當(dāng)前正在執(zhí)行的中斷。具有較高搶占優(yōu)先級的中斷可以打斷正在執(zhí)行的較低優(yōu)先級中斷,并立即執(zhí)行自己的中斷服務(wù)程序。
- 子優(yōu)先級(Subpriority):子優(yōu)先級用于決定在同一搶占優(yōu)先級的多個(gè)中斷中,哪個(gè)中斷將首先得到執(zhí)行。具有較高子優(yōu)先級的中斷將在同一搶占優(yōu)先級的其他中斷之前得到執(zhí)行。
2.1 有搶占優(yōu)先級為什么還要子優(yōu)先級?
搶占優(yōu)先級和子優(yōu)先級的組合可以提供更靈活的中斷控制和調(diào)度。搶占優(yōu)先級主要用于處理多個(gè)中斷同時(shí)發(fā)生時(shí)的中斷搶占關(guān)系,而子優(yōu)先級則用于處理同一搶占優(yōu)先級的多個(gè)中斷的執(zhí)行順序。
使用搶占優(yōu)先級可以確保關(guān)鍵的中斷能夠及時(shí)中斷正在執(zhí)行的低優(yōu)先級中斷,并立即執(zhí)行自己的中斷服務(wù)程序。這對于實(shí)時(shí)性要求較高的應(yīng)用非常重要。
然而,當(dāng)多個(gè)中斷具有相同的搶占優(yōu)先級時(shí),如果沒有子優(yōu)先級的支持,它們將按照先后順序依次執(zhí)行,無法進(jìn)行更細(xì)粒度的調(diào)度。一般情況下,搶占優(yōu)先級的位數(shù)比子優(yōu)先級的位數(shù)多,因此搶占優(yōu)先級的范圍更廣,可以提供更細(xì)粒度的中斷控制。通過使用子優(yōu)先級,可以在同一搶占優(yōu)先級的多個(gè)中斷中確定首先執(zhí)行的中斷。這對于需要優(yōu)先處理某些特定中斷的應(yīng)用非常有用。
3. 中斷嵌套
中斷嵌套是指在一個(gè)中斷服務(wù)程序(ISR)執(zhí)行期間,另一個(gè)中斷發(fā)生并觸發(fā)了相應(yīng)的中斷服務(wù)程序的執(zhí)行。當(dāng)一個(gè)中斷正在處理時(shí),如果有更高優(yōu)先級的中斷發(fā)生,系統(tǒng)將暫停當(dāng)前中斷的處理,轉(zhuǎn)而去處理更高優(yōu)先級的中斷,這就是中斷嵌套。
中斷嵌套在實(shí)時(shí)系統(tǒng)中非常常見,它允許系統(tǒng)在處理一個(gè)中斷時(shí)能夠及時(shí)響應(yīng)更高優(yōu)先級的中斷請求。通過中斷嵌套,可以實(shí)現(xiàn)對多個(gè)中斷請求的優(yōu)先級排序和處理,確保關(guān)鍵中斷能夠及時(shí)中斷正在執(zhí)行的較低優(yōu)先級中斷,并立即執(zhí)行自己的中斷服務(wù)程序。
在STM32微控制器中,中斷嵌套是通過搶占優(yōu)先級和子優(yōu)先級來實(shí)現(xiàn)的。當(dāng)一個(gè)中斷正在執(zhí)行時(shí),如果有更高搶占優(yōu)先級的中斷請求發(fā)生,系統(tǒng)會立即中斷當(dāng)前中斷的執(zhí)行,并開始處理更高優(yōu)先級的中斷。如果多個(gè)中斷具有相同的搶占優(yōu)先級,那么子優(yōu)先級將決定它們的執(zhí)行順序。
中斷嵌套可能會引入一些問題,如中斷嵌套深度過大可能導(dǎo)致系統(tǒng)性能下降,同時(shí)需要合理地處理中斷優(yōu)先級和中斷服務(wù)程序的互斥和同步問題,以確保系統(tǒng)的正確性和可靠性。
4. 中斷結(jié)構(gòu)
4.1 中斷向量表(Interrupt Vector Table):中斷向量表是一個(gè)存儲中斷向量地址的數(shù)據(jù)結(jié)構(gòu),用于存儲中斷服務(wù)函數(shù)的入口地址。當(dāng)一個(gè)中斷發(fā)生時(shí),微控制器會根據(jù)中斷號從中斷向量表中讀取相應(yīng)的ISR地址,并跳轉(zhuǎn)到該地址執(zhí)行中斷服務(wù)程序。在STM32中,中斷向量表存儲在內(nèi)部閃存的起始地址處。
中斷向量表的大小取決于微控制器支持的中斷數(shù)量。對于STM32系列微控制器,通常采用的是基于向量表的中斷處理方式,其中中斷向量表的大小是固定的,每個(gè)中斷向量的大小是4個(gè)字節(jié)。因此,中斷向量表的大小等于中斷數(shù)量乘以4個(gè)字節(jié)。
在編程中,我們可以通過修改中斷向量表中的中斷向量來指定每個(gè)中斷的ISR地址。通常,我們會使用編譯器提供的特定語法來定義中斷向量表和中斷服務(wù)程序,并將它們放置在正確的地址位置。
需要注意的是,中斷向量表是只讀的,它存儲了系統(tǒng)在編譯時(shí)確定的中斷服務(wù)程序的地址。因此,在運(yùn)行時(shí)無法修改中斷向量表。如果需要?jiǎng)討B(tài)地改變中斷服務(wù)程序的執(zhí)行地址,可以使用中斷向量重定向技術(shù),即通過修改中斷向量表中的中斷向量,將中斷重定向到其他地址。但這種技術(shù)需要小心使用,以避免引入不可預(yù)測的錯(cuò)誤。
4.2 中斷控制器(Nested Vectored Interrupt Controller,NVIC):NVIC是STM32中斷控制器的核心組件,用于管理和控制中斷。它支持多級中斷優(yōu)先級,可以配置中斷優(yōu)先級、使能或禁用中斷,并提供中斷向量表的地址。
NVIC有以下幾個(gè)主要的功能:
-
中斷優(yōu)先級管理:NVIC允許為每個(gè)中斷分配一個(gè)搶占優(yōu)先級和一個(gè)子優(yōu)先級。搶占優(yōu)先級用于確定中斷的搶占關(guān)系,而子優(yōu)先級用于確定同一搶占優(yōu)先級的多個(gè)中斷的執(zhí)行順序。NVIC提供了寄存器來配置和管理中斷的優(yōu)先級。
-
中斷使能/禁止控制:NVIC提供了寄存器來使能或禁止特定的中斷。通過設(shè)置相應(yīng)的位,可以選擇性地使能或禁止中斷。這對于靈活地控制中斷的觸發(fā)和執(zhí)行非常有用。
-
中斷狀態(tài)管理:NVIC提供了寄存器來管理中斷的狀態(tài)。例如,可以通過讀取和寫入中斷掛起寄存器來判斷中斷是否處于掛起狀態(tài),以及通過寫入中斷清除寄存器來清除中斷標(biāo)志。
-
中斷向量表偏移:NVIC允許通過設(shè)置偏移量來修改中斷向量表的起始地址。這對于實(shí)現(xiàn)中斷向量重定向非常有用,可以將中斷重定向到其他地址。
4.3 中斷服務(wù)函數(shù)(Interrupt Service Routine,ISR):中斷服務(wù)函數(shù)是中斷發(fā)生時(shí)執(zhí)行的代碼塊。在STM32中,中斷服務(wù)函數(shù)需要使用特定的函數(shù)聲明和命名規(guī)則,并通過中斷向量表進(jìn)行注冊。
5. 中斷使用方法
-
配置中斷優(yōu)先級:首先,需要使用
NVIC_SetPriority()
函數(shù)設(shè)置中斷的搶占優(yōu)先級和子優(yōu)先級。該函數(shù)的參數(shù)包括中斷通道號和優(yōu)先級值。 -
初始化中斷向量表:在啟動代碼中,需要初始化中斷向量表的起始地址??梢允褂?code>NVIC_SetVectorTable()函數(shù)來設(shè)置中斷向量表的偏移地址。
-
注冊中斷處理函數(shù):使用
NVIC_Init()
函數(shù)注冊中斷處理函數(shù)。該函數(shù)的參數(shù)包括中斷通道號、中斷優(yōu)先級和中斷處理函數(shù)的地址。 -
使能中斷:使用
NVIC_EnableIRQ()
函數(shù)使能中斷。該函數(shù)的參數(shù)為中斷通道號。 -
編寫中斷處理函數(shù):編寫中斷處理函數(shù),處理中斷事件發(fā)生時(shí)的邏輯。中斷處理函數(shù)的命名和參數(shù)取決于所使用的中斷通道和編程語言。
以下是一個(gè)示例代碼,演示了如何使用標(biāo)準(zhǔn)外設(shè)庫函數(shù)實(shí)現(xiàn)中斷:文章來源:http://www.zghlxwxcb.cn/news/detail-713038.html
#include "stm32f10x.h"
// 中斷處理函數(shù)
void EXTI0_IRQHandler(void)
{
// 處理中斷事件邏輯
// ...
// 清除中斷標(biāo)志
EXTI_ClearITPendingBit(EXTI_Line0);
}
int main(void)
{
// 初始化中斷向量表
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
// 配置中斷優(yōu)先級
NVIC_SetPriority(EXTI0_IRQn, 0);
// 注冊中斷處理函數(shù)
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能中斷
NVIC_EnableIRQ(EXTI0_IRQn);
while (1)
{
// 主循環(huán)邏輯
// ...
}
}
總結(jié)
STM32中斷提供了強(qiáng)大的功能,可以方便地處理各種外部中斷和內(nèi)部中斷。通過合理配置中斷優(yōu)先級和中斷服務(wù)函數(shù),可以實(shí)現(xiàn)對異步事件的及時(shí)響應(yīng)。在實(shí)際應(yīng)用中,需要根據(jù)具體需求和硬件設(shè)備,合理使用中斷功能,提高系統(tǒng)的可靠性和性能。文章來源地址http://www.zghlxwxcb.cn/news/detail-713038.html
到了這里,關(guān)于【物聯(lián)網(wǎng)】STM32的中斷機(jī)制不清楚?看這篇文章就足夠了的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!