Problem mit Taktfrequenz STM32F303K8

OP #6570241
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;
  }
}
Gast #6570272
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.
OP #6570603
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren