Forum: Analoge Elektronik und Schaltungstechnik [HAL] HSE + PLL = clock zu langsam


von Mampf F. (mampf) Benutzerseite


Lesenswert?

Guten Nachmittag,

hab einen 8MHz HSE in CubeMX konfiguriert und Code generieren lassen.

Funktioniert alles einwandfrei - nur ist der Clock ungefähr halb so 
schnell, als er sein sollte (auf meinem STM32L1)

Code ist dieser hier:
1
void SystemClock_Config(void) {
2
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
3
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
4
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
5
6
  /** Configure the main internal regulator output voltage
7
   */
8
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
9
  /** Initializes the RCC Oscillators according to the specified parameters
10
   * in the RCC_OscInitTypeDef structure.
11
   */
12
  RCC_OscInitStruct.OscillatorType =
13
      RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE;
14
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
15
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
16
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
17
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
18
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
19
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3;
20
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
21
    Error_Handler();
22
  }
23
  /** Initializes the CPU, AHB and APB buses clocks
24
   */
25
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
26
                                RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
27
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
28
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
29
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
30
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
31
32
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {
33
    Error_Handler();
34
  }
35
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LCD;
36
  PeriphClkInit.LCDClockSelection = RCC_RTCCLKSOURCE_LSI;
37
38
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
39
    Error_Handler();
40
  }
41
}

Sieht alles suppi aus (HSE_VALUE ist auch auf 8MHz gesetzt).

Kurioserweise, wenn ich statt dem HSE den HSI16 als PLL-Input-Clock 
benutze und dafür dann den Multiplikator auf *6 anpasse, weil der ja 
16MHz statt 8MHz hat, kommt der richtige Takt raus.

Hab den Oszillator mit meinem Oszi gemessen, wunderbare 8MHz und die 
liegen an dem richtigen OSC_IN Pin an. Es gibt auch keine Timeouts bei 
der Initialisierung usw ... Sollte alles stimmen, aber das tut es nicht. 
🙈

Die Berechnung des SystemClocks ergibt 32MHz.

Ganz seltsam, kann keinen Fehler finden und trotzdem passt der Takt 
nicht ...

Hat jemand soetwas schonmal gesehen?

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Aaaah, hab's gefunden ...

Für einen externen Oszillator benötigt man:
1
RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;

Jetzt geht mein USB, das 48MHz braucht, ebenfalls 🥳

edit: und kleiner tipp ... "cortex-debug" für VSCode ist der Hammer ... 
Nie war es einfacher die STM32 über einen stlink v2 clon-Adapter und 
OpenOCD zu gebuggen 😍

: Bearbeitet durch User
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.