Flash löschen beim Bootloader des stm32

Gast #3132914
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
Gast #3133677
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);
Gast #3133685
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);
#3133697
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!
Gast #3133744
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren