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
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??
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.
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??
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).
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); |
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
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
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
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...
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.