什么是中斷?中斷的流程是什么樣?:
一種處理系統內發生非尋常的或非預期的急需處理事件機制,叫做中斷。
在MCU執行程序期間,系統內發生任何非尋常的或非預期的急需處理事件,使得CPU暫時中斷當前正在執行的程序而轉去執行相應的時間處理程序。待處理完畢后又返回原來被中斷處繼續執行過程。幾乎所有的計算機系統都具備這種機制。
STM32中斷分類:CPU內核中斷和核外外設中斷,其中內核中斷,在官方手冊上,內核中斷叫異常(exception)和核外外設中斷才叫中斷(interrupt),其實是一回事。
補充:所有的中斷用一個表管理起來,編號 為 0~15 的稱為內核異常(需要說明的是,16個編號的內核中斷,但是STM32,本身的內核中斷是11個,還有5個是保留的沒用的),而 16 以上的則稱為核外中斷(外,相對內核而言,對于不同系列的STM32,大致的編號和數量相同,但是對于高級的,比如互聯型系列等,因為偏上外設要多一些,所以中斷的數量也會多一些),這個表就稱為中斷向量表。 這個中斷向量表,這個中斷向量表,本質上可以理解成一個4個字節類型Int的數組,每一個元素就是放的是對應編號的中斷處理程序的入口地址,數組編號其實相當于中斷編號。這個中斷向量表,放在程序最開頭位置(根據STM32存儲映射,起始地址的512K區域,根據boot0和boot1分別映射到系統程序、SRAM和flash,映射到flash和SRAM的時候,起始地址從0x00000000開始放的就是這個中斷向量表)。
在ST公司提供的啟動文件中為每一個中斷默認定義了一個中斷處理函數,如果我們自己重新寫中斷處理函數,會屏蔽掉默認的這個函數。
中斷管理機制:
STM32有多個中斷,當這些中斷同時發生時,需要有執行先后等關系,管理這些引入了一個專門的中斷管理機制叫NVIC(內嵌向量中斷控制器),相關硬件在CPU內部。控制著中斷的相關功能(其中包括中斷源、搶占優先級、響應優先級、中斷的使能與失能),具體的配置方法后面會提到。
固件庫中NVIC相關的結構體:
填充這4個成員,進行初始化。
中斷源
取值都在枚舉類型IRQn_Type中,在stm32f10x.h
stm32里面的優先級
在stm32中,一個中斷的優先級由兩部分決定,一個是搶占式優先級,還有一個是響應優先級。兩個優先級組成了一個4位的控制字。
如圖:
那么我們就會問,這有四位,那兩個優先級各占多少位。就像圖中所展示的,搶占式優先級(黃色)可以沾滿四位,也可以一位都不占,如果占滿四位,則搶占式優先級共有0-15這些等級,占滿2位,就有0-3這些等級。同理響應優先級也是這樣。分配他們各占多少位的函數為:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);后面這個數字代表的是搶占式優先級的位數
搶占式優先級和響應優先級分析
這兩個優先級中,搶占式優先級占主導地位,搶占式優先級高的中斷會優先打斷主程序或者另外一個中斷程序。
如果兩個中斷的搶占式優先級一樣高,當兩個中斷同時發生時,響應優先級高的先發生,完了再發生另一個。但是要注意,響應優先級高的中斷不會打斷低的中斷,也就是當一個高響應優先級的中斷來時,如果正在執行一個低的中斷,他不會打斷他,而是等待低的執行完在執行。也就是說只有高搶占式優先級可以阻斷。
基于標準固件庫V3.50中斷編程的應用:
1.需要全局配置中斷分組。
比如:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
2.對于某個具體的中斷源,配置其相應的NVIC。填寫結構體,調用
以串口為例
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ&pide;
3.產生中斷的,引發中斷,進入中斷處理函數的時間配置。
通常是XXX__ITConfig 其中XXX代表某個具體的外設
4.中斷處理函數:
中斷處理函數不能隨便填寫,必須要一個固定的函數名字,具體某個偏上外設對應的中斷處理函數,需要到,啟動文件這個文件里去找。
5.在進入相應中斷處理函數后
首先需要需要判斷XXX_GetITStatus 是不是我們前面對應設置的中斷事件
6.在處理完了相應的中斷函數后調用,有一個類似 _ClearIT 函數清除相應的標志位