Odpowiedzi:
Tak, możesz. Robiłem to wiele razy.
Istnieją jednak pewne wady związane z używaniem oddzielnej pamięci EEPROM:
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.