STM32系列第9篇--外部中斷
STM32的每個(gè)IO都可以作為外部中斷輸入。
STM32的中斷控制器支持19個(gè)外部中斷/事件請(qǐng)求:
線0~15:對(duì)應(yīng)外部IO口的輸入中斷。
線16:連接到PVD輸出。
線17:連接到RTC鬧鐘事件。
線18:連接到USB喚醒事件。
每個(gè)外部中斷線可以獨(dú)立的配置觸發(fā)方式(上升沿,下降沿或者雙邊沿觸發(fā)),觸發(fā)/屏蔽,專用的狀態(tài)位。
線0~15和IO口映射關(guān)系:
GPIOx.0映射到EXTI0
GPIOx.1映射到EXTI1
…
GPIOx.15映射到EXTI15
外部中斷一般配置步驟:
1、初始化IO口為輸入。
GPIO_Init();
2、 開啟IO口復(fù)用時(shí)鐘。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3、設(shè)置IO口與中斷線的映射關(guān)系。
void GPIO_EXTILineConfig();
4、 初始化線上中斷,設(shè)置觸發(fā)條件等。
EXTI_Init();
5、配置中斷分組(NVIC),并使能中斷。
NVIC_Init();
6、 編寫中斷服務(wù)函數(shù)。
EXTIx_IRQHandler();
7、清除中斷標(biāo)志位
EXTI_ClearITPendingBit();
exti.c
voidEXTIX_Init(void){EXTI_InitTypeDefEXTI_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;KEY_Init();//按鍵端口初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能復(fù)用功能時(shí)鐘GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//設(shè)置IO與中斷線映射關(guān)系/***初始化***/EXTI_InitStructure.EXTI_Line=EXTI_Line4;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//設(shè)置為中斷而不是事件EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能EXTI_Init(&EXTI_InitStructure);/***初始化end***//***初始化NVIC***/NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;//使能按鍵KEY0所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;//搶占優(yōu)先級(jí)2NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00;//子優(yōu)先級(jí)0NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能外部中斷通道NVIC_Init(&NVIC_InitStructure);//根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器/***初始化NVICEND***/}/***中斷服務(wù)函數(shù)***/voidEXTI4_IRQHandler(void){delay_ms(10);//消抖if(KEY0==0)//按鍵KEY0{LED0=!LED0;LED1=!LED1;}EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標(biāo)志位}1234567891011121314151617181920212223242526272829303132333435
main.c
intmain(void){delay_init();//延時(shí)函數(shù)初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)uart_init(115200);//串口初始化為115200LED_Init();//初始化與LED連接的硬件接口BEEP_Init();//初始化蜂鳴器端口KEY_Init();//初始化與按鍵連接的硬件接口EXTIX_Init();//外部中斷初始化LED0=0;//點(diǎn)亮LED0while(1){printf("OKrn");delay_ms(1000);}}