STM32F103C8 Plattformprojekt mit Display, FATFS, IMU MPU-9250 und Examples

Status
Nicht offen für weitere Antworten.

brm

Erfahrener Benutzer
#81
Ich löse damit ja keinen extra Interrupt aus, sondern lasse damit den Timer zurücksetzen, der frei geringfügig länger laufen würde und ohnehin einen Update Interrupt erzeugen muss. Das kostet gar keine CPU extra. Ein minimaler Jitter entsteht nur dadurch, dass vor dem Betreten der Hauptschleife auf das Flag vom Update Interrupt getestet wird. Wie könnte man den Jitter kleiner als ein paar Clocks machen? Da ist eher das Problem, dass ich das RC Signal per Interrupt vom UART hole und nicht per DMA. Auf dem Logic Analyzer ist kein Jitter zu sehen.

Wenn man einfach ein 1000 Hz Signal mit 1001 Hz sampled läuft die Phasenlage im laufe der Zeit(1s) ja komplett durch. Damit schwankt die Latenz in dieser Periode des Durchlaufens ja mit 1 ms. Im Extremfall liest man dann die Daten unmittelbar bevor die jüngsten Daten lesbar wären. Da ist doch genau das was Du zu Recht kritisiert hast als ich die 1 kHz mit 1,25 kHz gelesen habe.
// SysTick
SysTick_Config(SystemCoreClock / 1000);

versa
// SysTick
SysTick_Config(SystemCoreClock / 1000-1);

das mit den 1001 hz war leicht übertrieben.
man soll sicherstellen, dass keine daten durch jitter verlorengehen.
du solltest mal die m4 architektur studieren.
spätestens da merkst du, das mit dem retten der register viel zeit drauf geht.
also lieber per dma - das befreit die cpu.

instrumentiere mal den code und messe den jitter.
 

nichtgedacht

Erfahrener Benutzer
#82
Da die Stell-Daten für die OneShot Pulslängen erst beim Update Event des OneShot Timers übernommen werden (Preload),
und der Update Event komplett durch Hardware (Int Pin) gesteuert ist, und immer die die gerade aktuellen Sensordaten synchron verarbeitet werden gibt es per Design gar keinen Jitter von Außen gesehen.
 

cesco1

Erfahrener Benutzer
#83
OT:

Falls du mal GPS und RTH einbauen willst, ich hab da was sehr einfaches. Das hab ich gebaut um meinen FPV flieger mit 32u4 FC zurückzubekommen. Später dann an den fpv copter angepasst. Ein paar kritische augen würden dem code nicht schaden. Wenn gewünscht kann ich das mal vom restcode trennen und reinstellen.
 

brm

Erfahrener Benutzer
#85
OT:

Falls du mal GPS und RTH einbauen willst, ich hab da was sehr einfaches. Das hab ich gebaut um meinen FPV flieger mit 32u4 FC zurückzubekommen. Später dann an den fpv copter angepasst. Ein paar kritische augen würden dem code nicht schaden. Wenn gewünscht kann ich das mal vom restcode trennen und reinstellen.
das hört sich gut an.
habe vor langer zeit auch ein rth implementiert.
hatte nach einigen apm fly-aways keinen bock auf gps unterstützung.
könnte das wieder aufnehmen ...
ein seperater thread wäre prima.
 

nichtgedacht

Erfahrener Benutzer
#86
Hi

Ich habe jetzt eine in flight ACC Kalibrierung implementiert. Mit dem config tool und Wasserwage gelingt das ja nicht so perfekt. Man fliegt im Acro Mode und richtet den Kopter perfekt aus bis er praktisch nicht mehr wegfährt und betätigt dann den Tastschalter für "Beep". Dann werden 200 Samples über 1,6 Sekunden genommen und damit die neue Horizontal Haltung festgelegt. Das Speichern im Flash führt zu 57 ms Kontrollverlust. Das fällt aber in dem Flugzustand wirklich nicht auf.

Hier mal ein Video mit meinen bescheidenen Flugkünsten.

https://www.youtube.com/watch?v=6xw7s3deFkU&feature=youtu.be


@cesco1 Wo bleibt die versprochene "coming home" Funktion?

Gruß
Dieter
 

brm

Erfahrener Benutzer
#88
Hi

Hier mal ein Video mit meinen bescheidenen Flugkünsten.

Gruß
Dieter
bin gestern zum ersten mal easyglider geflogen.
die landungen waren soweit gut ;)

habe im moment probleme mit schnellen coordinated turns.
muss da auch mehr üben ...

what goes up must come down.
 

cesco1

Erfahrener Benutzer
#89
Hier mal ein Video mit meinen bescheidenen Flugkünsten
Solche flugfelder sollte man verbieten. Ich flieg zwischen strasse und fussballplatz mit massig spaziergängern. Da kommt neid auf. Der quad geht recht gut.

@cesco1 Wo bleibt die versprochene "coming home" Funktion?
Ich hab mir überlegt wie machen und es ist versandet ...
Mist, ich sollte einen neuen thread aufmachen. Voll vergessen.
 
Zuletzt bearbeitet:

cesco1

Erfahrener Benutzer
#90
Dieter du hast PA2 und PA3 als pwm out obwohl dort auch RX2 und TX2 angesiedelt sind?
Das projekt müsste laufen wenn ich nur die 4 leitungen (plus vcc) zum sensor ziehe?
Dein config tool gibts nur für linux ?

Kannst du mit dem was anfangen?
Code:
Info : STLINK v2 JTAG v15 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : vid/pid are not identical: 0x0483/0x374B 0x0483/0x3748
Info : using stlink api v2
Info : Target voltage: 3.213775
Info : STM32F103C8Tx.cpu: hardware has 6 breakpoints, 4 watchpoints
Error: timed out while waiting for target halted
TARGET: STM32F103C8Tx.cpu - Not halted
in procedure 'program' 
in procedure 'reset' called at file "embedded:startup.tcl", line 478
in procedure 'ocd_bouncer'

** Unable to reset target **
shutdown command invoked
 
Zuletzt bearbeitet:

nichtgedacht

Erfahrener Benutzer
#91
Dieter du hast PA2 und PA3 als pwm out obwohl dort auch RX2 und TX2 angesiedelt sind?
PA2 und PA3 (und PA0, PA3) sind ausschließlich als pwm output für die ESCs programmiert.
USART2 kann in der Tat nicht verwendet werden. USART3 als UART auf PB10, PB11 steht aber noch uneingeschränkt zur Verfügung.

Das projekt müsste laufen wenn ich nur die 4 leitungen (plus vcc) zum sensor ziehe?
Ich habe ja in zwischen den Int Pin, configuriert als Data read ready Signal, zur Synchronisation von Timer4 (und indirekt Timer2 bei Oneshot) auch angeschlossen. Der Pin ist angeschlossen an PB7. Das ist TIM4_CH2 Triggersource und resettet den Timer4 vorzeitig incl. Update Event.
Ansonsten eben VCC, GND, SPI-CLK, SPI-MISO, SPI-MOSI, SPI-CS

Siehe Src/tim.c
Code:
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
    ...
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ...
}
Dein config tool gibts nur für linux ?
Nein QT5 gibt es für Linux, MAC OS, Windows, Android.
Einfach QT5 in der Community Version (Opensource Lizenz) installieren. Da wird die IDE "qtcreator" mitgeliefert.
Dann git clone von dem configurator project machen und mit "qtcreator" Datei->"Datei oder Projekt öffnen" klicken und
im geclonten Project folder die Datei configurator101.pro öffnen. Dann fragt es welche für welche QT Version (5.7) man es gerne hätte und reneriert das Project mit configurator101.pro.user. Dann auswählen ob debug oder release Version und auf das grüne Dreieck klicken, fertig. Bei einem aktuellen Linux mit KDE hat man nur den Vorteil, dass die shared Libs schon da sind und man die nicht mitsamt Path deployen muss.

Kannst du mit dem was anfangen?
Code:
Info : STLINK v2 JTAG v15 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : vid/pid are not identical: 0x0483/0x374B 0x0483/0x3748
Info : using stlink api v2
Info : Target voltage: 3.213775
Info : STM32F103C8Tx.cpu: hardware has 6 breakpoints, 4 watchpoints
Error: timed out while waiting for target halted
TARGET: STM32F103C8Tx.cpu - Not halted
in procedure 'program' 
in procedure 'reset' called at file "embedded:startup.tcl", line 478
in procedure 'ocd_bouncer'

** Unable to reset target **
shutdown command invoked
Entweder ein ST-Link v2 Dongle verwenden, bei dem die Reset Leitung funktioniert (z.B. das Ding von BAITE) und die Reset Leitung anschließen, oder dem Openocd sagen, das er ohne HW Reset machen soll.
Wie?
Zusammenfassung der bekannten Lösungen hier (ganz unten):
http://www.openstm32.org/tiki-view_forum_thread.php?comments_parentId=2221&topics_offset=35


Edit: Dieser Clone funktioniert wirklich auf der NRST Leitung:
https://www.aliexpress.com/item/ST-...x-M0-Cortex-M3-SWIM-JTAG-SWD/32322884886.html
 
Zuletzt bearbeitet:

cesco1

Erfahrener Benutzer
#92
Ok, das runterladen läuft.

Mein Blue_Pill hat aber nur 64kb flash. Das programm passt nicht rein. Wenn ich nun aus dem linker script due 16kb des bootloaders entferne stimmen die vektoren nicht mehr?

Um es kleiner zu machen hab ich file-system und LED gelöscht. Das lässt sich dann bis SystemClock_Config(); debuggen und verabschiedet sich dort.
 
Zuletzt bearbeitet:

nichtgedacht

Erfahrener Benutzer
#93
Wenn ich nun aus dem linker script due 16kb des bootloaders entferne stimmen die vektoren nicht mehr?

Um es kleiner zu machen hab ich file-system und LED gelöscht. Das lässt sich dann bis SystemClock_Config(); debuggen und verabschiedet sich dort.
Ohne Bootloader musst Du in STM32F103C8Tx_FLASH.ld

Code:
...
MEMORY
{
RAM (xrw)          : ORIGIN = 0x20000000, LENGTH = 20K
BOOTLOADER (rx)    : ORIGIN = 0x8000000, LENGTH = 16K
FIRMWARE (rx)      : ORIGIN = 0x8004000, LENGTH = 112K
/* FLASH (rx)         : ORIGIN = 0x8000000, LENGTH = 128K */
}

/* This is the application */
REGION_ALIAS("FLASH", FIRMWARE );
...
bei FIRMWARE 64k eintragen oder die auskommentierte Zeile "FLASH" nehmen, dort 64k eintragen
und REGION_ALIAS wegwerfen. ORIGIN dafür ist dann natürlich 0x8000000 und die BOOTLOADER Zeile muss dann weg. Die BOOTLOADER Zeile ist überhaupt nur da um per REGION_ALIAS alternativ den Anfang vom Flash zu bestimmen. Je nachdem kann dann die gleiche Datei für die Application oder für den Bootloader verwendet werden. Spielerei, im Bootloader Linker Script hab ich das nicht mal durchgezogen.

in Src/system_stm32f1xx.c

Code:
...
#define VECT_TAB_OFFSET  0x4000
//#define VECT_TAB_OFFSET  0x0 /*!< Vector Table base offset field. This value must be a multiple of 0x200. */
..
musst Du dann für ohne Bootloader VECT_TAB_OFFSET mit 0 definieren.

Der Bootloader ist inzwischen auch kleiner als 16k.

Ich könnte Dir auch 1 -2 Maple Mini Bords per Brief schicken. Bitte PM wenn Du willst.
 

nichtgedacht

Erfahrener Benutzer
#95
Hi

Ich hatte lange überlegt wie ich das Jeti EX-Bus Protokoll implementieren kann.
Jetzt habe ich eine Lösung.

Das Problem:
Während bei UDI(SRXL) oder S-Bus die vom RC-Empfänger kommenden Pakete stets dieselbe Länge haben, werden bei EX-Bus vom Master (dem RC-Empfänger) verschieden lange Botschaften mit unterschiedlicher Bedeutung gesendet. Man kann also nicht einfach sagen "empfange 35 Bytes und löse dann einen Interrupt aus".

Lösung:
Es gibt in der USART Peripherie der MCU eine weitere Interrupt-Quelle die dann auslöst, wenn der RX Teil innerhalb der Zeit für zwei Bytes nichts weiter empfängt. Diese Interrupt-Quelle wird leider vom HAL UART Driver nicht abgebildet, lässt sich aber mit wenigen Zeilen nachrüsten. Da alle seriellen RC Protokolle als Burst daherkommen, kann die Lücke dazwischen zum Triggern dienen und die Pakete dürfen unterschiedliche Längen haben.

Ich hab den Mechanismus jetzt mit SRXL und S-Bus getestet. Ich requeste mehr Bytes als kommen können und breche den Transfer (per DMA) im Interrupt Handler ab, wenn es der Idle Interrupt war. Dann wird getestet ob das Paket vollständig und korrekt ist und dann werden die Daten verarbeitet. Am Ende wird der nächste Transfer gestartet, was dann sicher in der aktuellen Lücke erfolgt.

Da auf diese Weise auch der genaue Zeitpunkt bekannt ist an dem über EX-Bus Telemetriedaten zum Empfänger gesendet werden können, kann mein Kopter bald dem Jet Sender was sagen.

Dieter
 

cesco1

Erfahrener Benutzer
#96
Ich versteh die logik von deinem sbus eh nicht. Wenn syncbyte nicht stimmt machst du 3.2ms ein pin toggle aber kein rx flush? Normalerweise triggert man auf den gap zwischen den msg, oder man flusht den ganzen buffer wenn sync nicht stimmt.

Um den gap zu erwischen muss man bytes einzeln lesen, nicht das ganze msg auf einmal. Oder wenn dein rx-idle interrupt zuverlässig läuft, das wäre natürlich klasse lösung. Und anstatt multiplex oder jeti ...

Flysky IBUS ! Flysky sender ist $40, empfänger ab $4, telemetrie empfänger ab $10. Den code gibts bei mwii oder baseflight (oder cleanflight wenn dus komplizirt magst).
 
Zuletzt bearbeitet:

nichtgedacht

Erfahrener Benutzer
#97
Ich versteh die logik von deinem sbus eh nicht. Wenn syncbyte nicht stimmt machst du 3.2ms ein pin toggle aber kein rx flush? Normalerweise triggert man auf den gap zwischen den msg, oder man flusht den ganzen buffer wenn sync nicht stimmt.
Entweder treffe ich beim ersten Start des Transfers irgendwo in die Lücke, dann ist alles gut und die folgenden Starts erfolgen dann garantiert am Anfang der Lücken oder ich treffe beim ersten Start den laufenden Frame und verzögere dann den nächsten Versuch um eine Framelänge. Da gibt es nichts zu flushen. Die fixe Anzahl der angeforderten Bytes überschreibt den Buffer bei jedem neuen Transfer. Die einzige Gefahr dabei ist, dass ich ein Byte im Payload als Sync Byte erwische. Dieser Zustand kann aber nicht solange bestehen, dass es einen merklichen Glitch gibt.

Flysky IBUS ! Flysky sender ist $40, empfänger ab $4, telemetrie empfänger ab $10. Den code gibts bei mwii oder baseflight (oder cleanflight wenn dus komplizirt magst).
Alles was nicht getestet wurde funktioniert nicht. Ich habe keine Flysky Fernsteuerung zur Verfügung. Mein source code ist "at your fingertips"
 
Status
Nicht offen für weitere Antworten.
FPV1

Banggood

Oben Unten