ich möchte die hse clock nutzen (8Mhz Quarz).
ich habe dafür folgende routine geschrieben die im main aufgerufen wird.
als hsi/2 clock config funktioniert es!
void clock_init(){
FLASH_SetLatency(FLASH_Latency_1);
* Enable PLL, wait till it's stable, then select it as system clock*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Set HCLK, PCLK1, and PCLK2 to SCLK (these are default */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
/* Set ADC clk to 12MHz (14MHz max, 18MHz default)*/
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
/*To save power, use below functions to stop the clock to ceratin
* peripherals
* RCC_AHBPeriphClockCmd
*/
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL, ENABLE);
}
Also es sollen 72Mhz als sysclk genutzt werden.
ADCclock sollen 12 Mhz sein.
PCLK1 müssen 36Mhz sein
oder muss ich den controller zunächst als hsi konfigurieren????
mikro111 schrieb:> oder muss ich den controller zunächst als hsi konfigurieren????
Ja, wenn er's nicht schon ist. Vorzugsweise immer aus HSI heraus
woanders hin schalten. Aus dem Powerup/Reset kommt er allerdings sowieso
mit HSI.
Hast du den HSE überhaupt eingeschaltet?
Höflicherweise reduziert man den/die Periphieriebustakte bevor man den
Sysclk auf Maximum stellt.
Code als Code posten, sieht sonst schrecklich aus.
Also auf jeden Fall fehlt da mal das: RCC_HSEConfig(RCC_HSE_ON);
Die ganze Clock-Initialisierung kannst Du auch durch die ST-Lib machen
lassen, schau Dir mal das File system_stm32f10x.c an.
Jan H. schrieb:> ich habe genau das gleiche Problem.. Wurde eine Lösung gefunden?
Schon seit Ewigkeiten!
Wenn ich mich recht entsinne, hab ich vor ganz vielen Monaten schon
einmal ein komplettes kleines STM32F103-Projekt hier gepostet. Die
angehängte Datei config.c (vom 19.9.2016) stammt daraus.
W.S.
W.S. schrieb:> Wenn ich mich recht entsinne, hab ich vor ganz vielen Monaten schon> einmal ein komplettes kleines STM32F103-Projekt hier gepostet.> /* Konfiguration für das Testboard mit STM32F302RBT6 */> #include "StdTypes.h"> #include "STM32F302xB.h"
Was denn jetzt, F1 oder F3?
Jan braucht es aber für den STM32F105:
Beitrag "Re: STM32F105xx keine CAN Nachrichten!"
Man kann sich den Initialisierungs-Code aus STM32CubeMX generieren
lassen, oder mithilfe des Datenblattes selber schreiben. Man muss nicht
alles aus dem Internet kopieren...
Dr. Sommer schrieb:> W.S. schrieb:>> Wenn ich mich recht entsinne, hab ich vor ganz vielen Monaten schon>> einmal ein komplettes kleines STM32F103-Projekt hier gepostet.>>> /* Konfiguration für das Testboard mit STM32F302RBT6 */>>> #include "StdTypes.h">> #include "STM32F302xB.h"> Was denn jetzt, F1 oder F3?>> Jan braucht es aber für den STM32F105:> Beitrag "Re: STM32F105xx keine CAN Nachrichten!">> Man kann sich den Initialisierungs-Code aus STM32CubeMX generieren> lassen, oder mithilfe des Datenblattes selber schreiben. Man muss nicht> alles aus dem Internet kopieren...
Dr. Sommer! Du scheinst ja ein Einzelkämpfer zu sein. Super!
Ich für meine Person, brauche nun mal noch externe Hilfe, im Internet
habe ich keine Passende Erklärung gefunden.
Soweit bin ich aktuell..
Vielleicht kommst du besser mit einem Programmbeispiel zurecht, daß
keine HAL Library verwendet:
http://stefanfrings.de/stm32/index.html#takt
Ich richte mich jedenfalls lieber nach den Hinweisen im STM32F1
Reference Manual. Dort sind die Register und Bits genannt, also greife
ich 1:1 darauf zu. Die HAL Libraries verwirren mich nur.
Hier hast du noch eine absolut minimalistische PLL-Config für 72MHz
Systemtakt und 48MHz USB bei 8MHz Quartz. Das hatte ich so mal für einen
F103C8 zusammengestrickt.
1
voidSystemInit(void){
2
3
/* Enable Power Control clock -> see section 7.3.8 in the manual */
4
RCC->APB1ENR|=RCC_APB1ENR_PWREN;
5
6
/* Enable HSE */
7
RCC->CR|=RCC_CR_HSEON;
8
9
/* Wait for HSE to become ready */
10
while((RCC->CR&RCC_CR_HSERDY)==0);
11
12
/*
13
* Configure Main PLL
14
* HSE as clock input
15
* HSE = 8MHz
16
* fpllout = 72MHz
17
* PLLMUL = 9
18
* fusb = 48MHz
19
*
20
* PLL configuration is really straight forward. Setting the PLLMULL bits in the
21
* RCC->CFGR to 0b0111 results in a multiplication factor of 9.
22
* The divider for the USB clock is 1.5 by default, resulting in 48MHz fusb.
23
* Select the HSE as PLL source by setting the PLLSRC bit in the configuration register.
24
* See chapter 8.3.2 in the manual for more information.
Christopher J. schrieb:> RCC->CFGR = (0b0111 << RCC_CFGR_PLLMULL_Pos) | RCC_CFGR_PLLSRC;
Nabend.
Danke für deine Hilfe.
Hiermit stellst du den Faktor für die PLL ein oder ? In dem Fall für
72MHz, sollten das "9" sein oder?
"RCC_CFGR_PLLMULL_Pos" gibt es bei mir in den Headerdateien nicht.
Christopher J. schrieb:> Hier hast du noch eine absolut minimalistische PLL-Config
So lernt er das nie...
Jan H. schrieb:> "RCC_CFGR_PLLMULL_Pos" gibt es bei mir in den Headerdateien nicht.
Nimm die neuen Header-Dateien die zur HAL gehören, nicht die alten für
die SPL. Da sind diese xxx_Pos Makros drin.
Dr. Sommer schrieb:> Nimm die neuen Header-Dateien die zur HAL gehören, nicht die alten für> die SPL. Da sind diese xxx_Pos Makros drin.
Was verbirgt sich hinter dem Macro?
Dr. Sommer schrieb:> Jan H. schrieb:>> Was verbirgt sich hinter dem Macro?>> Die Position des Bits PLLMULL im RCC_CFGR Register, also einfach 18.
Jetzt klappt es!
Besten dank. Werde mir das jetzt mal alles Ausführlich anschauen.
Christopher J. schrieb:> /*> * FLASH configuration block> * enable instruction cache> * enable prefetch> * set latency to 2WS (3 CPU cycles)> */> FLASH->ACR |= FLASH_ACR_PRFTBE> | FLASH_ACR_LATENCY_2;
Wozu genau wird das gemacht?
Der Flash kann mit maximal 24Mhz gelesen werden. Wenn die CPU schneller
getaktet wird, muss sie warten. Dafür ist die Latency, es gibt zwei
mögliche Werte, die je nach Taktfrequenz gewählt werden müssen.
Prefetch aktiviert einen Puffer, der die nächstren Befehle vom Flash in
einen schnelleren Speicher kopiert, den die CPU ohne Wartezeit lesen
kann.
Der Prefetch Buffer kann nur direkt aufeinanderfolgende Befehle
beschleunigen. Bei Sprung-Anweisungen und Interrupts wird sein Inhalt
verworfen.
Stefan U. schrieb:> Der Flash kann mit maximal 24Mhz gelesen werden. Wenn die CPU schneller> getaktet wird, muss sie warten. Dafür ist die Latency, es gibt zwei> mögliche Werte, die je nach Taktfrequenz gewählt werden müssen.>> Prefetch aktiviert einen Puffer, der die nächstren Befehle vom Flash in> einen schnelleren Speicher kopiert, den die CPU ohne Wartezeit lesen> kann.>> Der Prefetch Buffer kann nur direkt aufeinanderfolgende Befehle> beschleunigen. Bei Sprung-Anweisungen und Interrupts wird sein Inhalt> verworfen.
Kann ich mir das so ungefähr wie ein FiFO für Befehle vorstellen?
Wenn das nicht gemacht wird? Kann es dazu kommen das dass Programm an
einigen Stellen abstürzen kann?
Jan H. schrieb:> Kann es dazu kommen das dass Programm an> einigen Stellen abstürzen kann?
Ohne Prefetch wird das Programm lediglich langsamer. Ohne Wait States
stürzt der Controller beim 1. Flash-Zugriff nach dem Takt-Umschalten ab
oder macht sonst irgend einen Unfug.
Die STM32F4 haben mit dem "ART" einen verbesserten Cache, und die F7
einen richtigen L1-Cache.
> Kann ich mir das so ungefähr wie ein FiFO für Befehle vorstellen?
Ja. Während die CPU mit Rechnen beschäftigt ist, kann der Puffer gefüllt
werden.
> Wenn das nicht gemacht wird?
Dann muss die CPU häufiger auf den Flash Speicher warten, da dieser wie
gesagt nur 24Mhz schafft. Wenn du das ignorierst und die CPU z.B. mit
72Mhz ohne Wait States benutzt, dann wird sie abstürzen.
Dr. Sommer schrieb:> Christopher J. schrieb:>> Hier hast du noch eine absolut minimalistische PLL-Config> So lernt er das nie...
Ja ich weiß, das war gespoilert und wenn er das einfach nur per
Copy-Paste übernimmt ohne es zu hinterfragen, dann bringt es nichts. Das
ist ja bei Jan scheinbar nicht der Fall. Würde er sich die Konfiguration
von CubeMX oder sonstwie generieren lassen wäre der Lerneffekt aber
ebenso gleich Null.
Jedenfalls hab ich selber nochmal drüber geschaut und festgestellt, das
man sich die erste Zeile, also
1
/* Enable Power Control clock -> see section 7.3.8 in the manual */
2
RCC->APB1ENR|=RCC_APB1ENR_PWREN;
prinzipiell schenken kann, wenn man denn keine Low-Power-Modi verwenden
will. Dann wäre es wirklich minimal ;)