Запускаю микроконтроллер от кварца на 16 мГц. Соответственно, предделитель на 2, PLLx9
Однако при выводе частоты на ногу с помощью таймера или MCO все выглядит так, как будто микроконтроллер стартует на 144 мГц (MCO выводит 72 мГц).
Ниже привожу код с выводом на MCO
#include "stm32f10x.h"
#define HSE_VALUE (16000000U)
int main(void) {
// Включить HSE
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & RCC_CR_HSERDY)) {
// ждём готовности HSE
}
// Настроить PLL
#if HSE_VALUE == 8000000U
RCC->CFGR |= RCC_CFGR_PLLSRC; // Источник PLL = HSE
RCC->CFGR |= RCC_CFGR_PLLMULL9; // ×9 → 72 MHz
#elif HSE_VALUE == 16000000U
RCC->CFGR |= RCC_CFGR_PLLXTPRE; // HSE/2
RCC->CFGR |= RCC_CFGR_PLLSRC; // Источник = HSE/2
RCC->CFGR |= RCC_CFGR_PLLMULL9; // ×9 → 72 MHz
#else
#error "Unsupported HSE value"
#endif
// Включить PLL
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY)) {
// ждём готовности PLL
}
// Переключиться на PLL
RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) {
// ждём переключения
}
// Включить тактирование GPIOA для MCO (PA8)
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// Настроить PA8 как AF output (50 MHz, push-pull)
GPIOA->CRH &= ~(0xFU << 0); // очистить биты PA8
GPIOA->CRH |= (0xBU << 0); // 1011 = AF, 50 MHz
// Вывести PLL/2 (36 МГц) на PA8 (MCO)
RCC->CFGR &= ~RCC_CFGR_MCO; // очистить поле MCO
RCC->CFGR |= RCC_CFGR_MCO_2; // MCO = PLL/2
while (1) {
// PA8 теперь генерирует 36 МГц
}
}