Здравствуйте! Уже намучился с мелкой проблемой.
Есть плата - STM32F4Discovery. На борту у нее STM32F407VG6. Припаян кварц на 8МГц.
Делаю проект в CooCoxe.
Использую только CMSIS. При запуске настраивается тактирование:
- Используется HSE.
- Источник для PLL задан HSE.
- Настройки PLL: N = 336, M = 8, P = 2, Q = 7.
На этом этапе SYSCLK должен быть равен: 8 * (336 /

/ 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 раза быстрее. Т.е. пол-секунды включен, пол-секунды выключен.
Где блин грабли? Что я не так понимаю?