日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32外部中断与各通道对应关系

發布時間:2025/6/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32外部中断与各通道对应关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

EXTI0_IRQn的值,其實就是EXTI0中斷向量在中斷向量表中的位置(STM32技術參考手冊中斷向量表position欄中的數值)

一:外部中斷使用配置過程:

(1)配置時鐘信號
(2)引腳屬性
(3)NVIC配置

(4)外部中斷配置

二:配置步驟

步驟如下:?
1.系統初始化,如系統時鐘初始化,使之進入72MHZ主頻;程序啟動時已調用SystemInit()函數將主頻改為72MHZ。
2.GPIO配置,務必注意打開GPIO時鐘時,一定打開AFIO時鐘。?在使用引腳的重映射功能和外部中斷時需要使用AFIO時鐘。
3.EXTI配置,在這里配置需要選擇哪個引腳作為中斷引腳。?

//定義一個EXTI初始化結構體
EXTI_InitTypeDef?EXTI_InitStructure;?
//設置中斷線:EXTIL_Line1為中斷線1
EXTI_InitStructure.EXTI_Line?=?EXTI_Line1;?
//模式
EXTI_InitStructure.EXTI_Mode?=?EXTI_Mode_Interrupt;?


模式:這里有兩個模式:(1)中斷模式,(2)事件,具體區別如下:
“事件:是表示檢測有一某件觸發事件發生了。中斷:有某個事件發生并產生中斷,并跳轉到對應的中斷處理程序中。事件可以觸發中斷,也可以不觸發中斷有可能被更優先的中斷屏蔽,事件不會事件本質上就是一個觸發信號,是用來觸發特定的外設模塊或核心本身(喚醒).事件只是一個觸發信號(脈沖),而中斷則是一個固定的電平信號”


//設置中斷觸發方式(3種)

?EXTI_InitStructure.EXTI_Trigger?=?EXTI_Trigger_Falling;

?EXTI_Trigger_Falling:設置輸入線路下降沿為中斷請求
?EXTI_Trigger_Rising:設置輸入線路上升沿為中斷請求
? EXTI_Trigger_Rising_Falling:設置輸入線路上升沿和下降沿為中斷請求

?//定義選擇中斷線的新狀態
?EXTI_InitStructure.EXTI_LineCmd=ENABLE;

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


?4.NVIC配置,這也是比單片機多出來的部分,我們必須把NVIC中對應的通道使能,并且設置優先級別。


?5.編寫中斷函數

?void EXTI2_IRQHandler(void)

三:STM32外部中斷與各通道對應關系

例子 1:

exit.c文件#include "exti.h" #include "delay.h" extern int isr_flag ;void EXTIX_Init(void) {EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;//時鐘配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);//IO配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOE, &GPIO_InitStructure);GPIO_SetBits(GPIOE,GPIO_Pin_0); //EXTIGPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0);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); //NVICNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }void EXTI0_IRQHandler(void) {delay_ms(1); if(EXTI_GetITStatus(EXTI_Line0)!=RESET){isr_flag = 1;EXTI_ClearITPendingBit(EXTI_Line0); } }

例子2:

#include "exti.h" #include "led.h" #include "key.h" #include "delay.h" #include "usart.h" #include "beep.h" //外部中斷0服務程序 void EXTIX_Init(void) {EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;//初始化KEY0-->GPIOA.13,KEY1-->GPIOA.15 上拉輸入RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);//使能PORTA,PORTE時鐘//IO初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //PE2~4GPIO_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//EXTI//GPIOE.2 中斷線以及中斷初始化配置 下降沿觸發GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2EXTI_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 中斷線以及中斷初始化配置 下降沿觸發 //KEY1GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);EXTI_InitStructure.EXTI_Line=EXTI_Line3;EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器//GPIOE.4 中斷線以及中斷初始化配置 下降沿觸發 //KEY0GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);EXTI_InitStructure.EXTI_Line=EXTI_Line4;EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器//GPIOA.0 中斷線以及中斷初始化配置 上升沿觸發 PA0 WK_UPGPIO_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寄存器//NVICNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按鍵WK_UP所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子優先級3NVIC_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; //子優先級2NVIC_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(KEY3==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上的中斷標志位 }

總結

以上是生活随笔為你收集整理的STM32外部中断与各通道对应关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。