Forum: Mikrocontroller und Digitale Elektronik STM32 - Fehler in CMSIS system_stm32l0xx.c


von Mehmet K. (mkmk)


Lesenswert?

Nachdem ich bei einem STM32L051 die HSI Frequenz heraufgesetzt hatte, 
rief ich SystemCoreClockUpdate() auf. Und meine Kontroll-LED spielte 
verrückt.

system_stm32l0xx.c Zeile 249:
1
    case 0x0C:  /* PLL used as system clock */
2
      (...)
3
      if (pllsource == 0x00)
4
      {
5
        /* HSI oscillator clock selected as PLL clock entry */
6
        SystemCoreClock = (((HSI_VALUE) * pllmul) / plldiv);    <--- Fehler
7
      }
8
      else
9
      {
10
        /* HSE selected as PLL clock entry */
11
        SystemCoreClock = (((HSE_VALUE) * pllmul) / plldiv);
12
      }
13
      break;
14
      (...)

HSI_VALUE ist mit einem define auf 16MHz gesetzt.
Es wird dabei nicht nachgefragt, ob der HSI nicht vielleicht mit 
HSI16DIVF gestartet worden war.

Korrekt sollte es sein:
1
uint32_t hsi_value = (RCC->CR & RCC_CR_HSIDIVEN) ? HSI_VALUE / 4 : HSI_VALUE;
2
SystemCoreClock = ((hsi_value * pllmul) / plldiv);

Muss vielleicht erwaehen, dass ich zum ersten Mal mit HSI arbeite.
Könnte also sein, dass dieser Fehler auch in anderen system_stm32xxx 
Files vorhanden ist.

von ... (Gast)


Lesenswert?

Das HSI16DIVF haben nur die STM32L0.

von Bernd K. (prof7bit)


Lesenswert?

Bei mir sieht die so aus:
1
void SystemCoreClockUpdate() {
2
}

Und käme ich auf die Idee die Taktfrequenz im laufenden Betrieb zu 
ändern dann würde SystemCoreClock genau dort geupdatet wo es 
vernünftigerweise hingehört, nämlich dort wo der Takt geändert wurde und 
wo man nicht anhand der Registerwerte umständlich herumraten muß was man 
eben gerade explizit getan hat.

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.