Nabend.
Habe heute mein China Board bekommen (CAN + USART).
Drauf bestückt ist ein 8MHz Quarz.
Als Herzstück ist ein STM32F105R8T6 bestückt. Das ganze habe ich mit
EmBitz compiliert.
Wenn ich jetzt via. USART was ausgeben möchte, kommen nur Sonderzeichen.
Vermutlich ist die Frequenz im Projekt nicht richtig eingestellt, so das
die Baudrate überhaupt nicht richtig berechnet wird.
Oder sieht hier jemand einen fatalen Fehler, was die USART
Initalisierung oder auch das senden betrifft?
Das SystemInit() sollte man als erstes machen, dort wird IIRC der Quarz
eingeschaltet und die Clocks umprogrammiert.
Wenn man das nach der UART Initialisierung macht, sind dessen Baudraten
Einstellungen hinterher falsch.
Jim M. schrieb:> Das SystemInit() sollte man als erstes machen, dort wird IIRC der Quarz> eingeschaltet und die Clocks umprogrammiert.>> Wenn man das nach der UART Initialisierung macht, sind dessen Baudraten> Einstellungen hinterher falsch.
Ich bin mir nicht sicher, wie er konfiguriert ist. Läuft er jetzt mit
25MHz?
Benutze die Standart Treiber von ST.
Johannes S. schrieb:> da wo SystemInit definiert ist sollte es auch etwas wie> 'SystemCoreClock' geben, das kannst du ja über die serielle ausgeben> (wenn sie funktioniert).
Also in der Headerdatei steht nicht viel..
Das haben Header (zumindest bei C) so an sich, dass da nur die
Deklarationen drin stehen. Für die Implementierung der Funktionen würde
ich mal in der entsprechenden .c-Datei nachsehen.
Normalerweise (jedenfalls war das mal von ARM so vorgesehen) wird die
SystemInit auch noch vor der eigentlichen main aufgerufen. Entsprechende
Hinweise liefert der Startup-Code. Findest du dort ein "bl SystemInit"
vor einem "bl main" kannst du dir den Aufruf in der main sowieso sparen.
Christopher J. schrieb:> Das haben Header (zumindest bei C) so an sich, dass da nur die> Deklarationen drin stehen. Für die Implementierung der Funktionen würde> ich mal in der entsprechenden .c-Datei nachsehen.>> Normalerweise (jedenfalls war das mal von ARM so vorgesehen) wird die> SystemInit auch noch vor der eigentlichen main aufgerufen. Entsprechende> Hinweise liefert der Startup-Code. Findest du dort ein "bl SystemInit"> vor einem "bl main" kannst du dir den Aufruf in der main sowieso sparen.
Wo sehe ich denn nun die aktuelle Frequenz mit der Initalisiert wird?
In deinem Projektverzeichnis sollte müsste noch eine gleichnamige
Quelldatei liegen (in deinem Fall also system_stm32f10x_cl.c). Darin
sind dann die Werte enthalten, die mit SystemInit() in die
Controller-Register geschrieben werden.
Diese Datei kann man mit einem einfachen Excel-Tool erzeugen oder mit
dem Programm STMCubeMX. Beides gibts bei ST auf der jeweiligen
Produktseite für deinen Controller zum Download.
Im Anhang siehst du eine solche Datei, welche den Systemtakt einstellt
(exemplarisch für einen STM32F2).
Gruß
A.. P. schrieb:> In deinem Projektverzeichnis sollte müsste noch eine gleichnamige> Quelldatei liegen (in deinem Fall also system_stm32f10x_cl.c). Darin> sind dann die Werte enthalten, die mit SystemInit() in die> Controller-Register geschrieben werden.>> Diese Datei kann man mit einem einfachen Excel-Tool erzeugen oder mit> dem Programm STMCubeMX. Beides gibts bei ST auf der jeweiligen> Produktseite für deinen Controller zum Download.>> Im Anhang siehst du eine solche Datei, welche den Systemtakt einstellt> (exemplarisch für einen STM32F2).>> Gruß
Diese Datei die du meinst, muss ich mir erst noch erstellen?
Jan H. schrieb:> Diese Datei die du meinst, muss ich mir erst noch erstellen?
Er hat doch gerade erst geschrieben:
A.. P. schrieb:> In deinem Projektverzeichnis sollte müsste noch eine gleichnamige> Quelldatei liegen
Dumpfbacke schrieb:> Jan H. schrieb:>> Diese Datei die du meinst, muss ich mir erst noch erstellen?>> Er hat doch gerade erst geschrieben:>> A.. P. schrieb:>> In deinem Projektverzeichnis sollte müsste noch eine gleichnamige>> Quelldatei liegen
Diese gibt es eben nicht.
Jan H. schrieb:> Diese Datei die du meinst, muss ich mir erst noch erstellen?
Wie gesagt: entweder, sie ist da, oder du musst sie noch erstellen. Wenn
du dein Programm kompilieren kannst, wird sie wohl schon da sein und du
musst überprüfen, was drin steht und bei Bedarf auf den korrekten Wert
einstellen.
Darüber hinaus muss USART_Cmd() nach USART_Init() aufgerufen werden. Zur
besseren Orientierung findet man in der Standard Peripherals Library zu
jeder Peripherie eine kurze Anleitung, wie man sie richtig
initialisiert. So z.B. für den USART für einen STM32F1xx:
Die genauen Werte für z.B. Konstanten oder Funktionsnamen musst du
natürlich in deiner speziellen Version nachsehen, hier unterscheiden
sich die Bezeichnungen bei den STMs von Familie zu Familie.
Gruß
A.. P. schrieb:> In deinem Projektverzeichnis sollte müsste noch eine gleichnamige> Quelldatei liegen (in deinem Fall also system_stm32f10x_cl.c). Darin> sind dann die Werte enthalten, die mit SystemInit() in die> Controller-Register geschrieben werden.>> Diese Datei kann man mit einem einfachen Excel-Tool erzeugen oder mit> dem Programm STMCubeMX. Beides gibts bei ST auf der jeweiligen> Produktseite für deinen Controller zum Download.>> Im Anhang siehst du eine solche Datei, welche den Systemtakt einstellt> (exemplarisch für einen STM32F2).>> Gruß
Woher weißt du das sie genau so heißen muss?
Weil es eine übliche Konvention bei C ist, dass eine Quell- und die
zugehörige Header-Datei denselben Namen haben. Datei.c und Datei.h eben.
Da du aber schon so fragst und du scheinbar keine Probleme hast deinen
Code zu kompilieren, solltest du dich mal auf die Suche machen, wo denn
in deinem Code sonst noch die Werte versteckt sein könnten, die
normalerweise in der system_xxxxx.c Datei stehen. Selbstverständlich
kann der Code für die Initialisierung des Systemtakts in jeder
x-beliebigen Datei mit unscheinbarem Namen stehen, solange die Header
eingebunden werden - das wäre aber grober Unfug ;)
Wenn du einen Editor mit vernünftiger Suchfunktion hast, dann kannst du
ja einfach mal in deinem Projektverzeichnis nach Zeichenketten wie
"RCC->CR", "RCC->PLLCFGR" oder einfach "SystemCoreClock" suchen. Das
sind nämlich so ein paar Zuweisungen, die passieren müssten, wenn der
Takt konfiguriert ist. Die Datei, in der das steht ist vielleicht auch
die Datei, die du suchst.
Viel, viel einfacher wäre es aber, einfach das Clock Configuration Tool
von ST runterzuladen, dir eine saubere Datei zu erzeugen und sich nicht
weiter darum zu kümmern. In den letzten 30 Minuten hättest du dir eine
solche Datei ein Dutzend Mal erzeugt :D
Gruß
>Woher weißt du das sie genau so heißen muss?
Ist doch egal. Mach ne Volltextsuche nach SystemInit
in deinem Projekt. Und wenn du gleich das ganze Projekt und nicht
nur Codeschnipsel geliefert hättest, wäre dein Problem längst gelöst.
Was ich noch so weiß ist das diese SystemInits oft für die EVAL
Boards ausgelegt sind. Da ist ein 25MHz Quarz drauf. Das passt dann
nicht zu deinem 8MHz Quarz.
Kompletten Code zeigen dürfte hier am schnellsten zur Lösung
beitragen.
A.. P. schrieb:> Wenn du einen Editor mit vernünftiger Suchfunktion hast, dann kannst du> ja einfach mal in deinem Projektverzeichnis nach Zeichenketten wie> "RCC->CR", "RCC->PLLCFGR" oder einfach "SystemCoreClock" suchen. Das> sind nämlich so ein paar Zuweisungen, die passieren müssten, wenn der> Takt konfiguriert ist. Die Datei, in der das steht ist vielleicht auch> die Datei, die du suchst.>> Viel, viel einfacher wäre es aber, einfach das Clock Configuration Tool> von ST runterzuladen, dir eine saubere Datei zu erzeugen und sich nicht> weiter darum zu kümmern. In den letzten 30 Minuten hättest du dir eine> solche Datei ein Dutzend Mal erzeugt :D>> Gruß
Kannst du mir mal einen Link zum Tool posten?
Ist es das "STM32CubeMx"?
holger schrieb:> Was ich noch so weiß ist das diese SystemInits oft für die EVAL> Boards ausgelegt sind. Da ist ein 25MHz Quarz drauf. Das passt dann> nicht zu deinem 8MHz Quarz.
Ja, scheint tatsächlich häufig so zu sein. Deshalb sage ich ja: einfach
diese Datei einmal selbst erzeugen (dauert doch nur 1 Minute) und fortan
glücklich sein :)
A.. P. schrieb:> holger schrieb:>> Was ich noch so weiß ist das diese SystemInits oft für die EVAL>> Boards ausgelegt sind. Da ist ein 25MHz Quarz drauf. Das passt dann>> nicht zu deinem 8MHz Quarz.>> Ja, scheint tatsächlich häufig so zu sein. Deshalb sage ich ja: einfach> diese Datei einmal selbst erzeugen (dauert doch nur 1 Minute) und fortan> glücklich sein :)
Ja krass. Geht! Scheint so als würde "EmBitz" etwas falsch machen beim
Projekt erstellen.
> Ja krass. Geht! Scheint so als würde "EmBitz" etwas falsch machen beim> Projekt erstellen.
Nein, EmBitz kann ja Deine Hardware nicht kennen. Man kann da Quarze von
3-25MHz dranhängen.
Jan H. schrieb:> Ja krass. Geht! Scheint so als würde "EmBitz" etwas falsch machen beim> Projekt erstellen.
Ich würde diesem EmBitz (kenne das Tool nicht) nicht grundsätzlich
unterstellen, dass es was falsch macht. Wahrscheinlich hat es nur eine
Standardvorlage für ein solches Projekt enthalten, wo eben der Takt für
einen 25 MHz Quarz konfiguriert wird. Daher plädiere ich immer dafür,
nachzusehen, was unter der Haube tatsächlich vor sich geht und nicht
einfach alles schlucken, was einem vor die Füße geschmissen wird. Dann
können solche Problemchen gar nicht erst entstehen.
A.. P. schrieb:> Jan H. schrieb:>> Ja krass. Geht! Scheint so als würde "EmBitz" etwas falsch machen beim>> Projekt erstellen.>> Ich würde diesem EmBitz (kenne das Tool nicht) nicht grundsätzlich> unterstellen, dass es was falsch macht. Wahrscheinlich hat es nur eine> Standardvorlage für ein solches Projekt enthalten, wo eben der Takt für> einen 25 MHz Quarz konfiguriert wird. Daher plädiere ich immer dafür,> nachzusehen, was unter der Haube tatsächlich vor sich geht und nicht> einfach alles schlucken, was einem vor die Füße geschmissen wird. Dann> können solche Problemchen gar nicht erst entstehen.
In diesem Fall also mit diesem Controller, war es ziemlich un
übersichtlich. Bei anderen Controller Familien, war das deutlich
einfacher festzustellen, wo und welche Taktquelle ich gerade einstelle.
Du kannst doch nicht einfach eine Variable vom Typ eines Structs
anlegen, ohne vorherige Initialisierung oder dass damit vorher was
passiert ist auf seine Member zugreifen und erwarten das was sinnvolles
bei rauskommt.
Man kann ja auch nicht einfach
1
inti;
in seinen Code schreiben und in der nächsten Zeile erwarten, dass i =
2017 ist.
Schau dir nochmal an, wie dieses Struct, was du verwendest, korrekt
verwendet und befüllt wird. Hinweis: es gibt eine Methode namens
RCC_GetClocksFreq().