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