|
mortomyx
|
|||||||||||||||||||||
помогите с TIM223.02.2013, 23:47. Показов 13551. Ответов 12
Метки нет (Все метки)
привет,
Начал изучать STM32 на примере STM32VLDyscover И вот добрался до таймеров. Решил сделать себе delay_ms и использовал пример найденный в интрернетах. Иничу таймер :
Я исправил методом почти научного тыка код на такой :
- почему первый код не работал при первом вызове delay_ms() - зачем в рабочем коде мне нужно при ините включать таймер TIM2->CR1 = TIM_CR1_CEN, я же включаю его в коде функции? - Зачем перед включением таймера в коде функции мне нужно сбрасывать флаг переполнения TIM2->SR &= ~TIM_SR_UIF;? |
|||||||||||||||||||||
| 23.02.2013, 23:47 | |
|
Ответы с готовыми решениями:
12
Прерывание от TIM2 Прерывание таймера TIM2 Захват и переполнение TIM2 |
|
bzoukotmov
|
||
| 24.02.2013, 12:54 | ||
2. Если One putsi mode, то таймер нужно включать каждый раз, т.к. при переполнении он останавливается. Если обычный режим, то можно включать один раз, при инициализации, или наоборот при начале задержки включать, а по окончании выключать. 3. Если используете обычный режим, то такая последовательность: сбросить флаг, включить таймер, дождаться переполнения, выключить таймер. Если таймер не выключить, он продолжит счет и снова выставит флаг переполнения, когда основной цикл покинет процедуру задержки. При one putsi mode: сбросили флаг переполнения, включили таймер, дождались переполнения, при этом таймер выключится сам. |
||
|
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 286
|
|
| 24.02.2013, 13:30 | |
|
0
|
|
|
mortomyx
|
|||
| 24.02.2013, 14:14 | |||
|
|||
|
bzoukotmov
|
||
| 24.02.2013, 15:25 | ||
|
||
|
bzoukotmov
|
||
| 24.02.2013, 16:44 | ||
При изменении ARR каждый раз вызывать событие не обязательно, достаточно чтобы ARPE бит в TIMx_CR1 = 0, тогда ARR будет сразу загружаться из предварительного регистра. В этом примере как раз так сделано (TIM2->CR1 = TIM_CR1_OPM; - обнуляет все, кроме One putsi mode) |
||
|
mortomyx
|
||
| 24.02.2013, 17:16 | ||
|
С апдейт ивентом я понял.
При изменении ARR каждый раз вызывать событие не обязательно, достаточно чтобы ARPE бит в TIMx_CR1 = 0, тогда ARR будет сразу загружаться из предварительного регистра. В этом примере как раз так сделано (TIM2->CR1 = TIM_CR1_OPM; - обнуляет все, кроме One putsi mode) Не совсем понял, то есть, в этом примере из-за отсутствия в начала апдейт ивента, действительно первый делей будет проходить с неясным значением из-за того, что TIM2->PSC не применен к скрытому регистру? так? |
||
|
bzoukotmov
|
||
| 24.02.2013, 21:17 | ||
И еще один момент: TIM2->CR1 = TIM_CR1_CEN; //запустить таймер лучше заменить на TIM2->CR1 |= TIM_CR1_CEN; Иначе one putsi mode будет сбрасываться. И соответственно, очистку флага TIM2->SR &= ~TIM_SR_UIF; можно будет оставить только одну. |
||
|
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 286
|
||
| 24.02.2013, 22:33 | ||
0
|
||
|
btosk27512
|
|||||||||||
| 05.01.2016, 22:35 | |||||||||||
|
Странность с этими таймерами, почему-то перезагрузка при принудительном вызове события update (TIM4->EGR = TIM_EGR_UG) не срабатывает второй раз, хотя если позволить таймеру вызвать прерывание, то всё же загружаются (PSC и ARR)
В начале делаю так:
В обработчике перезапускаю таймер с другими параметрами, вот так:
|
|||||||||||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
||||||
| 05.01.2016, 23:28 | ||||||
|
У таймеров есть одна документированная "фича", надо лишь читать внимательно документацию (по своим граблЯм) - параметры устанавливаются по сигналу UPDATE, который возникает при переполнении счетчика. Теперь внимательно - эта "фича" распространяется и на делитель тоже.
Обычное положение дел - установить настройки (частоту/делитель/макс.), запустить таймер и надеяться на результат. Но(!), делитель применится только по переполнению, а значит он будет максимальный. Если на 16х таймере это не слишком заметно (ну, кроме subj), а вот на M0 с его 32х счетчиком выходит просто жуткий результат. Корректная инициализация (IMHO) должна быть выполнена так: - настроить все параметры, только в длительность поставить "1". Запустить счетчик. Подождать UPDATE. Поставить нужную длительность и пользоваться. Не стоит использовать аппаратный таймер для системного delayP.S. Для М3/4: Вообще-то, использовать стандартный таймер для delay - жуткое разбазаривание аппаратуры. Для этого лучше подходит системный таймер, входящий в состав ядра. К тому-же, он еще и весьма точный.
0
|
||||||
|
btosk27512
|
||||||
| 05.01.2016, 23:51 | ||||||
|
Бывают же ошибки в ДШ, однако...
Разобрался, что бы это нормально работало нужно установить еще и URS в CR1 (в ДШ написано, что его включение наоборот ограничивает источники апдейта) Надо вот так в общем:
|
||||||
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
| 06.01.2016, 00:04 | |
|
А если посмотреть что внутри функции инициализации таймера из SPL, то станет ясно, что там последняя строчка - принудительное обновление регистров, как раз таки выставлением бита URS. Выше уже все объяснили - значение ARR и предделители буферизированы, они не обновляются мгновенно. В ДШ подробно описаны варианты обновлений этих регистров.
0
|
|
| 06.01.2016, 00:04 | |
|
Помогаю со студенческими работами здесь
13
STM8S + TIM2 +PWM Проблема с таймером TIM2 TIM2 по сравнению -> в прерывание TIM2 задержка в 1 сек STM8S + TIM2 = 100kHz на канале №2 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|