Проблема с таймером на STM32F407

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
RVL
Открыл глаза
Сообщения: 43
Зарегистрирован: Вт окт 14, 2008 23:47:09

Проблема с таймером на STM32F407

Сообщение RVL »

Здравствуйте! Уже намучился с мелкой проблемой.
Есть плата - 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 раза быстрее. Т.е. пол-секунды включен, пол-секунды выключен.
Где блин грабли? Что я не так понимаю?
lleeloo
Родился
Сообщения: 2
Зарегистрирован: Чт ноя 01, 2012 14:59:07

Re: Проблема с таймером на STM32F407

Сообщение lleeloo »

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

Re: Проблема с таймером на STM32F407

Сообщение RVL »

lleeloo писал(а):Так перед этим таймером еще умножитель на 2 стоит вроде=) Самый быстрый способ это проверить, это stm32f4 clock utility/ Удачи!

Курю-курю Reference Manual, гляжу на Clock tree, и нигде не могу найти этот самый умножитель. Ткните мордой плиз.
Нашел, но вот только это для камня STM32F42xxxx и STM32F43xxxx.
А для камней F407 ничего такого не сказано.
RVL
Открыл глаза
Сообщения: 43
Зарегистрирован: Вт окт 14, 2008 23:47:09

Re: Проблема с таймером на STM32F407

Сообщение RVL »

Все. Докурил. Ну это вообще пестициды какие-то.
Хочется сказать тем, кто пишет статьи про такие простые вещи, как 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. В итоге все четко. Проверка по осцилоперу все подтвердила.

Буду рад, если кому-либо это поможет обойти такие грабли.
makser
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 24, 2009 11:25:34
Откуда: Rus

Re: Проблема с таймером на STM32F407

Сообщение makser »

Наступал на эти грабли, только просто "забил" на этот факт и считал что источник 84МГц.
Спасибо, теперь понятно. Там таких "нюансов" много.
Ответить

Вернуться в «ARM»