|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|||||||||||||||||||||||||||||||
STM32F303 задержка базовым таймером20.07.2017, 13:31. Показов 10731. Ответов 8
Метки нет (Все метки)
Всем привет! Решил тут внести пару исправлений в один свой проект в отношении временных задержек и решил, что начинающим разработчикам может пригодиться опыт реализации задержки на основе базовых таймеров.
В чем собственно суть? Первые эксперименты у начинающих разработчиков, начинаются с моргания диодом с заданной частотой. Это некий "Hello world!" в этой сфере. Поэтому встает логичный вопрос, как реализовать задержку? Вариантов существует несколько, возможно назову не все но основные. Простая: - Программная задержка (существует много вариаций):
Посложнее: - Функция задержки в ОСРВ:
Средний вариант: -Используем базовые таймеры. В STM32 есть куча таймеров с разным функционалом, почему бы не выделить один базовый таймер? Почему базовый: в основном внутри МК установлены таймеры с функциями генерации ШИМ, захвата и т.д. оставим их на другие нужды. Базовый таймер умеет немногое, просто считать вверх/вниз генерировать прерывания по переполнению, то что нам и надо. В своем проекте мне нужна была задержка около 100 и 200 мкс, хоть я и использую FreeRTOS, стандартная задержка ОСРВ здесь не подойдет. И так в моем распоряжении 2 базовых таймера TIM6/TIM7. Возьму TIM7 так как 6 уже занят. Подрыгать ножкой с задержкой, ножка у меня на порту E 12 пин.
Теперь подробнее про инициализацию таймера Init_DelayTIM();
По переполнению вызывается прерывание:
Что по итогу получилось, замеряем осциллографом. Собственно интервал выдержан, период немного плавает в пределах 1 мкс. С внешним кварцем будет лучше. Примеров в сети огромное количество, где то понятные, где то не очень. Ну и я свой оставлю тут, может кому пригодится.
2
|
|||||||||||||||||||||||||||||||
| 20.07.2017, 13:31 | |
|
Ответы с готовыми решениями:
8
Задержка с таймером TMR0 MPASM Прерывание EXTI на stm32f303 Проблема с USART STM32f303 |
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|||||||||||
| 25.07.2017, 09:49 [ТС] | |||||||||||
|
Решил немного оптимизировать задачу. В примере приведенном выше в прерываниях каждые 10 мкс декрементируется переменная, скажем если мы возьмем задержку в 500 мкс, то за это время нам надо обработать 50 прерываний, а оно нам надо? Сделаем проще:
А вот и сама функция задержки:
Таким образом, мы избавились от прерываний, избавились от лишней переменной ( мелочь, а приятно) и увеличили разрешение счетчика до 1 мкс. Небольшой профит.
1
|
|||||||||||
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
| 29.07.2017, 06:44 [ТС] | |
|
Grey, вы правы, не спорю, при классической программе другие прерывания будут влиять на время задержки ( если таковые будут происходить в таковой промежуток времени). В ОСРВ все немного хуже, если нам требуется задержка в одном процессе на 5 мкс и шедулер в некий момент задержки переключит на другую задачу, то задержка увеличится минимум на 1 мс ( если брать стандартный тик в 1 мс). Есть варианты отключать планировщик на время действия задержки. Если есть другие варианты предложите, я бы с удовольствием перенял опыт. Ибо сам не так давно в разработке
0
|
|
|
Тутошний я
|
||
| 01.08.2017, 00:20 | ||
|
Я тоже недавно начал изучать STM. Потому и интересуюсь.
Но думаю, что если такая функция нужна, то нужно не отключать планировщик, а встроить функцию в ОСРВ. Но использовать только для небольших длительностей. Например в винде есть таймер работающий от системного таймера( тот же планировщик). И есть пара функций работающих от тактов процессора. Но они вроде тормозят винду. Но винда же не ОСРВ.
0
|
||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
|||
| 01.08.2017, 09:03 | |||
|
PS: имхо.
0
|
|||
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
||
| 01.08.2017, 13:23 [ТС] | ||
|
Grey,
Voland_, мне ОСРВ удобна, так как много периодических задач, которые не зависят друг от друга. А сам проект достаточно большой. Удобно с потоками по отдельности работать. Не спорю, что все тоже самое можно сделать с помощью таймеров, в первом примере, что-то подобное представлено, скажем делаем прерывания по таймеру в которых инкрементируем переменные, а в основном цикле проверяем. Интересно было попробовать ОСРВ, теперь втыкаю по случаю...
0
|
||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 01.08.2017, 14:08 | ||
|
0
|
||
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
| 01.08.2017, 14:11 [ТС] | |
|
Voland_, ну, да все что требует отклика менее > 1 мс приходится на периферии делать, благо в stm32 её навалом
0
|
|
| 01.08.2017, 14:11 | |
|
Помогаю со студенческими работами здесь
9
STM32f303+EEPROM I2C Stm32f303+freertos+interrupts STM32F303 comp --> timer STM32F303 внешнее прерывание USART в STM32F303 [закрыто] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|