1. 程式人生 > >STM32中斷設定以及中斷優先順序設定

STM32中斷設定以及中斷優先順序設定

最近,在做一個智慧鎖的專案,由於,今天碰到了一個關於中斷的問題,因此,又回來好好啃一下中斷配置的知識,俗話說:磨刀不誤砍柴工。問題是什麼呢?專案中我用到了一個觸控鍵盤TTP229,結果在測試鍵盤時,不能夠輸入密碼?最終,調試出bug就是由於中斷優先順序的影響。

本專案使用到的是STM32F030C8型號的MCU,我們可以從官方下載到的標準庫檔案中的啟動彙編檔案中,檢視到本型號微控制器的外部中斷向量表。(如下圖所示)

首先,我們瞭解一下NVIC是什麼,在core_cm0.h檔案中的標準庫中的NVIC結構體。

其中,我們一般只用到ISER、ICER、IP這3個暫存器。ISER用於使能中斷,ICER用來清除中斷,IP用來設定中斷優先順序。

其次,我們瞭解一下中斷優先順序,中斷優先順序暫存器NVIC_IPRx,本暫存器寬度為8位,原則上每個外部中斷可配置的優先順序為0~255,實際上精簡了,只用到了它的高4位。這4位,又被分成了搶佔優先順序和響應優先順序兩組,然後,中斷優先順序有分為以下幾種情況:

1、搶佔優先順序不同,會涉及到中斷巢狀,搶佔優先順序高的會優先搶佔優先順序低的,優先得到執行。(注意:優先順序數字越小,優先順序越高)

2、搶佔優先順序相同,不涉及到中斷巢狀,響應優先順序不同,響應優先順序高的先響應。(例如:兩個中斷同時響應,這裡就會先執行響應優先順序高的那個中斷)(注意:優先順序數字越小,優先順序越高)

3、搶佔優先順序和響應優先順序都相同,則比較它們的硬體中斷編號,中斷編號越小,優先順序越高。(硬體中斷編號從中斷向量表當中檢視)

中斷優先順序分組,因為中斷優先順序只使用了高4位,所以,中斷優先順序的分組分別有以下幾種情況:

優先順序分組

搶佔優先順序

響應優先順序

描述

NVIC_PriorityGroup_0

0

0到15的取值

高4位全部是響應優先順序,無搶佔優先順序

NVIC_PriorityGroup_1

0到1的取值

0到7的取值

搶佔優先順序為1位,響應優先順序為3位

NVIC_PriorityGroup_2

0到3的取值

0到3的取值

搶佔優先順序為2位,

響應優先順序為2位

NVIC_PriorityGroup_3

0到7的取值

0到1的取值

搶佔優先順序為3位,響應優先順序為1位

NVIC_PriorityGroup_4

0到15的取值

0

高4位全部是搶佔優先順序,無響應優先順序

最後,總結一下中斷程式設計的三步曲:

第一步:使能外設某個中斷,具體由對應的中斷使能位控制。

(例如:我們使用到GPIO之前必須開啟GPIO埠的時鐘,用到EXTI必須開啟AFIO時鐘)

第二步:初始化NVIC_InitTypeDef結構體,配置中斷優先順序分組,設定搶佔優先順序和響應優先順序,使能中斷請求。

庫函式:

NVIC_IRQChannel()設定不同的中斷源,在IRQn_Type IRQn結構體尋找自己對應的中斷源。

NVIC_IRQChannelPreemptionPriority()設定搶佔優先順序

NVIC_IRQChannelCmd() 中斷使能或者取消使能

第三步:編寫中斷服務函式,在stm32f0xx_it.c檔案中,都有一個根據中斷向量表,實現的一個空的中斷服務函式,需要我們自己重新編寫。