Полная версия этой страницы:
RCC и TIM3 TIM5 в stm32f107
MarYuriy
Jun 8 2012, 15:06
Здравствуйте!
Пытаюсь настроить таймеры в TIM3 и TIM5 в stm32f107. Частота шины AHB=70 МГц поэтому делю её,
// apb1
RCC->CFGR &=~RCC_CFGR_PPRE1; // предочистка
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // HCLK divided by 2
и получаю 35 МГц на APB1, где находятся таймеры
Настраиваю таймеры
RCC->APB1ENR |= 1<<3;
TIM5->PSC = 35000 - 1;
TIM5->ARR = 1000 - 1;
Таймер выходит в прерывание примерно в 2 раза чаще. Тогда я делаю так
// apb1
RCC->CFGR &=~RCC_CFGR_PPRE1; // предочистка
RCC->CFGR |= RCC_CFGR_PPRE1_DIV1; // HCLK not divided
И ничего с таймером не меняется. За то USART2, настроенный на 35МГц и находящийся на той же шине, перестаёт правильно работать.
Питаюсь от HSEBYP 10 МГц и умножаю PLL на 7.
В чем может быть проблема?
maksimp
Jun 8 2012, 16:22
В документе RM0008 в разделе Connectivity line devices: reset and clock control (RCC) есть на странице 123 Figure 11. Clock tree. И там есть
"TIM2,3,4,5,6,7
If(APB1 prescaler =1) x1
else x2"
То есть если поставить APB1 prescaler !=1 то таймер умножает частоту на 2 перед использованием.
То есть, при
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // HCLK divided by 2
таймер работает на 70 Мгц.
Таймерам на вход подаётся APB1, если прескалер APB1 = 1, и APB1*2, если прескалер APB1 > 1.
То есть, в обоих ваших случаях это 70 МГц.
Смотрите Figure 8. "Clock tree" в RM0008.
MarYuriy
Jun 8 2012, 17:08
О! Спасибо большое! Посмотрел. Всё понятно.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.