Forum: Mikrocontroller und Digitale Elektronik Flash löschen beim Bootloader des stm32


von booti (Gast)


Lesenswert?

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

von Peter Z. (hangloose)


Lesenswert?

Passt die verwendete löschfunktion zum verwendeten chip?
Es gibt doch 2 verschiedene arten zu löschen und nur eine wird jeweils 
unterstützt.

von booti (Gast)


Lesenswert?

die wird mir ja mitgeteilt wenn ich die Version auslese und da steht die 
mit 0x44. also müsste des passen

von booti (Gast)


Lesenswert?

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

von Peter Z. (hangloose)


Lesenswert?

Benutzt du "Even Parity" bei deiner Datenübertragung?

von booti (Gast)


Lesenswert?

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

von Peter Z. (hangloose)


Lesenswert?

Wenn du kein "even parity" Bit sendest wird es nicht funktionieren!

von booti (Gast)


Lesenswert?

aber warum tut es dann soweit mit none parity? und warum empfange ich 
nix mit even parity?

von Peter Z. (hangloose)


Lesenswert?

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!

von booti (Gast)


Lesenswert?

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

von Peter Z. (hangloose)


Lesenswert?

Probier mal folgendes wenn du parity benutzt!

USART_InitStructure.USART_WordLength = USART_WordLength_9b;

Und sag Bescheid ob es funktioniert hat...

von booti (Gast)


Lesenswert?

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

von Peter Z. (hangloose)


Lesenswert?

probier mal Mass Erase
0x44,0xbb,0xff,0xff,0x00

von booti (Gast)


Lesenswert?

dann bekomme ich nach dem senden von 0xff, 0xff, 0x00 keine antwort, 
also kein ack und kein nack

von booti (Gast)


Lesenswert?

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

von Peter Z. (hangloose)


Lesenswert?

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

von Peter Z. (hangloose)


Lesenswert?

ahh ok... na dann passts ja

von booti (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.