mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F103 - System Clock mit PLL erhöhen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Max M. (maxmicr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde gerne den System Takt mit der integrierten PLL auf Basis des 
HSI erhöhen.
Dafür benutze ich aktuell folgenden Code:
int main()
{
  /* Configure Clock */
  FLASH->ACR |= FLASH_ACR_LATENCY_1;
  RCC->CR &=~RCC_CR_PLLON;
  RCC->CFGR |= RCC_CFGR_PLLMULL_2;
  RCC->CR |= RCC_CR_PLLON;
  RCC->CFGR |= RCC_CFGR_SW_1;
  
  /* Set PIN A8 as MCO Output */ 
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
  GPIOA->CRH = GPIO_CRH_CNF8_1;
  GPIOA->CRH |= GPIO_CRH_MODE8_1 | GPIO_CRH_MODE8_0;
  RCC->CFGR |= RCC_CFGR_MCO_2;

  while(1){
    asm volatile ("nop");
  }
}

Um das Ganze zu testen, gebe ich den System Clock auf PA8 aus, dieser 
gibt allerdings nur 8MHz aus anstatt der zu erwartenden 48MHz (PLL input 
clock x6).

Beim Debuggen ist mir aufgefallen, dass PLLON immer 1 ist, selbst 
nachdem ich versuche, die PLL zu disablen - warum ist das so?

Außerdem enthält RCC_CFGR für mich nicht nachvollziehbare Werte, ist 
doch der Reset Value = 0.

Autor: Max M. (maxmicr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das ist mein aktueller Versuch, das Problem war, dass standardmäßig PLL 
als System Clock verwendet wird und man die PLL-Werte so nicht verändern 
kann, dafür muss man die erst deaktivieren. Drauf gebracht hat mich 
dieser Artikel: 
https://stm32f4-discovery.net/2015/05/library-59-change-pll-settings-while-stm32f4xx-is-running/

Allerdings hab ich nun seltsame Effekte.
void init_clock() {
  //FLASH->ACR |= FLASH_ACR_LATENCY_1;
  
  RCC->CR |= RCC_CR_HSION;
  while(!(RCC->CR & RCC_CR_HSIRDY))
    asm volatile ("nop");
  RCC->CFGR &=~ (RCC_CFGR_SW_0 | RCC_CFGR_SW_1);
  RCC->CR &=~RCC_CR_PLLON;
  while(RCC->CR & RCC_CR_PLLRDY)
    asm volatile ("nop");
  
  RCC->CFGR &=~ RCC_CFGR_PLLSRC;
  RCC->CFGR &=~(RCC_CFGR_PLLMULL_3 | RCC_CFGR_PLLMULL_2 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_0);
  RCC->CR |= RCC_CR_PLLON;
  
  while(!(RCC->CR & RCC_CR_PLLRDY))
    asm volatile ("nop");
  
  RCC->CFGR |= RCC_CFGR_SW_1;
  
  while(!(RCC->CFGR & RCC_CFGR_SW_1))
    asm volatile ("nop");
}

Anbei die Registerwerte nach dem Durchlaufen der Funktion.

Nach der Einstellung von PLLMULL ergibt das "PLL input clock x 2", mit 
8MHz /2 = 4MHz als Eingangstakt messe ich auch korrekte 8MHz.

Wenn ich nun
  RCC->CFGR |= RCC_CFGR_PLLMULL_0;

hinzufüge, erhalte ich auch korrekte 12MHz. Sobald ich aber die oben 
genannte Zeile auf
  RCC->CFGR |= RCC_CFGR_PLLMULL_1;

ändere (hier wären 16MHz zu erwarten), erhalte ich bei der Logic 
Analyzer Messung ungleiche Taktlängen (siehe Anhang).

Woher kommt das?

Edit:

Sobald ich die WaitStates für den Flash erhöhe 
(http://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf 
S. 57) ergibt:
  FLASH->ACR |= FLASH_ACR_LATENCY_1;
  ...
  RCC->CFGR |= RCC_CFGR_PLLMULL_1;

8MHz und
  FLASH->ACR |= FLASH_ACR_LATENCY_1;
  ...
  RCC->CFGR |= RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_0;

ergibt 4MHz (auch wieder mit unsauberen Taktlängen). Wie kann das denn 
sein?

: Bearbeitet durch User
Autor: John Doe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max M. schrieb:
> Drauf gebracht hat mich
> dieser Artikel:
> https://stm32f4-discovery.net/2015/05/library-59-c...


Wie wärs damit, einfach mal das Referenzmanual richtig zu lesen? Da 
steht sowas schliesslich drin.
Aber ist heutzutage wohl out, google wird es schon richten...


> ändere (hier wären 16MHz zu erwarten), erhalte ich bei der Logic
> Analyzer Messung ungleiche Taktlängen (siehe Anhang).
>
> Woher kommt das?


Wie ist die Abtastrate Deines Analyzers?

Autor: Max M. (maxmicr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
John Doe schrieb:
> Wie ist die Abtastrate Deines Analyzers?

24 MS/s

Autor: John Doe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max M. schrieb:
> John Doe schrieb:
>> Wie ist die Abtastrate Deines Analyzers?
>
> 24 MS/s


Da ist Dein Problem. Das reicht nicht, daher das fehlerhaft Bild. Damit 
Du bei 16MHz etwas vernünftig erkennst, sollten es mindestens 50MHz, 
besser mehr sein.

Dein Taktsignal ist also völlig in Ordnung und nicht unregelmäßig.

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max M. schrieb:
> John Doe schrieb:
>> Wie ist die Abtastrate Deines Analyzers?
>
> 24 MS/s

Shannon kennst du?

Theoretisch kannst du damit 12MHz erkennen.
Praktisch würde ich zum Messen 5..10-fach übertakten.

Autor: Max M. (maxmicr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
John Doe schrieb:
> Dein Taktsignal ist also völlig in Ordnung und nicht unregelmäßig.

Okay, anderer Versuch. Ich hab einen Timer Interrupt mit Reload-Value 
0xFFFF.

Ich messe an einem GPIO 487.3Hz mit diesem Setup:
  RCC->CFGR |= RCC_CFGR_PLLMULL_3 | RCC_CFGR_PLLMULL_2 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_0;

also Input Clock x 16 = 64MHz

Sofern ich richtig rechne sind 487.3Hz * 2^16 ~ 32MHz. Frisst das 
löschen des Pending-Bits die anderen 32MHz "auf"?
void TIM2_IRQHandler (void) {
    TIM2->SR &=~TIM_SR_UIF;
    GPIOC->ODR ^= GPIO_ODR_ODR13;
}

Prescaler vom Timer ist 0.

: Bearbeitet durch User
Autor: Thomas E. (picalic)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Max M. schrieb:
> Ich messe an einem GPIO 487.3Hz mit diesem Setup:

Aber zu einer Schwingung Deines gemessenen Rechteck-Signals gehören zwei 
Pegelwechsel, also zwei Interrupts, die den Pin togglen. Deine ISR wird 
also mit der doppelten gemessenen Frequenz aufgerufen!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.