Во время настройки системы тактирования я столкнулся с тем, что частота этого тактирования вообще не такая, какая должна по идее быть. После прочтения мануала от st, оказалось, что на упомянутой плате отсутствует кварцевый резонатор, подключенный к контроллеру, однако он есть на st-link, встроеном в плату и следует использовать именно его. Также я нашёл/покрутил пример кода от st, однако при включении соотв.опций ничего не поменялось. Почему/что я делаю не так?
Мой код:
Код: Выделить всё
uint8_t RCC_Init(void) {
/* Clear bits */
RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */
RCC->CFGR &= 0xF87FC00C;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
/* Reset PREDIV1[3:0] bits */
RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
/* Reset USARTSW[1:0], I2CSW and TIMs bits */
RCC->CFGR3 &= (uint32_t)0xFF00FCCC;
/* Disable all interrupts */
RCC->CIR = 0x00000000;
/* Using 8Mhz crystal */
RCC->CR |= RCC_CR_HSEBYP | RCC_CR_HSEON; /*Вот здесь вот, при установке bypass ничо не меняется, тактирование вообще не слушает меня; чисто визуально, по миганию светодиода частота раз в 15 меньше, чем должна быть. (По SysTick - точнo также) Код мигания самый тривиальный, задержка через цикл for, нет смысла сюда приводить. На счет mco ничего, увы, не могу сказать, я пока шкет и у меня осциллографа нету */
/* Wait for crystal */
uint16_t i = 0;
while (!(RCC->CR & RCC_CR_HSERDY)){
if (i == UINT16_MAX){
return 1;
}
++i;
}
/* Flash 48 <= HCLK <= 72 */
FLASH->ACR |= FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_1й;
/* PLL input = 8Mhz, output = 72Mhz */
RCC->CFGR |= RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL9;
RCC->CR |= RCC_CR_PLLON;
i = 0;
/* Wait for PLL */
while (!(RCC->CR & RCC_CR_PLLRDY)){
if (i == UINT16_MAX){
return 1;
}
++i;
}
/* Divide PLL for APB1*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
/* Switch on PLL */
RCC->CFGR |= RCC_CFGR_SW_PLL;
/* Wait for switching on PLL */
i = 0;
while (!(RCC->CFGR & RCC_CFGR_SWS_PLL)){
if (i == UINT16_MAX){
return 1;
}
++i;
}
RCC->CR &= ~(RCC_CR_HSION);
return 0;
}


