embedded - GPIOB 上的 EXTI 不起作用,但 GPIOA 上一切正常
问题描述
我想启用 EXTI 中断,以获取有关端口是否已更改其状态的信息。如下所示,我配置了 2 个引脚,GPIOA5 和 GPIOB3。两者都配置了上拉电阻,因此当它们接地时它们应该改变状态。
问题是一切都适用于 GPIOA5,但不适用于 GPIOB3。正在调用 GPIO5 的 isr,但没有调用 GPIOB。
我评论了关于 UART 配置的部分代码,因为它在这种情况下不相关 - uart 工作正常,所以我可以看到从 MCU 发出的消息。
这里可能有什么问题?
我正在使用 STM32f411CEU6 和 libopencm3。
#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;
}
}
}
解决方案
我不熟悉libopencm3,但通常 EXTI 映射在SYSCFG_EXTICR寄存器中配置,为了访问它们,需要启用SYSCFG时钟。
如果您检查它的源文件,您会发现该exti_select_source()
函数本身并没有启用SYSCFG时钟。所以可能你需要通过调用相关函数来自己做:
rcc_periph_clock_enable(RCC_SYSCFG);
推荐阅读
- bazel - 如何使用 bazel 中的配置设置启用/禁用属性?
- javascript - 如何使用 Datatable jQuery 显示表格上的所有行
- .net - 在防火墙后面验证 SSL 证书
- node.js - 打字稿应用程序路线
- angular - 如何为 Angular Flex 布局指令(fxHide、fxShow)编写单元测试?
- php - 使用 Slim 框架时,get 函数以纯文本形式输出,并带有错误消息“未找到页面”
- dialogflow-es - Dialogflow 让机器人更人性化
- c# - 使用 C# SDK 中的存储连接字符串通过 URI 访问 blob
- javascript - 通过 web-socket 处理 CORS 通信
- kotlin - 如何在 buildSrc 中使用 project() 而不是 const 字符串,使用 Kotlin 进行 Gradle 依赖管理