Top.Mail.Ru
Уведомления
Очистить все

[Решено] STM32CubeMx PWM не срабатывает прерывание

Igor
 Igor
(@igor-3)
New Member

Добрый день, столкнулся с проблемой в одном из своих проектов. Решил исключить все остальное, чтобы точно убедиться в источнике этой проблемы и вот, что вышло в итоге...

В STM32CubeMx создаю пустой проект для STM32F103, активирую только таймер TIM3, канал Channel4, в режиме генерации PWM-сигнала. Частота тактирования таймера 48 МГц, на таких настройках получаю 300 Гц и скважность 50%. Это все работает хорошо, проверяю осциллографом. Проблемы начинаются при дальнейшем углублении...

Изначально у меня цель - изменять период генерируемого PWM-сигнала в процессе работы устройства. Изменять период планирую прямой записью в регистр ARR, плюс в регистр CCR4, чтобы сохранить скважность 50%:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == &htim3)
    {
        TIM3->ARR = new_period;
        TIM3->CCR4 = new_period / 2;
    }
}

Все это действо добавил в прерывание по окончанию периода - самый безопасный момент для изменения настроек таймера. Значение переменной new_period точно меняется - вижу в отладчике. При этом также вижу, что реальный период сигнала не реагирует - снова подключаю отладчик, и бинго! Программа не попадает в прерывание, хотя в STM32CubeMx включено:

image

P. S. Вот настройки таймера:

image
image

 

 

Цитата
Topic starter Размещено : 18.09.2021 12:59
Тэги темы
Aveal
(@aveal)
Illustrious Member Admin

Добрый день!

Cube при запуске ШИМ функцией HAL_TIM_PWM_Start_IT() включает только прерывания при срабатывании схемы сравнения:

case TIM_CHANNEL_1:
{
  /* Enable the TIM Capture/Compare 1 interrupt */
  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
  break;
}

case TIM_CHANNEL_2:
{
  /* Enable the TIM Capture/Compare 2 interrupt */
  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
  break;
}

case TIM_CHANNEL_3:
{
  /* Enable the TIM Capture/Compare 3 interrupt */
  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
  break;
}

case TIM_CHANNEL_4:
{
  /* Enable the TIM Capture/Compare 4 interrupt */
  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
  break;
}

 

Уж не знаю, баг ли это или тактическая задумка, возможный путь решения - добавить:

__HAL_TIM_ENABLE_IT(&htim3, TIM_IT_UPDATE);

 

ОтветитьЦитата
Размещено : 20.09.2021 11:46
Igor
 Igor
(@igor-3)
New Member

@aveal 

Заработало! Три дня убил не это... Нет слов, спасибо!

ОтветитьЦитата
Topic starter Размещено : 20.09.2021 15:34
Поделиться: