国产肉体XXXX裸体137大胆,国产成人久久精品流白浆,国产乱子伦视频在线观看,无码中文字幕免费一区二区三区 国产成人手机在线-午夜国产精品无套-swag国产精品-国产毛片久久国产

新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 NVIC 中斷優(yōu)先級(jí)管理

STM32 NVIC 中斷優(yōu)先級(jí)管理

作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
CM3內(nèi)核支持256個(gè)中斷,其中包含了16個(gè)內(nèi)核中斷和240個(gè)外部中斷,并且具有256級(jí)的可編程中斷設(shè)置。但STM32并沒有使用CM3內(nèi)核的全部東西,而是只用了它的一部分。STM32有84個(gè)中斷,包括16個(gè)內(nèi)核中斷和68個(gè)可屏蔽中斷,具有16級(jí)可編程的中斷優(yōu)先級(jí)。而我們常用的就是這68個(gè)可屏蔽中斷,但是STM32的68個(gè)可屏蔽中斷,在STM32F103系列上面,又只有60個(gè)(在107系列才有68個(gè))。

在MDK內(nèi),與NVIC相關(guān)的寄存器,MDK為其定義了如下的結(jié)構(gòu)體:

本文引用地址:http://m.ptau.cn/article/201611/317044.htm
  1.   typedefstruct
  2.   {
  3.   vu32 ISER[2];
  4.   u32 RESERVED0[30];
  5.   vu32 ICER[2];
  6.   u32 RSERVED1[30];
  7.   vu32 ISPR[2];
  8.   u32 RESERVED2[30];
  9.   vu32 ICPR[2];
  10.   u32 RESERVED3[30];
  11.   vu32 IABR[2];
  12.   u32 RESERVED4[62];
  13.   vu32 IPR[15];
  14.   }NVIC_TypeDef;

STM32的中斷在這些寄存器的控制下有序的執(zhí)行的。只有了解這些中斷寄存器,才能了解STM32的中斷。下面簡要介紹這幾個(gè)寄存器:

ISER[2]:ISER全稱是:InterruptSet-EnableRegisters,這是一個(gè)中斷使能寄存器組。上面說了STM32F103的可屏蔽中斷只有60個(gè),這里用了2個(gè)32位的寄存器,總共可以表示64個(gè)中斷。而STM32F103只用了其中的前60位。ISER[0]的bit0~bit31分別對(duì)應(yīng)中斷0~31。ISER[1]的bit0~27對(duì)應(yīng)中斷32~59;這樣總共60個(gè)中斷就分別對(duì)應(yīng)上了。你要使能某個(gè)中斷,必須設(shè)置相應(yīng)的ISER位為1,使該中斷被使能(這里僅僅是使能,還要配合中斷分組、屏蔽、IO口映射等設(shè)置才算是一個(gè)完整的中斷設(shè)置)。具體每一位對(duì)應(yīng)哪個(gè)中斷,請(qǐng)參考stm32f10x_nvic..h里面的第36行處。

ICER[2]:全稱是:InterruptClear-EnableRegisters,是一個(gè)中斷除能寄存器組。該寄存器組與ISER的作用恰好相反,是用來清除某個(gè)中斷的使能的。其對(duì)應(yīng)位的功能,也和ICER一樣。這里要專門設(shè)置一個(gè)ICER來清除中斷位,而不是向ISER寫0來清除,是因?yàn)镹VIC的這些寄存器都是寫1有效的,寫0是無效的。

ISPR[2]:全稱是:InterruptSet-PendingRegisters,是一個(gè)中斷掛起控制寄存器組。每個(gè)位對(duì)應(yīng)的中斷和ISER是一樣的。通過置1,可以將正在進(jìn)行的中斷掛起,而執(zhí)行同級(jí)或更高級(jí)別的中斷。寫0是無效的。

ICPR[2]:全稱是:InterruptClear-PendingRegisters,是一個(gè)中斷解掛控制寄存器組。其作用與ISPR相反,對(duì)應(yīng)位也和ISER是一樣的。通過設(shè)置1,可以將掛起的中斷接掛。寫0無效。

IABR[2]:全稱是:InterruptActiveBitRegisters,是一個(gè)中斷激活標(biāo)志位寄存器組。這是一個(gè)只讀寄存器,通過它可以知道當(dāng)前在執(zhí)行的中斷是哪一個(gè)。在中斷執(zhí)行完了由硬件自動(dòng)清零。對(duì)應(yīng)位所代表的中斷和ISER一樣,如果為1,則表示該位所對(duì)應(yīng)的中斷正在被執(zhí)行。

IPR[15]:全稱是:InterruptPriorityRegisters,是一個(gè)中斷優(yōu)先級(jí)控制的寄存器組。這個(gè)寄存器組相當(dāng)重要!STM32的中斷分組與這個(gè)寄存器組密切相關(guān)。因?yàn)镾TM32的中斷多達(dá)60多個(gè),所以STM32采用中斷分組的辦法來確定中斷的優(yōu)先級(jí)。IPR寄存器組由15個(gè)32bit的寄存器組成,每個(gè)可屏蔽中斷占用8bit,這樣總共可以表示15*4=60個(gè)可屏蔽中斷。剛好和STM32的可屏蔽中斷數(shù)相等。IPR[0]的[31~24],[23~16],[15~8],[7~0]分別對(duì)應(yīng)中斷3~0,依次類推,總共對(duì)應(yīng)60個(gè)外部中斷。而每個(gè)可屏蔽中斷占用的8bit并沒有全部使用,而是只用了高4位。這4位,又分為搶占優(yōu)先級(jí)和子優(yōu)先級(jí)。搶占優(yōu)先級(jí)在前,子優(yōu)先級(jí)在后。而這兩個(gè)優(yōu)先級(jí)各占幾個(gè)位又要根據(jù)SCB->AIRCR中的中斷斷分組設(shè)置來決定。

這里簡單介紹一下STM32的中斷分組:STM32將中斷分為5個(gè)組,組0~4。該分組的設(shè)置是由SCB->AIRCR寄存器的bit10~8來定義的。具體的分配關(guān)系如表


通過這個(gè)表,我們就可以清楚的看到組0~4對(duì)應(yīng)的配置關(guān)系,例如組設(shè)置為3,那么此時(shí)所有的60個(gè)中斷,每個(gè)中斷的中斷優(yōu)先寄存器的高四位中的最高3位是搶占優(yōu)先級(jí),低1位是響應(yīng)優(yōu)先級(jí)。每個(gè)中斷,你可以設(shè)置搶占優(yōu)先級(jí)為0~7,響應(yīng)優(yōu)先級(jí)為1或0。搶占優(yōu)先級(jí)的級(jí)別高于響應(yīng)優(yōu)先級(jí)。而數(shù)值越小所代表的優(yōu)先級(jí)就越高。

這里需要注意兩點(diǎn):第一,如果兩個(gè)中斷的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都是一樣的話,則看哪個(gè)中斷先發(fā)生就先執(zhí)行;第二,高優(yōu)先級(jí)的搶占優(yōu)先級(jí)是可以打斷正在進(jìn)行的低搶占優(yōu)先級(jí)中斷的。而搶占優(yōu)先級(jí)相同的中斷,高優(yōu)先級(jí)的響應(yīng)優(yōu)先級(jí)不可以打斷低響應(yīng)優(yōu)先級(jí)的中斷。

使用庫函數(shù)實(shí)現(xiàn)以上中斷分組設(shè)置以及中斷優(yōu)先級(jí)管理,使得我們以后的中斷設(shè)置簡單化。NVIC中斷管理函數(shù)主要在misc.c文件里面。

首先是中斷優(yōu)先級(jí)分組函數(shù)NVIC_PriorityGroupConfig,這個(gè)函數(shù)的作用是對(duì)中斷的優(yōu)先級(jí)進(jìn)行分組,這個(gè)函數(shù)在系統(tǒng)中只能被調(diào)用一次,一旦分組確定就最好不要更改。

比如我們?cè)O(shè)置整個(gè)系統(tǒng)的中斷優(yōu)先級(jí)分組值為2(2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)”),那么方法是:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

設(shè)置好了系統(tǒng)中斷分組,那么對(duì)于每個(gè)中斷又怎么確定他的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)呢?下面看一個(gè)重要的函數(shù)為中斷初始化函數(shù)NVIC_Init,其函數(shù)申明為:

voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)

其中NVIC_InitTypeDef是一個(gè)結(jié)構(gòu)體,可以看看結(jié)構(gòu)體的成員變量:

  1.    typedefstruct
  2.    {
  3.      uint8_t NVIC_IRQChannel;//定義初始化的是哪個(gè)中斷,這個(gè)我們可以在 stm32f10x.h 中找到每個(gè)中斷對(duì)應(yīng)的名字。例如 USART1_IRQn。
  4.      uint8_t NVIC_IRQChannelPreemptionPriority;//定義這個(gè)中斷的搶占優(yōu)先級(jí)別。
  5.      uint8_t NVIC_IRQChannelSubPriority;//定義這個(gè)中斷的子優(yōu)先級(jí)別。
  6.      FunctionalState NVIC_IRQChannelCmd;//該中斷是否使能。
  7.    }NVIC_InitTypeDef;

比如我們要使能串口1的中斷,同時(shí)設(shè)置搶占優(yōu)先級(jí)為1,子優(yōu)先級(jí)位2,初始化的方法是:

  1.    USART_InitTypeDef USART_InitStructure;
  2.    NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//串口 1 中斷
  3.    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;// 搶占優(yōu)先級(jí)為 1
  4.    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;// 子優(yōu)先級(jí)位 2
  5.    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ 通道使能
  6.    NVIC_Init(&NVIC_InitStructure);



評(píng)論


技術(shù)專區(qū)

關(guān)閉