STM32F051 FLASH_ErasePage problem.

Miroslav Mraz mraz na seznam.cz
Úterý Září 17 18:37:42 CEST 2013


Zdravím,
objevil jsem další záhadu, snad se najde nějaká dobrá duše, která pomůže 
objasnit jí. Pro představu kousek kódu v main:
FLASH_Status fs = 0;
uprintf("begin program %d\r\n", simEeRead());
while (1) {
__WFI();
if (!gblUsart.flag) continue;
uprintf("pass %d\r\n", gFlashIndex);
FLASH_Unlock();
if (gblUsart.flag & 1) {
gFlashIndex = 0;
FLASH_ClearFlag (FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
uprintf("enter to erase 0x%x\r\n", (uint32_t) gBeginAddr);
Delay(100); // ms
fs = FLASH_ErasePage ((uint32_t) gBeginAddr);
uprintf("erase: %d\r\n", fs);
Delay(100);
}
if (gblUsart.flag & 2) {
fs = FLASH_ProgramWord ((uint32_t) gBeginAddr + 4*gFlashIndex, gFlashIndex);
uprintf("write: %d\r\n", fs);
}
gFlashIndex++;
gblUsart.flag = 0;
FLASH_Lock();
}
Volatilní proměnná gblUsart.flag se nastavuje v přerušení od usartu 
(podle přijatého znaku), uprintf je neblokovaný (tzn. nečeká na 
dokončení) výpis na usart v přerušení. Idea je taková, že budu do flash 
zapisovat uint32 parametr (zde jen test), vždy na první volné místo 
(0xFFFFFFFF) na stránce a pokud jí zaplním, tak jí smažu a začnu znovu.
Zápis není problém. Mazání ano. Pokud vynechám to Delay(100) před 
FLASH_ErasePage, stránka se sice smaže, ale program zůstává viset (podle 
openocd, kterému moc nevěřím) v obsluze přerušení usartu a už se z toho 
nevyhrabe. Vypadá to tak, že pokud usart nestihne odvysílat všechny 
znaky než se začne mazat stránka, zdechne. A marně si lámu hlavu proč. 
Netušíte někdo ?

Mrazík




Další informace o konferenci Hw-list