|
|
  |
STM32. Функция задержки, программные задержки на таймере |
|
|
|
Dec 22 2012, 06:53
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(AHTOXA @ Jun 28 2012, 21:03)  Да, это я лопухнулся  Значит, не надо уменьшать на 1. Пытаюсь досконально разобраться с базовыми таймерами. Считаю, что на 1 уменьшать надо. Практически пока не проверял. В руководстве есть картинки, где показано, как CNT меняется от 0 до 36, при этом написано, что ARR = 0x36. Значит, счетчик считает на 1 больше. Фраза "The counter is blocked while the auto-reload value is null" вызывает недоумение. Вообще, описано плохо. Пытаюсь прикинуть, как биты URS, UDIS работают в схеме таймера, и из описания понять невозможно.
|
|
|
|
|
Dec 22 2012, 09:07
|
Местный
  
Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127

|
Нодо на 1 уменьшать. Я то же практически проверял. Цитата(AHTOXA @ Dec 22 2012, 12:50)  А я практически проверил  Для генерации 2МГц пришлось в ARR занести значение 36. (При тактовой 72МГц). Не должно было такое случиться. Где то единичка убежала.
|
|
|
|
|
Dec 22 2012, 10:09
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(AHTOXA @ Dec 22 2012, 11:50)  А я практически проверил Для генерации 2МГц пришлось в ARR занести значение 36. (При тактовой 72МГц). Как оно работает... Цитата the counter counts from 0 to the auto-reload value (content of the TIMx_ARR register) – 1, generates a counter overflow event Цитата Example update event periodThe update event period is calculated as follows:
Update_event = TIM_CLK/((PSC + 1)*(ARR + 1)*(RCR + 1))
|
|
|
|
|
Dec 22 2012, 10:32
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(ViKo @ Dec 22 2012, 14:20)  То, что показал HHIMERA Ну какие ещё другие таймера в STM32??? ))) AN4013 Application note
STM32F1xx, STM32F2xx, STM32F4xx, STM32L1xx, STM32F30/31/37/38x timer overview
2.2 Time base generator
Отнимать единички надобно... т.к. таймер их сам доплюсовывает...
|
|
|
|
|
Dec 22 2012, 10:50
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Даете противоречивые показания.  Цитата(HHIMERA @ Dec 22 2012, 13:32)  Отнимать единички надобно... т.к. таймер их сам доплюсовывает... Противоречит Цитата the counter counts from 0 to the auto-reload value (content of the TIMx_ARR register) – 1, generates a counter overflow event Как вы представляете, что таймер считает не до ARR, а до ARR-1 (то есть, вашими словами, отминусовывает), физически? По руководству пройдитесь поиском "counter counts", найдете, какие таймеры как считают. P.S. и там не уверен, не разбирался вообще.
|
|
|
|
|
Dec 22 2012, 11:20
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(ViKo @ Dec 22 2012, 13:50)  По руководству пройдитесь поиском "counter count", найдете, какие таймеры как считают. Спасибо, мне не надо... ))) Недавно с Леонидом Ивановичем рассматривали возможность частотомера на STM32 ... В железе всё прекрасно... На STM32f100 до 90МГц (выше не пробовал)... на STM32F05X - 110МГц (больше неоткуда было взять)... P.S: Доки для STM32 писались не новичками... и не для новичков... увы... Отсюда и сжатый стиль, и "неоднозначные толкования", и пр. ... но в целом - всё достойно и понятно... Цитата(ViKo @ Dec 22 2012, 14:13)  У вас (в AN) некорректная запись. "Мопед не мой"(С) И в чём некорректность???
|
|
|
|
|
Dec 22 2012, 11:46
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(HHIMERA @ Dec 22 2012, 14:18)  Спасибо, мне не надо... ))) Отсюда и сжатый стиль, и "неоднозначные толкования", и пр. ... но в целом - всё достойно и понятно... Нихрена там не понятно. И не достойно. Был бы признателен, если бы растолковали, как работают биты UDIS, URS в базовых таймерах. Чтобы не противоречило ни одной из фраз из руководства. У меня пока никак не складывается картинка. Что на что влияет...? Или, например, если загружаем в ARR значение меньше прежнего, при ARPE сброшенном, а CNT уже перевалившем за новое (до старого, естественно, не добрался еще). Тут же появится overflow event, или будет до переполнения счетчика скакать? Цитата(HHIMERA @ Dec 22 2012, 14:20)  И в чём некорректность??? Еще раз - где вы взяли ту цитату после "Как оно работает": (...) - 1, что привели? Проверил на своем. Код void Timer3_init(void) { /* Разрешить тактирование Таймера 3 */ RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; /* Prescaler 8 MHz */ TIM3->PSC = 24 / 8 - 1; /* Autoreload 2 MHz */ TIM3->ARR = 8 / 2 - 1; /* PWM */ TIM3->CCMR2 = 0x6060 | TIM_CCMR2_OC4PE | TIM_CCMR2_OC3PE; /* Противоположная полярность активных сигналов (не обязательно) */ TIM3->CCER = TIM_CCER_CC4E | TIM_CCER_CC4P | TIM_CCER_CC3E; /* Регистры сравнения */ TIM3->CCR3 = TIM3->CCR4 = 8 / 2 / 2; /* Разрешить счет */ TIM3->CR1 = TIM_CR1_ARPE | TIM_CR1_URS | TIM_CR1_CEN; /* Remap TIM3 to PC8, PC9 */ AFIO->MAPR = 0x00000c00; } Выдает 2 MHz на светодиодах STM32VLDiscovery. Не забудьте задать альтернативные функции для портов PC8, PC9. Продолжу с битами, доложу.
|
|
|
|
|
Dec 22 2012, 11:58
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(ViKo @ Dec 22 2012, 14:28)  Нихрена там не понятно. И не достойно. Просто надо привыкнуть к стилю написания документации... Цитата Был бы признателен, если бы растолковали Не-не... я нифига ни разу не учитель-разжеватель и не писатель... Я так... ткнул, пнул и съе... и свалил... сорри... Цитата Или, например, если загружаем в ARR значение меньше прежнего, при ARPE сброшенном, а CNT уже перевалившем за новое (до старого, естественно, не добрался еще). Тут же появится overflow event, или будет до переполнения счетчика скакать? Так грубо я шашкой не махал... таких задач не было... но мысль интересная, спасибо... проверю по желанию и возможности... А вот новое значение ARR, которое не превысило предыдущее и CNT ещё не перевалил за новое, загружал "на лету"... отрабатывалось по новому значению ARR... Цитата Еще раз - где вы взяли ту цитату после "Как оно работает": (...) - 1, что привели? Да с какого-то первого попавшегося даташита... что под руку попалось...
|
|
|
|
|
Dec 22 2012, 12:02
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(HHIMERA @ Dec 22 2012, 14:58)  Так грубо я шашкой не махал... таких задач не было... но мысль интересная, спасибо... проверю по желанию и возможности... А вот новое значение ARR, которое не превысило предыдущее и CNT ещё не перевалил за новое, загружал "на лету"... отрабатывалось по новому значению ARR... Сам проверю. Сравним ответы.  Второе понятно. ARPE=0 разрешает обновлять теневой регистр ARR, с которым сравнивается счетчик CNT, сразу после записи. Цитата Да с какого-то первого попавшегося даташита... что под руку попалось... Вот именно. Что я и хотел сказать.
|
|
|
|
|
Dec 23 2012, 14:16
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Сочинил задержку подлиннее. Тактовая частота подразумевается 24 MHz. Код /*! ******************************************************************************* * @brief Wide time delay start, check, wait in 1, 10, 100, 1000 us steps * @details Старт, проверка и ожидание окончания задержки в микросекундаx * @param US - delay time (1 ... 65 536 000 us) */ #define WDELAY_START(US) \ TIM6->PSC = ((US < 65536)? (24 - 1) : \ ((US < 655360)? (240 - 1) : \ ((US < 6553600)? (2400 - 1) : (24000 - 1)))); \ TIM6->ARR = ((US < 65536)? (US - 1) : \ ((US < 655360)? (US / 10 - 1) : \ ((US < 6553600)? (US / 100 - 1) : (US / 1000 - 1)))); \ TIM6->EGR = TIM_EGR_UG; \ TIM6->SR = 0; \ TIM6->CR1 |= TIM_CR1_CEN; \
#define WDELAY_CHECK (TIM6->SR) #define WDELAY_WAIT() while (!TIM6->SR) К этому коду прилагается инициализация таймера. Код void Timer6_init(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; TIM6->CR1 = TIM_CR1_ARPE | TIM_CR1_OPM | TIM_CR1_URS; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|