Программирую lm3s6432. Пытаюсь запустить внутренний PLL, но он упорно отказывается запускаться. Хотя когда использую внешний кварц без PLL (BYPASS=0), то все работает.
Код, инициализирующий PLL, такой:
Код
void SYSCTL_Init (void){
// get current value
uint32_t rcc_buf = SYSCTL->RCC;
// bypass the PLL and system clock divider
rcc_buf |= SYSCTL_RCC_BYPASS;
rcc_buf &= ~SYSCTL_RCC_USESYSDIV;
// write new value
SYSCTL->RCC = rcc_buf;
// enable main osc
rcc_buf &= ~SYSCTL_RCC_MOSCDIS;
// write new value
SYSCTL->RCC = rcc_buf;
SysCtlDelay(524288);
// select the crystal value and oscillator source
rcc_buf &= ~(SYSCTL_RCC_XTAL_M | SYSCTL_RCC_OSCSRC_M);
rcc_buf |= SYSCTL_RCC_XTAL_6MHZ;
rcc_buf |= SYSCTL_RCC_OSCSRC_MAIN;
// write new value
SYSCTL->RCC = rcc_buf;
SysCtlDelay(16);
// Clear the PLL lock interrupt.
SYSCTL->MISC |= SYSCTL_MISC_PLLLMIS;
// power-down PLL desable
rcc_buf &= ~SYSCTL_RCC_PWRDN;
// select the desired system divider
rcc_buf &= ~SYSCTL_RCC_SYSDIV_M;
rcc_buf |= SYSCTL_RCC_SYSDIV_4;
// enable use of the system clock divider
rcc_buf |= SYSCTL_RCC_USESYSDIV;
// write new value
SYSCTL->RCC = rcc_buf;
while (bit_is_clear(SYSCTL->RIS,SYSCTL_RIS_PLLLRIS)){}
SYSCTL->MISC |= SYSCTL_MISC_PLLLMIS;
// enable use of the PLL
rcc_buf &= ~SYSCTL_RCC_BYPASS;
// write new value
SYSCTL->RCC = rcc_buf;
SysCtlDelay(16);
}
// get current value
uint32_t rcc_buf = SYSCTL->RCC;
// bypass the PLL and system clock divider
rcc_buf |= SYSCTL_RCC_BYPASS;
rcc_buf &= ~SYSCTL_RCC_USESYSDIV;
// write new value
SYSCTL->RCC = rcc_buf;
// enable main osc
rcc_buf &= ~SYSCTL_RCC_MOSCDIS;
// write new value
SYSCTL->RCC = rcc_buf;
SysCtlDelay(524288);
// select the crystal value and oscillator source
rcc_buf &= ~(SYSCTL_RCC_XTAL_M | SYSCTL_RCC_OSCSRC_M);
rcc_buf |= SYSCTL_RCC_XTAL_6MHZ;
rcc_buf |= SYSCTL_RCC_OSCSRC_MAIN;
// write new value
SYSCTL->RCC = rcc_buf;
SysCtlDelay(16);
// Clear the PLL lock interrupt.
SYSCTL->MISC |= SYSCTL_MISC_PLLLMIS;
// power-down PLL desable
rcc_buf &= ~SYSCTL_RCC_PWRDN;
// select the desired system divider
rcc_buf &= ~SYSCTL_RCC_SYSDIV_M;
rcc_buf |= SYSCTL_RCC_SYSDIV_4;
// enable use of the system clock divider
rcc_buf |= SYSCTL_RCC_USESYSDIV;
// write new value
SYSCTL->RCC = rcc_buf;
while (bit_is_clear(SYSCTL->RIS,SYSCTL_RIS_PLLLRIS)){}
SYSCTL->MISC |= SYSCTL_MISC_PLLLMIS;
// enable use of the PLL
rcc_buf &= ~SYSCTL_RCC_BYPASS;
// write new value
SYSCTL->RCC = rcc_buf;
SysCtlDelay(16);
}
При попытке использовать готовые функции, результат тот же.
Подскажите, пожалуйста, в чем может быть проблема.