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

发布时间 2023-11-21 08:31:55作者: Wm9实验室

常规电路(带上拉电阻)

阻值可选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--;
        }
     
     }
 }

 

工程获取

三连后私信获取