STM32
直播中

王秀兰

7年用户 1380经验值
私信 关注
[问答]

STM32 PE0按下时产生的下降沿触发外中断0,那在释放会产生上升沿,会不会触发外中断1?

void Exti_Init(void)
   {
      EXTI_InitTypeDef  EXTI_InitStructure;
      NVIC_InitTypeDef  NVIC_InitStructure;

      GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
      
      EXTI_InitStructure.EXTI_Line = EXTI_Line0;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发

      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init( EXTI_InitStructure);

     // EXTI_InitTypeDef  EXTI_InitStructure;
      EXTI_InitStructure.EXTI_Line = EXTI_Line1;   //外部中断1
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //下降沿触发
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init( EXTI_InitStructure);
      
      //外部中断0中断优先级
      NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init( NVIC_InitStructure);

      //外部中断1中断优先级
      NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQChannel;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
      NVIC_Init( NVIC_InitStructure);
}

void EXTI0_IRQHandler(void)
{
   if(EXTI_GetITStatus(EXTI_Line0) != RESET)
        {
           EXTI_ClearITPendingBit(EXTI_Line0);  //清外部中断0
           LED1ON();  
           delay_s();
           LED1OFF();
           uart1_trx[uart1_rx] = 0x61;
           uart1_rx++;
           uart1_rx  = 0x3f;
        }
}

void EXTI1_IRQHandler(void)
{
   if(EXTI_GetITStatus(EXTI_Line1) != RESET)
        {
           EXTI_ClearITPendingBit(EXTI_Line1);//清外部中断1
           LED2ON();
           delay_s();
           LED2OFF();
           uart1_trx[uart1_rx] = 0x62;
           uart1_rx++;
           uart1_rx  = 0x3f;
        }   
}

假如PE0,PE1配置为按键输入
PE0按下时产生的下降沿触发外中断0,那在释放会产生上升沿,会不会触发外中断1?
PE1按下时产生的下降沿会触发外中断0吗?,那在释放会产生上升沿,会不会触发外中断1?

谁能说清楚点啊,谢谢啦,分数都是浮云,解决问题最重要!
望高手解决。外中断1搞错了
// EXTI_InitTypeDef  EXTI_InitStructure;
      EXTI_InitStructure.EXTI_Line = EXTI_Line1;   //外部中断1
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init( EXTI_InitStructure);
其他不变。我要问的是这个,我搞错了,这又会是什么情况
PE0按下时产生的下降沿触发外中断0,那在释放会产生上升沿,会不会触发外中断1?
PE1按下时产生的下降沿会触发外中断0吗?,那在释放会产生上升沿,会不会触发外中断1?

回帖(1)

gfhtrdfd

2024-5-17 17:59:45
在STM32中,外设中断(EXTI)是一种用于检测外部事件的中断机制。在您提供的代码片段中,您已经配置了PE0和PE1引脚用于外部中断。然而,要使上升沿触发外中断1,您需要进行一些额外的配置。

首先,您需要初始化EXTI和NVIC结构体,然后配置EXTI线。以下是完整的初始化代码:

```c
void Exti_Init(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 配置PE0为下降沿触发外中断0
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 配置为下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    // 配置PE1为上升沿触发外中断1
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 配置为上升沿触发
    EXTI_Init(&EXTI_InitStructure);

    // 配置NVIC中断优先级和子优先级
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_Init(&NVIC_InitStructure);
}
```

在这个代码中,我们首先配置PE0为下降沿触发外中断0,然后配置PE1为上升沿触发外中断1。接下来,我们配置NVIC中断优先级和子优先级,以确保中断能够被正确处理。

现在,当PE0按下时,会产生下降沿,触发外中断0。当PE0释放时,会产生上升沿,触发外中断1。这样,您就可以根据需要处理这两个中断了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分