Например TDA7294

Форум РадиоКот • Просмотр темы - Проблема с таймером на STM32F407
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Чт янв 01, 2026 13:33:20

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Проблема с таймером на STM32F407
СообщениеДобавлено: Пт ноя 29, 2013 01:21:09 
Открыл глаза

Зарегистрирован: Вт окт 14, 2008 23:47:09
Сообщений: 43
Рейтинг сообщения: 0
Здравствуйте! Уже намучился с мелкой проблемой.
Есть плата - STM32F4Discovery. На борту у нее STM32F407VG6. Припаян кварц на 8МГц.
Делаю проект в CooCoxe.
Использую только CMSIS. При запуске настраивается тактирование:
- Используется HSE.
- Источник для PLL задан HSE.
- Настройки PLL: N = 336, M = 8, P = 2, Q = 7.
На этом этапе SYSCLK должен быть равен: 8 * (336 / 8) / 2 = 168 МГц.
AHB-Прескалер равен 0000 - т.е. = 1.
Прескалер APB1 = 4. F = 42 МГц.
Прескалер APB2 = 2. F = 84 МГц.

В работе проверяю миганием светодиодов содержимое регистров RCC. Все верно "до копеечки".

Настраиваю таймер:

Код:
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;
TIM6->PSC = 42000 - 1;
TIM6->ARR = 1000;
TIM6->DIER |= TIM_DIER_UIE;
TIM6->CR1 |= TIM_CR1_CEN;


Запускаю тактирование таймера TIM6. Он тактируется от APB1. Т.е. тикает с частотой 42 МГц.
Прескалер = 41999.
Счиатем до 1000. Затем прерывание.
Запускаем таймер.

В обработчике таймера мигаем светодиодом - через раз включаем / выключаем:

Код:
void TIM6_DAC_IRQHandler(void)
{
   TIM6->SR &= ~TIM_SR_UIF;
   if(i == 0) {
      i = 1;
      GPIOD->ODR |= GPIO_ODR_ODR_12;
   } else {
      i = 0;
      GPIOD->ODR &= ~GPIO_ODR_ODR_12;
   }
}


На мой взгляд светодиод должен включиться на 1 секунду, затем погаснуть на 1 секунду. И так постоянно.
А на деле он все делает в 2 раза быстрее. Т.е. пол-секунды включен, пол-секунды выключен.
Где блин грабли? Что я не так понимаю?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с таймером на STM32F407
СообщениеДобавлено: Пт ноя 29, 2013 10:40:13 
Родился

Зарегистрирован: Чт ноя 01, 2012 14:59:07
Сообщений: 2
Рейтинг сообщения: 0
Так перед этим таймером еще умножитель на 2 стоит вроде=) Самый быстрый способ это проверить, это stm32f4 clock utility/ Удачи!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с таймером на STM32F407
СообщениеДобавлено: Пт ноя 29, 2013 12:26:50 
Открыл глаза

Зарегистрирован: Вт окт 14, 2008 23:47:09
Сообщений: 43
Рейтинг сообщения: 0
lleeloo писал(а):
Так перед этим таймером еще умножитель на 2 стоит вроде=) Самый быстрый способ это проверить, это stm32f4 clock utility/ Удачи!

Курю-курю Reference Manual, гляжу на Clock tree, и нигде не могу найти этот самый умножитель. Ткните мордой плиз.
Нашел, но вот только это для камня STM32F42xxxx и STM32F43xxxx.
А для камней F407 ничего такого не сказано.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с таймером на STM32F407
СообщениеДобавлено: Пт ноя 29, 2013 19:21:20 
Открыл глаза

Зарегистрирован: Вт окт 14, 2008 23:47:09
Сообщений: 43
Рейтинг сообщения: 0
Все. Докурил. Ну это вообще пестициды какие-то.
Хочется сказать тем, кто пишет статьи про такие простые вещи, как Basic Timers, чтобы они хотя бы правильно и полноценно все объясняли.
Для тех, кто столкнется с той же проблемой объясню. А тему можно закрывать.
Далее речь про STM32F40x семейство на ядре Cortex-M4.

Основной источник инфы - Reference Manual для камней STM32F40x (документ маркируется RM0090).

Все имеющиеся таймеры (TIMx) тактируются от шины APB1 (которая помедленнее - до 42 МГц) и от шины APB2 (она побыстрее - до 84 МГц).
Как завести соответствующую шину на нужной частоте - это надо читать в RM0090 главу "RCC" (Reset and Clock Control) - крайне полезный документ. Там разжевывается откуда берутся тактовые частоты, как выбирать нужный источник тактовой частоты, как настраивать PLL (читай "умножитель"), как настраивать предделители шин и прочее. ИМХО надо обязательно знать, чтобы понимать с какой скоростью какая периферия работает. Там еще есть схема "Clock tree" - многое объясняет.

Так вот оказывается для таймеров есть некоторое примечание: если предделитель соответствующей шины APB выставлен в "1", то таймеры, подключенные к этой шине, будут использовать в качестве источника частоту этой шины. Но если предделитель выставлен в значение, отличающееся от "1", то таймер тикает на УДВОЕННОЙ частоте шины, к которой подключен.
У меня прескалер APB1 был выставлен в "4". Т.е. шина тикала на частоте 42 МГц. Соответственно, таймер тикал на удвоенной частоте - 84МГц.
Поскольку предделитель таймера TIM6PSC является 16-битным значением, то записать туда 83999 нельзя. поэтому пишем туда 41999, а вот в регистре перезагрузки TIM6ARR удваиваем значение, до которого будет считать таймер - ставим 2000. В итоге все четко. Проверка по осцилоперу все подтвердила.

Буду рад, если кому-либо это поможет обойти такие грабли.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Проблема с таймером на STM32F407
СообщениеДобавлено: Пт ноя 29, 2013 19:41:01 
Открыл глаза

Зарегистрирован: Пт апр 24, 2009 11:25:34
Сообщений: 71
Откуда: Rus
Рейтинг сообщения: 0
Наступал на эти грабли, только просто "забил" на этот факт и считал что источник 84МГц.
Спасибо, теперь понятно. Там таких "нюансов" много.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y