因此,我试图切换一个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();
}发布于 2020-05-08 00:27:07
push-pull
。
发布于 2020-05-08 10:11:14
正如@dev_eng正确地指出的,问题是中断被配置为上升/下降的边缘。
配置它的单一边缘,无论是上升还是下降,解决了我的问题。
https://stackoverflow.com/questions/61668033
复制相似问题