Stran 1 od 1

STM32F0 in clock

OdgovorObjavljeno: 10 Apr 2018, 09:46
Napisal/-a zanka
Procesor 072 skušam spraviti na 48MHz, vendar ko dal PLL mnogokratnik (PLLMUL) na 12 tu in tam dobim HardFault, na 11 še deluje. Izvor za PLL (PLLSRC) je privzet (HSI/2), torej 4 MHz. CubeMX pri takšni nastavitvi ne javi napake, čeprav pa ravno nima na izbiro te možnosti HSI/2 kot jo ponuja register.

RCC->CFGR &= ~RCC_CFGR_PLLSRC;
RCC->CFGR &= ~RCC_CFGR_PLLMUL;
RCC->CFGR |= RCC_CFGR_PLLMUL11;
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);

Če namesto 11 dam 12, mi LED več ne utripa. Včasih se ustavi pri nastavljanju OSPEEDR. Včasih pa gre naprej in utripa.

Celotna koda s katero se igram je
Koda: Izberi vse
#include <stdint.h>
#include "cmsis/stm32f072xb.h"

void on(void) {
  GPIOA->BSRR = GPIO_BSRR_BS_5;
}

void off(void) {
  GPIOA->BSRR = GPIO_BSRR_BR_5;
}

static void _delay_ms(uint16_t ms)
{
  TIM6->ARR = ms - 1;
  TIM6->CR1 = TIM_CR1_CEN;
  while(!(TIM6->SR & TIM_SR_UIF));
  TIM6->CR1 &= ~TIM_CR1_CEN;
  TIM6->SR &= ~TIM_SR_UIF;
}

void _clock_pll48mhz(void)
{
  RCC->CFGR &= ~RCC_CFGR_SW;
  RCC->CR &= ~RCC_CR_PLLON;
  RCC->CFGR &= ~RCC_CFGR_PLLSRC;
  RCC->CFGR &= ~RCC_CFGR_PLLMUL;
  RCC->CFGR |= RCC_CFGR_PLLMUL12;
  RCC->CR |= RCC_CR_PLLON;
  while (!(RCC->CR & RCC_CR_PLLRDY));
  RCC->CFGR |= RCC_CFGR_SW_PLL;
  while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
  //RCC->CFGR |= RCC_CFGR_HPRE_DIV2;
  FLASH->ACR = FLASH_ACR_LATENCY;
}

int main(void)
{
  _clock_pll48mhz();

  RCC->APB1ENR = RCC_APB1ENR_TIM6EN;
  TIM6->PSC = 7999;

  RCC->AHBENR = RCC_AHBENR_GPIOAEN;

  GPIOA->MODER &= ~GPIO_MODER_MODER5;
  GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR5;
  GPIOA->MODER |= GPIO_MODER_MODER5_0;

  while (1) {

    on();
    _delay_ms(1000);

    off();
    _delay_ms(1000);

  }

  return 0;
}

Re: STM32F0 in clock

OdgovorObjavljeno: 10 Apr 2018, 09:58
Napisal/-a Kroko
Zakaj za izvor ne uporabiš kar HSI48?

Re: STM32F0 in clock

OdgovorObjavljeno: 10 Apr 2018, 10:10
Napisal/-a zanka
Zato ker mi tudi ta ne deluje. Najprej sem si zaželel HSI48 pa sem šel s PLL do koliko pridem.
Koda: Izberi vse
  RCC->CFGR &= ~RCC_CFGR_SW;
  RCC->CR2 |= RCC_CR2_HSI48ON;
  while (!(RCC->CR2 & RCC_CR2_HSI48RDY));
  RCC->CFGR &= ~RCC_CFGR_SW;
  RCC->CFGR |= RCC_CFGR_SW_HSI48;
  while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI48);

Re: STM32F0 in clock

OdgovorObjavljeno: 10 Apr 2018, 10:18
Napisal/-a tilz0R
Najprej nastavi flash latency, potem PLL.

Re: STM32F0 in clock

OdgovorObjavljeno: 10 Apr 2018, 10:31
Napisal/-a zanka
No, to pa je rešitev in tudi HSI48 sedaj deluje. :D

Je pa zanimivo, da je do 44 MHz delovalo, na 48 MHz pa več ne, čeprav naj bi FLASH deloval le do 24 MHz.

Re: STM32F0 in clock

OdgovorObjavljeno: 10 Apr 2018, 10:41
Napisal/-a tilz0R
zanka je napisal/-a:Je pa zanimivo, da je do 44 MHz delovalo, na 48 MHz pa več ne, čeprav naj bi FLASH deloval le do 24 MHz.

Bil si izven specs-ov in zelo lucky. Pri katerem drugem bi pa falilo že pri 25MHz.