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.