C STM32L1上的外部中断设置不';不运行ISR

C STM32L1上的外部中断设置不';不运行ISR,c,embedded,external,interrupt,stm32,C,Embedded,External,Interrupt,Stm32,4天来,我一直在努力在我的STM32上设置外部中断,为了得到它,我已经阅读了大量的书籍和其他人的代码。但是没有运气。 我有两个按钮,当按下其中任何一个按钮时,我希望点亮一个LED,这个示例只是为了让它工作,我希望在继续并构建其余代码之前有一些功能。 如果代码有点凌乱,我很抱歉,但我正在整理我的编码技能。 我查阅了手册和数据表,但似乎没有任何帮助 这是我的主要任务 #include "stm32l1xx_hal.h" #include "buttons.h" static void MX_GPI

4天来,我一直在努力在我的STM32上设置外部中断,为了得到它,我已经阅读了大量的书籍和其他人的代码。但是没有运气。 我有两个按钮,当按下其中任何一个按钮时,我希望点亮一个LED,这个示例只是为了让它工作,我希望在继续并构建其余代码之前有一些功能。 如果代码有点凌乱,我很抱歉,但我正在整理我的编码技能。 我查阅了手册和数据表,但似乎没有任何帮助

这是我的主要任务

#include "stm32l1xx_hal.h"
#include "buttons.h"

static void MX_GPIO_Init(void);

bool RightButtonFlag = 0;
bool LeftButtonFlag = 0;


int main(void)
{
  HAL_Init();
  SystemClock_Config();
  controls_Interrupt_Init();
  MX_GPIO_Init();

  while (1)
  {
      if(RightButtonFlag){
          Blue_ON();
      }
      if(LeftButtonFlag){
          Green_ON();
      }
  }

}
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();


  GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
{
然后是stm32l1x_it.c的一部分

#include "stm32l1xx_hal.h"
#include "stm32l1xx.h"
#include "stm32l1xx_it.h"
#include "buttons.h"

extern volatile uint8_t RightButtonFlag;
extern volatile uint8_t RightButtonFlag;

void EXTI15_10_IRQHandler(void)
{
    if(GPIOC->IDR & GPIO_IDR_IDR_10){
        RightButtonFlag = 1;
        EXTI->PR |= EXTI_PR_PR10;
    }

    if(GPIOC->IDR & GPIO_IDR_IDR_11){
            LeftButtonFlag = 1;
            EXTI->PR |= EXTI_PR_PR11;
    }
}
按钮

void controls_Interrupt_Init(void){

    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; /* Enable System Configuration Register */


    SYSCFG->EXTICR[3] |= SYSCFG_EXTICR3_EXTI11_PC; /* Set up External Interrupt for Pin 11 Port C */
    SYSCFG->EXTICR[3] |= SYSCFG_EXTICR3_EXTI10_PC; /* Set up External Interrupt for Pin 10 Port C */

    EXTI->IMR |= EXTI_IMR_MR11;
    EXTI->IMR |= EXTI_IMR_MR10;

    EXTI->FTSR  |= EXTI_FTSR_TR11; /* Falling trigger Selection Reg. Trigger 11 */
    EXTI->FTSR  |= EXTI_FTSR_TR10; /* Falling trigger Selection Reg. Trigger 10 */

    NVIC_SetPriority(EXTI15_10_IRQn,1); /* Set Interrupt priority for pins 10-15 */
    NVIC_EnableIRQ(EXTI15_10_IRQn); /* Enable NVIC for Pins Between 10-15 */


}
和按钮

void controls_Interrupt_Init(void);

#define Blue_ON()           (HAL_GPIO_WritePin(BLUE_LED_PORT, BLUE_LED_PIN, 1))
#define Green_ON()          (HAL_GPIO_WritePin(GREEN_LED_PORT, GREEN_LED_PIN, 1))

我对编码是相当陌生的,由于我的经验不足,我希望能把一些非常简单的事情搞砸

您必须将标志声明为
volatile
。这是对编译器的一个提示,即变量可以随时更改,与正常的程序流无关

volatile bool RightButtonFlag = 0;
volatile bool LeftButtonFlag = 0;
当不存在volatile时,编译器可以假设主循环中的标志从未更改,并以这种方式对其进行优化,即变量只在循环之前加载一次

仅在中断处理程序的范围内声明它们
volatile
没有好处,因为优化仍将在
main()
中进行,其中
volatile
声明不可见

将声明移动到头文件,并在引用变量的任何地方包含该头文件,这是一种良好的做法。然后编译器可以检查类型是否确实兼容

更新

中断处理程序没有什么意义。将EXTI设置为检测下降沿,然后检查输入是否高。由于机械按钮的弹跳效应,检查GPIO数据寄存器无论如何都不可靠

您应该检查处理程序中的
EXTI->PR
,并使用简单赋值重置挂起位,而不是
|=
,否则您也可能意外地清除另一个挂起位

void EXTI15_10_IRQHandler(void)
{
    if(EXTI->PR & EXTI_PR_PR10){
        RightButtonFlag = 1;
        EXTI->PR = EXTI_PR_PR10;
    }

    if(EXTI->PR & EXTI_PR_11){
        LeftButtonFlag = 1;
        EXTI->PR = EXTI_PR_PR11;
    }
}
您仍然可以在某处检查
GPIOC->IDR
是否实际反映了按钮状态,以消除可能的硬件问题


您还可以尝试从调试器或在代码中设置
EXTI->SWIER
,以模拟按下按钮。

从何处调用
MX\u GPIO\u Init()?当您在
EXT15\u 10\u IRQHandler()
上设置断点时,当您按下按钮时,断点会被击中吗?哦,是的!我很抱歉!它是在main()函数中调用的,我通过删除许多与此问题无关的内容缩短了这段代码,我一定是意外地删除了MX_GPIO_Init(),但它包含在实际代码中。我将对此进行编辑以避免混淆。我在调试器中注意到,在内存视图中,对应管脚的PR(挂起寄存器)中的位始终为0,当我尝试将其设置为1时,它仍然为0。感谢您的响应。我添加了volatile前缀,但它没有帮助,无论出于何种原因,我尝试用于EXTI的两个管脚的PR(挂起寄存器)位没有重置为1,我猜它应该设置为1,以便等待外部中断事件。我会更深入地查看调试器,看看是否还能找到其他东西。您阅读“GPIO->IDR”的想法绝对正确!最重要的是,我将两个管脚的“PUPDR”设置为向上拉,并希望它的读数为“1”,但我需要在按下按钮时从“GPIO->IDR”读取“0”,以便它工作。我尝试在“EXTI->SWIER”中设置位,按钮flag成功地切换到1,尽管使用外部中断运行它仍然没有成功。我会挖得更深一点,看看还有什么不对…我找到了!!它是
SYSCFG->EXTICR[x]
其中
x
对于
EXTICR3
应该是2。我一直在调试器中搜寻,我注意到我在
EXTICR4
中设置位,而不是
EXTICR3
。就像我提到的,这是一个简单的新手错误。谢谢你的帮助!通过解决这个问题,我学到了很多东西。