Gast
#3388204
Hallo zusammen, (CoIDE 1.7.5, gcc 4.7 2013q3 und 4.6 2012q4) mit meinem frisch gekauften STM32F4 Discovery habe ich das Problem, dass manche Programme zwar nach Starten im Debugger laufen, nach Ab- und wieder anstecken ans USB-Kabel aber nicht loslaufen. Ich habe schon alles mögliche probiert, die gcc-Optimierung scheint einen Einfluss zu haben (manche Programme laufen mit -o0 los, manche mit -o3)... Das Minimalst-Programm, dass zuverlässig nicht startet (übrigens hilft auch der Reset-Taster nicht), schaltet die LEDs des Boards ein: #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_SetBits(GPIOD, GPIO_Pin_12); GPIO_SetBits(GPIOD, GPIO_Pin_13); GPIO_ResetBits(GPIOD, GPIO_Pin_14); GPIO_ResetBits(GPIOD, GPIO_Pin_15); while(1) { GPIO_ToggleBits(GPIOD,GPIO_Pin_15); } } Aus dem Debugger läufts, nach Anstöpseln nicht... SysInit() fehlt übrigens, das wird vom Startup (startup_stm32f4xx.c in cmsis_boot/startup) nicht aufgerufen, aber zum die LEDs einschalten sollte auch die Default-Takteinstellung (wahrscheinlich HSI*?) reichen. SysInit() an erster Stelle im main() (mit korrekten PLL-Einstellungen für den 8-MHz-Quarz) ändert übrigens nichts am Problem. Ich habe schon die Vektortabelle kontrolliert, MSP und PC werden da korrekt geladen, der Startup-Code kopiert zuerst die Daten-Initialisierungen, löscht bss und hupft dann zu main(). Stutzig gemacht hat mich die MSP-Initialisierung (erster Eintrag in der Vektortabelle an 0x0800 0000: Bei einem Beispiel stand da (void *)&pulStack[STACK_SIZE], /*!< The initial stack pointer */ bei einem anderen (void *)&pulStack[STACK_SIZE-1], /*!< The initial stack pointer */ Egal, wenn der Prozessor zicken würde wegen misalignment, würde er das immer machen und nicht nur nach power on reset. Vielleicht sind die Optimierungs-Probleme auch auf so ein Alignment-Problem zurückzuführen? Fragen über Fragen... Klingelt's da irgendwo bei Euch? Schon mal sowas gehabt? Ich habe jetzt schon einen Tag damit verbraten und nur unkonsistente Verhalten beobachtet. Mal gehts, mal nicht. Immerhin habe ich ein Beispielprogramm (hier aus dem Forum), das immer geht und das oben, das nie läuft. Jetzt kommt das alte Spiel "Finde den Unterschied". Ich habe nur die Befürchtung, es könnte etwas fieses sein wie ein Bug im Linkerskript (das anscheinend von CoIDE erzeugt wird) oder im gcc. Im Errata-Sheet von ST fand ich auch nichts. Das Board könnte defekt sein (sehr sehr unwahrscheinlich). Jemand eine Idee? PS: Mir wäre es schon vielleicht 200 € wert, gcc in die Tonne treten zu können, aber für IAR oder Keil reicht das nicht. Werde die Tool-Liste noch einmal durchgehen und Alternativen anschauen! Danke - Martin