А Latency для флэш выставили?
Если нет, то неудивительно, что зависает.
Вот мой код, кварц 12 Мгц.
Измените cMainFreq на 8, должно заработать.
|
PHP код:
|
//system quartz
#define cMainFreq 12
#define cVCOClock 336
//Division coeff for input clock ›=2
#define cPLLM 4
//Mul for VCO
#define cPLLN (cVCOClock*cPLLM / cMainFreq)
//Div for main system clock 336 Mhz, 0 for 2 (page 162)
#define cPLLP 0
//divider for USB 48MHz
#define cPLLQ (cVCOClock / 48)
void InitClock(void){
RCC-›APB1ENR |= RCC_APB1ENR_PWREN;
//PWR_CR Page 138
PWR-›CR |=PWR_CR_PLS | PWR_CR_PVDE | PWR_CR_VOS_0;
while (!(PWR-›CSR & PWR_CSR_VOSRDY));
//RCC register page 159
RCC-›CR |=RCC_CR_HSEON; // Enable external quartz
while (!(RCC-›CR & RCC_CR_HSERDY)); //wait for quartz ready
// Config Flash
// Latency page 80 Refman
FLASH-›ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS;
//Config PLL
RCC-›PLLCFGR=(cPLLQ‹‹24) | (cPLLP‹‹16) | (cPLLN‹‹6) | cPLLM | RCC_PLLCFGR_PLLSRC_HSE; //page 162
RCC-›CR |= RCC_CR_PLLON;
while (!(RCC-›CR & RCC_CR_PLLRDY)); //wait for PLL ready
//RCC register page 159
RCC-›CFGR |= RCC_CFGR_HPRE_DIV1; //page 151 Max freq AHB 180 MHz, current 168
RCC-›CFGR |= RCC_CFGR_PPRE2_DIV2; //page 151 Max freq APB2 90 MHz, current 84
RCC-›CFGR |= RCC_CFGR_PPRE1_DIV4; //page 151 Max freq APB1 45 MHz, current 42
//Выбираем источником тактового сигнала генератор PLL:
//page 95, PLL selected as system clock
RCC-›CFGR = (RCC-›CFGR & ~0x03) | RCC_CFGR_SW_PLL;
//Ждем когда контроллер перейдет на тактирование от PLL:
while ((RCC-›CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
RCC-›CR &= ~RCC_CR_HSION; // page 159, HSI clock 16 MHz Off
}
|
P.S. Где написано page nnn - это номер страницы в reference manual, где про это написано. Пишу для удобства, потом через время проще разбираться.