logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[stm32] Flaga sygnalizująca 1 uruchomienie po programowaniu

sajmon5544 21 Cze 2012 20:14 2052 13
REKLAMA
  • #1 11027540
    sajmon5544
    Poziom 10  
    Posty: 52
    Pomógł: 1
    Witam,
    Potrzebuje pomysł na zgrabne programowanie zewnętrznej kości EEPROM podpiętej przez I2C z STM32F103RB.

    Chcę żeby to się odbywało mniej więcej jak to ma miejsce w AVR, czyli jeżeli programuje procesor to i EEPROM.

    W STM na początku programu mam funkcję która programuje mi EEPROM domyślnymi wartościami, ale wiadomo że tak nie może zostać na stałe, gdyż zmienione ustawienia będą wymazywane ilekroć program będzie uruchamiany od nowa - potrzebuję więc gdzieś ustawić jakąś flagę, która sygnalizuje że eeprom jest juz zaprogramowany i należy pominąć programowanie wartosciami domyślnymi.
    Taka flaga musi się resetować w przypadku programowania, ale jednocześnie musi przetrwać zaniki napięcia.

    Nie mam baterii więc przechowywanie flagi w rejestrach chronionych odpada, myślałem jeszcze o przechowywaniu we flashu, jednak musiałbym poświęcić na to całą stronę (1KB flasha po to żeby przechować 1 bit informacji :/). Mógłbym też przechowywać taką flage poprostu w EEPROMie, ale jeśli zmienię coś w programie co dotyczny eepromu, a w flaga jest juz ustawiona to muszę ręcze wymusić zaprogramowanie eepromu - to podowuje problemy przy aktualizacji oprogramowania, ta opcja nie jest idealna ale najlepsza ze wszystkich.

    Jestem dosyć początkujący w tych procesorach i nie znam jeszcze wszystkich tajników, być może ktoś mi podsunie odpowiednie rozwiązanie.
  • REKLAMA
  • #2 11027604
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Jeśli nie chce używać rejestrów backupowych to zostaje Tobie tylko zapis do flasha. Twój uC ma 128KB flash, chcesz zapełnić całą pamięc programem?
    Zakłożę się, że nie, więc nie widzę problemu z poświęceniem mniej niż 1% pamięci na tą flagę.

    Inny sposób to zapis wybranej komórki EEPROMA jakąś znaną wartością po pierwszym zaprogramowaniu uC. Przed każdym uruchomieniem programu sprawdzasz, czy ta komórka jest zapisana. Jeśli jest to ładujesz ustawienia z EEPRIMU, jeśli nie jest to zapisujesz EEPROM ustawieniami domyślnymi... chyba, że źle zrozumiałem Twój problem.
  • REKLAMA
  • #3 11027653
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    A CRC EEPROM-u nie wystarczy ? Z reguły przy pierwszym uruchomieniu nie będzie się zgadzać, zapisujemy wartości startowe i hajda..
  • REKLAMA
  • #4 11028104
    Konto nie istnieje
    Konto nie istnieje  
  • #5 11028150
    sajmon5544
    Poziom 10  
    Posty: 52
    Pomógł: 1
    Cytat:
    Jeśli nie chce używać rejestrów backupowych to zostaje Tobie tylko zapis do flasha. Twój uC ma 128KB flash, chcesz zapełnić całą pamięc programem?
    Zakłożę się, że nie, więc nie widzę problemu z poświęceniem mniej niż 1% pamięci na tą flagę.

    Projekt nie jest jeszcze ukończony a zajmuje już ~80KB, ale nie wiem ile wyjdzie.

    Cytat:
    Inny sposób to zapis wybranej komórki EEPROMA jakąś znaną wartością po pierwszym zaprogramowaniu uC. (..)

    Opisalem dlaczego ta opcja nie jest idealna.

    Cytat:
    Tam zaraz CRC. Jak EEPROM pusty to programujesz, jak nie to nie.

    Jak programujesz 2 raz to już nie będzie pusty.

    Cytat:
    A CRC EEPROM-u nie wystarczy ? Z reguły przy pierwszym uruchomieniu nie będzie się zgadzać, zapisujemy wartości startowe i hajda..

    Mógłbyś rozwinąć bardziej jakby to miało działać?
  • #6 11028168
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Wkompiluj sobie do programu datę i godzinę kompilacji (timestamp) i zachowuj go w EEPROMie - jeśli daty się zgadzają, to znaczy że już programowałeś, jeśli nie - to trzeba przeprogramować.

    4\/3!!
  • #7 11028173
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Albo zamiast daty wersję programu i cześć.
  • REKLAMA
  • #8 11028188
    Konto nie istnieje
    Konto nie istnieje  
  • #9 11028257
    sajmon5544
    Poziom 10  
    Posty: 52
    Pomógł: 1
    Freddie Chopin napisał:
    Wkompiluj sobie do programu datę i godzinę kompilacji (timestamp) i zachowuj go w EEPROMie - jeśli daty się zgadzają, to znaczy że już programowałeś, jeśli nie - to trzeba przeprogramować.

    4\/3!!


    To by było coś, jeszce gdyby dało się #definem wygenerowac tą datę albo jakąś byle jaką pseudo losową liczbe - to by było zupełnie bezobsługowe, da się?
    Hm, ewentualnie jakiś define przy kompilacji w makefile sciągający tego timestampa z systemu.

    Bo tak poza tym to niczym się to nie różni od zwykłego trzymania flagi w EEPROMie :( Pilnowanie jej, szczególnie w trakcie tworzenia jest wpieniające :>
  • #11 11028843
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    1. Te stringi lepiej przekonwertować define'ami do timestampa czy czegokolwiek będącego liczbą. W necie można znaleźć taki konwerterek do daty, coś na poniższy styl:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    No i w tym momencie "cyferki" można połączyć w jedną. analogicznie należy postępować z datą.

    2. Należy w Makefile zadbać o to, żeby plik z tym kodem był ZAWSZE rekompilowany, ponieważ generalnie skompilowany zostanie tylko raz, a potem dopiero gdy zostanie zmieniony - np. zmieni się jego data. Najprościej jest to zrobić wywołując program "touch" z tym plikiem, który zmieni mu datę na aktualną.

    4\/3!!
  • #12 11028952
    sajmon5544
    Poziom 10  
    Posty: 52
    Pomógł: 1
    TBH nie bawiłem sie w konwersje, poprostu miele te 2 stringi do CRC i tak prównuje.
    Jest też jeden problem, jeżeli wgrywam ten sam program drugi raz (np w środowisku produkcyjnym, gdzie program nie jest kompilowany) to wtedy wartości domyślne nie będą wgrywane.

    Chyba nie ma rozwiązania idealnego ;)
  • #13 11029039
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    sajmon5544 napisał:
    Jest też jeden problem, jeżeli wgrywam ten sam program drugi raz


    No ale po co masz ten sam program wgrywać dwa razy? Z resztą już za pierwszym razem przecież wgrasz coś do eeproma :) Chyba, że każde środowisko wgra coś innego. W takim razie musisz się martwić tym, żeby nie włączać urządzenia dopóki się go nie zaniesie gdzie trzeba.
  • #14 11070176
    sajmon5544
    Poziom 10  
    Posty: 52
    Pomógł: 1
    Ok, problem rozwiązałem poprzez zapis do flasha, na pierwszy rzut oka, działa dokładnie tak jak chciałem, ale może jest coś o czym nie wiem - nieporządane efekty czy cos.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tworzę we flashu zmienną SIGNATURE 2 bajtową o wartości 0xffff, przy uruchomieniu programu sprawdzam jaką wartość ma ta zmienna, jeśli 0xffff to programuje eeprom i zapisuje do flasha pod adres tej zmiennej wartość 0.

    Przy następnym uruchomieniu ta zmienna będzie już miała wartość 0.

Podsumowanie tematu

✨ Użytkownik poszukiwał sposobu na efektywne programowanie zewnętrznej pamięci EEPROM podłączonej przez I2C do mikrokontrolera STM32F103RB, aby uniknąć nadpisywania zmienionych ustawień przy każdym uruchomieniu programu. Proponowane rozwiązania obejmowały zapis flagi w pamięci flash, co pozwala na przetrwanie zaniku zasilania, oraz wykorzystanie znanych wartości w EEPROM do weryfikacji, czy pamięć została już zaprogramowana. Inne sugestie dotyczyły użycia daty i czasu kompilacji jako mechanizmu identyfikacji wersji programu. Ostatecznie użytkownik zdecydował się na zapis do pamięci flash, co okazało się skuteczne w jego przypadku.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA