使用IDR寄存器的STM32 GPIO中断 这就是我配置EXTI的方式 这就是我的程序在站起来后所做的 这就是我试图处理中断的方式。

使用IDR寄存器的STM32 GPIO中断 这就是我配置EXTI的方式 这就是我的程序在站起来后所做的 这就是我试图处理中断的方式。,stm32,interrupt,Stm32,Interrupt,这东西不起作用。Idk为什么,但对于PA0,它像一个符咒一样工作,但更改为PB4会停止弹出中断事件 我有一个连接到pin的按钮,该pin更改了上的IDR寄存器 我错过了什么 我使用的是STM32L052系列4-15版本的EXTI IRQ非常少见。也许你可以添加你正在使用的exakt控制器 例如,在STM32F415上,对于IRQ处理程序,它将是EXTI4\u IRQHandler。对于PA0,我相信它必须与这一行相关: void EXTI4_15_IRQHandler(void) { i

这东西不起作用。Idk为什么,但对于PA0,它像一个符咒一样工作,但更改为PB4会停止弹出中断事件

我有一个连接到pin的按钮,该pin更改了上的IDR寄存器

我错过了什么


我使用的是STM32L052系列

4-15版本的EXTI IRQ非常少见。也许你可以添加你正在使用的exakt控制器


例如,在STM32F415上,对于IRQ处理程序,它将是
EXTI4\u IRQHandler

对于PA0,我相信它必须与这一行相关:

void EXTI4_15_IRQHandler(void)
{
    if(!(GPIOB->IDR & GPIO_IDR_ID4)){
        state = 0;
    } else {
        state = 1;
    } 
    EXTI->PR = EXTI_PR_PR4;
}
根据参考手册,
PB[x]
(其中
x
为4)映射到SYSCFG_EXTICR2的位0-3。因此,在您的情况下,应该是:

SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR2_EXTI4_PB;
PA0映射到SYSCFG->EXTICR[0]<代码>SYSCFG->EXTICR[0]&=~SYSCFG\u EXTICR2\u EXTI4\u PB表示
SYSCFG->EXTICR[0]相反的
SYSCFG\u EXTICR2\u EXTI4\u PB的内容
这是0xFE。假设
SYSCFG->EXTICR[0]
都是零,那么实际上就是
一堆零,这就是PA0工作的原因

我注意到的另一件事是,在中断处理程序中,我会检查外部中断处理程序标志,而不是GPIO IDR寄存器,以检查按钮是否按下。根据我对问题的理解,您希望按下按钮切换变量
状态
。按下按钮会触发中断,因此您可以通过检查IDR寄存器来达到某种目的。在EXTI中断处理程序中,您可以通过挂起寄存器/PR检查它是否是正确的中断。其他EXTI中断看起来像是共享同一个处理程序,因此您需要使用
EXTR->PR
寄存器来检查中断右挂起位

以下是我的一些STM32F407代码示例:

SYSCFG->EXTICR[2] &= ~SYSCFG_EXTICR2_EXTI4;
SYSCFG->EXTICR[2] |= SYSCFG_EXTICR2_EXTI4_PB;
每次我按下一个按钮,它就会切换电路板上的LED

对于
状态
变量,使用异或操作。它很有用

为了回答这个问题,我使用了STM32L052参考手册和ST网站上的STM32L052.h文件。只需查找STM32CubeL0下载

好的,这是我的lib文件行105 88yimph024crmxevdfnlahuewhg0imlxkquee1ybffq它的L052,通过单个处理程序将行从4映射到15
void EXTI4_15_IRQHandler(void)
{
    if(!(GPIOB->IDR & GPIO_IDR_ID4)){
        state = 0;
    } else {
        state = 1;
    } 
    EXTI->PR = EXTI_PR_PR4;
}
SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR2_EXTI4_PB;
SYSCFG->EXTICR[2] &= ~SYSCFG_EXTICR2_EXTI4;
SYSCFG->EXTICR[2] |= SYSCFG_EXTICR2_EXTI4_PB;
#define PORTD_ALL 0x0000F000
void EXTI0_IRQHandler(void){

  // Check for EXTI 0 flag
  if((EXTI->PR & EXTI_PR_PR0) == EXTI_PR_PR0){

    // Toggle all LED on board
    GPIOD->ODR ^= PORTD_ALL;

    // Clear interupt pending request
    EXTI->PR = EXTI_PR_PR0;
  }
}