Warum läuft der CAN-Bus auf einem GD32F303 nicht mit dem Code eines STM32F103?

OP #7924334
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 ;)

Angehängte Dateien:
: Bearbeitet durch User
OP #7924375
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
Moderator #7924400
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 :)

OP #7924444
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).

OP #7924479
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
#7924485
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...

#7924487
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.

#7924489
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?
OP #7924494
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
#7924504
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
#7924515
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
Moderator (Firma: Titel) Persönliche Seite #7924535
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.

#7924556
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.)

#7924626
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
OP #7924699
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...

#7924788
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?

OP #7924810
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

Angehängte Dateien:
: Bearbeitet durch User
(Firma: Jasinski) #7924818
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren