Forum: Mikrocontroller und Digitale Elektronik STM32F107 Probleme mit RCC StdLib


von Franz (Gast)


Lesenswert?

Moin

Aufgrund von einer großen Frequenzdifferenz zwischen dem Takt was für 
I2C eingestellt wurde und dem was tatsächlich vorhanden war, stellte ich 
fest das etwas nicht stimmt.

Als MCU kommt ein STM32F107 zum Einsatz. Der wird mit einem externen 
8MHz Quarz betrieben.
1
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |
2
                                         RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);


Als SYSCLK sind demnach 72MHz eingestellt.

Die I2C Std lib holt sich den Takt as der RCC Stdlib

Da steht
1
RCC_Clocks->SYSCLK_Frequency = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull;

Wenn ich das jetzt per Hand rechne, komme ich auf 72MHz
Laut Debugger (Coocox) habe ich da aber einen Wert von 225000000

Daher ist dann auch mein PCLK1 falsch berechnet, was dazu führt, das das 
I2C mi einem ganz anderen Takt läuft.

Wenn ich aber in der I2C Std lib PCLK1 manuell eintrage, dann stimmten 
die I2C Takte
1
  RCC_GetClocksFreq(&rcc_clocks);
2
  //pclk1 = rcc_clocks.PCLK1_Frequency;
3
  pclk1 = 36000000;

Das wundert mich insofern, weil die Timer die ich nutze, richtig laufen
1
  prescaler = 17999;
2
  period = (72 * milliseconds * 1000) / (prescaler + 1) - 1;

Ist in den Std libs ein Bug enthalten, den ich übersehen habe?

von Franz (Gast)


Lesenswert?

Die Teiler und multiplizierer werden wohl richtig gesetzt, aber die 
Funktion aus der RCC std Lib ließt entweder aus der falschen stelle, 
oder es ließt falsch

von Franz (Gast)


Lesenswert?

keiner 'ne Idee?

von holger (Gast)


Lesenswert?

Hast du HSE_VALUE=8000000 definiert? Sonst kann es sein das
in der  stm32f10x.h 25MHz definiert werden.
1
#if !defined  HSE_VALUE
2
 #ifdef STM32F10X_CL   
3
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
4
 #else 
5
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
6
 #endif /* STM32F10X_CL */
7
#endif /* HSE_VALUE */

von Felix C. (felix_c13)


Lesenswert?

Das schlimme in diesem Forum ist, dass hier alles so aufgeblasene 
Saftsäcke wie Cyblorg rumlungern und Arduino-Nutzer beleidigen, aber 
wenn man mal ne einfache Frage zu nem Clock stellt antwortet keine Sau.


Hab den STM32F107 auch gerade aufgesetzt.

Hier mein Code für 72MHz:

int clockinit(void){
    ErrorStatus ErrorHSE;

    //Reset the clock to default value
    RCC_DeInit();

    //Enable the External Crystal Clock
    RCC_HSEConfig(RCC_HSE_ON);
    ErrorHSE = RCC_WaitForHSEStartUp();

    if(ErrorHSE == SUCCESS){
      //HSE has been turned on

      //PLL Config
      RCC_PREDIV2Config(RCC_PREDIV2_Div5);
      RCC_PLL2Config(RCC_PLL2Mul_9);
      RCC_PLL2Cmd(ENABLE);
      while(RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET);    //Wait 
till PLL2 is stable
      RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2,RCC_PREDIV1_Div5);
      RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_8);
      RCC_PLLCmd(ENABLE);
      while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);    //Wait till 
PLL is stable

      //Config for AHB, APB1 and APB2
      RCC_HCLKConfig(RCC_SYSCLK_Div1);
      RCC_PCLK1Config(RCC_HCLK_Div2);
      RCC_PCLK2Config(RCC_HCLK_Div1);

      //ADC
      RCC_ADCCLKConfig(RCC_PCLK2_Div6);

      //Flash Settings
      FLASH_SetLatency(FLASH_Latency_2);

      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

      return(1);
    }

    else{
      //HSE has not been turned on
      return(0);
    }
}

von Felix C. (felix_c13)


Lesenswert?

Ich bezweifle, dass die SPL nen Bug hat hat. Achte darauf, dass du dir 
bei allen verwendeten Funktionen immer gut die Parameter durchliest und 
diese richtig einsetzt. Da können schnell mal Fehler passieren, und das 
dies alles defines sind fällt ein Fehler kaum auf.

Anhand deiner Code-Fragmenten kann man auf wenig schliessen, verrate uns 
doch aus welchen Funktionen die stammen, in meiner I2C.Init sieht das 
zum Beispiel iwie ein bissel anders aus.

Franz schrieb:
> Wenn ich aber in der I2C Std lib PCLK1 manuell eintrage

Hää, also wenn du das Register korrekt setzt? Oder was meinst du damit?

Schick doch mal deine I2C Init.


Franz schrieb:
> Laut Debugger (Coocox) habe ich da aber einen Wert von 225000000

Kannst du im Debugger ins I2C_CCR reinschauen? was steht da denn?

von Franz (Gast)


Lesenswert?

Problem gelöst.
  * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, 
depedning on
  *    the product used), refer to "HSE_VALUE" define in "stm32f10x.h" 
file.
  *    When HSE is used as system clock source, directly or through PLL, 
and you
  *    are using different crystal you have to adapt the HSE value to 
your own
  *    configuration.

Danke für den Hinweis.

Interessant finde ich aber dennoch, das die Takte gesetzt waren... Die 
Timer zb liefen ja richtig.

Das liegt wohl an
1
switch (tmp)
2
  {
3
    case 0x00:  /* HSI used as system clock */
4
      SystemCoreClock = HSI_VALUE;
5
      break;
6
    case 0x04:  /* HSE used as system clock */
7
      SystemCoreClock = HSE_VALUE;
8
      break;
9
    case 0x08:  /* PLL used as system clock */
10
11
      /* Get PLL clock source and multiplication factor ----------------------*/
12
      pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
13
      pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
da ich das PLL nutze...arrrghh, so kann man schnell einfache Fehler mit 
großen Auswirkungen machen.

Danke an alle für die Hinweise.

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.