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
Ale chcesz zapisywać do flasha czy po prostu wczytać z niego defaulta a potem modyfikować w RAMie?
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ść.
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.
Możesz też poszukać pod hasłem „EEPROM emulation”. ST udostępnia noty aplikacyjne na ten temat, np. AN4894
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?
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 ?
Na oko uint8_t napis
to raczej literka a nie cały napis.
Ale bez kontekstu i MRE, myślę, że chrumkowanie się bangladeszuje.
czyli tylko tworząc tablice znakow moge poprawnie zapisac jakiś napis ?
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.
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.