Что касается прерываний STM32-Срабатывание прерывания для коммутатора-2, когда Коммутатор-2 находится в режиме ожидания при работе с коммутатором-1:

#stm32

Вопрос:

Я использую микроконтроллер STM32L072CZ для своих целей разработки. Я интегрирую STM32L072CZ с LoRa communication для нашего проекта. Я написал уровень приложений на базовой прошивке LoRa LSN50-V2(узел со встроенным STM32 и чипом Lora) В этом я настраиваю 2 штыря прерывания как в восходящем, так и в падающем крае. Я настраиваю pin-код таким образом, как я упоминал ниже, а также использую макросы для контактов, часов pin-кода и порта pin-кода

Инициализация и настройка PIN-кода и деинициализация

 void  mainInit( void  )
{
    GPIO_InitTypeDef GPIO_InitStruct={0};
    GPIO_MAIN_CLK_ENABLE();
  
  GPIO_InitStruct.Pin  = GPIO_MAIN_PIN; 
    GPIO_InitStruct.Mode =GPIO_MODE_IT_RISING_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;   
    GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;

  HW_GPIO_Init( GPIO_MAIN_PORT, GPIO_MAIN_PIN, amp;GPIO_InitStruct );
    
    /* Enable and set EXTI lines 4 to 15 Interrupt to the lowest priority */
  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}

void  dgInit( void  )
{
    GPIO_InitTypeDef GPIO_InitStruct={0};
    GPIO_DG_CLK_ENABLE();
    
  GPIO_InitStruct.Pin  = GPIO_DG_PIN;   
    GPIO_InitStruct.Mode =GPIO_MODE_IT_RISING_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;   
    GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;

  HW_GPIO_Init( GPIO_DG_PORT, GPIO_DG_PIN, amp;GPIO_InitStruct );
    
    /* Enable and set EXTI lines 4 to 15 Interrupt to the lowest priority */
  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}
void  mainIoDeInit( void  )
{
    GPIO_InitTypeDef GPIO_InitStruct={0};
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    GPIO_InitStruct.Mode =GPIO_MODE_IT_RISING_FALLING;
  HW_GPIO_Init( GPIO_MAIN_PORT, GPIO_MAIN_PIN, amp;GPIO_InitStruct );
}

void  dgIoDeInit( void  )
{
    GPIO_InitTypeDef GPIO_InitStruct={0};   
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  GPIO_InitStruct.Mode =GPIO_MODE_IT_RISING_FALLING;    
  HW_GPIO_Init( GPIO_DG_PORT, GPIO_DG_PIN, amp;GPIO_InitStruct );
}

/* IRQ handler functionality*/

 //HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_14 );

            if (joined_flags==1)
    {   
            
      if(__HAL_GPIO_EXTI_GET_IT(GPIO_DG_PIN)!=RESET)    
        {
         HAL_Delay(30);
         mainStreamer=0;
         dgStreamer=1;
         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_DG_PIN);
         HAL_GPIO_EXTI_IRQHandler(GPIO_DG_PIN);  
                
        }
        
   
  //HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_15 );

        if(__HAL_GPIO_EXTI_GET_IT(GPIO_MAIN_PIN)!=RESET)
        {   
         
         HAL_Delay(30);
         mainStreamer=1;
         dgStreamer=0;
         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_MAIN_PIN);
         HAL_GPIO_EXTI_IRQHandler(GPIO_MAIN_PIN);
            
                
        }
    }
 

Я использовал PB14 и PB15 в качестве вывода прерывания.

PB14-Переключатель-1 PB15-Переключатель-2

В большинстве случаев обновляется прерывание с соответствующим состоянием переключателя. Но иногда возникали проблемы.

Проблема в том, что когда коммутатор-2 находится в состоянии ожидания, я управляю только коммутатором 1, в том, что иногда я наблюдал, что прерывание ISR коммутатора-2 происходит вместо ISR коммутатора 1.

в чем причина этого?

Комментарии:

1. Существует только одно прерывание, разделяемое этими двумя контактами. Когда вы получаете это единственное прерывание, вам нужно прочитать регистры состояния, чтобы определить, что произошло. Что заставляет вас думать, что «происходит переключение 2 ISR»?

2. Я устанавливаю флаги в каждом обработчике IRQ, в соответствии с флагом записывается условие для считывания статуса pin-кода и отправки через LoRa на сетевой сервер. В этом я наблюдаю проблему такого рода.

3. Что вы имеете в виду под «каждым IRQ»? Существует только один IRQ.

4. Да!!! Но я имел в виду, что каждый пин-код обработчика IRQ!

5. В вышеупомянутом коде я фиксирую Mainstream=0, а dg streamer =1 для одного pin-кода и наоборот для другого pin-кода. Основываясь на флаге, я выполнил одну функцию, прочитав статус PIN-кода прерывания. Эту функцию я упомянул ниже. Этим заявлением о печати я подтверждаю эту проблему.