STM32F051 FLASH_ErasePage problem.

Miroslav Mraz mraz na seznam.cz
Neděle Září 22 22:25:38 CEST 2013


To je úplně jedno, chová se to stejně. Jen je mi divné, že tu knihovní
funkci FLASH_ErasePage() jsem poprvé použil v bootloderu, kde celá
proběhne v přerušení od usartu a tam není problém.
Ten nastane, pokud tuto funkci vykonávám v main() a usart je aktivní,
tedy vysílá data přes přerušení.
Možná mám nějakou chybu v nastavení toho usartu, používám ho v
half-duplexu, tedy po jednom drátě a je divné, že v tomto módu přijímá i
vysílaná data. Třeba LPC11U24 to nedělá. Ten při vysílání automaticky
zablokuje přijímač.

Mrazík

František Burian píše v Ne 22. 09. 2013 v 21:46 +0200:
> Jen palba od boku ... je kód v RAM nebo flash ? zksil bych ho dát do
> RAM ...
> 
> F.
> 
> 
> ---------- Původní zpráva ----------
> Od: Miroslav Mraz <mraz na seznam.cz>
> Datum: 22. 9. 2013
> Předmět: Re: STM32F051 FLASH_ErasePage problem.
> 
> 
>         Po delší době - nikdo nic ?
>         Problém jsem sice víceméně úspěšně obešel, ale pořád mě to tak
>         nějak
>         vadí. Sice chápu, že může být chybka v překladači, v
>         knihovnách, bordel
>         ve vektorech a co já vím co všechno, ale nemůžu to najít.
>         
>         Mrazík
>         
>         Miroslav Mraz píše v Út 17. 09. 2013 v 18:37 +0200:
>         > 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