Ich verstehe das nicht.
Ich habe im "Device Configuration Tool" für USB_HOST unter "Platform
Settings" gesetzt "Drive_VBUS_FS | GIO:Ouput | PG6".
Dennoch wird der PG6 nicht in usbh_conf.c initialisiert.
Im Referenzprojekt FatFs_USBDisk gibt's dafür in usbh_conf.c
Und, bleibt Dir ein mulmiges Gefühl im Bauch?
Glücklicherweise ist Dir die Fehlfunktion ja aufgefallen, da die
erwartete Reaktion vom Programm nicht stattfand.
Der Cube-Code ist wohl nie richtig getestet worden.
> Und, bleibt Dir ein mulmiges Gefühl im Bauch?
So ganz wohl ist mir dabei nicht, weil ich nicht weiss, was da noch
alles für Fehler drin schlummern.
Der User USB port wird jetzt mit Spannung versorgt (ok).
Wenn ich einen USB Stick einstecke, dann lande ich auch in dem von
Zu einem breakpoint NACH dem HAL_Delay(10U) komme ich nicht mehr.
Stattdessen lande ich dann als nächstes wieder in meinem breakpoint auf
Zeile #232 hier:
1
/**
2
* @brief This function handles USB On The Go FS global interrupt.
3
*/
4
voidOTG_FS_IRQHandler(void)
5
{
6
/* USER CODE BEGIN OTG_FS_IRQn 0 */
7
8
/* USER CODE END OTG_FS_IRQn 0 */
9
#232 HAL_HCD_IRQHandler(&hhcd_USB_OTG_FS);
10
/* USER CODE BEGIN OTG_FS_IRQn 1 */
11
12
/* USER CODE END OTG_FS_IRQn 1 */
13
}
Und der backtrace sagt:
1
Thread#1[main]1[core:0](Suspended:Breakpoint)
2
OTG_FS_IRQHandler()atstm32f7xx_it.c:2320x8000e00
3
<signalhandlercalled>()at0xfffffffd
4
prvPortStartFirstTask()atport.c:2610x800dbf8
5
xPortStartScheduler()atport.c:3670x800dcd0
Das liegt vermutlich am FreeRTOS scheduling wegen des
'HAL_Delay(10U)'(?)
Wenn ich nun im Debugger auf "play" drücke lande ich bei einem
HardFault_Handler():
> Und, bleibt Dir ein mulmiges Gefühl im Bauch?
Also dafür, dass ich gerade erst mit dem STM32 angefangen habe, komme
ich gar nicht mal so schlecht damit zurecht - trotz der ganzen
Widrigkeiten :-)
Es **war** der stacksize für den USB_HOST.
Das nächste issue:
https://github.com/STMicroelectronics/STM32CubeF7/issues/47
Frank B. schrieb:> Das ist echt hartes Brot :-)>> Jetzt hänge ich in einer Schleife hier:
Das ist der Preis, den man für's Zusammenklicken bezahlen muß.
Aber solange Du nicht am Baum hängst ... ;-)
Frank B. schrieb:> Was meinst Du mit "Zusammenklicken"?
Das bezog sich primär auf die Verwendung von CubeMX. Man klickt die
Funktionen wie gewünscht an und erwartet, daß ein funktionierendes
Programm geliefert wird: kann sein - muß aber nicht, wie man auch in
diesem Forum an verschiedenen Stellen nachlesen kann.
Frank B. schrieb:> Oder sind die Libraries einfach (noch) nicht aufeinander abgestimmt.
Wer soll das "Abstimmen" der LIBs denn leisten? Gut ist, wenn man
passenden Code findet. Wenn es nicht passt, ist es Deine Aufgabe.
> Und> muss man dann alle Libraries knicken und komplett low-level alles> selber machen?
Bei komplexeren Funktionen wie USB kann das sehr aufwendig werden,
entweder eigenen Code zu schreiben oder die Fehler im Fremdcode zu
finden und beseitigen.
Persönlich brauche ich für meine Anwendungen kein USB, obwohl hier im
Forum einige Beispiele dafür zu finden wären. Aber was ich brauche, ist
low-level Programmierung, die die Hardware so verwendet, wie es benötigt
wird. Daher lese ich das Datenblatt, das Reference-Manual und
programmiere auf Registerebene. Das dauert anfangs sicherlich länger als
CubeMX und HAL zu verwenden. Dafür weiß ich aber, wo was und warum
passiert.
Frank B. schrieb:> Also dafür, dass ich gerade erst mit dem STM32 angefangen habe, komme> ich gar nicht mal so schlecht damit zurecht - trotz der ganzen> Widrigkeiten :-)
Für ein Fazit ist es wohl noch zu früh.
>> Also dafür, dass ich gerade erst mit dem STM32 angefangen habe, komme ich>> gar nicht mal so schlecht damit zurecht - trotz der ganzen Widrigkeiten :-)> Für ein Fazit ist es wohl noch zu früh
Lass mich raten: Du bist hauptberuflich Motivationstrainer ;-)
ich finde es auch eher erstaunlich wieviel mittlerweile auch an
Middleware integriert ist. Und für komplexere Schnittstellen wie
Ethernet oder USB reicht es auch nicht ein paar Seiten Datenblatt zu
lesen, das war bisher sehr teuer oder es war ein deutlich höherer
Eigenanteil nötig.
Wie man sieht bearbeitet STM die issues auf Github auch, aber es dauert.
Dazu kommt das der F7/H7 mit seinem Cache und verschieden angebundenen
Speicher auch sehr komplex ist. Ein Stück Software das heute noch lief
kann morgen schon crashen wenn durch ein gewachsenes Programm ein Buffer
von einem Speicher in den anderen rutscht.
Auch ein RTOS mal eben optional einbauen ist gefährlich wenn nicht alle
Libs dafür entwickelt wurden. Beim Cube generierten Code sehe ich nicht
das da mit Tests gearbeitet wird, wie z.B. bei einem (RT)OS wie Mbed. Da
ist es schwer neue Features rein zu bekommen weil alles aufwändig durch
automatisierte Tests laufen muss.
Die Strategie mit MS ist schon interessant, aber einiges ist ja durch
den CMSIS Layer für das RTOS abgefangen. Das FreeRTOS wird ja nicht
einfach verschwinden und auch weiterhin integrierbar sein. Nur eventuell
durch mehr eigene Handarbeit...
Ich verstehe, Du möchtest meine Kontonummer ;-)
Kleine Geschichte:
Bei einem STM32H723 möchte ich RNG anwerfen, um "saubere" Zufallswerte
zu erhalten. Beim H750 waren drei Anweisungen notwenig: RCC freigeben,
Takt auf HSI48 stellen und Enable. Simpel.
Beim H723 versuche ich Gleiches, erhalte ein paar hundert Werte und dann
bleibt RNG mit Taktfehler hängen.
Testweise CubeMX angeworfen und RNG per HAL starten lassen.
Nach MX_RND_Init() läuft RNG für kurze Zeit und bleibt dann stehen. In
den Registern steht der gleiche Inhalt wie nach meiner manuellen
Initialisierung.
Ganz schnell erledigt und wirkungslos ;-)
Auf der HAL-Ebene passiert einiges, was schlecht zu durchschauen ist.
Dort finde ich keinen richtigen Ansatzpunkt.
Auf Registerebene habe ich zumindest herausgefunden, daß eine Senkung
der Taktfrequenz RNG weiterlaufen läßt. Fertig bin ich noch nicht. Auf
der Suche nach "fertigen" Lösungen stoße ich wieder auf dieses
HAL-Gedöns.
Was ich sagen will: Im Zweifelsfall kommt man nicht umhin, sich im
Detail mit der Hardware auseinanderzusetzen. Sich hoffnungsvoll auf
CubeMX+HAL zu verlassen, kann schwer daneben gehen. Wenn noch andere
Quellen dazukommen, die in einer speziellen Umgebung durchaus stabil
laufen, kann Debugging schwer bis unmöglich werden.
Glückstreffer Stack vergrößern klappt nicht immer.
@Johannes S.
Hast Du vielleicht eine Lösung für RNG beim H723/H730?
Könnte ja sein, daß Du selbiges Problem schon mal hattest.
m.n. schrieb:> Könnte ja sein, daß Du selbiges Problem schon mal hattest.
nein, habe den TRNG bisher nicht (bewusst) genutzt.
Vielleicht hilft die init Sequenz aus dem Mbed weiter:
https://github.com/ARMmbed/mbed-os/blob/master/targets/TARGET_STM/trng_api.c
Auch als Beispiel wie HAL Benutzung für verschiedene Serien sehr
unterschiedlich ist. Da sollte das funktionieren weil RNG afaik für TLS
gebraucht wird.
Vielen Dank!
Copyright ist 2006 - 2016 angegeben, wo es schon den H74x/H75x gab aber
noch nicht die H72x/H73x Version, die deutlich differenzierter
einstellbar ist. Aber ich werde mich weiter durchhangeln, auch in den
Bereichen, in denen RNG benötigt wird.
> Sich hoffnungsvoll auf CubeMX+HAL zu verlassen, kann schwer daneben gehen.
Warum verwende ich das framework?
Weil es da ist und dafür gedacht ist, dass man Basis-Funktionalität
einfach einbindet, verwendet, und sich auf seine eigentliche Applikation
konzentrieren kann. Und sei es, dass man diesen Weg erst mal nur geht um
eine sub-optimale Vorab-Lösung zu haben, die funktioniert und mit der
man die eigentliche Funktionalität erarbeiten kann.
Konkret geht es hier um Logging. Ich will Meßwerte aufnehmen, ggf.
"Aktoren" ansteuern" und das protokollieren. Dann kann nämlich jemand
anderes sich diese Messwerte schon mal ansehen und damit arbeiten,
während ich dann prüfe, ob das Logging vom framework ok ist, oder ob ich
das noch mal überarbeiten will (tunen, verschlanken, vereinfachen).
Warum verwende ich FreeRTOS?
Weil es eine Möglichkeit ist, Funktionsblöcke gedanklich voneinander zu
isolieren, getrennt anzugehen, ggf. sogar auf mehrere Leute verteilt
entwickeln zu lassen. Auch hier: vielleicht nur als Prototyp, um z.B.
erst mal Messwerte zu erhalten und auswerten zu können. Später mag man
entscheiden, dass der overhead von FreeRTOS nicht tragbar ist und auf
eine monolithische Lösung wechseln.
Mit dem Ansatz, FreeRTOS zu wählen kann ich nicht prinzipiell falsch
liegen, denn sonst gäbe es dieses Produkt nicht.
Der Anspruch Meßwerte sowohl auf die Console als auch - mit höherer
möglicher Bandbreite - in eine Log-Datei per USB aufzeichnen zu wollen,
ist auch nicht unsinnig.
Eigentlich würde ich erwarten, dass ST da eine Referenz-Implementierung
(Beispiele) für Logging mit und ohne FreeRTOS anbietet. Denn es ist
essential für irgendwelche konkreten Anwendungen, die dem Nutzer da
vorschweben.
ST verwendet ein Haufen Energie auf sein "Service Creation Tool". Warum
wird das dann nicht mit einem wirklich bauchbarem Beispiel validiert?
Ich war lange weg vom Thema STM32, will jetzt aber doch noch mal einen
Anlauf machen. Ich habe damals die STM32CubeIDE v1.6.1 verwendet. Jetzt
habe ich mir die aktuelle v1.16.0 installiert. Ich verwende immer noch
das Board STM32F767ZI.
Damit bin ich jetzt den umgekehrten Weg gegangen und habe das
funktionierende Demo "FatFs_USBDisk" genommen und die Funktionalität der
seriellen Console aus einem anderen Projekt da hinein integriert.
Damit bekomme ich auch eine logging Zeile auf der seriellen Console
angezeigt.
Aber die main() Routine des "FatFs_USBDisk" Demos ruft in einer
"while(1)" Schleife USBH_Process(...) auf. Und dieser Aufruf kehrt bei
aktiviertem logging auf der Console nicht mehr zurück.
Ich nehme an, dass da ein Konflikt bei der Verwendung der Resourcen
vorhanden ist.
In den Sourcen des "FatFs_USBDisk" Demos finde ich in
Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c:
Das wird vermutlich der Konflikt sein (oder EINER der Konflikte).
Kann man da für die USB Funktionalität oder für die serielle Console auf
einen anderen PIN zurückgreifen? Oder gibt das Layout des STM32F767ZI
das nicht her?
Kann man also nur entweder a) auf die Console loggen oder b) auf einen
USB Stick loggen? Ich hätte gerne die Kombination von beidem.
Das Beispiel-Projekt ist hier:
https://github.com/FBergemann/STM32-USBDiskAndConsole
Bitte wundert euch nicht über die Implementierung für die serielle
Console. Die ist aus einem anderen Projekt übernommen, das RTOS
verwendet: https://github.com/FBergemann/STM32-FreeRTOS-Framework