首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPIOB上的EXTI不起作用,但在GPIOA上一切正常

GPIOB上的EXTI不起作用,但在GPIOA上一切正常
EN

Stack Overflow用户
提问于 2021-07-02 13:10:41
回答 1查看 180关注 0票数 1

我希望启用EXTI中断,以便获得有关端口是否已更改状态的信息。如下所示,我配置了两个引脚,GPIOA5和GPIOB3。两者都配置了拉起电阻,所以当它们连接到地面时,它们应该改变状态。

问题是,所有东西都适用于GPIOA5,但不适用于GPIOB3。GPIO5的isr正在被调用,但是GPIOB却没有。

我评论了关于UART配置的部分代码,因为它与本例无关-- uart工作正常,所以我可以看到来自MCU的消息。

这里有什么问题吗?

我正在使用STM32f411CEU6和libopencm3。

代码语言:javascript
复制
#include <libopencm3/stm32/gpio.h>

#include <libopencm3/stm32/flash.h>
#include <libopencm3/cm3/systick.h>

volatile bool sensor_isr_process { false };
volatile bool sensor_isr_process2 { false };

extern "C" {

void exti3_isr()
{
  sensor_isr_process2 = true;

    exti_reset_request(EXTI3);
}

void exti9_5_isr()
{
  sensor_isr_process = true;

    exti_reset_request(EXTI5);
}
}

void configure_exti(uint32_t nvicirq, uint32_t exti, uint32_t gpioport)
{
  nvic_enable_irq(nvicirq);

  exti_select_source(exti, gpioport);

  exti_set_trigger(exti, EXTI_TRIGGER_FALLING);
  exti_enable_request(exti);
}

int main()
{
  //Setup Clock
  auto clock = rcc_clock_scale{};
  clock.pllm = 8;
  clock.plln = 100; //336;
  clock.pllp = 2; //4;
  clock.pllq = 4; //7;
  clock.pllr = 2; //0;
  clock.pll_source = RCC_CFGR_PLLSRC_HSI_CLK;
  clock.hpre = RCC_CFGR_HPRE_DIV_NONE; //?
  clock.ppre1 = RCC_CFGR_PPRE_DIV_2; // ?
  clock.ppre2 = RCC_CFGR_PPRE_DIV_NONE; // ?
  clock.voltage_scale = PWR_SCALE1; //?
  clock.flash_config = FLASH_ACR_DCEN | FLASH_ACR_ICEN |
      FLASH_ACR_LATENCY_2WS;
  clock.ahb_frequency  = 100000000;
  clock.apb1_frequency = 50000000;
  clock.apb2_frequency = 100000000;

  rcc_clock_setup_pll(&clock);

  //Enable GPIO
  rcc_periph_clock_enable(RCC_GPIOA);
  rcc_periph_clock_enable(RCC_GPIOB);

  //Setup GPIO
  gpio_mode_setup(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO5);
  gpio_mode_setup(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO3);

  configure_exti(NVIC_EXTI9_5_IRQ, EXTI5, GPIOA);
  configure_exti(NVIC_EXTI3_IRQ,   EXTI3, GPIOB);

  while(1)
  {
    if (sensor_isr_process) {
      // trace(1, "Sensor 1\r\n"); //sends message by uart
      sensor_isr_process = false;
    } 
    else if (sensor_isr_process2) {
      // trace(1, "Sensor 2\r\n"); //send message by uart
      sensor_isr_process2 = false;
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-02 14:51:15

我不熟悉libopencm3,但通常EXTI映射是在SYSCFG_EXTICR寄存器中配置的,为了访问它们,需要启用SYSCFG时钟。

如果检查它的来源文件,可以看到exti_select_source()函数不启用SYSCFG时钟本身。因此,您可能需要自己调用相关函数:

代码语言:javascript
复制
rcc_periph_clock_enable(RCC_SYSCFG);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68225820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档