STM32 中斷詳解,適合初級學員

2022-05-27     大方老師單片機

原標題:STM32 中斷詳解,適合初級學員

STM32中斷詳解適合初級學員

中斷,在單片機中占有非常重要的地位。代碼默認地從上向下執行,遇到條件或者其他語句,會按照指定的地方跳轉。而在單片機執行代碼的過程中,難免會有一些突發的情況需要處理,這樣就會打斷當前的代碼,待處理完突發情況之後,程序會回到被打斷的地方繼續執行。

1 EXTI控制器

外部中/事件控制(EXTI)管理了控制器 23個中/事件線。每個中/事件線都對應有一個邊沿檢測器,可以實現輸入信號的上升沿檢測和下降沿的檢測EXTI可以實現對每個中/事件線進行單獨配置,可以單獨配置為中斷或者事件,以及觸發事件的屬性。

外部信號進入經1的邊沿檢測電路,檢測是否符(23的上升沿和下降沿選擇寄存器決),產生信號,然後4軟體中斷事件寄存器或值,(在這裡也就說可以寫入軟體中斷事件寄存器模擬中斷和事件),之後產生信號一分為二,5中斷屏蔽寄存器7事件屏蔽寄存器,如果中斷和事件都沒有屏蔽,首先會產生事件,進入脈衝發生器。其次,會進6掛起寄存器,然後進NVIC

注意:

1、上面說,我們可以使用寄存4軟體模擬中斷事件寄存器模式符合條件的信號進入,為什麼不能6寄存器呢?因為

寄存器是可讀可清除的寄存器,通過1清除。0無效。所以不能使用

2、關於掛起寄存器,掛起就是,證明有了中斷,會在觸發中斷。但是不會硬體清除。

只能軟體清除,或者修改邊沿極性的時候清除。如下

EXTI吧,

EXTI控制器的主要特:

·每個中/事件線上都具有獨立的觸發和屏蔽

·每個中斷線都具有專用的狀態位

·支持多23個軟體事/中斷請求

·檢測脈衝寬度低APB2時鐘寬度的外部信號

下圖ST207的框架圖

下圖為翻譯版

從圖中看出和外部中斷有關的寄存器有:上升沿觸發選擇、下降沿觸發選擇、軟體中斷事件寄存器、中斷屏蔽寄存器、掛起請求寄存器、事件屏蔽寄存器NVIC中斷控制寄存器等。此外就是對輸入線的理解了。

另外七 EXTI線連接方式如下

也就是說對於一個外部中斷線可以和多GPIO相連,當你要使用哪一IO的時候只要SYSCFG_EXTICR對應的位設置就好了,在中斷屏蔽寄存器或事件屏蔽寄存器對應位可以設置使用哪一個中斷線

ST的使SYSCFG_EXTICR來配置GD的采AFIO寄存器(GPIO寄存器中)

EXTI是外部中斷吧,上面的主要是針對的22條中斷線的說明,我們還知道還是有很多中斷的,比如定時器中斷,串口中斷等等,他們不屬於22條中斷線。

我們可以在中斷向量表中看到

其他的中斷配置都在各個模塊的寄存器中了

2 NVIC控制器

在上面EXTI寄存器都設置好後就可以設NVIC了,關NVIC的晶片編程手冊上描述較少,但是說了

所以我們就參考一M3手冊吧

AIRCR寄存器,其810位為優先級分組

我們在代碼中使用的庫函數是

voidNVIC_PRIGroup_Enable(uint32_tNVIC_PRIGroup){

/*Set the priority grouping value */

SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PRIGroup;}

其中我們查到

1SCB->AIRCR在庫函數的地址0XE000ED0C,不懂的如何查詢的,請自行百度

2、查SCB的結構體定義

我們看SCBSystemControl Block的簡寫

下面我們說一下分組的取值

misc.c中有

*==========================================================================================================================

*NVIC_PriorityGroup|NVIC_IRQChannelPreemptionPriority|NVIC_IRQChannelSubPriority|Description

*==========================================================================================================================

*NVIC_PriorityGroup_0|0|0-15|0bitsforpre-emptionpriority

*|||4bitsforsubpriority

*--------------------------------------------------------------------------------------------------------------------------

*NVIC_PriorityGroup_1|0-1|0-7|1bitsforpre-emptionpriority

*|||3bitsforsubpriority

*--------------------------------------------------------------------------------------------------------------------------

*NVIC_PriorityGroup_2|0-3|0-3|2bitsforpre-emptionpriority

*|||2bitsforsubpriority

*--------------------------------------------------------------------------------------------------------------------------

*NVIC_PriorityGroup_3|0-7|0-1|3bitsforpre-emptionpriority

*|||1bitsforsubpriority

*--------------------------------------------------------------------------------------------------------------------------

*NVIC_PriorityGroup_4|0-15|0|4bitsforpre-emptionpriority

*|||0bitsforsubpriority

*==========================================================================================================================

搶占優先&響應優先級區別

.高優先級的搶占優先級是可以打斷正在進行的低搶占優先級中斷的。

.搶占優先級相同的中斷,高響應優先級不可以打斷低響應優先級的中斷。

.搶占優先級相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先級高,哪個先執行。

.如果兩個中斷的搶占優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行。

例子:

假定設置中斷優先級組2,然後設置

3(RTC)的搶占優先級2,響應優先級1

6(外部中0)的搶占優先級3,響應優先級0

7(外部中1)的搶占優先級2,響應優先級0

那麼3個中斷的優先級順序為:中7>3>6

表現在代碼中

NVIC_InitParaNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQ=IRQn;NVIC_InitStructure.NVIC_IRQPreemptPriority=pri;NVIC_InitStructure.NVIC_IRQSubPriority=pri1;NVIC_InitStructure.NVIC_IRQEnable=ENABLE;NVIC_Init(&NVIC_InitStructure);

0,那pri的取值范0~0pri1的取值范0~16

2,那pri的取值范0~4pri1的取值范0~4

4,那pri的取值范0~16pri1的取值范0~0

下面我們講解一NVIC寄存器

__IO uint8_t IP[240]; //中斷優先級控制的寄存器組

__IO uint32_t ISER[8]; //中斷使能寄存器組

__IO uint32_t ICER[8]; //中斷失能寄存器組

__IO uint32_t ISPR[8]; //中斷掛起寄存器組

__IO uint32_t ICPR[8]; //中斷解掛寄存器組

__IO uint32_t IABR[8]; //中斷激活標誌位寄存器組

中斷優先級控制的寄存器組IP[240]

全稱是InterruptPriority Registers

2408位寄存器,每個中斷使用一個寄存器來確定優先級。

比如STM32F10x系列一60個可屏蔽中斷,使IP[59]~IP[0]

IP寄存器的4位用來設置搶占和響應優先級(根據分組),4位沒有用到。

voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct);

中斷使能寄存器組ISER[8]

作用:用來使能中斷

32位寄存器,每個位控制一個中斷的使能STM32F10x60個可屏蔽中斷,所以只使用了其中ISER[0]ISER[1]

ISER[0]bit0~bit31分別對應中0~31ISER[1]bit0~27對應中32~59

voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct);

中斷失能寄存器組ICER[8]

作用:用來失能中斷

32位寄存器,每個位控制一個中斷的失能STM32F10x60個可屏蔽中斷,所以只使用了其中ICER[0]ICER[1]

ICER[0]bit0~bit31分別對應中0~31ICER[1]bit0~27對應中32~59

配置方法ISER一樣。

voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct);

中斷掛起控制寄存器組ISPR[8]

作用:用來掛起中斷

中斷解掛控制寄存器組ICPR[8]

作用:用來解掛中斷

static__INLINEvoidNVIC_SetPendingIRQ(IRQn_TypeIRQn)static__INLINEuint32_tNVIC_GetPendingIRQ(IRQn_TypeIRQn)static__INLINEvoidNVIC_ClearPendingIRQ(IRQn_TypeIRQn);

中斷激活標誌位寄存器組IABR[8]

作用:只讀,通過它可以知道當前在執行的中斷是哪一個

如果對應位1,說明該中斷正在執行。

static__INLINEuint32_tNVIC_GetActive(IRQn_TypeIRQn)

3 code

一定要使能系統時鐘

因為配GPIO和中斷線的映射關係需SYSCFG

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource11);

只要用到外部中斷,就一定要打SYSCFG時鐘

開原始碼地址:

【文章福利】:小編整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件裡面,有需要的可以自行添加哦!~點擊綠色通訊軟體搜airuimcu加入。

文章來源: https://twgreatdaily.com/zh-cn/52a565aa211495a58bb0d91e894ed775.html