2023版 STM32实战3 按键外部中断(电路与代码都讲解)

常规电路(带上拉电阻)

阻值可选3.3/4.7/5.1/10 单位K
在这里插入图片描述

偷懒电路

利用GPIO内部的上拉模式
在这里插入图片描述

代码(直接拷贝使用)

这是一个外部中断控制变量a增加减少的demo
为了新手方便我直接都写在了main.c文件

#include "stm32f10x.h"

u8 keyflag=0;
u8 a=0;

void KEY_Init(void)
{

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
	GPIO_InitTypeDef GPIO_in;
	GPIO_in.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_in.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4;
	GPIO_Init(GPIOE,&GPIO_in);
	
}

void My_EXIT_Init(void)
{
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
	EXTI_InitTypeDef EXTI_in;
	EXTI_in.EXTI_Line=EXTI_Line3|EXTI_Line4;
	EXTI_in.EXTI_LineCmd=ENABLE;
	EXTI_in.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_in.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_in);
	
}

void KEY_NVIC_CFG(void)
{
	
	NVIC_InitTypeDef nvic_in;
	nvic_in.NVIC_IRQChannel=EXTI3_IRQn;
	nvic_in.NVIC_IRQChannelCmd=ENABLE;
	nvic_in.NVIC_IRQChannelPreemptionPriority=0;
	nvic_in.NVIC_IRQChannelSubPriority=0;
	NVIC_Init(&nvic_in);
	
	nvic_in.NVIC_IRQChannel=EXTI4_IRQn;
	nvic_in.NVIC_IRQChannelCmd=ENABLE;
	nvic_in.NVIC_IRQChannelPreemptionPriority=0;
	nvic_in.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&nvic_in);
}

//中断函数3
void EXTI3_IRQHandler(void)
{
	EXTI_ClearFlag(EXTI_Line3);
	keyflag=1;

}

//中断函数4
void EXTI4_IRQHandler(void)
{
	EXTI_ClearFlag(EXTI_Line4);
	keyflag=2;
}









 int main(void)
 {	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	KEY_Init();
	My_EXIT_Init();
	KEY_NVIC_CFG();
	while(1)
	{
		if(keyflag==1)
		{
			keyflag=0;
			a++;
		}
		else	if(keyflag==2)
		{
			keyflag=0;
			a--;
		}
	 
	 }
 }

工程获取

三连后点击下方头像

你可能感兴趣的:(stm32,单片机,嵌入式硬件)