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

歷史上的今天

今天是:2025年03月13日(星期四)

正在發生

2019年03月13日 | 【STM32】外部中斷概述、寄存器、庫函數(EXTI一般步驟)

發布者:anluran 來源: eefocus關鍵字:STM32  外部中斷  寄存器  庫函數 手機看文章 掃描二維碼
隨時隨地手機看文章

STM32F1xx官方資料:


《STM32中文參考手冊V10》-第9章  中斷和事件


 


外部中斷概述

外部中斷(EXTI),和在【STM32】NVIC中斷優先級管理(中斷向量表) 中講述的CM3內核的外部中斷不同。特指的是,在中斷向量表中的EXTI的外部中斷。STM32的每個IO都可以作為外部中斷輸入。


外部中斷線

STM32的中斷控制器支持19個外部中斷、事件請求(也就是19條外部中斷線):


線0~15:對應外部IO口的輸入中斷;

線16:連接到PVD輸出;

線17:連接到RTC鬧鐘事件;

線18:連接到USB喚醒事件。



每條外部中斷線可以獨立的配置觸發方式(上升沿、下降沿或者雙邊沿觸發)、使能/失能中斷、專用的狀態位。


但是,從上面可以看出,STM32供IO使用的中斷線只有16條,但是STM32F10x系列的IO口多達上百個,其中STM32F103ZET6有112個引腳(7組GPIO,每組16個)。那么中斷線怎么跟IO口對應呢?



從上圖可以輕易地看出來:每個GPIOx的同一編號的引腳(共7個)與一條中斷線對應。比如PA0、PB0、PC0、PD0、PE0、PF0、PG0一條中斷線。


注意一下:同一個時間,只能有一個IO口映射到同一個中斷線。也就是說,PA0和PB0不能同一時間映射到同一個中斷線,而PA0、PA1則可以同時映射,因為它們不是在同一個中斷線上。


中斷服務函數

那么是不是16個中斷線就可以分配16個中斷服務函數呢?


答案也不是。之前在【STM32】NVIC中斷優先級管理(中斷向量表) 文章中,我們介紹了中斷向量表。在中斷向量表中,IO口外部中斷在中斷向量表中只分配了7個中斷向量,也就是只能使用7個中斷服務函數。


從上圖中可以看出,外部中斷線5~9分配一個中斷向量,共用一個服務函數;外部中斷線10~15分配一個中斷向量,共用一個中斷服務函數;而中斷向量線0-4則單獨使用一個中斷服務函數。也就是說,IO口的外部中斷最多只能使用7個。


下面列舉了中斷服務函數的名稱(在啟動文件startup_stm32f10x_hd.s上):


void EXTI0_IRQHandler()       

void EXTI1_IRQHandler()

void EXTI2_IRQHandler()           

void EXTI3_IRQHandler()           

void EXTI4_IRQHandler()           

void EXTI9_5_IRQHandler()         

void EXTI15_10_IRQHandler()       

 


外部中斷相關配置寄存器

中斷屏蔽寄存器(EXTI_IMR)

作用:每一位對應著一條中斷線。清零表示屏蔽該線路上的中斷請求;置1表示打開該線路上的中斷請求。


事件屏蔽寄存器(EXTI_EMR)

作用:每一位對應著一條中斷線。清零表示屏蔽該線路上的事件請求;置1表示打開該線路上的事件請求。


上升沿觸發選擇寄存器(EXTI_RTSR)


作用:每一位對應著一條中斷線。清零表示關閉上升沿觸發中斷或事件;置1表示打開上升沿觸發中斷或事件。


下降沿觸發選擇寄存器(EXTI_FTSR)

作用:每一位對應著一條中斷線。清零表示關閉下降沿觸發中斷或事件;置1表示打開下降沿觸發中斷或事件。


軟件觸發事件寄存器(EXTI_SWIER)


作用:每一位對應著一條中斷線。當EXTIx中斷有效且SWIER=0時,向SWIER寫1將觸發中斷請求。


掛起寄存器(EXTI_PR)

作用:每一位對應著一條中斷線。如果第i個中斷觸發了,則PR位對應位自動置1;向PR位寫入1清零該位,同時清除SWIER位。


 


外部中斷配置相關庫函數

1個映射函數

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

作用:設置IO口與中斷線之間的映射關系。


1個初始化函數

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

作用:初始化中斷線,設置觸發方式、中斷還是事件等等。


2個標志位函數

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

作用:前者判斷中斷線中斷狀態,是否發生;后者清除中斷線上的中斷標志位。


實際上固件庫除了這兩個標志位函數之外,還提供了兩個函數來判斷外部中斷狀態和清除愛步狀態標志位的函數,分別為:


FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);

void EXTI_ClearFlag(uint32_t EXTI_Line);

它們的作用和前面兩個函數的作用類似,只是在EXTI_GetITStatus()函數中,會先判斷這種中斷是否使能,使能了才去判斷中斷標志位,而EXTI_GetFlagStatus則直接判斷狀態標志位。


 


外部中斷一般步驟

開啟IO口時鐘,初始化IO口為輸入。調用函數:GPIO_Init();

開啟IO口復用時鐘。調用函數:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

設置IO口與中斷線的映射關系。調用函數:GPIO_EXTILineConfig();

初始化線上中斷,設置觸發條件等。調用函數:EXTI_Init();

配置中斷分組(NVIC),并使能中斷。調用函數:NVIC_Init();

編寫中斷服務函數。調用函數:EXTIx_IRQHandler();

清除中斷標志位。調用函數:EXTI_ClearITPendingBit()。

下面按照這個一般步驟來進行一個簡單的外部中斷程序


void KEY_Init(void) //IO初始化

  GPIO_InitTypeDef GPIO_InitStructure;

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE時鐘

 

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入

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

 

//初始化 WK_UP-->GPIOA.0   下拉輸入

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0設置成輸入,默認下拉   

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

 

}

void EXTIX_Init(void)

{

 

  EXTI_InitTypeDef EXTI_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

 

    KEY_Init(); // 按鍵端口初始化

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能復用功能時鐘

 

    //GPIOE.2 中斷線以及中斷初始化配置   下降沿觸發

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

 

  EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器

 

   //GPIOE.3   中斷線以及中斷初始化配置 下降沿觸發 //KEY1

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);

  EXTI_InitStructure.EXTI_Line=EXTI_Line3;

  EXTI_Init(&EXTI_InitStructure);   //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器

 

   //GPIOE.4   中斷線以及中斷初始化配置  下降沿觸發 //KEY0

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

  EXTI_InitStructure.EXTI_Line=EXTI_Line4;

  EXTI_Init(&EXTI_InitStructure);   //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器

 

 

   //GPIOA.0   中斷線以及中斷初始化配置 上升沿觸發 PA0  WK_UP

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); 

 

  EXTI_InitStructure.EXTI_Line=EXTI_Line0;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

  EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器

 

 

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按鍵WK_UP所在的外部中斷通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2, 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子優先級3

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

  NVIC_Init(&NVIC_InitStructure); 

 

        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按鍵KEY2所在的外部中斷通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2, 

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

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

  NVIC_Init(&NVIC_InitStructure);

 

 

  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按鍵KEY1所在的外部中斷通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子優先級1 

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

  NVIC_Init(&NVIC_InitStructure);    //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器

 

NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //使能按鍵KEY0所在的外部中斷通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子優先級0 

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

  NVIC_Init(&NVIC_InitStructure);    //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器

 

}

 

//外部中斷0服務程序 

void EXTI0_IRQHandler(void)

{

delay_ms(10);//消抖

if(WK_UP==1) //WK_UP按鍵

{  

BEEP=!BEEP;

}

EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中斷標志位  

}

 

//外部中斷2服務程序

void EXTI2_IRQHandler(void)

{

delay_ms(10);//消抖

if(KEY2==0)   //按鍵KEY2

{

LED0=!LED0;

}  

EXTI_ClearITPendingBit(EXTI_Line2);  //清除LINE2上的中斷標志位  

}

//外部中斷3服務程序

void EXTI3_IRQHandler(void)

{

delay_ms(10);//消抖

if(KEY1==0) //按鍵KEY1

{  

LED1=!LED1;

}  

EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中斷標志位  

}

 

void EXTI4_IRQHandler(void)

{

delay_ms(10);//消抖

if(KEY0==0) //按鍵KEY0

{

LED0=!LED0;

LED1=!LED1; 

}  

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

}

EXTIX_Init函數

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE),使能復用功能時鐘,這個步驟不能省略,否則肯定會出問題。【STM32】STM32端口復用和重映射(AFIO輔助功能時鐘)

在編寫中斷處理函數的過程中,在最后一步,一定要記得清除中斷標志位。調用函數:EXTI_ClearITPendingBit()。否則下次中斷就不會發生。


關鍵字:STM32  外部中斷  寄存器  庫函數 引用地址:【STM32】外部中斷概述、寄存器、庫函數(EXTI一般步驟)

上一篇:【STM32】獨立看門狗概述、寄存器、庫函數(IWDG一般步驟)
下一篇:【STM32】STM32固件庫(標準外設庫)

推薦閱讀

????昨日滬深大盤指數延續上周強勢,創業板成交量放大,題材概念股活躍,其中芯片概念股漲幅居前,國家集成電路產業基金(下稱“大基金”)所投資的標的表現突出。  芯片題材活躍  昨日,國科微和兆易創新雙雙錄得漲停,整個國產芯片板塊漲幅超過2%。芯片題材股近期持續活躍,芯片國產化指數自2月以來累計上漲近30%,其中,中科曙光、兆易創新、士蘭...
近日,筆者采訪了曠視科技黨委書記兼副總裁蔣燕女士,分別就我國人工智能產業發展現狀,曠視企業發展規劃等事宜展開深入交流。政府助力,我國AI產業發展有望跑贏美國市場在我國經濟體系結構當中,政商關系一直是企業關系建設過程中至為重要的一環。蔣燕女士目前主要以負責曠視的政府相關事務為主,對我國AI產業發展以及相關政策文件的制定以及發行有比較深...
Silicon Labs已與Redpine Signals達成協議,以3.08億美元的價格收購該公司的Wi-Fi和藍牙業務,包括位于印度海德拉巴的開發中心以及其專利組合。該公司表示,該技術將加速Silicon Labs的Wi-Fi 6芯片和軟件路線圖。此次收購還包括針對音頻應用的藍牙經典IP(包括擴展數據速率),可應用在可穿戴設備,音頻設備,語音助手和智能揚聲器。此次收購包括在印...
據國家能源局3月12日消息,針對“《能源技術創新“十四五”規劃》何時發布的相關問題”的留言,國家能源局回應稱,國家能源局正在組織研究編制《能源技術創新“十四五”規劃》(以下簡稱《規劃》),支撐能源領域重大技術裝備創新發展。 《規劃》的主要思路是聚焦保障能源安全、促進能源轉型和引領能源革命等重大需求,以實現能源科技自立自強為目標,...

史海拾趣

問答坊 | AI 解惑

我的清華紫光U盤在系統下能找到,但是打不開,不能格式化?解決方案

可以到  http://www.crsky.com/soft/4032.html 網上去下載U盤修復軟件USBboot,只要識別該U盤,應該就能修復,我的就是這樣修復好的多謝支持…

查看全部問答∨

求。。設計三人搶答器邏輯電路圖

求。。設計三人搶答器邏輯電路圖!!…

查看全部問答∨

最強大的串口橋式轉換芯片

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 編輯 我公司是JM系列IC的一級代理商,下面是JM IC的功能型號簡介: JMicron智微科技主要產品研發方向為高速串行式連結(High Speed Serial Link)的相關技術,該技術現已廣泛應用于Serial ATA、PCI E ...…

查看全部問答∨

做個FDD接口的U盤如何?

昨日與友人閑談,得知其急需一FDD接口的U盤.用于工控.遂發此貼,求助于諸位.提及FDD(即軟驅),眾皆笑曰:"淘汰久矣!"然,君不見其依然服役于眾多工控場合?隨之FPGA/RAM等先進技術之普及.待處理數據之大,昔日之1.44何以滿足?市有產品曰:仿真軟驅,價格 ...…

查看全部問答∨

3.3 伏至 5 伏互聯技巧

本帖最后由 paulhyde 于 2014-9-15 08:58 編輯 概述 我們對處理速度的需求日益增長,伴隨著這種增長,用來構建單片機的晶體管尺寸則在持續減小。以更低的成本實現更高的集成度,也促進了對更小的幾何尺寸的需求。隨著尺寸的減小,晶體管擊穿電壓 ...…

查看全部問答∨

C++.net硬件開發

請問各位大俠,C++.net能開發硬件程序嗎,就是那種控制門口擋車桿升降的程序。 如果不能,那可以用VisualC++開發嗎? 多種語言開發的程序可不可以組成一個軟件上那? 謝謝各位。…

查看全部問答∨

老嫗變少女,AMD暴笑視頻

       偶然在網上看到了AMD的一個“我為三核狂”活動,整個活動的主旨都是圍繞“三核”的概念來的,網友的熱情和創意也是讓人嘆為觀止,大家下面這些有趣的作品吧。簡直是神了!大家也來欣賞一下哦      &n ...…

查看全部問答∨

誰知道PROTEUS的第三方元件庫怎么添加

有誰知道PROTEUS的第三方元件庫怎么添加啊,我用的是7.5sp3的版本,我把.lib文件加到元件庫里面但是還是以前那些元件,這是怎么回事啊?請大家幫幫忙!!!謝謝…

查看全部問答∨

尋找西安寫PDA軟件的開發人員或公司。

要求:1、熟悉WINCE平臺       2、有相關產品介紹       3、必須是西安的 聯系QQ:112654 信箱:xclion@126.com 價格面談。…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 昌平区| 大关县| 山丹县| 蓬安县| 遂川县| 尉犁县| 芒康县| 乌拉特后旗| 绍兴县| 肇州县| 达州市| 固原市| 固始县| 汕尾市| 仙游县| 峡江县| 肃北| 阳高县| 喜德县| 霍林郭勒市| 清徐县| 宁海县| 东莞市| 元朗区| 安龙县| 凌源市| 石景山区| 耒阳市| 恩平市| 漳浦县| 衡阳县| 乌海市| 建水县| 丰顺县| 滦平县| 清涧县| 大余县| 洛阳市| 瑞安市| 蕲春县| 东城区|