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
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 3 lata
- Postów:1493
Ale chcesz zapisywać do flasha czy po prostu wczytać z niego defaulta a potem modyfikować w RAMie?
- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Lokalizacja:Podaj nazwę miejscowości
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.
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 3 lata
- Postów:1493
Możesz też poszukać pod hasłem „EEPROM emulation”. ST udostępnia noty aplikacyjne na ten temat, np. AN4894
- Rejestracja:ponad 3 lata
- Ostatnio:około 3 lata
- Postów:9
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?
- screenshot-20210813190248.png (5 KB) - ściągnięć: 14
- Rejestracja:ponad 3 lata
- Ostatnio:około 3 lata
- Postów:9
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 ?
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 3 lata
- Postów:1493
Na oko uint8_t napis
to raczej literka a nie cały napis.
Ale bez kontekstu i MRE, myślę, że chrumkowanie się bangladeszuje.
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 3 lata
- Postów:1493
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.
- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Lokalizacja:Podaj nazwę miejscowości
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.