Hallo, ich habe zwei stm32, der eine kann den anderen mit dem internen Bootloader neu Flashen. leider habe ich beim löschen ein Problem und ich weis nicht wieso. in dem einen steht der nachfolgende Code: // Flash Schreibschutz aufheben sendToBootloader(0x73); sendToBootloader(0x8C); TimeoutBoot = 200; while(((read_buffer2[0] != 0x79)||(read_buffer2[1] != 0x79)) && (TimeoutBoot != 0)); read_buffer2[0] = 0x00; read_buffer2[1] = 0x00; // Flash löschen bWritePtr2 = 0; sendToBootloader(0x44); sendToBootloader(0xBB); TimeoutBoot = 200; while((read_buffer2[0] != 0x79) && (TimeoutBoot != 0)); sendToBootloader(0xFF); sendToBootloader(0xFE); sendToBootloader(0x01); Delay(3); while((read_buffer2[1] != 0x79) && (TimeoutBoot != 0)); Zum Problem: nachdem ich den Schreibschutz aufhebe bekomm ich ein ACK (0x79) von dem Bootloader zurück. Nachdem ich das Kommando zum Löschen schicke (0x44 + 0xBB) bekomme ich ein ACK (0x79) zurück. nachdem ich die Adresse und checksumme (0xff, 0xFE und 0x01) schicke, bekomme ich ein NACK (0x1F) zurück. hat jemand eine idee wieso? Danke
Passt die verwendete löschfunktion zum verwendeten chip? Es gibt doch 2 verschiedene arten zu löschen und nur eine wird jeweils unterstützt.
die wird mir ja mitgeteilt wenn ich die Version auslese und da steht die mit 0x44. also müsste des passen
mir ist auch aufgefallen das es beim Go Commando so ähnlich ist. ich schicke 0x21 und 0xDE und warte auf ein ACK welches ich bekomme. dann schicke ich ein 0x08 0x00 0x00 0x00 0x08 und warte auf 2 ACKs. aber ich bekomme nur eines. und laut application note müssten ja beide kommen. sendToBootloader(0x21); sendToBootloader(0xDE); TimeoutBoot = 200; while(read_buffer2[0] != 0x79 && TimeoutBoot != 0); sendToBootloader(0x08); sendToBootloader(0x00); sendToBootloader(0x00); sendToBootloader(0x00); sendToBootloader(0x08); while((read_buffer2[0] != 0x79 || read_buffer2[1] != 0x79|| read_buffer2[2] != 0x79) && TimeoutBoot != 0);
nein. sobald ich even parity benutze empfange ich gar nichts mehr. hab da auch schon verschiedene Baudraten ausprobiert. Konfiguriere die Schnittstelle wie folgt: USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* Configure USART2 */ USART_Init(USART2, &USART_InitStructure); /* Enable the USART2 Receive interrupt: this interrupt is generated when the USART2 receive data register is not empty */ USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); /* Enable the USART2 */ USART_Cmd(USART2, ENABLE);
Wenn du kein "even parity" Bit sendest wird es nicht funktionieren!
aber warum tut es dann soweit mit none parity? und warum empfange ich nix mit even parity?
Ich kann dir nur sagen das ich den Bootloader mit einem AVR angesteuert habe. Ohne Parity --> NACK mit Parity --> ACK Manche Kommandos akzeptiert er anscheinend ohne Parity... Warum kann ich dir nicht sagen. War bei mir auch so. Warum du mit even parity nix empfängst weis ich nicht. Liegt wahrscheinlich an deinem UART Code... keine Ahnung. Aber wenn du meinst mach weiter ohne parity... wird aber definitiv nie funktionieren!
ich würde es ja schon gerne mit parity machen, hab ich am anfang ja auch probiert, aber es klappt nunmal nicht und ansonsten funktioniert ja der usart ohne probleme. aber danke für deine hilfe
Probier mal folgendes wenn du parity benutzt! USART_InitStructure.USART_WordLength = USART_WordLength_9b; Und sag Bescheid ob es funktioniert hat...
danke, das war eines. also jetzt scheint es mit even parity zu gehen, aber hab noch nicht alle funktionen getestet. aber der fehler von oben ist immer noch vorhanden dass ich ein 0x1f zurück bekomme beim löschen
dann bekomme ich nach dem senden von 0xff, 0xff, 0x00 keine antwort, also kein ack und kein nack
funktioniert jetzt beim löschen doch beim mass erase. hab davor zu kurz gewartet. bis das Ack nach der Adresse 0xff 0xff 0x00 kommt dauert es über 10 sekunden
Dann wirst du noch irgendwo einen Fehler beim Empfang haben tippe ich jetzt mal. Da du ja deinen kompletten Code nicht gepostet hast fällt mir sonst nichts mehr ein...
beim empfang würde ich aber einen fehler ausschließen. beim Go Command kommt das letzte ACK noch nicht, auch wenn ich lange warte
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.