C: ПО обнаружения STM32F4 устраняет прерывание кнопки пользователя - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь запрограммировать плату обнаружения STM32F4 так, чтобы пользовательская кнопка могла использоваться для изменения состояния программы с помощью прерывания. Мой код конечного автомата и прерывание работают нормально, однако нажатия кнопок / прерывания требуют устранения ошибок.

Я в основном новичок, когда дело доходит до программирования STM32F4, поэтому я не уверен, что наиболее эффективно / В этом случае будет практический метод устранения неполадок. Мне лучше создать код отладки, в котором я проверяю прерывания, или я должен делать это внутри самого прерывания? Я пробовал использовать таймер для подсчета тиков (изнутри таймера и отдельно я пробовал это, когда прерывание проверяется в коде), но, похоже, он не работает, если кнопка не нажимается быстро, а не удерживается. Аналогично, использование функции задержки (HAL library: HAL_Delay ()) не работает должным образом в основном l oop и останавливает программу, если используется в прерывании.

Это код для моего таймера и прерывание кнопки pu sh:

void
HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)
{
  if (htim->Instance == htim3.Instance)
  {
    start_loop = 1;
  }
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    buttonPressed = 1;
  }
}

Это мой основной код конечного автомата l oop /:

switch (status)
    {
      case 0: // WAIT
        if (buttonPressed == 1)
        {
          buttonPressed = 0;
          status = 1; // go to SET
        }
        break;
      case 1:  // SET
        for (int i = 0; i < 2; i++) // loop twice for DMA ret val
        resultStatus = HAL_ADC_Start_DMA(&hadc1, (uint16_t*) &data, 1);
        if (resultStatus != 0)
        {
          printf("-> ERROR: HAL_ADC_Start_DMA() call failed (status = %d)\n", resultStatus);
        }
        duration = 5 + round((10.0/255)*data[0]); // calc duration (5-15 s)
        endTime = loop_count + duration * 100;  // for 20/60 s run time
        status = 2; // go to RUN
        break;
      case 2: // RUN
        if (loop_count >= endTime)
        {
          status = 4; // go to END
        }
        else if (buttonPressed == 1)
        {
          buttonPressed = 0;
          status = 3; // go to PAUSE
        }
        else
        {
          // Blue LED ON
          HAL_GPIO_WritePin (GPIOD, LED_BLU, 1);
        }
        //  Motor ON
        break;
      case 3: // PAUSE
        pause_count++;
        if (buttonPressed == 1)
        { // go to RUN
          endTime = endTime + pause_count;
          pause_count = 0;
          buttonPressed = 0;
          status = 2; // return to RUN
          HAL_GPIO_WritePin (GPIOD, LED_RED, 0);
        }
        else if (pause_count >= 20000/TIMER_PERIOD)
        { // go to END
          status = 4;
          HAL_GPIO_WritePin (GPIOD, LED_RED, 0);
        }
        else
        {
          //  Red LED pattern
          HAL_GPIO_WritePin (GPIOD, LED_RED, 1);
        }
        break;
      case 4: // END
        //  Blue LED OFF
        HAL_GPIO_WritePin (GPIOD, LED_BLU, 0);
        //  Motor OFF
        break;
    }
}
...