Код: Выделить всё
RCC->CR |= ((uint32_t)RCC_CR_HSEON);//запускаем HSE (RCC->CR)
while(!(RCC->CR & RCC_CR_HSERDY));//ждем запуска HSE (RCC->CR)
RCC->PLLCFGR = 0x403208;
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0) {}
FLASH->ACR = 3;
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;Вот за эти "мэджик намберс" надо
2. FLASH->ACR = 3;
По что кэши и предвыборку не включил? Без них смысла в 100 МГц проце нет. Зато __DSB() в коде используешь
3. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
Вот это одна большая ошибка.
Во-первых, ты переключаешь источник тактирования с одного на другой через третий. В данном случае этот третий совпал с исходным и первая строчка в принципе ничего не делает, но ведь могло и не повезти.
Во-вторых, частота APB1 не может быть больше 50 МГц. У тебя без делителя она 100 МГц. Будут глюки, однозначно.
Нельзя так вольно с регистрами обращаться, на каком-нибудь бите может висеть запуск МБР и стирай потом с карты америку...
Собственно, я бы для себя написал так
Код: Выделить всё
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON; //Включаем HSE
while(!(RCC->CR & RCC_CR_HSERDY)); //Ждем запуска HSE
RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSE | _VAL2FLD(RCC_PLLCFGR_PLLR,2) | _VAL2FLD(RCC_PLLCFGR_PLLQ,4) |
_VAL2FLD(RCC_PLLCFGR_PLLP,0) | _VAL2FLD(RCC_PLLCFGR_PLLN,100) | _VAL2FLD(RCC_PLLCFGR_PLLM,4);
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON | RCC_CR_PLLON; //Включаем PLL
while(!(RCC->CR & RCC_CR_PLLRDY)); //Ждем запуска PLL
FLASH->ACR = FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_3WS;
RCC->CFGR = RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_PLL;

