Czy pamięć flash programu mikrokontrolera może służyć do przechowywania konfiguracji użytkownika?

9

Wiele mikrokontrolerów, np. PIC18F , ma pamięć programu Flash: „Pamięć programu Flash jest czytelna i zapisywalna podczas normalnej pracy”. Czy to oznacza, że ​​mogę zapisać niektóre konfiguracje użytkowników w pamięci programu?

student1
źródło

Odpowiedzi:

12

Tak, możesz. Robiłem to wiele razy.

Istnieją jednak pewne wady związane z używaniem oddzielnej pamięci EEPROM:

  1. Liczba dożywotnich zapisów do pamięci flash jest znacznie mniejsza niż w przypadku EEPROM danych.

  2. Procesor wyjdzie na lunch w czasie wymazywania i pisania.

  3. Program flash jest kasowany w blokach. Nie możesz po prostu zaktualizować jednego bajtu. Zwykle używam schematu buforowania bloków, aby sobie z tym poradzić.

Olin Lathrop
źródło
Idealnie, wydaje się, że w jakiś sposób wiesz, że moje pytanie brzmi „dlaczego potrzebuję pamięci EEPROM, podczas gdy możesz używać pamięci programu zarówno do danych programu, jak i danych użytkownika” :)
student1
Olin, czy cała pamięć Flash zostaje skasowana, gdy nowa wersja oprogramowania układowego zostaje wypalona na PIC? Czy istnieje dobry sposób, aby zapobiec skasowaniu konfiguracji użytkownika (lub danych kalibracyjnych) we Flashu podczas pobierania oprogramowania? Chodzi o wygodę podczas tworzenia oprogramowania. Wyobrażam sobie, że konfiguracja użytkownika będzie przechowywana w ostatnim bloku lub Flashu.
Nick Alexeev
6
@Nick: To zależy od programisty PIC, którego używasz. Wielu, w tym wszystkie moje, wykonuje kasowanie masowe, więc dane kalibracyjne zostaną wymazane. Kilkakrotnie napisałem specjalną aplikację do programowania, która odczytuje dane kalibracyjne, usuwałem dane zbiorcze, a następnie zapisywałem dane kalibracyjne z powrotem w ramach normalnego procesu programowania. Niektórzy programiści Microchip mogą aktualizować tylko części pamięci programu. Zauważ, że jeśli włączyłeś ochronę kodu, programista musi wykonać wymazanie zbiorcze.
Olin Lathrop,
Na procesorach innych niż Harvard (mam na myśli MSP430) możesz kopiować kod do pamięci RAM, przeskakiwać do pamięci RAM i uruchamiać się podczas zapisu / usuwania pamięci flash. Użyłem tego do bootloadera, aby jednocześnie pisać i odbierać nowe dane z radia.
markrages
@ znak: Tak, działa to również na PIC32, gdzie można również uruchomić z pamięci RAM. W rzeczywistości jest to szybsze.
Olin Lathrop,
6

Wiele PIC18 ma pamięć EEPROM o wielkości do 1K. Niestety PIC18F46J50, do którego się odwołujesz, nie ma. Jeśli dostępna jest pamięć EEPROM, jest znacznie lepszym wyborem, jeśli jest wystarczająco duża dla danych, ponieważ pamięć EEPROM ma co najmniej 1 000 000 cykli kasowania / zapisu, a pamięć flash to tylko 10 000.

PIC18, podobnie jak większość innych mikrokontrolerów, wykorzystuje tak zwaną architekturę Harvarda, co oznacza, że ​​istnieją fizycznie oddzielne obszary adresowalne dla programów i danych (tzn. Możesz mieć adres programu 4 i adres danych 4 i nie są one takie same). Dlatego nie można czytać ani zapisywać pamięci flash przy użyciu normalnych metod w języku C lub asemblerze.

Zamiast tego w rodzinie PIC18 skonfigurowano adres początkowy w 22-bitowym rejestrze o nazwie TBLPTR. Aby odczytać bajty z pamięci flash, używasz instrukcji TBLRD. Istnieje opcja automatycznego zwiększania lub zmniejszania adresu po przeczytaniu, którego nie musisz robić ręcznie.

Aby zapisać w pamięci flash, musisz najpierw usunąć jeden lub więcej 64-bajtowych bloków pamięci flash, które zostaną zapisane. Po ponownym ustawieniu adresu początkowego w TBLPTR i wartościach w niektórych innych rejestrach w celu zainicjowania operacji kasowania, przerwania są wyłączone, a następnie należy wpisać do rejestru 0x55, a następnie 0xAA; odblokowuje to polecenie kasowania i jest potrzebne, aby zapobiec błędnemu wyczyszczeniu pamięci przez błędny kod. Na koniec wykonywane jest polecenie faktycznego usunięcia, po którym następuje ponowne włączenie przerwań.

Zapis do pamięci flash jest podobny do usuwania, z tym że rozmiar bloku jest mniejszy. Zapis jest w rzeczywistości wykonywany przy użyciu instrukcji TBLWT, która umożliwia także automatyczne zwiększanie / zmniejszanie, podobnie jak instrukcja TBLRD.

Oprócz zapisywania danych konfiguracyjnych, zapis do pamięci flash umożliwia aktualizację oprogramowania układowego w terenie przy użyciu tak zwanego „oprogramowania bezprzewodowego”. Musisz mieć stały blok oprogramowania układowego, zwykle na początku pamięci programu, który może odbierać aktualizację z modułu Bluetooth, Wi-Fi, modułu komórkowego, a nawet połączenia przewodowego, i aktualizować flash powyżej określonego punktu w program (np. „ogrodzenie”) z nowym kodem. Po zakończeniu aktualizacji inicjowany jest reset i nowy kod jest wykorzystywany.

Wiele innych mikrokontrolerów oprócz rodziny PIC ma możliwość aktualizacji pamięci flash; większość korzysta z kombinacji rejestrów konfiguracji, wskaźnika adresu i specjalnych instrukcji do wykonania zadania.

tcrosley
źródło
Ta metoda „firmware over the air” wygląda bardzo interesująco. Czy to eliminuje potrzebę programowania systemowego (ISP)?
student1
@ student1 Nie eliminuje to potrzeby początkowego programowania układu za pośrednictwem interfejsu ISP, ponieważ musisz zainstalować oprogramowanie układowe na chipie, aby móc później obsługiwać aktualizacje. Mikrokontrolery ATmega stosowane na płytach Arduino mają już na sobie oprogramowanie tego typu, zwane Bootloader, dlatego nie trzeba używać interfejsu ISP do pobierania szkiców na Arduino. Jednak jeśli chcesz zaktualizować sam moduł ładujący, wymaga to interfejsu ISP. Ten program ładujący obsługuje tylko aktualizacje przez USB, więc nie jest tak naprawdę „oprogramowaniem bezprzewodowym”.
tcrosley,