STM32F103 | libopencm3 | GPIO 使用中断问题切换

Posted

技术标签:

【中文标题】STM32F103 | libopencm3 | GPIO 使用中断问题切换【英文标题】:STM32F103 | libopencm3 | GPIO toggle using interrupt issue 【发布时间】:2020-08-23 08:29:36 【问题描述】:

所以,我正在尝试根据按钮的中断来切换 LED。

理想情况下,当按下按钮时,LED 应该切换,即如果它关闭则打开,反之亦然。但是当我执行此代码时,它会切换并返回其原始状态。

预期结果: LED 关闭 » 按钮按下 » LED 开启

实际效果: LED 关闭 » 按钮按下 » LED 开启 » LED 关闭

我已经为去抖动添加了延迟,因此弹跳不在图片中。按下按钮时,GPIO 的 ODR 也会在 ISR 中设置,那么在退出 ISR 时如何清除它?

非常感谢您的帮助!谢谢。

#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/stm32/exti.h>
#include <libopencm3/cm3/nvic.h>

#define LEDPIN (GPIO13)

static void exti_setup(void)

    /* Enable GPIOA and AFIO clock. */
    rcc_periph_clock_enable(RCC_GPIOB);
    rcc_periph_clock_enable(RCC_AFIO);

    /* Enable EXTI0 interrupt. */
    nvic_enable_irq(NVIC_EXTI15_10_IRQ);

    /* Set GPIO12 (in GPIO port B) to input  */
    gpio_set_mode(GPIOB, GPIO_MODE_INPUT,GPIO_CNF_INPUT_FLOAT, GPIO12);

    /* Configure the EXTI subsystem. */
    exti_select_source(EXTI12,GPIOB);
    exti_set_trigger(EXTI12, EXTI_TRIGGER_BOTH);
    exti_enable_request(EXTI12);



static void gpio_setup(void)

    /* Enable clock for GPIO port C */
    rcc_periph_clock_enable(RCC_GPIOC);

    /* Set LEDPIN (in GPIO port C) as opendrain output  */
    gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_OPENDRAIN, LEDPIN);


void delay()
    int i;
    for (i = 0; i < 1000000; i++) 
    
        __asm__("nop");
     


void handler()
    delay();
    gpio_toggle(GPIOC, GPIO13);


int main(void)

    gpio_setup();
    exti_setup();

    while (1) 
    __asm__("nop");
    
    return 0;


void exti15_10_isr()

    exti_reset_request(EXTI12);
    handler();

【问题讨论】:

据我了解,您已经为两个边缘配置了外部中断。因此,当您按下按钮时,它会获得一个边缘,而当您释放按钮时,它会获得另一个边缘(我不知道您的开关如何使用 PULL UP 或 PULL DOWN)。尝试使用上升或下降的单边。 @dev_eng 非常感谢!用 RISING 边缘配置它解决了我的问题。 【参考方案1】:

正如@dev_eng 正确指出的那样,问题是中断被配置为上升/下降沿。

使用上升或下降的单边配置它解决了我的问题。

【讨论】:

【参考方案2】:
    不是开漏,而是推挽式 按钮不应使用 EXTI,因为它会使 去抖动 更加复杂,经常会用中断淹没 uC,请改用定时器中断来读取键和去抖动。

【讨论】:

以上是关于STM32F103 | libopencm3 | GPIO 使用中断问题切换的主要内容,如果未能解决你的问题,请参考以下文章

AIR32F103 搭载 AIR32F103CBT6 的Bluepill核心板

AIR32F103 在无系统环境和FreeRTOS环境集成LVGL

stm32f407H库和stm32f103H库有区别吗

STM32F103(二十)DAC(贼详细)

STM32F103(十八)ADC总结(贼详细)

STM32F103(二十一)DMA(超详细的~)