真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

STM32中斷的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)STM32中斷的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)是專業(yè)的淮安網(wǎng)站建設(shè)公司,淮安接單;提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行淮安網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

中斷,在單片機(jī)中占有非常重要的地位。代碼默認(rèn)地從上向下執(zhí)行,遇到條件或者其他語(yǔ)句,會(huì)按照指定的地方跳轉(zhuǎn)。而在單片機(jī)執(zhí)行代碼的過(guò)程中,難免會(huì)有一些突發(fā)的情況需要處理,這樣就會(huì)打斷當(dāng)前的代碼,待處理完突發(fā)情況之后,程序會(huì)回到被打斷的地方繼續(xù)執(zhí)行。

1 EXTI控制器

外部中斷/事件控制器(EXTI)管理了控制器的 23 個(gè)中斷/事件線。每個(gè)中斷/事件線都對(duì)應(yīng)有一個(gè)邊沿檢測(cè)器,可以實(shí)現(xiàn)輸入信號(hào)的上升沿檢測(cè)和下降沿的檢測(cè)。EXTI 可以實(shí)現(xiàn)對(duì)每個(gè)中斷/事件線進(jìn)行單獨(dú)配置,可以單獨(dú)配置為中斷或者事件,以及觸發(fā)事件的屬性。

STM32中斷的示例分析

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

注意:

1、上面說(shuō),我們可以使用寄存器4軟件模擬中斷事件寄存器模式符合條件的信號(hào)進(jìn)入,為什么不能用6寄存器呢?因?yàn)?/p>

STM32中斷的示例分析

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

2、關(guān)于掛起寄存器,掛起就是,證明有了中斷,會(huì)在觸發(fā)中斷。但是不會(huì)硬件清除。

STM32中斷的示例分析

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

STM32中斷的示例分析

先說(shuō)EXTI吧, 

EXTI 控制器的主要特性:

  • 每個(gè)中斷/事件線上都具有獨(dú)立的觸發(fā)和屏蔽

  • 每個(gè)中斷線都具有專用的狀態(tài)位

  • 支持多達(dá)23個(gè)軟件事件/中斷請(qǐng)求

  • 檢測(cè)脈沖寬度低于APB2 時(shí)鐘寬度的外部信號(hào)

下圖是ST207的框架圖

STM32中斷的示例分析

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

STM32中斷的示例分析

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

STM32中斷的示例分析

STM32中斷的示例分析

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

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

STM32中斷的示例分析

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

2 NVIC控制器

在上面的EXTI寄存器都設(shè)置好后就可以設(shè)置NVIC了,關(guān)于NVIC的芯片編程手冊(cè)上描述較少,但是說(shuō)了

STM32中斷的示例分析

所以我們就參考一下M3手冊(cè)吧

找到AIRCR寄存器,其中8到10位為優(yōu)先級(jí)分組

STM32中斷的示例分析

我們?cè)诖a中使用的庫(kù)函數(shù)是

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

其中我們查到

1、SCB->AIRCR在庫(kù)函數(shù)的地址是0XE000ED0C,不懂的如何查詢的,請(qǐng)自行百度

2、查到SCB的結(jié)構(gòu)體定義

STM32中斷的示例分析

我們看到SCB是SystemControl Block的簡(jiǎn)寫

下面我們說(shuō)一下分組的取值

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                      
  *   ==========================================================================================================================

搶占優(yōu)先級(jí)& 響應(yīng)優(yōu)先級(jí)區(qū)別

  1. 高優(yōu)先級(jí)的搶占優(yōu)先級(jí)是可以打斷正在進(jìn)行的低搶占優(yōu)先級(jí)中斷的。

  2. 搶占優(yōu)先級(jí)相同的中斷,高響應(yīng)優(yōu)先級(jí)不可以打斷低響應(yīng)優(yōu)先級(jí)的中斷。

  3. 搶占優(yōu)先級(jí)相同的中斷,當(dāng)兩個(gè)中斷同時(shí)發(fā)生的情況下,哪個(gè)響應(yīng)優(yōu)先級(jí)高,哪個(gè)先執(zhí)行。

  4. 如果兩個(gè)中斷的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都是一樣的話,則看哪個(gè)中斷先發(fā)生就先執(zhí)行。

例子:

假定設(shè)置中斷優(yōu)先級(jí)組為2,然后設(shè)置

中斷3(RTC中斷)的搶占優(yōu)先級(jí)為2,響應(yīng)優(yōu)先級(jí)為1。

中斷6(外部中斷0)的搶占優(yōu)先級(jí)為3,響應(yīng)優(yōu)先級(jí)為0

中斷7(外部中斷1)的搶占優(yōu)先級(jí)為2,響應(yīng)優(yōu)先級(jí)為0。

那么這3個(gè)中斷的優(yōu)先級(jí)順序?yàn)椋褐袛?>中斷3>中斷6

表現(xiàn)在代碼中

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]; //中斷優(yōu)先級(jí)控制的寄存器組

__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]; //中斷激活標(biāo)志位寄存器組

中斷優(yōu)先級(jí)控制的寄存器組:IP[240]

全稱是:InterruptPriority Registers

240個(gè)8位寄存器,每個(gè)中斷使用一個(gè)寄存器來(lái)確定優(yōu)先級(jí)。

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

每個(gè)IP寄存器的高4位用來(lái)設(shè)置搶占和響應(yīng)優(yōu)先級(jí)(根據(jù)分組),低4位沒(méi)有用到。

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

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

作用:用來(lái)使能中斷

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

ISER[0]的bit0~bit31分別對(duì)應(yīng)中斷0~31。ISER[1]的bit0~27對(duì)應(yīng)中斷32~59;

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

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

作用:用來(lái)失能中斷

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

ICER[0]的bit0~bit31分別對(duì)應(yīng)中斷0~31。ICER[1]的bit0~27對(duì)應(yīng)中斷32~59;

配置方法跟ISER一樣。

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

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

作用:用來(lái)掛起中斷

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

作用:用來(lái)解掛中斷

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);

中斷激活標(biāo)志位寄存器組:IABR[8]

作用:只讀,通過(guò)它可以知道當(dāng)前在執(zhí)行的中斷是哪一個(gè)

如果對(duì)應(yīng)位為1,說(shuō)明該中斷正在執(zhí)行。

static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)

3 code

一定要使能系統(tǒng)時(shí)鐘

因?yàn)榕渲肎PIO和中斷線的映射關(guān)系需要SYSCFG

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource11);

只要用到外部中斷,就一定要打開(kāi)SYSCFG時(shí)鐘

STM32中斷的示例分析

開(kāi)源代碼地址:

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

關(guān)于“STM32中斷的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


文章題目:STM32中斷的示例分析
本文來(lái)源:http://weahome.cn/article/pdocjc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部