Forum: Mikrocontroller und Digitale Elektronik Warum läuft der CAN-Bus auf einem GD32F303 nicht mit dem Code eines STM32F103?


von Hochsitz C. (hochsitzcola)


Angehängte Dateien:

Lesenswert?

Ich habe lange rumprobiert. Die Peripherie Register der beiden 
Prozessoren sind identisch, ein einfacher Blink Code läuft auch 
problemlos mit dem STM32F103 Code. Ein Blinken auf dem CANTx Pin kommt 
am CAN Transceiver an.
Leider gibt es zu dem GD32F303RCT6 nur sehr wenige Codebeispiele und die 
laufen ebenfalls nicht auf meiner Hardware (ein Bafang BLDC Controller) 
Auf dem CAN Tx kann ich mit dem Oszi keinerlei Aktivität sehen. Daß das 
Timing ggf. nicht passt, würde ich wegen der unterschiedlichen 
Clock-Konfiguration ja noch einsehen.

Ich weiß, daß man in Reference Manuals alle nötigen Informationen findet 
(siehe Bild) Ich weiß, daß die HAL Bibliotheken doof sind. Ich weiß 
auch, daß der eine Cortex M3 und der andere Cortex M4 ist ;)

: Bearbeitet durch User
von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Einen Moment, ich geh schnell Popcorn kaufen...

: Bearbeitet durch User
von Hochsitz C. (hochsitzcola)


Lesenswert?

heute ist anscheinend keine Vorstellung :-)

von Wastl (hartundweichware)


Lesenswert?

Wer billig kauft, kauft doppelt.

Lieber stunden-, tagelang herumfrickeln und herumärgern anstatt
was Vernünftiges zu verwenden. Zudem die Controller ja mit
Goldbarren aufzuwiegen sind.

von Peter L. (pelikan)


Lesenswert?

moin,
CAN läuft bei mir mit 1 Modul auf 103,303,405,412,413, 446.
Immer identisch .. bis auf 412,413 die haben bei CAN1 AF8!
CAN hat gefühlte 100 Register, alle verglichen?

von Hochsitz C. (hochsitzcola)


Lesenswert?

Peter L. schrieb:
> CAN läuft bei mir mit 1 Modul auf 103,303,405,412,413, 446.

auf einem STM oder auf einem GD? Auf dem STM läuft es bei mir auch.
Wenn es auf einem GD läuft, gibt es da einen Beispielcode?

Wastl schrieb:
> Wer billig kauft, kauft doppelt
Der Controller war keineswegs billig, warum ein Clone verwendet wird und 
kein Original, musst du Bafang fragen, nicht mich ;) Wobei der GD ja ein 
deutlicher Fortschritt ist gegenüber dem STM32F103. 120MHz statt 72, M4 
statt M3, Hardware FPU...
Wer aus Hobby selber Firmware für einen BLDC Controller schreibt und 
sich nicht einfach einen VESC, einen ASI, einen Sabvoton, einen Kelly 
kauft, muss schon ein bisschen nerdig sein ...

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Hochsitz C. schrieb:
> Ich habe lange rumprobiert. Die Peripherie Register der beiden
> Prozessoren sind identisch,

Wie kommst du darauf? Dia haben ja nicht einmal die gleichen Namen,
weder die Register als Ganzes noch die einzelnen Bits. Die I/O- und
damit die CAN-Funktionalität ist vermutlich an den STM32 angelehnt,
was aber noch lange nicht heißt, dass der GD32 und der STM32 bis ins
Detail kompatibel sind. Oder wird das im Datenblatt des GD32 etwa
zugesichert? Natürlich nicht.

Hier werden ein paar von den Unterschieden beschrieben:

  https://easyelectronics.ru/img/ARM_kurs/STvsGD/Migration/compatibility%20sumup%20between%20GD32%20and%20STM32_V2.0.pdf

> Leider gibt es zu dem GD32F303RCT6 nur sehr wenige Codebeispiele und die
> laufen ebenfalls nicht auf meiner Hardware (ein Bafang BLDC Controller)

Müssen sie das? Wurde der Controller ohne Firmware ausgeliefert?

Hochsitz C. schrieb:
> Wobei der GD ja ein deutlicher Fortschritt ist gegenüber dem
> STM32F103. 120MHz statt 72, M4 statt M3, Hardware FPU...

Kein Wunder, denn du vergleichst Äpfel mit Birnen:

xx32F1yy -> Cortex M3
xx32F3yy -> Cortex M4   (xx ∈ {STM, GD})

> Wer aus Hobby selber Firmware für einen BLDC Controller schreibt und
> sich nicht einfach einen VESC, einen ASI, einen Sabvoton, einen Kelly
> kauft, muss schon ein bisschen nerdig sein ...

Nerdig sein alleine reicht nicht, vor allem sollten seine
Softwarefähigkeiten etwas über die bloße Copy/Paste-Programmierung
hinausreichen :)

von Hochsitz C. (hochsitzcola)


Lesenswert?

Das mit den identischen Registern zum STM32F103 habe ich mir nicht 
ausgedacht, das kann man an verschiedenen Stellen lesen, z.B.
hier:
https://www.eevblog.com/forum/microcontrollers/psa-gd32f303-is-not-a-drop-in-substitute-for-stm32f303/

Don't know about the M4 vs M3 part though but binaries built for 
STM32F103 run on the GD32F303 with no modifications including the 
peripherals (currently tested: usb, adc, timer, dma, interrupts).

von Rahul D. (rahul)


Lesenswert?

Hochsitz C. schrieb:
> 
https://www.eevblog.com/forum/microcontrollers/psa-gd32f303-is-not-a-drop-in-substitute-for-stm32f303/

In dem Thread steht doch auch "RTFM".
Warum sollten Quellcodes des einen Herstellers auf Controllern eines 
anderen "einfach so" funktionieren?

von Hochsitz C. (hochsitzcola)


Lesenswert?

Früher wurde einem hier neben den üblichen Stänkereien noch geholfen. 
Die Leute mit Ahnung schlafen wohl noch. :-)
GD nennt seinen CAN je nach Ausführung CAN0 oder nur CAN, dieser 
Differenzierung muss ich wohl intensiver nachgehen, ggf. gibt es da doch 
Unterschiede in den Registern, die ich noch nicht gefunden habe...

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Hochsitz C. schrieb:
> GD nennt seinen CAN je nach Ausführung CAN0 oder nur CAN, dieser
> Differenzierung muss ich wohl intensiver nachgehen, ggf. gibt es da doch
> Unterschiede in den Registern, die ich noch nicht gefunden habe...

Das machen andere Hersteller genauso.
Wenn ein Controiller nur eine (CAN-) Schnittstelle hat, braucht die wohl 
kaum einen Index zur Unterscheidung.

Hochsitz C. schrieb:
> Früher wurde einem hier neben den üblichen Stänkereien noch geholfen.
> Die Leute mit Ahnung schlafen wohl noch. :-)

Was erwartest du? Wenn du einen Baustein verwenden willst, für den es 
keine Beispiele gibt, wirst du dich - wie jeder andere - durchs Handbunh 
hangeln müssen.
Da hilft es wohl kaum, Beispiele anderer einfach so übernehmen zu wollen 
und sich auf (unbestätigte) Aussagen in irgendwelchen Foren zu 
verlassen, nur weil es einem so gefällt.

Hochsitz C. schrieb:
> (currently tested: usb, adc, timer, dma, interrupts).
Dann trifft die Aussage möglicherweise auch / wohl offensichtlich nicht 
auf die komplette Peripherie zu.

Hochsitz C. schrieb:
> Auf dem CAN Tx kann ich mit dem Oszi keinerlei Aktivität sehen. Daß das
> Timing ggf. nicht passt, würde ich wegen der unterschiedlichen
> Clock-Konfiguration ja noch einsehen.

Das Posten deines Quellcodes könnte bei der Fehlersuche helfen...

von Roland E. (roland0815)


Lesenswert?

Hochsitz C. schrieb:
> Früher wurde einem hier neben den üblichen Stänkereien noch geholfen.
> Die Leute mit Ahnung schlafen wohl noch. :-)
> GD nennt seinen CAN je nach Ausführung CAN0 oder nur CAN, dieser
> Differenzierung muss ich wohl intensiver nachgehen, ggf. gibt es da doch
> Unterschiede in den Registern, die ich noch nicht gefunden habe...

Nunja. Wenn der Fragende beim zusammenkopieren von Code scheitert und 
sich dann beratungsresistend zeigt, was die möglichen Problemursachen an 
geht, ist es nicht verwunderlich wenn der Ton rauer wird.

Lese die Datenblätter und lerne (selbst) programmieren. Dann klappt auch 
mit CAN auf (beliebigen) Controllern.

von Wastl (hartundweichware)


Lesenswert?

Roland E. schrieb:
> Nunja. Wenn der Fragende beim zusammenkopieren von Code scheitert und
> sich dann beratungsresistend zeigt, was die möglichen Problemursachen an
> geht, ist es nicht verwunderlich wenn der Ton rauer wird.

Wenn es schon sonst keiner tut dann muss man sich eben selbst
beweihräuchern indem man sich als "nerdig" bezeichnet.

von Peter L. (pelikan)


Lesenswert?

1. ich verwende nur STM-MCs.
2. in deinem Registervergleich ist ein CAN_CTL angegeben. Das kenne ich 
bei
   STM nicht.
3. was sagt der Debuger?
4. aus deinem Link:
Other psa: the samc21 chips do not have usb...  (difference between a 
d20 and d21 is essentially usb.  Difference between c20 and c21 is... 
CAN.
5. Da es Robodyn nicht mehr gibt, ist der STM32F303 für mich tot.
   Bei den BlackPills ersetze ich
   STM32F401CD -> STM32F412CE
   STM32F401RC -> STM32F446RE
6. Können die 120MHz für USB mit 2,5 geteilt werden?

von Hochsitz C. (hochsitzcola)


Lesenswert?

Rahul D. schrieb:
> Das Posten deines Quellcodes könnte bei der Fehlersuche helfen...

https://github.com/stancecoke/BionX_Minimal_Translator/tree/BAFANG_Hubmotor_Controller
Der Code läuft auf dem STM32F103.

Ganz unbeschlagen bin ich der Materie nicht ;)

Und ich lerne auch jederzeit gern dazu, sonst würde ich hier ja nicht 
fragen, obwohl ich weiß, das hier gern gespottet und gelästert wird, daß 
man überhaupt keine Ahnung hat und sich einfach das Reference Manual 
anschauen muss...

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Hochsitz C. schrieb:
> Ganz unbeschlagen bin ich der Materie nicht ;)

Dann sollte dir der Umstieg ja eigentlich leichtfallen.

von Nemopuk (nemopuk)


Lesenswert?

Rahul D. schrieb:
> Das Posten deines Quellcodes könnte bei der Fehlersuche helfen...

Wahrscheinlich käme dann heraus, dass er die Lizenbedingungen der Tools 
und Libraries von ST missachtet hat.

"This software package or any part thereof, including modifications 
and/or derivative works of this software package, must be used and 
execute solely and exclusively on or in combination with a 
microcontroller or a microprocessor devices manufactured by or for 
STMicroelectronics."

https://www.st.com/content/ccc/resource/legal/legal_agreement/license_agreement/group0/eb/8e/f9/c1/9e/64/49/95/SLA0048/files/SLA0048.txt/jcr:content/translations/en.SLA0048.txt

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Nemopuk schrieb:
> Wahrscheinlich käme dann heraus, dass er die Lizenbedingungen der Tools
> und Libraries von ST missachtet hat.

Die sind doch alls kommerziell nutzbar.
Die auf Github veröffentlichen Projekte habe ich mir nicht näher 
angeguckt.
Könnte natürlich sein, dass die Copy-Paste-Programme sind.

von Hochsitz C. (hochsitzcola)


Lesenswert?

Nemopuk schrieb:
> die Lizenbedingungen der Tools

Wenn ich es mit den Libraries von GD hinbekommen hätte, würde ich auch 
nicht fragen. Zu denen gibt es so gut wie keine Dokumentation und nur 
sehr wenig Beispielcode. Und selbst das Wenige habe ich nicht zum Laufen 
bekommen, lande selbst bei einfachen Blink Codes immer im hardfault 
handler :(

von Nemopuk (nemopuk)


Lesenswert?

Rahul D. schrieb:
> Die sind doch alls kommerziell nutzbar.

Lies mal den von mir zitierten Absatz aus der Lizenz.

von Nemopuk (nemopuk)


Lesenswert?

Hochsitz C. schrieb:
> Zu denen gibt es so gut wie keine Dokumentation und nur
> sehr wenig Beispielcode.

Nun siehst du, warum die Chips von ST mehr Wert sind. Du bezahlst beim 
Kauf nicht nur die Hardware, sondern auch die Dokumentation und Tools.

von Rahul D. (rahul)


Lesenswert?

Nemopuk schrieb:
> Lies mal den von mir zitierten Absatz aus der Lizenz.
Hättest du früher posten müssen...

Punkt 4 ist schon mal verletzt, wenn man STM-Software auf anderen 
Controllern laufen lassen will...
Zack! Abmanung ist raus!

Kommerziell darf man sie trotzdem verwenden...Sonst wären STM-Controller 
ziemlich schnell von der Bildfläche verschwunden.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hochsitz C. schrieb:
> Und ich lerne auch jederzeit gern dazu,
Grundsätzlich: der GD-Nachbau lädt den Code ins RAM und führt ihn von 
dort dann ohne Waitstates schneller aus als das STM-Original. Wenn der 
Code timingmäßig "so hingefrickelt" wurde, kann es sein, dass 
"schneller" einfach "zu schnell" ist und irgendwelche Raceconditions und 
Blokaden auftreten. BTDT.

von Dieter S. (ds1)


Lesenswert?

Um auszuschließen dass es an Unterschieden beim GD32 liegt: hast Du 
schon versucht den Code auf einem STM32F303 zum Laufen zu bringen?

von Benedikt H. (hunz)


Lesenswert?

Wenn das nur ein einzelnes Gerät für private Spielereien ist, würde ich 
ja kurzerhand einfach den GD32 per Heissluft raus- und einen richtigen 
STM32 reinmachen um meine Nerven zu schonen.
Wenn das keine private Spielerei ist, hätte ich da etwas Bedenken dabei, 
Code auf einen anderen µC zu werfen, bei dem ich nicht das Gefühl habe, 
den gut genug verstanden zu haben. (Zusätzlich zu der o.g. 
Lizenzproblematik.)

von Hochsitz C. (hochsitzcola)


Lesenswert?

Dieter S. schrieb:
> auf einem STM32F303 zum Laufen zu bringen

Das macht ja keinen Sinn, der GD32F303 ist eben kein Clone des 
STM32F303, sondern ein aufgemotzter F103. Siehe meinen Link weiter oben.

Ich werde berichten, wenn ich mit dem Thema weiterkomme.

von Dieter S. (ds1)


Lesenswert?

Du könntest es eventuell mit dem hier ausprobieren:

https://github.com/embeddedalpha/STM32F103_CAN_Project

Das eigentliche Binary ist nur ca. 5 KByte groß (die ELF Datei ist 
dabei, das Binary kann man daraus erzeugen) und es werden kontinuierlich 
CAN Frames mit 1 MBit/s verschickt.

Auf einem STM32F103 funktioniert es und zum Testen ohne CAN Transceiver 
reicht es wenn PA12 (CANTx) mit PA11 (CANRx) verbunden ist (sonst 
passiert ohne CAN Transceiver nichts).

: Bearbeitet durch User
von Hochsitz C. (hochsitzcola)


Lesenswert?

Ich habe es jetzt mit dem GDEmbeddedBuilder hinbekommen, so hingebogen, 
daß der STLink zum Flashen und Debuggen direkt aus der Anwendung läuft.
https://github.com/stancecoke/BAFANG_HUB_GD32F303RCT6

Warum der ST-Code nicht läuft, ist mir aber immer noch rätselhaft, ich 
habe noch mal die CAN Register überprüft und keine Unterschiede gefunden 
auch der CAN0 hat die gleiche Basisadresse wie der CAN1 bei ST...

von Peter (pittyj)


Lesenswert?

STM liefert doch eine HAL mit, so dass man gar nicht an die Register 
muss.
Jedenfalls mache ich das bei SPI, I2C, USB und Ethernet.
Ich finde die STM HAL sehr hilfreich, weil sie einem die ganzen 
Bitspielereien erspart. So hat man fix einen lauffähigen I2C Master.

Gibt es keine entsprechende HAL bei GD32.. . So mit Beispielen und etwas 
Anwendungscode? Da muss es doch auch Hilfe für Einsteiger geben?
HAL ist doof???? Ist eine doofe Aussage, wenn man es selber auch nicht 
hin bekommt?

von Hochsitz C. (hochsitzcola)


Angehängte Dateien:

Lesenswert?

Peter schrieb:
> Ist eine doofe Aussage, wenn man es selber auch nicht hin bekommt?

Die Aussage sollte gewisse Experten hier davon abhalten, über die 
Verwendung der HAL Bibliotheken zu lästern, das kommt regelmäßig in 
solchen Threads ;)
Es ist angeblich viel einfacher, direkt in die Register zu schreiben, 
ist viel schneller in der Ausführung und spart Speicher.

Mag ja sogar richtig sein, wenn man das Reference Manual auswendig 
gelernt und verstanden hat.

GD hat für einige Prozessorfamilien HAL Bibliotheken, für den GD32F303 
funktioniert aber leider weder die Code Generierung aus dem graphischen 
Tool zum Peripherie Setup, noch gibt es HAL Bibliotheken, siehe 
Screenshot.
Es gibt prozessorspezifische Peripheral Libraries, so dass man nicht 
selber in die Register schreiben muss.

Findet man alles zum Download auf der GD-Homepage. Und funktioniert 
alles sehr ähnlich der STM CubeIDE, genauso aufgesetzt auf Eclipse.
IDE und Peripheral Libraries:
https://gd32mcu.com/en/download/7?kw=GD32F3

Beispiele:
https://gd32mcu.com/en/download/8?kw=GD32F3

: Bearbeitet durch User
von Gregor J. (Firma: Jasinski) (gregor_jasinski)


Lesenswert?

Peter schrieb:
> HAL ist doof?

Weder HAL, noch LL oder die Zugriffe auf Registerebene sind doof – man 
muss halt wissen, was wann sinnvoll ist, es einzusetzen und zu 
gebrauchen. Bei mir ist es ein Mix aus allen drei Bereichen und der 
Schwerpunkt liegt auf LL und Registerebene, aber den eigenen Schwerpunkt 
muss schon jeder selbst herausfinden oder entsprechend seiner 
Fähigkeiten setzen. Man sollte sich auch darüber im Klaren sein, dass 
sowohl HAL als auch LL – je nach IDE-Version – Fehler enthalten können, 
was in der Vergangenheit vorgekommen ist. Eigene Registerzugriffe können 
selbstverständlich auch fehlerhaft sein, vor allem dann, wenn man nicht 
weiß, wie man es nicht machen sollte – manche „Superhelden” verwenden 
z.B. Zahlen für Adressen und Bitzusammensetzungen, statt auf die zur 
Vefügung gestellten Definitionen zurückzugreifen. Der Gebrauch von 
eigenen Macros ist in diesem Zusammenhang auch wichtig, weil man den 
Code dann deutlich einfacher schreiben und – was noch wichtiger ist – 
besser lesen kann.

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

Lothar M. schrieb:
> Grundsätzlich: der GD-Nachbau lädt den Code ins RAM und führt ihn von
> dort dann ohne Waitstates schneller aus als das STM-Original.

Dann wäre doch ein Ansatz auf 72 Mhz zu takten.

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.