zmienna globalna w pamieci flash

0

w jaki sposob ustawić w C zmienna globalną w pamieci flash (tablice numerów lub napis) a później zmieniać ją w funkcji ? jak najlepiej to zrobić? stm32f4

1

Ale chcesz zapisywać do flasha czy po prostu wczytać z niego defaulta a potem modyfikować w RAMie?

0

Chce zapisać zmienną do flasha i potem móc zmieniać ją w funkcji na inne wartości kiedy tylko chce,ale tak żeby za kazdym razem gdy odpalam płytkę była ta ostatnia zapisana wartość.

1

W takim razie musisz zapisać tą wartość do flasha - punkt 3 ("Embedded Flash memory interface) dokumentacji do STM32F4 (RM0090.pdf).
Ale to mało wygodne rozwiązanie; takie rzeczy zapisuje sie w eepromach (sporo uC ma je wbudowane/emulowane ale akurat F4 nie).

edit.
Ewentualnie użyj RAMu z podtrzymaniem bateryjnym. Nie wiem co masz za sprzęt ale jeśli masz bateryjkę/akumulator/kondensator do napędzania RTCa to i tego użyjesz. STM32F4 ma 4kB "backup SRAM"u, poza tym sam RTC oferuje (OIDP) 32 rejestry.

0

Możesz też poszukać pod hasłem „EEPROM emulation”. ST udostępnia noty aplikacyjne na ten temat, np. AN4894

0

void Write_Flash( uint8_t napis)
{
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
FLASH_Erase_Sector(FLASH_SECTOR_6, VOLTAGE_RANGE_3);
HAL_FLASH_Program(TYPEPROGRAM_WORD, FlashAddress, napis);
HAL_FLASH_Lock();
}

jak zapisuje sobie napis np 'xyz' to w pamieci mam tylko zapis ostatniego znaku?

0

void Write_Flash( uint8_t napis)
{
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
FLASH_Erase_Sector(FLASH_SECTOR_6, VOLTAGE_RANGE_3);
HAL_FLASH_Program(TYPEPROGRAM_WORD, FlashAddress, napis);
HAL_FLASH_Lock();
}

dlaczego po wywołaniu funkcji z napisem 'xyz' dostaje tylko zapis ostatniego znaku ?

0

Na oko uint8_t napis to raczej literka a nie cały napis.
Ale bez kontekstu i MRE, myślę, że chrumkowanie się bangladeszuje.

0

czyli tylko tworząc tablice znakow moge poprawnie zapisac jakiś napis ?

0

Możesz w ramach obfuskacji nawet rozsiać go po całym flashu a pierwszy i ostatni znak zapisać w randomowych komórkach eepromu na SPI. Kwestia żebyś go potem poskładać potrafił.

Dobra, poważniej: niekoniecznie, ale tak chyba będzie najintuicyjniej.

1

Zobacz jak działa HAL_FLASH_Program: http://www.disca.upv.es/aperles/arm_cortex_m3/llibre/st/STM32F439xx_User_Manual/group__flash__exported__functions__group1.html#gab94b3dc16c5c6fcc30ba2cb897de8bae

Zapisujesz po bajcie/dwóch/czterech (co i dlaczego - odsyłam do dokumentacji bo nie zawsze możesz zapisać np bajt). Procedura zapisuje jedną komórkę więc ma to gdzieś Twój tekst (formalnie - tablicę/bufor). Musisz - tak po kolei:

  • odblokować flash
  • wyczyścić stronę/strony,
  • zapisujesz w pętli swoje dane,
  • blokujesz flash.

1 użytkowników online, w tym zalogowanych: 0, gości: 1