Я пытаюсь запрограммировать плату обнаружения 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;
}
}