Forum: Mikrocontroller und Digitale Elektronik ADC Problem mit Bootloader STM32F10x


von groma (Gast)


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

von groma (Gast)


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

von Max D. (max_d)


Lesenswert?

Also ohne deinen µC zu kennen: Die Chance, dass der hex2bin gerade genau 
deinen ADC-Code versaut ist recht gering.
Ich würde eher mal den Code abklappern nach vom BL initialisierter 
Hardware auf die die Haupt-Apllikation nicht gefasst ist.

von groma (Gast)


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

von Max D. (max_d)


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

von Frank M. (ukw) (Moderator) Benutzerseite


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);

von groma (Gast)


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

von groma (Gast)


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

von groma (Gast)


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

von Narfie (Gast)


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

von holger (Gast)


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.

von groma (Gast)


Lesenswert?

sorry war nur ein dummer fehler beim kopieren von Projektdateien.

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.