STM32F411 зависает при обновлении рабочего цикла ШИМ при включенной оптимизации компилятора - PullRequest
0 голосов
/ 08 июля 2019

У меня странная проблема, которую я не могу понять. Я использую плату STM32F411 и ST32CubeIDE (на основе затмения). Я хочу использовать ШИМ, поэтому я использовал cubeMX для настройки TIM4 в режиме вывода ШИМ с предскалером и значением нагрузки, которое соответствует частоте ШИМ / ширине импульса, которые я хочу. Я также включил глобальное прерывание для TIM4, так как хочу использовать функцию HAL_TIM_PWM_PulseFinishedCallback позже.

Перед основным циклом я инициализирую TIM4 и все 4 канала следующим образом:

HAL_TIM_PWM_Start_IT(&htim4, TIM_CHANNEL_1); //Start up PWM
HAL_TIM_PWM_Start_IT(&htim4, TIM_CHANNEL_2); //Start up PWM     
HAL_TIM_PWM_Start_IT(&htim4, TIM_CHANNEL_3); //Start up PWM     
HAL_TIM_PWM_Start_IT(&htim4, TIM_CHANNEL_4); //Start up PWM

Затем, после того как я просто установил ширину импульса ШИМ вручную:

htim4.Instance->CCR1 = 100;
htim4.Instance->CCR2 = 100; 
htim4.Instance->CCR3 = 100;
htim4.Instance->CCR4 = 100;

Однако по какой-то причине, когда я включаю оптимизацию компилятора на «Оптимизировать для скорости -Ofast» *, программа, похоже, застревает после последней строки, пока отлаживается, где устанавливается CCR4, и не может прогрессировать.

Это только происходит, когда включена оптимизация компилятора по скорости. По умолчанию он был настроен на оптимизацию для отладки, и это нормально.

1 Ответ

1 голос
/ 08 июля 2019

Оптимизация для всего, кроме отладки, может сбить с толку отладчик.

Вещи, которые вы можете попробовать: (Вы не указали свою цепочку инструментов, я предполагаю, что она основана на eclipse / gcc.)

  • Включить пошаговое выполнение инструкций для пошагового выполнения инструкций по сборке по одному. Это должно работать, даже если отладка по строкам исходного кода не работает.
  • Установите точку останова на две или три строки ниже в коде и дайте отладчику пройти через критическую часть.
  • Нажмите кнопку паузы, чтобы увидеть, где она застряла. Он может быть недоступен, если в коде нет активной точки останова.
...