一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

STM32 學(xué)習(xí)筆記之外部中斷的初步了解

 quasiceo 2016-01-21

STM32 學(xué)習(xí)筆記之外部中斷的初步了解

2013-06-19 21:30:06
分享:

 STM32F103有76個(gè)中斷,包括16個(gè)內(nèi)核中斷和60個(gè)可屏蔽中斷,具有16級(jí)16級(jí)可編程的中斷優(yōu)先級(jí)。

理解STM32的中斷,要從中斷優(yōu)先級(jí)哦分組開始。而理解中斷優(yōu)先級(jí)分組,就要理解什么是搶占優(yōu)先級(jí),什么是響應(yīng)優(yōu)先級(jí)。

所謂:

搶占優(yōu)先級(jí):如果有兩中斷先后出發(fā),已經(jīng)在執(zhí)行的中斷優(yōu)先級(jí)如果沒有后出發(fā)的中斷優(yōu)先級(jí)高,就會(huì)先處理搶占優(yōu)先級(jí)高的中斷,也就是說有較高的搶占優(yōu)先級(jí)的中斷可以打斷搶占優(yōu)先級(jí)較低的中斷,這是實(shí)現(xiàn)中斷嵌套的基礎(chǔ)。

響應(yīng)優(yōu)先級(jí):只在同一搶占優(yōu)先級(jí)的中斷同時(shí)觸發(fā)時(shí)起作用。搶占優(yōu)先級(jí)相同,則優(yōu)先執(zhí)行響應(yīng)優(yōu)先級(jí)較高的中斷。響應(yīng)優(yōu)先級(jí)不會(huì)造成中斷的嵌套,如果中斷的兩個(gè)優(yōu)先級(jí)都一致,那么優(yōu)先執(zhí)行位于中斷向量表中位置較高的中斷。

STM32通過中斷向量控制器(NVIC)來分配搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)的數(shù)量。

ARM cortex-m3內(nèi)核中有一個(gè)3位寬度的PRIGROUP數(shù)據(jù)區(qū),用來指示一個(gè)8位數(shù)據(jù)序列中的小數(shù)點(diǎn)的位置從而表示中斷優(yōu)先級(jí)的分組。

如果PRIGROUP數(shù)據(jù)位為000,即為0,說明8位數(shù)據(jù)序列中小數(shù)位置在第1位的左邊,為xxxxxxx.y 。用于表示中斷優(yōu)先級(jí)的分組的含義就是:用7位的數(shù)據(jù)寬度來表示搶占優(yōu)先級(jí)的數(shù)量,即為128,用1位的數(shù)據(jù)寬度來表示響應(yīng)優(yōu)先級(jí)的數(shù)量即為2。

STM32中只有5個(gè)優(yōu)先級(jí)分組,表示方法略有不同:

MDK中定義的中斷相關(guān)的寄存器結(jié)構(gòu)體為:

typedef struct

{

  vu32 ISER[2];

  u32  RESERVED0[30];

  vu32 ICER[2];

  u32  RSERVED1[30];

  vu32 ISPR[2];

  u32  RESERVED2[30];

  vu32 ICPR[2];

  u32  RESERVED3[30];

  vu32 IABR[2];

  u32  RESERVED4[62];

  vu32 IPR[15];

} NVIC_TypeDef;

其中:

ISER 全稱是interupt set-Enable Registers,這是以訛中斷使能寄存器組。ISER[0]的bit0~bit31分別對(duì)應(yīng)中斷0~31.ISER[1]的bit0~bit27對(duì)應(yīng)中斷32~59,要是能某個(gè)中斷,必須設(shè)置相應(yīng)的ISER位為1,使該中斷被使能。

ICER全稱是Interrupt clear-Enable Registers中斷清除寄存器組。該寄存器組的功能與ISER的作用恰好相反,是用來清除某個(gè)走紅段的使能的。

ISPR全稱是Interrupt set-Enable Registers,中斷掛起控制寄存器。通過置1,可以將正在進(jìn)行的中斷掛起,而執(zhí)行同級(jí)或更高級(jí)別的中斷,寫0無效。

ICPR全稱是Interrupt clear-Enable Registers,中斷解掛控制寄存器,通過設(shè)置1,可以將掛起的中斷解掛,置0無效。

IABR全稱是Active Bit Registers,是中斷激活標(biāo)志位寄存器組。對(duì)應(yīng)位所代表的中斷和ISER一樣,如果為1,則表示該位所對(duì)應(yīng)的中斷正在被執(zhí)行。

IPR[15]全稱是Interrupt Priority Registers,是中斷優(yōu)先級(jí)控制的寄存器。IPR寄存器由15個(gè)32bit的寄存器組成,每個(gè)可屏蔽中斷用8bit,IPR[0]的 [31~24],[23~16],[15~8],[7~0]分別對(duì)應(yīng)中斷3~0。

每個(gè)可屏蔽中斷占用的8bit并沒有全部使用,只用了高4位,這4位又分為搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)。

一般把IO口作為外部中斷輸入的步驟:

1.初始化IO口為輸入

2.開啟IO口服用時(shí)鐘,設(shè)置IO口與中斷線的映射關(guān)系

3.開啟與該IO口相對(duì)應(yīng)的線上中斷/事件,設(shè)置觸發(fā)條件

4.配置中斷分組(NVIC),并使能中斷

5.編寫中斷服務(wù)函數(shù)

分享一下中斷程序:

void EXTIX_Init(void)

{

GPIO_InitTypeDef   GPIO_InitStructure;                     //定義端口結(jié)構(gòu)初始化

EXTI_InitTypeDef   EXTI_InitStructure;          //定義中斷結(jié)構(gòu)初始化

NVIC_InitTypeDef   NVIC_InitStructure;                    //定義中斷優(yōu)先級(jí)結(jié)構(gòu)初始化

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);     //改變指定管腳的映射 GPIO_Remap_SWJ_Disable SWJ完全禁用澹(JTAG+SW-DP)

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);     //改變指定管腳的映射GPIO_Remap_SWJ_JTAGDisable,JTAG-DP 禁用?SW-DP使能

 

//初始化KEY01-> PB5,  KEY00->PB4  設(shè)置為輸出

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

KEY01 = 1;

KEY00 = 0;

 

//初始化KEY13->PB3 設(shè)置為輸入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOB, &GPIO_InitStructure);

//初始化KEY12->PC12, KEY11->PC11, KEY10->PC10,設(shè)置為輸入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11|GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOC, &GPIO_InitStructure);

 

//設(shè)置KEY12->PC12, KEY11->PC11, KEY10->PC10中斷

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);         //開啟肞B3與中斷線的映射

 

EXTI_InitStructure.EXTI_Line = EXTI_Line3;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource12);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource11);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource10);

 

EXTI_InitStructure.EXTI_Line = EXTI_Line12;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

EXTI_InitStructure.EXTI_Line = EXTI_Line11;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

EXTI_InitStructure.EXTI_Line = EXTI_Line10;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

   

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

 }

 

void EXTI3_IRQHandler(void)

{

//delay_ms(10);

if(EXTI_GetITStatus(EXTI_Line3) !=RESET)

{

LED4 =!LED4;

        }

EXTI_ClearITPendingBit(EXTI_Line3);

}

 

 

void EXTI15_10_IRQHandler(void)

{

//delay_ms(10);

 

if (EXTI_GetITStatus(EXTI_Line12) !=RESET)

{

LED3 =!LED3;

        }

else if (EXTI_GetITStatus(EXTI_Line11) !=RESET)

{

LED2 =!LED2;

         }

else if (EXTI_GetITStatus(EXTI_Line10) !=RESET)

{

LED1 =!LED1;

         }

EXTI_ClearITPendingBit(EXTI_Line12);      //清除EXTI線路掛起位

EXTI_ClearITPendingBit(EXTI_Line11);      //清除EXTI線路掛起位

EXTI_ClearITPendingBit(EXTI_Line10);      //清除EXTI線路掛起位

}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    手机在线观看亚洲中文字幕| 91亚洲精品亚洲国产| 亚洲熟女少妇精品一区二区三区| 好吊妞视频这里有精品| 黄色在线免费高清观看| 欧美日韩三区在线观看| 丝袜av一区二区三区四区五区| 亚洲第一区欧美日韩在线| 久久精品久久久精品久久| 国产一区二区精品丝袜| 欧美在线观看视频免费不卡| 国产内射一级二级三级| 欧美成人免费一级特黄| 黑鬼糟蹋少妇资源在线观看| 视频在线观看色一区二区| 狠狠做五月深爱婷婷综合| 国产亚洲精品岁国产微拍精品 | 亚洲精品高清国产一线久久| 日本午夜免费啪视频在线| 国产精品自拍杆香蕉视频| 日本高清一区免费不卡| 欧美国产在线观看精品| 国产免费无遮挡精品视频| 丝袜视频日本成人午夜视频 | 麻豆精品在线一区二区三区| 太香蕉久久国产精品视频| 国产精品免费自拍视频| 国产精品午夜性色视频| 91麻豆视频国产一区二区| 欧美日韩国产综合特黄| 午夜视频成人在线免费| 久久久精品日韩欧美丰满| 亚洲综合激情另类专区老铁性| 国产麻豆精品福利在线| 国产精品国产亚洲区久久| 欧美日韩亚洲综合国产人| 久热香蕉精品视频在线播放| 欧美日韩亚洲国产av| 国内九一激情白浆发布| 成人亚洲国产精品一区不卡| 国产午夜精品久久福利|