RCC->CR |= RCC_CR_HSEON; // set High Speed External ON (== enable) while ( !(RCC->CR & RCC_CR_HSERDY) ); // wait for High Speed External ReaDY flag RCC->CFGR &= ~RCC_CFGR_SW; // reset system clock SWitch RCC->CFGR |= RCC_CFGR_SW_HSE; // SWitch to HSE while ( !(RCC->CFGR & RCC_CFGR_SWS_HSE) ); // wait for SWitch Status to HSEOn peut maintenant connecter l'hyperpropulseur:
RCC->CFGR |= RCC_CFGR_PLLSRC; // set PLL SouRCe to HSE RCC->CFGR &= ~RCC_CFGR_PLLMULL; // reset PLL MULtipLication RCC->CFGR |= RCC_CFGR_PLLMULL9; // set light speed RCC->CR |= RCC_CR_PLLON; // set PLL ON (== enable) while ( !(RCC->CR & RCC_CR_PLLRDY) ); // wait for the PLLReaDY flag RCC->CFGR &= ~RCC_CFGR_SW; // reset system clock SWitch RCC->CFGR |= RCC_CFGR_SW_PLL; // SWitch to PLL while ( !(RCC->CFGR & RCC_CFGR_SWS_PLL) ); // wait for SWitch Status to PLLet voilà une Blue Pill qui passe en vitesse lumière (HSE à 8 MHz * PLLMULL9 == 72 MHz, soit le maximum supporté). Oui mais non, ça pas marche. C'est quoi ce bordel, Chewie ? Comme toujours, ce n'est pas du côté obscur de la Force qu'il faut regarder mais le manuel de référence, page 58 où on apprend que l'accès à la FLASH (donc au code) est dépendant de SYSCLK:
... FLASH->ACR |= FLASH_ACR_LATENCY_2; // 2 wait states !!! REQUIRED !!! RCC->CR |= RCC_CR_PLLON; // set PLL ON (== enable) ...Pour ne rien arranger, APB1 ne pouvant pas dépasser 36 MHz, il faut régler son diviseur en conséquence:
RCC->CFGR |= RCC_CFGR_PPRE1_2; // div SYSCLK by 2 == 72 MHz / 2 == 36 MHzHistoire d'enfoncer le clou, le composant ADC est limité à 14 MHz:
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; // div SYSCLK by 6 == 72 MHz / 6 == 12 MHzLe coup de grâce est porté par les TIMERs mais je préfère m'arrêter là. On l'aura compris, modifier la fréquence ne se fait pas sur un coup de tête.
... #CFLAGS += -DUSE_HYPERDRIVE #CFLAGS += -DUSE_LIGHT_SPEEDLe code source complet: https://gitlab.com/dsx/blue-pill/-/tree/master/stm32f103c8t6/01_clocks_hse_pll
Il est à noter que c'est bien le registre SWS qui est testé:
Set and cleared by hardware to indicate which clock source is used as system clockNe pas hésiter à triturer ce code: modifier les valeurs de multiplication, ne pas configurer correctement la FLASH ...