STM32 тактируется от внутреннего 8 МГц генератора, при умножении на PLL получаем тактовую 32. При подключении внешнего генератора 6 МГц, но без изменения программы (т. е. МК должен тактироваться все еще от встроенного RC-генератора) я вижу изменение тактовой (раньше таймер выдавал прерывание каждую 1 с, а теперь каждые 1.8 с). Чем это объяснить?
Код инициализации тактовой частоты:
Код
void InitClock(void) // Инициализируем и раздаем клоки
{
__IO uint32_t HSEStatus = (uint32_t)0x00; // Работа от HSI
FLASH->ACR |= FLASH_ACR_PRFTBE; // Включаем буфер предвыборки FLASH
// Конфигурируем Flash на 2 цикла ожидания
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
// HCLK = SYSCLK
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
// PCLK2 = HCLK
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
//PCLK1 = HCLK
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
// Конфигурируем множитель PLL configuration: PLLCLK = (8/2) * 8 = 32 MHz
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL8);
// Включаем PLL
RCC->CR |= RCC_CR_PLLON;
// Ожидаем, пока PLL выставит бит готовности
while((RCC->CR & RCC_CR_PLLRDY) == 0){}
// Выбираем PLL как источник системной частоты
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
// Ожидаем, пока PLL выберется как источник системной частоты
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) {}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Включаем тактирование PORTA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Включаем тактирование PORTB
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // Включаем тактирование SPI
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // Включаем тактирование таймера 2
}