STM32L0 GPIO Interrupt не работает

Я пытаюсь мигать светодиодом порта GPIO PA5 каждый раз, когда нажимается кнопка PC13. Однако это не работает. Не могли бы вы посоветовать, как я могу решить проблему?

main.c - основная программа

#include "main.h"
#include "stm32l0xx_hal.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

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

   while (1)
    {
    }
  }

Раздел конфигурации порта GPIO. Настроены порты PA5 и PC13. Разрешено прерывание на EXTI13.

static void MX_GPIO_Init(void)
  {

    GPIO_InitTypeDef GPIO_InitStruct;

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

   /*Configure GPIO pin Output Level */
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}

stm32l0xx_it.c - файл прерывания. Определены обработчик IRQ и функция обратного вызова.

void EXTI4_15_IRQHandler(void)
 {
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
 }

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    HAL_Delay(500);
}

С наилучшими пожеланиями,


person ussrback    schedule 07.05.2018    source источник
comment
Вы не должны вызывать HAL_GPIO_WritePin () перед инициализацией вывода. Также я не рекомендую вызывать HAL_Delay () в рамках обратного вызова ISR.   -  person LoriB    schedule 08.05.2018


Ответы (2)


Я не понимаю, что ты хочешь делать.

  • Если вы хотите изменить состояние вашего светодиода при каждом событии нажатия кнопки, вам не нужно устанавливать задержку в HAL_GPIO_EXTI_Callback. Это не очень хорошая практика при разработке прошивки. IRQ должны быстро управлять событиями. Их процессы имеют более высокий приоритет, чем выполнение программы (здесь ваша основная).

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin == GPIO_PIN_13)
        {
            HAL_GPIO_TogglePin (GPIOA, GPIO_PIN_5);
        }
    }
    
  • Если вы хотите запускать / останавливать мигание светодиода в зависимости от событий нажатия кнопки, вам необходимо использовать таймер (например, кнопка запускает таймер, каждый истекший таймер irq переключает PA5).

В функции MX_GPIO_Init необходимо вызвать HAL_GPIO_WritePin после инициализации PA5 (HAL_GPIO_Init).

Взгляните на свое оборудование, прежде чем устанавливать подтяжку на PA13.

Советую скачать STM32Cube. Это много примеров кода. В примере показано, как настроить внешние линии прерывания для мигания светодиода при событиях кнопок (путь к репозиторию: ... \ STM32Cube \ Repository \ STM32Cube_FW_L0_V1.8.0 \ Projects \ STM32L073RZ-Nucleo \ examples \ GPIO \ GPIO_EXTI ).

person Hugo Bevilacqua    schedule 14.09.2018

HAL_Delay () не будет работать, пока вы не измените приоритет exti irq на более высокий, чем приоритет systick irq. Я предполагаю, что в вашей реализации приоритеты по умолчанию равны 0 для обоих и HAL_Delay() зависает, потому что вы используете его с тем же приоритетом isr. Попробуйте изменить приоритет exti irq на 1.

person sbtek    schedule 10.05.2018