Forum: Mikrocontroller und Digitale Elektronik Problem mit Taktfrequenz STM32F303K8


von Lutz S. (lutzs)


Lesenswert?

Hallo,

ich habe bemerkt dass bei einem STM32F303K8 auf einem Nucleo-Board das 
setzen/rücksetzen des LED-Pins PB3 bei höheren Taktfrequenzen nicht mehr 
funktioniert. Bis 56 Mhz klappt es, wenn ich dann auf 60 Mhz oder 
darüber gehe funktioniert es nicht mehr. Verwendet wird der interne 
Oszillator (8 Mhz) zusammen mit der PLL (HSI/2 * Faktor). Beschränkungen 
für die GPIOs habe ich im Datenblatt nicht finden können. Habe ich da 
noch etwas übersehen?

Ich habe das Problem so weit isoliert dass es nun aus diesem kurzen 
Programm besteht (Keil-Compiler). Wenn ich den Takt mit RCC->CFGR = 
0x00340002; auf 60 Mhz oder höher setze wird der Pin nicht mehr 
geändert.

#include "stm32f3xx.h"

#define TOGGLE_LED GPIOB->ODR ^= 0x8 //PB3

int main(void){

  //configure clock for system
  //PLL as clock (0x2) and factor for PLL
  RCC->CFGR = 0x00300002; //0x00300002 Faktor 14 = 56 Mhz
  RCC->CR |= RCC_CR_PLLON; //enable PLL

  //configure port B
  RCC->AHBENR |=  RCC_AHBENR_GPIOBEN; //enable clock
  GPIOB->MODER &= ~(GPIO_MODER_MODER3_Msk);//reset bits
  GPIOB->MODER |= 1 << GPIO_MODER_MODER3_Pos; //set as output

  while(1){
    TOGGLE_LED;
  }
}

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Ich fürchte eher dass dein Mikrocontroller abstürzt, weil:

a) du die PLL zu früh benutzt. Du musst erst warten, bis sie bereit ist.

b) Außerdem musst du Waitstates einstellen, weil der Flash Speicher 
nicht so schnell ist.

Siehe http://stefanfrings.de/stm32/stm32f3.html#takt

von Lutz S. (lutzs)


Lesenswert?

Danke, das ging ja fix. Teste ich morgen.

von A. B. (Gast)


Lesenswert?

Das liegt wohl eher an der Takteinstellung an sich:

Erst Teilerfaktoren etc. einstellen, dann PLL einschalten, auf PLLRDY 
warten, und erst DANACH auf PLL mit den SW Bits umschalten. S. RM.

Außerdem LATENCY im FLASH_ACR nicht vergessen.

von Lutz S. (lutzs)


Lesenswert?

Mit diesen Zeilen funktioniert das jetzt auch bis hin zu 64 Mhz:

FLASH->ACR |= FLASH_ACR_LATENCY_1;
RCC->CFGR |= RCC_CFGR_PLLMUL16;
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY)); //wait for PLL
RCC->CFGR |= RCC_CFGR_SW_1;  //switch to PLL

Vielen Dank an euch beide.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.