Возникла проблема с настройкой умножителя тактовой частоты микроконтроллера STM32F407ZGT6. После включения бита PLL_ON в регистре PLL_CFGR не происходит установка бита PLL_RDY в этом же регистре.
При этом раньше код работал, а потом вдруг перестал. На всякий случай проосциллографировал напряжение на выводах питания - всё в пределах нормы. Что ещё может мешать ему настроить PLL - ума не приложу.
Настраиваю от HSI. HSE тоже имеется, но он тоже не запускается, возможно, по той же причине, что и PLL (в данный момент HSE не запущен и на выводах микроконтроллера, подключенных к HSE, осциллограф показывает GND)
Изначальное под подозрением был вышедший из за воздействия статического (или какого-то другого) электричества микроконтроллер, но после перепайки ничего не изменилось.
Код настройки прилагаю.
Код: Выделить всё
void InitRCC (void) {
dummy_loop(100000);
// Увеличиваем задержку чтения из Flash перед повышением тактовой частоты
FLASH->ACR |= ( 7 << FLASH_ACR_LATENCY_Pos );
for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
// Настраивааем умножитель тактовой частоты
RCC->PLLCFGR = ( 2 << 28 ) | ( 8 << RCC_PLLCFGR_PLLM_Pos ) | ( 96 << RCC_PLLCFGR_PLLN_Pos ) | ( 0 << RCC_PLLCFGR_PLLP_Pos) | ( 4 << RCC_PLLCFGR_PLLQ_Pos );
for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
RCC->CR |= ( 1 << RCC_CR_PLLON_Pos ); // Включаем умножитель тактовой частоты
for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
/********************************************/
/* ЗДЕСЬ ПРОИСХОДИТ ЗАВИСАНИЕ ПРОГРАММЫ !!! */
/********************************************/
while (((RCC->CR)&(1<<RCC_CR_PLLRDY_Pos)) == 0) {} // Ожидаем готовности умножителя тактовой частоты <--- ЗДЕСЬ ПРОИСХОДИТ ЗАВИСАНИЕ ПРОГРАММЫ
for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
// Switch clock source from HSI16 on PLL
RCC->CFGR = ( 2 << RCC_CFGR_SW_Pos ); // Переключаем тактирование ядра с HSI16 на PLL
for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
RCC->AHB1ENR |= ( 1 << RCC_AHB1ENR_GPIOAEN_Pos) | ( 1 << RCC_AHB1ENR_GPIOBEN_Pos )| ( 1 << RCC_AHB1ENR_GPIOCEN_Pos) | ( 1 << RCC_AHB1ENR_GPIODEN_Pos ) | ( 1 << RCC_AHB1ENR_GPIOEEN_Pos ) | ( 1 << RCC_AHB1ENR_GPIOFEN_Pos ) | ( 1 << RCC_AHB1ENR_CCMDATARAMEN_Pos );
for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
RCC->APB1ENR |= ( 1 << RCC_APB1ENR_TIM4EN_Pos ) | ( 1 << RCC_APB1ENR_TIM3EN_Pos) | ( 1 << RCC_APB1ENR_TIM2EN_Pos ) | ( 1 << RCC_APB1ENR_DACEN_Pos );
for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
RCC->APB2ENR = ( 1 << RCC_APB2ENR_ADC1EN_Pos ) | ( 1 << RCC_APB2ENR_ADC2EN_Pos ) | ( 1 << RCC_APB2ENR_ADC3EN_Pos );
for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
}

