Добрый вечер.
Пытаюсь написать таймер для конечных автоматов и вот какая странность.
Настроил таймер на 1мс.
Прерывание от таймера простейшее:
Код:
extern uint32_t blinkMS;
void TIM14_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim14);
if( blinkMS > 0 )
blinkMS--;
}
Первый вариант мигалки, он работает:
Родил такое от безысходности, в приступе вдохновения
Спойлер
Код:
uint8_t on = 0;
while (1)
{
if( blinkMS <= 20 && blinkMS > 10 && !on )
{
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
on = 1;
}
if( blinkMS <= 10 && on)
{
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
on = 0;
}
if( blinkMS == 0 )
blinkMS = 20;
}
А вот второй, по смыслу такой же, не пашет. TogglePin вызывается только один раз и все, больше туда не заходит.
Спойлер
Код:
while (1)
{
if( blinkMS == 0 )
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
blinkMS = 1000;
}
}
Зато, если его немного переиначить и сделать так:
Спойлер
Код:
while (1)
{
if( blinkMS == 0 )
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
if( blinkMS == 0 )
{
blinkMS = 1000;
}
}
То он начинает мигать, но очень хаотично, импульсы нестабильны и отличаются по длине в 1.5-2 раза.
Вопрос: что за фигня творится и как это победить?!
Фото первой и третьей мигалок прилагаю:
P.S. Вариант с запретом/разрешением прерывания ничего не менят.
Спойлер
Хаотичные импульсы:
Код:
if( blinkMS == 0 )
{
NVIC_DisableIRQ(TIM14_IRQn);
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
if( blinkMS == 0 )
{
blinkMS = 10;
NVIC_EnableIRQ(TIM14_IRQn);
}
Так, не работает вообще. Как вариант №2.
Код:
if( blinkMS == 0 )
{
NVIC_DisableIRQ(TIM14_IRQn);
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
blinkMS = 10;
NVIC_EnableIRQ(TIM14_IRQn);
}