ADC Problem mit Bootloader STM32F10x

Gast #4091032
Lesenswert?
• ▲
▼
Hallo,

ich arbeite mit einem STM32F105RC und habe bereits ein Programm 
geschrieben mit dem ich einen Schrittmotor (Fehlererkennung über adc) 
Temperaturmessung, Spannungsmessung Battery. Das hat auch alles schon 
funktioniert.

Nun habe ich einen Bootloader geschrieben (Update via USB) und springe 
dann in die Applikation die sich auf einer höheren adresse ist.
Funktioniert auch.

Mein Problem ist, das auf einmal keine ADC Channels mehr richtig 
funktionieren. (Temperatur ist falsch usw.)
Alle anderen Peripheren einheiten funktionieren jedoch, kann also nicht 
an der Vectortabel liegen ?!?!

Meine Frage: Hat irgendjemand eine ahnung woran und woher dieser Fehler 
kommen kann, den ich habe keine Idee woran es scheitern könnte?

Sg
Gast #4091130
Lesenswert?
• ▲
▼
Habe jetzt schon eine Ahnung das es am HexToBin Converter liegen könnte.
Wenn ich das Programm aufspiele (mit JLink) und dann starte, 
funktionieren die ADChannels wieder. (Hier wird auch zuerst der BL 
gestartet und springt dann auf die Startadresse vom Programm).

Ich verwende diesen Hex2bin Converter
http://sourceforge.net/projects/hex2bin/?source=typ_redirect

Schon mal jemand Probleme damit gehabt??
Gast #4091170
Lesenswert?
• ▲
▼
Habe mir jetzt auch vom Eclipse eine bin file erzeugen lassen (geht auch 
:D)
Die beiden sind ident somit kanns nicht am hextobin converter liegen.

Im BL wird mit der ADC Peripherie nichts gemacht somit wird diese auch 
erst in Appliktion initialisiert.

Meinst du jetzt also das die init im BL die init in Application sich 
gegenseitig stören??
#4091206
Lesenswert?
• ▲
▼
Also ich kann jetzt ermangels Kentniss deines µC nichts spezifisches 
Sagen, aber mal angenommen der BL konfiguriert einen Timer als 
Taktquelle für sein USB. Jetzt kommt die Applikation und will den selben 
Timer für ihren ADC nutzen und nimmt an, dass alle Register nach dem 
"reset" (aus applikationssicht) 0 sind. Dann kann das zu problemen 
führen, grade wenn bits gezielt gesetzt werden (register |= xyz) anstatt 
einfach das ganze register zu beschreiben (register = xyz).
Moderator Persönliche Seite #4091241
Lesenswert?
• ▲
▼
groma schrieb:
> Nun habe ich einen Bootloader geschrieben (Update via USB) und springe
> dann in die Applikation die sich auf einer höheren adresse ist.

Wie springst Du in die Applikation? Wird dabei auch der Code ausgeführt, 
der dafür sorgt, dass Deine globalen Variablen auch alle schön vor 
Sprung in die main-Funktion mit 0 initialisiert werden?

Was gerade bei STM32 und ADCs falsch gemacht wird:

Es wird oft vergessen, unmittelbar nach

  ADC_InitTypeDef ADC_InitStructure;

die Funktion

  ADC_StructInit (&ADC_InitStructure);

aufzurufen, damit nachfolgende unvollständige Initialisierungen 
tatsächlich doch die komplette struct initialisieren. Den Fehler findet 
man auch in sehr vielen (um nicht zu sagen: eigentlich allen) 
STM32-Tutorials. Dann ist es Glücksache, ob die struct komplett korrekte 
Werte enthält oder nicht - je nachdem, was gerade so auf dem Stack 
rumfleucht.

Ich könnte mir vorstellen, dass Dein Stack nach Sprung vom Bootloader in 
die Applikation nicht so schön mit Nullen gefüllt ist - auf jeden Fall 
anders aussieht.

Also:
1
  ADC_InitTypeDef ADC_InitStructure;
2

3
  ADC_StructInit (&ADC_InitStructure);    // Einfügen!
4
  InitStructure.xxxx = yyyy
5
  ...
6
  ADC_Init(ADC_NUMBER, &ADC_InitStructure);
Gast #4091245
Lesenswert?
• ▲
▼
Ok schon mal ein guter ansatzt, jedoch ist die USB Peripherie (soweit 
ich das richtig verstanden habe) eine eigene einheit welche keine Timer 
usw. benötigt.

aber ich werde mal schauen ob nicht iwo anders der Timer 1 verwendet 
wird (der wird für ADC benötigt)

sonst noch andere Ideen??

Danke auf jeden Fall
Gast #4091301
Lesenswert?
• ▲
▼
Ich weis zwar noch nicht woran es genau lag, jedoch habe ich eine DeInit 
funktion geschrieben, bei der ich alle verwendeten Peripheren Einheiten 
vor der Init zurücksetzt.

Und das war ein ERFOLG!!!

Danke Max D. für deinen Hinweis

Den Stack habe ich nicht neu initialisiert, nur die Adresse habe ich 
geändert
1
  __disable_irq();
2
  uint32_t startAddress = *(__IO uint32_t*)(APPLICATION_FLASH_START + 4);
3
  pFunction JumpToAppi = (pFunction)startAddress;
4
  //Initialize firmware Stack Pointer */
5
  __set_MSP(*(__IO uint32_t*)APPLICATION_FLASH_START);
6
  __enable_irq();
7
  JumpToAppi();

Die Vector Table wird in der applikation mit dem offset versehen
Gast #4108914
Lesenswert?
• ▲
▼
Hy Leute,

habe jetzt ein weiteres Problem.

Der Bootloader soll über Usb ein Update machen, und das sollte 
eigentlich funktionieren (wurde vorprogrammiert)

Mein Problem ist, dass beim Sprung in die Applikation ein Fehler 
auftritt und ein Reset passiert. Somit startet der Bootloader neu.

Wenn ich die Applikation mit dem J_Link aufspiele, dann springt der 
Bootloader auf die Adresse und alles funktioniert.

Ich habe leider keine ahnung wo ich zu suchen beginnen soll.

Sg
Gast #4109316
Lesenswert?
• ▲
▼
Flash löschen, mit USB Bootloader aufspielen und mit JLink einen Dump 
erzeugen. Dann das Vorgehen wieder holen, aber diesmal anstatt mit dem 
Bootloader die Applikation mit JLink aufspielen.

Dann vergleiche, vll. hast du irgendwo eine Adressanpassung vergessen...
Gast #4109404
Lesenswert?
• ▲
▼
>Mein Problem ist, dass beim Sprung in die Applikation ein Fehler
>auftritt und ein Reset passiert. Somit startet der Bootloader neu.

Räumt dein Bootloader auch auf?
Also
Interrupts abschalten
Evtl. Timer abschalten
USB deaktivieren
Alles weitere deaktivieren von dem die Applikation nichts weiss.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.