Какие могут быть причины, по которым обработчик таймера на STM32 не срабатывает?

Мне нужно измерить переменный сигнал с частотой в диапазоне от 100 Гц до 2 кГц, используя микроконтроллер STM32F103x8. В моем проекте задействованы два таймера: TIM2, который предназначен для индикации и срабатывает каждые 10 мс, и TIM3, который выполняет измерение значений АЦП с периодом от 2 мс до 250 мкс. Однако, когда я уменьшаю период срабатывания TIM3 до 125 мкс, обработчик этого таймера, похоже, не вызывается. С чем это может быть связано? Моя симуляция проходит в Proteus — неужели микроконтроллер не справляется с такой высокой частотой обработки? Для работы с сигналом на 2 кГц требуется период 125 мкс. Может быть, лучше использовать DMA для этой задачи?
  • 20 ноября 2024 г. 15:23
Ответы на вопрос 2
Причины, по которым обработчик таймера на STM32 может не срабатывать, могут быть разными. Вот некоторые из них, которые стоит проверить:

1. **Конфигурация таймера**: Убедитесь, что таймер TIM3 настроен правильно. Проверьте настройки предделителя, авто-релоад и режима работы таймера, чтобы они соответствовали вашим требованиям по частоте.

2. **Приоритеты прерываний**: Если TIM2 имеет более высокий приоритет, чем TIM3, и он срабатывает каждые 10 мс, это может блокировать выполнение обработчика прерывания TIM3, когда он должен срабатывать. Убедитесь, что приоритеты прерываний настроены корректно.

3. **Проблемы с частотой системы**: Убедитесь, что частота системы (HCLK), используемая в STM32, достаточно высока для поддержания работы с требуемыми временными интервалами. Если частота слишком низкая, таймер не сможет правильно отсчитывать интервалы.

4. **Загруженность процессора**: Если в основном цикле выполнения программы или в обработчиках прерываний выполняются тяжелые задачи, это может привести к тому, что обработка прерывания (включая TIM3) будет отложена. Убедитесь, что все задачи выполняются эффективно.

5. **Конфликт с другими прерываниями**: Если есть другие прерывания, которые вызываются с высокой частотой, они могут блокировать выполнение TIM3. Убедитесь, что нет конфликта в программировании прерываний.

6. **Ошибки в коде**: Проверьте код на наличие логических ошибок, которые могут препятствовать вызову обработчика.

7. **DMA для АЦП**: Использование DMA для сбора данных с АЦП может быть хорошим решением при высоких частотах сигналов. Это позволит снизить нагрузку на ЦП и улучшить производительность приложения. DMA может работать асинхронно и позволит вам собирать данные без необходимости постоянного вмешательства в цикл обработки сигналов.

Учитывая, что вы работаете с диапазоном частот до 2 кГц, использование DMA может обеспечить более стабильное измерение и снизить задержки, возникающие от обработки прерываний в условиях высокой нагрузки.
0) Где код? <br/> 1) Настолько ли важно замеры проводить с помощью АЦП? Может простейший ФВЧ + компаратор + таймер в режиме input capture? Это проще с программной точки зрения, а рассыпуха копейки стоит <br/> 2) Какие параметры АЦП? Какая частота АЦП, время семплирования, используется ли прерывание по окончании, или блокирующая функция в прерывании? <br/> 3) Правильно ли я понял - вызывается обработчик 3 таймера? Если так, то другой вопрос - зачем? TIM3_TRGO может напрямую запускать преобразование <br/> 4) DMA? Да! И ещё раз - да! <br/> 5) Не понял, зачем тут упомянут TIM2 - если он используется для других задач, стоит выключить на время отладки АЦП, что бы не мешал. <br/> 6) "Симуляцию произвожу в proteus" - не надо, отлаживать надо на реальном железе, симуляторы в таком виде не используются, только изредка qemu для юнит тестов <br/> 7) "Это он не может так быстро обработать" - если симулятор не может обрабатывать в реальном времени, она начинает обрабатывать не в реальном времени, но на логику кода это никак не влияет, просто занимает больше времени. <br/> 8) 8МГц это мало, если нет гонки за каждым миллиампером (в таком случае F1 выкидывается, ставится L0/L1), лучше выставить максимальную частоту (72МГц)
Похожие вопросы