STM32外部中断 按键触发

一.外部中断的配置流程

           定义结构体变量

1.使能SYSCFG时钟、使能GPIOE时钟

2.初始化GPIO、设置GPIOE各项参数

3.设置IO口与中断线的映射关系

4.初始化线上中断、设置中断各项参数

5.配置中断分组、设置各项参数

6.编写对应的中断服务函数、清除中断标志位等

二.以上六个步骤就可以成功配置中断初始化函数了

1.第一步使能SYSCFG时钟、使能GPIOE时钟

    //使能APB2SYSCFG时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	//使能GPIOE时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA, ENABLE);

2.第二步初始化GPIO、设置GPIOE各项参数,因为这是用按键触发中断,所以采用的是通用输入模式 ,STM32的KEY_UP按键是在PA0口,且是高电平接通,所以初始化GPIOA就需要设置为下拉                  注意:STM32的结构体变量需要放在初始化函数的最上面!!!

    GPIOF_InitStructure.GPIO_Mode = GPIO_Mode_IN;             //通用输出模式
	GPIOF_InitStructure.GPIO_OType = GPIO_OType_PP;           //推挽输出
	GPIOF_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3 | GPIO_Pin_2;
	GPIOF_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;             //上拉
	GPIOF_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	//初始化GPIOE
	GPIO_Init(GPIOE, &GPIOF_InitStructure);

    GPIOF_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIOF_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;           //下拉
	//初始化GPIOA
	GPIO_Init(GPIOA, &GPIOF_InitStructure);

最上方

 3.第三步设置IO口与中断线的映射关系

//映射中断线   PE4->中断线4
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);

4.第四步初始化线上中断、设置中断各项参数

EXTI_InitStruture.EXTI_Line = EXTI_Line4;                     //中断线4
	EXTI_InitStruture.EXTI_LineCmd = ENABLE;                  //使能
	EXTI_InitStruture.EXTI_Mode = EXTI_Mode_Interrupt;        //中断触发
	EXTI_InitStruture.EXTI_Trigger = EXTI_Trigger_Falling;	  //下降沿触发	
	//中断初始化
	EXTI_Init(&EXTI_InitStruture);

5.第五步配置中断分组、设置各项参数

        配置中断优先级需要现在主函数中配置中断分组。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       //中断分组2

        在中断初始化函数中还有最后一步

NVIC_InitStruture.NVIC_IRQChannel = EXTI4_IRQn;               //配置中断线4通道
	NVIC_InitStruture.NVIC_IRQChannelCmd = ENABLE ;           //使能
	NVIC_InitStruture.NVIC_IRQChannelPreemptionPriority = 2;  //抢占优先级设置为2
	NVIC_InitStruture.NVIC_IRQChannelSubPriority = 1;         //响应优先级设置为1
    //中断优先级初始化
	NVIC_Init(&NVIC_InitStruture);

6.第六步编写对应的中断服务函数、清除中断标志位等

void EXTI4_IRQHandler(void)
{
	delay_ms(10);
	if(KEY0 == 0)
	{
		LED9 = ~LED9;
	}
	EXTI_ClearITPendingBit(EXTI_Line4);       //清除中断标志位 
}

好了!!!

        最后的效果是用按键触发中断,按下一次触发一次中断,LED进行取反一次。

猜你喜欢

转载自blog.csdn.net/x97666/article/details/121388136