stm32中的外部中断(EXTI External interrupt/event controller)keil中编程方法介绍

一、STM32中断的含义

中断的含义在这里用一个打比方来解释。STM32好比是一个人。这个人,他现在正在干某一项活动(比如写作业,作业还挺多,他估计得写很久),现在他的班主任要找他去干一个某一个活(比如去取个快递,时间比较短的一个活动)。这个时候这个人 ,他放下作业去取快递就是中断。那么如果班主任和校长同时叫他去取快递呢?这个时候,就要涉及到优先级的问题。

二、中断优先级

在初始化一个EXTI的时候,我们需要先指定各个中断的优先级(谁叫来指使这个“他”来干活)。在STM32中, 设置有抢占优先级响应优先级
stm32中的外部中断(EXTI External interrupt/event controller)keil中编程方法介绍_第1张图片
抢占优先级 响应优先级两级比较规则为 : 先比较抢占优先级,如果抢占优先级一样,再比较响应优先级。
每一级比较规则为:“The lower the value, the greater the priority of the corresponding interrupt.”

三、在stm32 keil中的编程

(1)打开时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

//待商榷记得打开复用时钟。

(2)配置GPIO口

GPIO_InitStructre.GPIO_Pin=GPIO_Pin_x; 	// x口作为GPIO,也是EXTI口。
GPIO_InitStructre.GPIO_Mode=GPIO_Mode_IPU/GPIO_Mode_IPU;     //下降沿触发 ,所以给上拉的。
GPIO_InitStructre.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructre);

(3)定义两个配置中断的结构体

 NVIC_InitTypeDef NVIC_InitStru;
 EXTI_InitTypeDef EXTI_InitStru;

NVIC的意思是Nested vectoredinterrupt controller,即嵌套向量中断控制器。

如果需要定义优先级分组的话,采用NVIC_PriorityGroupConfig命令,其中变量填:NVIC_PriorityGroup_1/2/3/4。NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x)

NVIC结构体定义:

NVIC_InitStru.NVIC_IRQChannel:选择哪个中断,中断类型可在STM32中文参考手册_V10.pdf,131页。可以看到EXTI0-4是单独的channel,5-9,10-15是共的一个channel。完整的为EXTI9_5(channel)_IRQn。其中IRQ:Interrupt Request。

NVIC_InitStru.NVIC_IRQChannelCmd:给ENABLE。

NVIC_InitStru.NVIC_IRQChannelPreemptionPriority,NVIC_IRQChannelSubPriority是 抢占优先级 与 响应优先级。

EXTI结构体初始化:

EXTI_InitStru.EXTI_Line:外部的中断通用I/O映像,从此处可以选择line。
stm32中的外部中断(EXTI External interrupt/event controller)keil中编程方法介绍_第2张图片
stm32中的外部中断(EXTI External interrupt/event controller)keil中编程方法介绍_第3张图片
EXTI_InitStru.EXTI_Mode:中断模式选择,可选 中断(EXTI_Mode_Interrupt) 或者 事件(EXTI_Mode_Event)。
模式选择范围
EXTI_InitStru.EXTI_Trigger:触发信号,可选 上升沿(EXTI_Trigger_Rising) 或者下降沿 (EXTI_Trigger_Falling) 或者 上升沿/下降沿(EXTI_Trigger_Rising_Falling)。
触发信号选择
EXTI_InitStru.EXTI_LineCmd:给ENABLE。

再加上 EXTI_Init(&EXTI_InitStru); 就完成EXTI初始化。
(4)总体代码

int main(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);     //需要使能复用时钟
    
	GPIO_InitTypeDef GPIO_InitStructre;
	NVIC_InitTypeDef NVIC_InitStru;
	EXTI_InitTypeDef EXTI_InitStru;
	
    GPIO_InitStructre.GPIO_Pin=GPIO_Pin_8; 	   //在这儿要修改,修改为需要的口。
    GPIO_InitStructre.GPIO_Mode=GPIO_Mode_IPU;     //需要修改,修改为上拉或者下降。
    GPIO_InitStructre.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOC,&GPIO_InitStructre);

	NVIC_InitStru.NVIC_IRQChannel = EXTI9_5_IRQn;     //这儿需要修改, 修改为对应的channel
	NVIC_InitStru.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStru.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStru.NVIC_IRQChannelSubPriority = 0;
	NVIC_Init(&NVIC_InitStru);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);
	
    EXTI_InitStru.EXTI_Line = EXTI_Line8;          //这儿需要修改, 修改为对应的channel
	EXTI_InitStru.EXTI_Mode= EXTI_Mode_Interrupt;
	EXTI_InitStru.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_InitStru.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStru);
	while(1){
		}
}	

void EXTI9_5_IRQHandler(){     //一定要注意是EXTI9_5_IRQHandler,中间有个IRQ 不要落了。
EXTI_ClearITPendingBit(EXTI_Line8);//保证能正确退出
}

你可能感兴趣的:(stm32,stm32,keil,mdk,嵌入式)