Forum: Mikrocontroller und Digitale Elektronik ARM PLL Konfiguration


von Rumkugel (Gast)


Lesenswert?

Hallo,

ich habe ein paar Probleme mit der PLL-Konfiguration meines STR911FAM44.
Ich kann die PLL problemlos bis 62.5 MHz hochtakten, doch darüber hinaus 
bewegt sich der Controller überhaupt nicht mehr, obwohl bei einem 25MHz 
Quarz eigentlich 96MHz möglich sein sollten.
Offenbar liegt es auch nicht direkt an der PLL, sondern eher an der 
Reference Clock (RCLK), welche auch die CPUClK bestimmt, denn wenn ich 
zwischen PLL und RCLK noch einen Teiler setze, gehts auch.
Ich möchte aber gern die CPU mit 96MHz takten.

Kann mir jemand helfen?

Gruß,
Rumkugel

von (prx) A. K. (prx)


Lesenswert?

96MHz geht beim STR9 durchaus, aber Busse und Flash müssen dafür 
entsprechend konfiguriert werden (Teiler/Waitstates). Und zwar bevor der 
Systemtakt auf die PLL geschaltet wird.

Da du nicht schreibst, was du tust, lässt sich auch nicht sagen, was du 
falsch machst.

von Rumkugel (Gast)


Lesenswert?

Ich bin hier offenbar auf eine kleine Hardwareeigenart getroffen.

http://www.keil.com/support/docs/3306.htm

also demnach BRCLK und FMICLK halbieren.. und das funktioniert sogar :)

Gruß,
Rumkugel

von (prx) A. K. (prx)


Lesenswert?

Rumkugel schrieb:

> http://www.keil.com/support/docs/3306.htm

Trifft hier nicht zu. Das bezieht sich nur auf Anfangsrevisionen des 
etwas glücklosen STR911F, nicht auf die spätere Version davon und schon 
garnicht auf den deutlich verbesserten STR911FA.

Wenn das dein Problem löst, dann weil du was anderes falsch gemachst 
hast. Das Flash-Timing wäre der erste Verdacht.

Du wirst zwar auch bei vollen 96MHz fast jedes Rennen gegen 70-100MHz 
CM3 verlieren, aber mit halben Flashtakt erst recht.

von Rumkugel (Gast)


Lesenswert?

hmm, ok, dann poste ich mal mein setting.
1
SCU_MCLKSourceConfig(SCU_MCLK_OSC);     // MSTR = OSC 
2
SCU_PLLCmd(DISABLE);                    // disable PLL  
3
SCU_BRCLKDivisorConfig(SCU_BRCLK_Div1); // BRCLK = MSTR = 96MHz (SSP & USART) 
4
SCU_RCLKDivisorConfig(SCU_RCLK_Div1);   // RCLK  (CPUCLK) = MSTR  
5
SCU_PCLKDivisorConfig(SCU_PCLK_Div2);   // PCLK  (APB bus clock)   = RCLK/2 
6
SCU_HCLKDivisorConfig(SCU_HCLK_Div1);   // HCLK  (AHB bus clock)   = RCLK 
7
8
// diese beiden Zeilen sind neu:
9
SCU_BRCLKDivisorConfig(SCU_BRCLK_Div2);  
10
SCU_FMICLKDivisorConfig(SCU_FMICLK_Div2);
11
12
SCU_PLLFactorsConfig(192,25,2);   // PLL = 96 MHz  
13
SCU_PLLCmd(ENABLE);               // Enable PLL
14
SCU_MCLKSourceConfig(SCU_MCLK_PLL);   // MSTR = PLL

Also wie gesagt, es läuft ja nun, aber würd natürlich auch gern wissen, 
weshalb, bzw. weshalb vorher nicht..

Gruß,
Rumkugel

von Rumkugel (Gast)


Lesenswert?

Sobald ich nur diese eine Zeile ausklammere, startet der Controller 
bereits nicht mehr.
1
SCU_FMICLKDivisorConfig(SCU_FMICLK_Div2);

Das ist schon ziemlich ärgerlich, denn ich wäre gern so schnell wie 
möglich unterwegs...

Gruß,
Rumkugel

von (prx) A. K. (prx)


Lesenswert?

Wo definierst du das Flash selbst? FMI_Config sehe ich nirgends.

von Rumkugel (Gast)


Lesenswert?

Offen gesagt bin ich ziemlicher Anfänger auf diesem Gebiet (ARM) und 
Flash-Waitstates sagen mir erstmal garnix..

Gruß,
Rumkugel

von (prx) A. K. (prx)


Lesenswert?

Ist auch wirklich ein bischen fies von ST, sowas im Flash Programming 
Manual zu verstecken ;-). Aber irgendwo logisch, denn das Flash ist ja 
ein separater Chip. Gibt dort auch noch etwas mehr zu beachten als die 
Waits.

Schau mal dort rein, und dann unter den FMI_xxx Funktionen der Lib.

von Rumkugel (Gast)


Lesenswert?

Besten Dank erstmal soweit.

hab dies noch in meiner startup912.s gefunden:

[avrasm]

 /*; --- wait states Flash confguration */

        LDR     R6, = 0x00080000     /*;Write a Write Flash 
Configuration */
        LDR     R7, =0x60            /*;Register command (60h) to any 
word*/
        STRH    R7, [R6]             /*;address in Bank 1.*/


        LDR     R6, = 0x00083040     /*;Write a Write Flash 
Configuration  */
        LDR     R7, = 0x3            /*;Register Confirm command (03h)*/
        STRH    R7, [R6]             /*;2Wstaites in read,PWD,LVD 
enabled, */
                                     /*;High BUSCFG.*/

[avrasm]

sagt mir erstmal garnix.
Aber ich schau mal in das Flash Programming Manual

Gruß,
Rumkugel

von Rumkugel (Gast)


Lesenswert?

So richtig schlau bin ich aus dem Flash Programming Manual leider nicht 
geworden. Ich denke aber ich benötige diese Konfiguration:
1
FMI_Config(FMI_READ_WAIT_STATE_3, FMI_WRITE_WAIT_STATE_0, FMI_PWD_ENABLE, FMI_LVD_ENABLE, FMI_FREQ_HIGH);

Die Zeile habe ich hinter dem PLL Disable und vor dem PLL Enable 
platziert, aber leider hilft es nichts. Ohne FMICLK Divisor läuft gar 
nichts.

Steht die Zeile nun an der falschen Stelle, habe ich noch mehr 
vergessen, oder stimmt die Konfiguration nicht?

Gruß,
Rumkugel

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.