中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

STM32中斷的示例分析

發布時間:2021-12-27 11:27:05 來源:億速云 閱讀:279 作者:小新 欄目:互聯網科技

這篇文章將為大家詳細講解有關STM32中斷的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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

1 EXTI控制器

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

STM32中斷的示例分析

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

注意:

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

STM32中斷的示例分析

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

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

STM32中斷的示例分析

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

STM32中斷的示例分析

先說EXTI吧, 

EXTI 控制器的主要特性:

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

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

  • 支持多達23個軟件事件/中斷請求

  • 檢測脈沖寬度低于APB2 時鐘寬度的外部信號

下圖是ST207的框架圖

STM32中斷的示例分析

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

STM32中斷的示例分析

另外七根 EXTI 線連接方式如下

STM32中斷的示例分析

STM32中斷的示例分析

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

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

STM32中斷的示例分析

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

2 NVIC控制器

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

STM32中斷的示例分析

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

找到AIRCR寄存器,其中8到10位為優先級分組

STM32中斷的示例分析

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

void NVIC_PRIGroup_Enable(uint32_t NVIC_PRIGroup)
{
    /*Set the priority grouping value */
    SCB->AIRCR =AIRCR_VECTKEY_MASK | NVIC_PRIGroup;
}

其中我們查到

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

2、查到SCB的結構體定義

STM32中斷的示例分析

我們看到SCB是SystemControl Block的簡寫

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

STM32中斷的示例分析

在misc.c中有

*   ==========================================================================================================================
 *      NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority |NVIC_IRQChannelSubPriority  |       Description
  *   ==========================================================================================================================
 *     NVIC_PriorityGroup_0  |                0                  |           0-15             | 0 bits for pre-emption priority
  *                          |                                   |                            | 4 bits for subpriority
  *   --------------------------------------------------------------------------------------------------------------------------
 *     NVIC_PriorityGroup_1  |                0-1                |           0-7              | 1 bits for pre-emption priority
  *                          |                                   |                            | 3 bits for subpriority
  *   --------------------------------------------------------------------------------------------------------------------------  
  *     NVIC_PriorityGroup_2  |                0-3               |            0-3              | 2 bits for pre-emption priority
 *                           |                                   |                            | 2 bits for subpriority
  *   --------------------------------------------------------------------------------------------------------------------------  
  *     NVIC_PriorityGroup_3  |                0-7               |            0-1              | 3 bits for pre-emption priority
 *                           |                                   |                            | 1 bits for subpriority
  *   --------------------------------------------------------------------------------------------------------------------------  
  *     NVIC_PriorityGroup_4  |                0-15              |            0                | 4 bits for pre-emption priority
 *                           |                                   |                            | 0 bits for subpriority                      
  *   ==========================================================================================================================

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

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

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

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

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

例子:

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

中斷3(RTC中斷)的搶占優先級為2,響應優先級為1。

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

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

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

表現在代碼中

NVIC_InitPara NVIC_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~0,pri1的取值范圍0~16

分組2,那么pri的取值范圍0~4,pri1的取值范圍0~4

分組4,那么pri的取值范圍0~16,pri1的取值范圍0~0

下面我們講解一下NVIC寄存器

STM32中斷的示例分析

__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

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

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

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

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

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

作用:用來使能中斷

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

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

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

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

作用:用來失能中斷

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

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

配置方法跟ISER一樣。

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

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

作用:用來掛起中斷

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

作用:用來解掛中斷

static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn);
static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);
static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn);

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

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

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

static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)

3 code

一定要使能系統時鐘

因為配置GPIO和中斷線的映射關系需要SYSCFG

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource11);

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

STM32中斷的示例分析

開源代碼地址:

https://github.com/strongercjd/STM32F207VCT6/tree/master/09-EXTI

關于“STM32中斷的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绍兴市| 武宣县| 伊宁市| 类乌齐县| 怀远县| 城市| 筠连县| 额济纳旗| 措美县| 武隆县| 江西省| 华亭县| 大同市| 阳曲县| 衢州市| 巩义市| 政和县| 耒阳市| 隆子县| 扶绥县| 资溪县| 安庆市| 南昌县| 通化市| 柯坪县| 蓝田县| 新野县| 玉田县| 甘洛县| 神池县| 张北县| 保康县| 板桥市| 内乡县| 司法| 综艺| 治县。| 桂阳县| 酒泉市| 冀州市| 准格尔旗|