HAL_GPIO_EXTI_Callback()
работает в контексте прерывания - неправильно указывать sh индикатор, который намного меньше включает задержку. Никакой другой код во время работы в режиме прерывания, и HAL_Delay()
, вероятно, не является безопасным для прерывания в любом случае.
Вместо этого в обработчике кнопки установите понижающий счетчик, который будет уменьшен в обработчике таймера, и в обработчике таймера установите перезагрузку в зависимости от того, равен ли счетчик нулю или нет. Примерно так:
[Я не включил вызовы HAL для выполнения TODO
выше, потому что мне пришлось бы их искать, но это план.]
volatile unsigned fast_flash_count = 0 ;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
HAL_GPIO_TogglePin(GPIOB, LED_Pin);
if( fast_flash_count > 0 )
{
fast_flash_count-- ;
// Set TIM2 reload to fast-flash period
TODO
}
else
{
// Set TIM2 reload to slow-flash period
TODO
}
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == BT_Pin)
{
fast_flash_count = 20 ;
// Set TIM2 counter to current reload value
// to force immediate interrupt
TODO
}
}