STM32F1之中斷

1.中斷是什麼以及作用

以下摘自百度百科

中斷指當出現需要時,CPU暫時停止當前程序的執行轉而執行處理新情況的程序和執行過程。

中斷處理:

        從查詢式的傳輸過程可以看出,它的優點是硬件開銷小,使用起來比較簡單。但在此方式下,CPU要不斷地查詢外設的狀態,當外設未準備好時,CPU就只能循環等待,不能執行其它程序,這樣就浪費了CPU的大量時間,降低了主機的利用率。 爲了解決這個矛盾,我們提出了中斷傳送方式,即當CPU進行主程序操作時,外設的數據已存入輸入端口的數據寄存器;或端口的數據輸出寄存器已空,由外設通過接口電路向CPU發出中斷請求信號,CPU在滿足一定的條件下,暫停執行當前正在執行的主程序,轉入執行相應能夠進行輸入/輸出操作的子程序,待輸入/輸出操作執行完畢之後CPU即返回繼續執行原來被中斷的主程序。這樣CPU就避免了把大量時間耗費在等待、查詢狀態信號的操作上,使其工作效率得以大大地提高。 能夠向CPU發出中斷請求的設備或事件稱爲中斷源。而對其的處理方式即中斷處理.即當CPU(中央處理器)執行一條現行指令的時候,如果外設向CPU發出中斷請求,那麼CPU在滿足響應的情況下,將發出中斷響應信號,與此同時關閉中斷,表示CPU不在受理另外一個設備的中斷。這時,CPU將尋找中斷請求源是哪一個設備,並保存CPU自己的程序計數器(PC)的內容。然後,他將轉移到處理該中斷源的中斷服務程序。CPU在保存現場信息,設備服務(如交換數據)以後,將恢復現場信息。在這些動作完成以後,開放中斷,並返回到原來被中斷的主程序的下一條指令。

2.中斷的基本知識

以下摘自STM32開發手冊

CM3 內核支持 256 箇中斷,其中包含了 16 個內核中斷和 240 個外部中斷,並且具有 256級的可編程中斷設置。但 STM32 並沒有使用 CM3 內核的全部東西,而是隻用了它的一部分。STM32 有 84 箇中斷,包括 16 個內核中斷和 68 個可屏蔽中斷,具有 16 級可編程的中斷優先級。而我們常用的就是這 68 個可屏蔽中斷,但是 STM32 的 68 個可屏蔽中斷,在 STM32F103 系列上面,又只有 60 個(在 107 系列纔有 68 個)。

        中斷優先級控制的寄存器組:IPR[15]:全稱是: Interrupt Priority Registers,這個寄存器組非常重要! STM32 的中斷分組與這個寄存器組密切相關。因爲 STM32 的中斷多達 60 多個,所以 STM32 採用中斷分組的辦法來確定中斷的優先級。 IPR 寄存器組由 15 個 32bit 的寄存器組成,每個可屏蔽中斷佔用 8bit,這樣總共可以表示 15*4=60 個可屏蔽中斷。剛好和 STM32的可屏蔽中斷數相等。 IPR[0]的[31~24], [23~16], [15~8], [7~0]分別對應中中斷 3~0,依次類推,總共對應 60 個外部中斷。而每個可屏蔽中斷佔用的 8bit 並沒有全部使用,而是 只用了高4 位。這 4 位,又分爲搶佔優先級和子優先級。搶佔優先級在前,子優先級在後。而這兩個優先級各佔幾個位又要根據 SCB->AIRCR 中中斷分組的設置來決定。這裏簡單介紹一下 STM32 的中斷分組: STM32 將中斷分爲 5 個組,組 0~4。該分組的設置是由 SCB->AIRCR 寄存器的 bit10~8 來定義的。具體的分配關係如表 4.5.1 所示:



        通過這個表,我們就可以清楚的看到組 0~4 對應的配置關係,例如組設置爲 3,那麼此時所有的 60 箇中斷,每個中斷的中斷優先寄存器的高四位中的最高 3 位是搶佔優先級,低 1 位是響應優先級。每個中斷,你可以設置搶佔優先級爲 0~7,響應優先級爲 1 或 0。搶佔優先級的級別高於響應優先級。而數值越小所代表的優先級就越高。這裏需要注意兩點:第一,如果兩個中斷的搶佔優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行;第二,高優先級的搶佔優先級是可以打斷正在進行的低搶佔優先級中斷的。而搶佔優先級相同的中斷,高優先級的響應優先級不可以打斷低響應優先級的中斷。

結合實例說明一下:假定設置中斷優先級組爲 2,然後設置中斷 3(RTC 中斷)的搶佔優先級爲 2,響應優先級爲 1。中斷 6(外部中斷 0)的搶佔優先級爲 3,響應優先級爲 0。中斷 7(外部中斷 1)的搶佔優先級爲 2,響應優先級爲 0。那麼這 3 箇中斷的優先級順序爲:中斷 7>中斷 3>中斷 6。

中斷優先級設置的步驟:
1) 系統運行開始的時候設置中斷分組。確定組號,也就是確定搶佔優先級和子優先級的分配位數。調用函數爲 NVIC_PriorityGroupConfig();
2)設置所用到的中斷的中斷優先級別。對每個中斷調用函數爲 NVIC_Init();

STM32 IO 口中斷的一些基礎概念

STM32 的每個 IO 都可以作爲外部中斷的中斷輸入口,這點也是 STM32 的強大之處。普通IO口作爲中斷使用時需要指定中斷線,即EXTI接口。 STM32F103 的中斷控制器支持 19 個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。 STM32F103 的19 個外部中斷爲:
線 0~15:對應外部 IO 口的輸入中斷。
線 16:連接到 PVD 輸出。
線 17:連接到 RTC 鬧鐘事件。
線 18:連接到 USB 喚醒事件。
從上面可以看出, STM32 供 IO 口使用的中斷線只有 16 個,但是 STM32 的 IO 口卻遠遠不止 16 個,那麼 STM32 是怎麼把 16 箇中斷線和 IO 口一一對應起來的呢?於是 STM32 就這樣設計, GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E, F,G)分別對應中斷線 15~0。這樣每個中斷線對應了最多 7 個 IO 口,以線 0 爲例:它對應了 GPIOA.0、 GPIOB.0、 GPIOC.0、 GPIOD.0、GPIOE.0、 GPIOF.0、 GPIOG.0。而中斷線每次只能連接到 1 個 IO 口上,這樣就需要通過配置來決定對應的中斷線配置到哪個 GPIO 上了。


3.中斷的使用方法

        1) 開啓按鍵外圍時鐘以及按鍵的相關配置。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);

模式一般使用GPIO_Mode_IPU,上拉輸入

2)初始化LED的相關配置。

3)開啓複用時鐘(外部中斷,需要使能AFIO時鐘)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

4)指定中斷線(以PG8爲例)-----4)5)步是設置中斷線和 GPIO 映射關係,然後設置好了中斷的觸發模式等初始化參數

GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource8);

5)中斷初始化配置

EXTI_InitStructer.EXTI_Line=EXTI_Line8;//中斷線8
EXTI_InitStructer.EXTI_Mode=EXTI_Mode_Interrupt;//中斷模式觸發
XTI_InitStructer.EXTI_Trigger=EXTI_Trigger_Rising_Falling;//任意方式觸發
EXTI_InitStructer.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructer);

6)既然是中斷,就有中斷通道(中斷的處理函數),中斷優先級,STM32 的 IO 口外部中斷函數只有 6 個,

分別爲:
EXPORT EXTI0_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI3_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI15_10_IRQHandler
中斷線 0-4 每個中斷線對應一箇中斷函數,中斷線 5-9 共用中斷函數 EXTI9_5_IRQHandler,中斷線 10-15 共用中斷函數 EXTI15_10_IRQHandler

NVIC_InitStructer.NVIC_IRQChannel=EXTI9_5_IRQn;//PG8中斷線爲EXTI8,對應EXTI9_5_IRQn
NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructer.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructer);

 7)編輯中斷處理函數,void EXTI9_5_IRQHandler(void)

在此函數中先判斷某個中斷線是否產生了中斷,if(EXTI_GetITStatus(EXTI_Line8)!=RESET)

如果發生了,在做相應的邏輯處理。

最後必須要清除某個中斷線上的中斷標誌位,EXTI_ClearITPendingBit(EXTI_Line8);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章