为什么我的 LED 不响应我的中断

问题描述 投票:0回答:1

我正在开发一个项目,该项目将使用 pa1 和 pa2 作为外部中断,并使用 pb12 pb13 pb14 pb15 作为 LED 输出。我的目标是,当我按 pa1 LED 时,按顺序从 pb12 到 pb15 打开,当我按 pa2 LED 时将从 pb15 到 pb12 打开,换句话说,方向相反。而且 pa1 中断的优先级高于 pa2 中断。但是当我按下按钮时,无论如何我都无法从 LED 获得任何响应。

#include "stm32f4xx.h"

void delay(uint32_t time) {
    time--;
}

void gpioa_config(void) { //input port (input pins are 1 2)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef gpio_init;
    gpio_init.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2;
    gpio_init.GPIO_Mode=GPIO_Mode_IN;
    gpio_init.GPIO_OType=GPIO_OType_PP;
    gpio_init.GPIO_PuPd=GPIO_PuPd_DOWN;
    gpio_init.GPIO_Speed=GPIO_Speed_100MHz;
    GPIO_Init(GPIOA,&gpio_init);


}
void gpiob_config(void) { //output port(output pins are 12 13 14 15)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    GPIO_InitTypeDef gpiob_init;
    gpiob_init.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    gpiob_init.GPIO_Mode=GPIO_Mode_OUT;
    gpiob_init.GPIO_OType=GPIO_OType_PP;
    gpiob_init.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpiob_init.GPIO_Speed=GPIO_Speed_100MHz;
    GPIO_Init(GPIOB,&gpiob_init);

}

void exti_config(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
    EXTI_InitTypeDef exti_init;
    exti_init.EXTI_Line= EXTI_Line1 | EXTI_Line2;
    exti_init.EXTI_LineCmd=ENABLE;
    exti_init.EXTI_Mode=EXTI_Mode_Interrupt;
    exti_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_Init(&exti_init);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    NVIC_InitTypeDef nvic_init;
    nvic_init.NVIC_IRQChannel=EXTI1_IRQn;
    nvic_init.NVIC_IRQChannelCmd=ENABLE;
    nvic_init.NVIC_IRQChannelPreemptionPriority=0; // channel 1's priority is higher than channel 2's
    nvic_init.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&nvic_init);

    NVIC_InitTypeDef nvic_init_2;
    nvic_init_2.NVIC_IRQChannel=EXTI2_IRQn;
    nvic_init_2.NVIC_IRQChannelCmd=ENABLE;
    nvic_init_2.NVIC_IRQChannelPreemptionPriority=1;
    nvic_init_2.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&nvic_init_2);





}

void exti1_irqhandler(void) {
    if (EXTI_GetITStatus(EXTI_Line1)!=RESET) {
        GPIO_SetBits(GPIOB,GPIO_Pin_12);
        delay(840000);
        GPIO_SetBits(GPIOB,GPIO_Pin_13);
        delay(840000);
        GPIO_SetBits(GPIOB,GPIO_Pin_14);
        delay(840000);
        GPIO_SetBits(GPIOB,GPIO_Pin_15);
        delay(840000);
        EXTI_ClearITPendingBit(EXTI_Line1);

    }
}

void exti2_irqhandler(void) {
    if(EXTI_GetITStatus(EXTI_Line2)!=RESET) {
        GPIO_SetBits(GPIOB,GPIO_Pin_15);
        delay(840000);
        GPIO_SetBits(GPIOB,GPIO_Pin_14);
        delay(84000);
        GPIO_SetBits(GPIOB,GPIO_Pin_13);
        delay(84000);
        GPIO_SetBits(GPIOB,GPIO_Pin_12);
        delay(840000);
        EXTI_ClearITPendingBit(EXTI_Line2);
    }
}


int main(void)
{
    gpioa_config();
    gpiob_config();
    exti_config();

  while (1)
  {
      GPIO_ResetBits(GPIOB,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
      exti1_irqhandler();
      exti2_irqhandler();

  }
}

我的proteus原理图或我的代码有什么问题吗?

我也配置了 nvic 来确定优先级,但没有任何变化。结果是相同的。

我的问题出在哪里?

我正在等待我的 LED 由于我的中断而打开,但由于我的中断,我的 LED 没有响应

stm32 interrupt stm32f4 stm32cubeide proteus
1个回答
0
投票

首先延迟功能应该如何工作?您是否知道程序只是转到该函数,在该函数中实现了操作 840000-1,仅此而已 - 每个参数时间的延迟都是相同的?如果您想使用延迟,请使用例如空 for 循环:

for(int i=0; i<840000; i++)
   {
    // just empty loop for delay
   }

此外,我怀疑这样的延迟(如果有效)会太长而无法在中断中实现。尝试使用较小的值。如果您告诉我们更多问题是什么,也会很有帮助。尝试调试代码并判断程序是否进入中断(调试时使用断点)。如果您不知道如何在 stm32 上调试代码,我相信您会在 yt 上找到很多教程。

© www.soinside.com 2019 - 2024. All rights reserved.