AnsweredAssumed Answered

STM32 PLL clock source doesn't work

Question asked by mike louaillier on Jun 18, 2017
Latest reply on Jun 19, 2017 by Khouloud G

Hello i have a program on the 32F030f4p6 chip for testing the system clock frequency. It blinks an LED at about 1Hz. the problem is that when i change the PLL multiplier from 2 to 12 the LED still blinks at the same 1Hz. i configured the system clock for 48MHz but it seems to be running at 8MHz. i don't know what i'm doing wrong.


#include "stm32f030x4.h"

int main(void)
{
 // sysclock configuration
  RCC->CR |= RCC_CR_HSION; // 8MHz
  RCC->CR |= RCC_CR_PLLON;
  RCC->CFGR &= ~RCC_CFGR_PLLSRC;
  RCC->CFGR |= RCC_CFGR_PLLSRC_HSI_DIV2; // PLL source = 4MHz
  RCC->CFGR &= ~RCC_CFGR_PLLMUL;
  RCC->CFGR |= RCC_CFGR_PLLMUL12; // <-- changing the multiplier has no effect on LED frequency
  RCC->CFGR &= ~RCC_CFGR_SW;
  RCC->CFGR |= RCC_CFGR_SW_PLL; // PLL selected as system clock
  RCC->CFGR &= ~RCC_CFGR_HPRE;
  RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // ahbclk not divided
  RCC->CFGR &= ~RCC_CFGR_PPRE;
  RCC->CFGR &= RCC_CFGR_PPRE_DIV1; // apbclk not divided
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
 
 // GPIO pin configuration
  pinpos = 4;
  GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR0 << (pinpos * 2));
  GPIOA->OSPEEDR |= ((uint32_t)(0x03) << (pinpos * 2)); // high speed 50MHz
  GPIOA->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos));
  GPIOA->OTYPER |= (uint16_t)(((uint16_t)0x00) << ((uint16_t)pinpos)); // type push/pull
  GPIOA->MODER  &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  GPIOA->MODER |= (((uint32_t)0x01) << (pinpos * 2)); // mode = output
  GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
  GPIOA->PUPDR |= (((uint32_t)0x00) << (pinpos * 2)); // no pull up or down

    while(1){
    GPIOA->ODR ^= (1 << 4);     // toggle LED
    for (y = 0; y<500; y++){        // delay about 1 second
      for (x = 0; x<500; x++){}
    }
  }
}

Outcomes