娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月11日(星期三)

正在發生

2018年12月11日 | STM32的外部中斷EXTI及NVIC中斷優先級介紹

發布者:Serendipitous55 來源: eefocus關鍵字:STM32  外部中斷  EXTI  NVIC  中斷優先級 手機看文章 掃描二維碼
隨時隨地手機看文章

一、什么是中斷?


打斷當前的操作,執行中斷需要做的事情。


中斷的作用:中斷機制不僅賦予了系統處理意外情況的能力,就可以“同時”完成多個任務,提高了并發“處理”能力。


和線程的區別:線程是同時執行多個任務,中斷是停下來去執行其他的(注意優先級),執行完了再回來執行,


定時器才相當于線程,定一個時間,每到這個時間執行一次



二、中斷概述


STM32F4并沒有使用CM4內核的全部東西,而是只用了它的一部分。


STM32F40xx/STM32F41xx總共有92個中斷


STM32F42xx/STM32F43xx則總共有96個中斷


STM32F40xx/STM32F41xx的92個中斷里面,包括10個內核中斷和82個可屏蔽中斷,具有16級可編程的中斷優先級,而我們常用的就是這82個可屏蔽中斷。


三、外部中斷/事件線映射多達140個GPIO。


 

根據圖文,發現我們的中斷線總共有23根,其中16根是連接PA~PI引腳。 


STM32F4供IO使用的中斷線只有16個:EXTI線0~15:對應外部IO口的輸入中斷。


剩下的七根是分別連接專用設備的:


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


● EXTI 線 16 連接到 PVD 輸出


● EXTI 線 17 連接到 RTC 鬧鐘事件


● EXTI 線 18 連接到 USB OTG FS 喚醒事件


● EXTI 線 19 連接到以太網喚醒事件


● EXTI 線 20 連接到 USB OTG HS(在 FS 中配置)喚醒事件


● EXTI 線 21 連接到 RTC 入侵和時間戳事件


● EXTI 線 22 連接到 RTC 喚醒事件


四、中斷服務函數分配


IO口外部中斷在中斷向量表中只分配了7個中斷向量,也就是只能使用7個中斷服務函數



從表中看出,外部中斷線5~9分配一個中斷向量,共用一個服務函數 外部中斷線10~15分配一個中斷向量,共用一個中斷服務函數


中斷服務函數列表如下:



四、設置中斷優先級的分組


1、中斷優先級有兩種:


      搶占(占先式)優先級 --》 第一序列                  響應(副)優先級 --》 第二序列


 2、搶占優先級 &響應優先級區別:


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


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


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


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



3、中斷優先級設置步驟


    ①系統運行后先設置中斷優先級分組。調用函數:


void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);整個系統執行中只設置一次中斷分組。


   ②針對每個中斷,設置對應的搶占優先級和響應優先級:


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);


  ③如果需要掛起/解掛,查看中斷當前激活狀態,分別調用相關函數即可



五、外部中斷的一般配置步驟


①使能SYSCFG時鐘


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


②初始化IO口為輸入。


    GPIO_Init();


③設置IO口與中斷線的映射關系。


    void SYSCFG_EXTILineConfig();//通過設置SYSCFG寄存器,建立IO口和中斷線的連接


④初始化線上中斷,設置觸發條件等。


    EXTI_Init();


⑤配置中斷分組(NVIC),并使能中斷。


    NVIC_Init();



⑥編寫中斷服務函數。


    EXTIx_IRQHandler();


且清除中斷標志位


EXTI_ClearITPendingBit();//清除中斷標志位是為了表示中斷已經開始執行,可以接收下一個中斷。


----------------------------------------------------------------------------------------------------------------------------------------------------------


代碼如下:


/**********************************************

*

*功能:四個按鍵中斷

*

**********************************************/

#include "exti.h"

 

 

//外部中斷初始化程序

//初始化PE2~4,PA0為中斷輸入.

void EXTI4_Init(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    EXTI_InitTypeDef   EXTI_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

 

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE時鐘

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //KEY0 KEY1 KEY2對應引腳

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

 

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);//PE4 連接到中斷線4

 

    /* 配置EXTI_Line2,3,4 */

    EXTI_InitStructure.EXTI_Line = EXTI_Line4;

    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 = EXTI4_IRQn;//外部中斷4

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//搶占優先級1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優先級2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道

    NVIC_Init(&NVIC_InitStructure);//配置   

}

 

 

void EXTI3_Init(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    EXTI_InitTypeDef   EXTI_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

 

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE時鐘

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //KEY0 KEY1 KEY2對應引腳

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

 

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);//PE4 連接到中斷線4

 

 

    /* 配置EXTI_Line2,3,4 */

    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);//配置

 

    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中斷4

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//搶占優先級1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優先級2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道

    NVIC_Init(&NVIC_InitStructure);//配置   

}

 

 

void EXTI2_Init(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    EXTI_InitTypeDef   EXTI_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE時鐘

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //KEY0 KEY1 KEY2對應引腳

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

 

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE4 連接到中斷線4

 

 

    /* 配置EXTI_Line2,3,4 */

    EXTI_InitStructure.EXTI_Line = EXTI_Line2;

    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 = EXTI2_IRQn;//外部中斷4

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//搶占優先級1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優先級2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道

    NVIC_Init(&NVIC_InitStructure);//配置   

}

 

 

void EXTI0_Init(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    EXTI_InitTypeDef   EXTI_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

 

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA,GPIOE時鐘

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //KEY0 KEY1 KEY2對應引腳

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4

 

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PE4 連接到中斷線4

 

 

    /* 配置EXTI_Line2,3,4 */

    EXTI_InitStructure.EXTI_Line = EXTI_Line0;

    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 = EXTI0_IRQn;//外部中斷4

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//搶占優先級1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優先級2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道

    NVIC_Init(&NVIC_InitStructure);//配置   

}

 

 

//外部中斷4服務程序

void EXTI4_IRQHandler(void)

{

     if(EXTI_GetITStatus(EXTI_Line4) != RESET)//判斷是否置位

    {} 

    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標志位  

}

 

 

//外部中斷3服務程序

void EXTI3_IRQHandler(void)

{

    delay_ms(15);

 

    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標志位  

}

 

 

//外部中斷2服務程序

void EXTI2_IRQHandler(void)

    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標志位  

}

 

 

//外部中斷0服務程序

void EXTI0_IRQHandler(void)

    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標志位  

}


關鍵字:STM32  外部中斷  EXTI  NVIC  中斷優先級 引用地址:STM32的外部中斷EXTI及NVIC中斷優先級介紹

上一篇:Cortex-M0 LPC11C14中斷控制器
下一篇:LPC824 一種IAP實現方法

0

推薦閱讀

廣州車展上,廣汽新能源汽車發布的新款車型“Aion S”新能源汽車采用了日本電產(Nidec)的牽引電機系統“E-Axle”。 牽引電機是在電動車(EV)及插電式混合動力車(PHEV)等新能源汽車中產生驅動力的核心部件。日本電產的牽引電機系統“E-Axle”通過將馬達、變頻器、變速箱整合為一體,實現了緊湊輕量以及高靈活度的車輛布局。此次被Aion S 所采用的E...
流量計測量的介質可以是液體也可以是氣體,雖然氣體和液體都是流體,但在物理性質上有很大差異。所以,流體密度、黏度、氣體組分的變化等都會對流體產生不同的影響。在使用和選型的時候一定要注意流體的變化。(1)對于密度的影響首先最簡單的大家都知道氣體和液體的密度差別是很大的。在標準狀態(溫度為20℃,壓力為101.325Pa)下,空氣的密度為1.2kg/m3...
為掌握新型動力電池的主導權,日本政府傳出將砸數千億日圓資金,幫助全固態電池的研發生產。據日經新聞10日報道,日本官民開始加快新型動力電池——全固態電池的實用化腳步,豐田汽車計劃2025年以前推出搭載全固態電池的電動汽車,三井金屬也準備生產相關材料,日本政府也考慮提供數千億日圓規模補助金。中國企業目前在全球動力電池市場占有很高份額,在電...
12月9日消息,vivo于線上舉辦OriginOS Ocean發布會,正式發布全系操作系統OriginOS Ocean,帶來了全新鎖屏體系、原子隨身聽、原子閱讀、原子隱私系統、原子筆記等交互模式及應用。 vivo副總裁楊健  vivo副總裁楊健表示,在原系統OriginOS 1.0基礎上,OriginOS Ocean帶來了革命性升級。OriginOS Ocean構建了人與世界的全新交互體驗,推動...

史海拾趣

問答坊 | AI 解惑

Modelsim SE 6.5的使用方法

哪位有Modelsim SE 6.5的使用中文教程,共享一下!…

查看全部問答∨

入門問題

什么是Qtopia 文件系統 ?…

查看全部問答∨

WinCE下讀寫GPIO的問題

我在讀寫GPIO的時候遇到了一個很奇怪的問題。 以下程序中,GPECON的內容可以正確讀寫,GPEDAT卻總是很奇怪的數值。 百思不得其解,大家能否幫我看一下? 代碼如下: v_pIOPRegs = (volatile IOPreg*)VirtualAlloc(0, sizeof(IOPreg), MEM_RESER ...…

查看全部問答∨

菜鳥求evc下判斷CSTRING是否為數字的函數

求evc下判斷CSTRING中字符是否為數字(包括小數點)的函數 大俠,請幫忙。…

查看全部問答∨

同時采集16通道頻率信號有什么好的方法

                                 如題:同時采集16通道頻率信號有什么好的方法,采集頻率不高為200--1000HZ…

查看全部問答∨

怎樣把編好的程序寫入單片機啊?

在IAR Embedded Workbench 把程序編好了,設置好編譯環境后調試無錯誤,debugger進入CSPY,我知道的僅僅到這一步,接著怎么做啊?假定我的程序達到我的要求,寫入時通過PET連上了單片機,此時單片機需要供電么?怎么寫入? 哪位高手幫忙解答一下, ...…

查看全部問答∨

【原創】:sd16中斷源的判斷問題

我使用的42X0系列的單片機,使用兩個A/D通道,通道2和通道5,請問在中斷程序中怎么來判斷是那個通道產生的中斷啊?我只是在sd16cctl0寄存器中看到有sd16ifg位,但不知道怎么用來判斷中斷源?請大俠們指教。急!!!…

查看全部問答∨

【設計工具】賽靈思Spartan-6嵌入式套件培訓演示PPT

賽靈思Spartan-6嵌入式套件培訓演示PPT。     …

查看全部問答∨

LM3S9B96學習(二)-----blinky

LM3S9B96學習(二)-----blinky 打開blinky文件夾下的工程,整個工程包含兩個最要的代碼文件 : blinky.c 和 startup_rvmdk.S , startup_rvmdk.S 是系統的啟動文件 ,里面使用匯編語言編寫,因為這個例程不需要修改堆棧和使用到中斷,所以在這 ...…

查看全部問答∨
小廣播
添点儿料...
无论热点新闻、行业分析、技术干货……
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 镇雄县| 江达县| 郴州市| 南城县| 铜鼓县| 太原市| 华宁县| 旺苍县| 泰宁县| 麻城市| 平谷区| 江西省| 壤塘县| 威宁| 揭阳市| 喀喇| 天长市| 建瓯市| 宁乡县| 巴青县| 阿克陶县| 徐州市| 乐昌市| 小金县| 荣昌县| 安西县| 奇台县| 容城县| 晋中市| 敦化市| 双桥区| 西昌市| 横山县| 玉门市| 龙山县| 韶关市| 高淳县| 娱乐| 彭水| 乌兰县| 本溪|