沥沥小鱼 2024-11-08 19:29 采纳率: 45.5%
浏览 81

stm32外部中断来实现检测4个按键按下

stm32中断按键
现象:设置了4个按键但是只有PB10 PB11口的两个按键可以改变相应的值,PB15 PB13按下没有反应.
这是按键中断代码

#include "stm32f10x.h"                  // Device header
#include "stm32f10x_exti.h" 
#include "misc.h" 
#include "Delay.h" 
u8 key = 0;

void KEY_Init(void)
{ 
    GPIO_InitTypeDef GPIO_InitStructure; 
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 使能 GPIO 和 AFIO 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    // 初始化GPIO引脚为上拉输入模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 配置 GPIO 线路和 EXTI 中断线对应关系
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);

    // 单独配置每个 EXTI 线路
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

    EXTI_InitStructure.EXTI_Line = EXTI_Line11;
    EXTI_Init(&EXTI_InitStructure);

    EXTI_InitStructure.EXTI_Line = EXTI_Line10;
    EXTI_Init(&EXTI_InitStructure);

    EXTI_InitStructure.EXTI_Line = EXTI_Line13;
    EXTI_Init(&EXTI_InitStructure);

    EXTI_InitStructure.EXTI_Line = EXTI_Line15;
    EXTI_Init(&EXTI_InitStructure);

    // 配置 NVIC 优先级和中断源
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
}

uint16_t key_Get(void)
{
    return key;
}

void EXTI15_10_IRQHandler(void)
{
    // 防抖动延时
    Delay_us(60);

    if (EXTI_GetITStatus(EXTI_Line11) == SET)
    {
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
        {
            key = 1;
        }
        EXTI_ClearITPendingBit(EXTI_Line11);
    }
    if (EXTI_GetITStatus(EXTI_Line15) == SET)
    {
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 0)
        {
            key = 2;
        }
        EXTI_ClearITPendingBit(EXTI_Line15);
    }
    if (EXTI_GetITStatus(EXTI_Line10) == SET)
    {
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) == 0)
        {
            key = 3;
        }
        EXTI_ClearITPendingBit(EXTI_Line10);
    }
    if (EXTI_GetITStatus(EXTI_Line13) == SET)
    {
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0)
        {
            key = 4;
        }
        EXTI_ClearITPendingBit(EXTI_Line13);
    }
}



img


想问问是按键接线的原因还是代码的原因啊,最后是想实现按键控制温湿度阈值的增加减少,所以需要4个按键。

  • 写回答

1条回答 默认 最新

  • weixin_69034136 2024-11-09 11:23
    关注

    按键接线和代码都有问题,根据你的中断函数的写法,应该设置为下降沿触发(EXTI_Trigger_Falling),PB13和PB15不应该接正极,应该接地

    评论

报告相同问题?

问题事件

  • 创建了问题 11月8日