Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Boot-loader | – | jest kodem uruchamianym w celu załadowania do pamięci FLASH programu aplikacji. |
Sekcja boot-loadera | – | jest to wydzielony obszar pamięci FLASH, w którym umieszczony został kod programowania pamięci FLASH. |
Sekcja aplikacji | – | jest to obszar pamięci FLASH, w którym jest umieszczony kod programu aplikacji. Obszar ten może być programowany przez boot-loader. |
Read-While-Write (RWW) | – | odczyt podczas zapisu. Jest to cecha pamięci FLASH, która umożliwia odczyt instrukcji dla mikroprocesora z pamięci FLASH, przy jednoczesnym programowaniu pamięci FLASH. |
Read-Modify-Write | – | odczyt, modyfikacja, zapis. |
No-Read-While-Write (NRWW) | – | jest to zablokowanie odczytu pamięci FLASH na czas jej programowania. |
Wsparcie dla boot-loadera dostarcza rzeczywistego mechanizmu Read-While-Write samoprogramowania do ładowania i przesyłania kodu programu przez sam mikrokontroler. Cecha ta umożliwia elastyczne uaktualnienia aplikacji kontrolowane przez mikrokontroler używający umieszczonego w pamięci FLASH programu boot-loadera. Program ten może wykorzystywać dowolny z dostępnych interfejsów danych i powiązanego z nimi protokołu, aby odczytywać kod programu przesyłany z zewnątrz i zapisywać go w pamięci FLASH lub odczytywać kod programu z pamięci programu FLASH i przesyłać go na zewnątrz. Kod programu w obrębie sekcji boot-loadera posiada możliwość zapisu do całej pamięci FLASH, łącznie z sekcją boot-loadera. W ten sposób boot-loader może nawet modyfikować samego siebie i może również usunąć samego siebie z kodu, jeśli przestanie już być potrzebny. Rozmiar pamięci boot-loadera jest konfigurowalny za pomocą bitów bezpiecznikowych i boot-loader posiada dwa oddzielne zestawy bitów blokujących, które można ustawiać niezależnie. Daje to użytkownikowi unikalną elastyczność wyboru różnych poziomów zabezpieczeń.
Cechy boot-loadera są następujące:
Uwaga: | 1. | Strona jest sekcją w pamięci FLASH złożoną z kilku bajtów używaną podczas programowania. Organizacja stron nie wpływa na normalne działanie. |
Sekcja aplikacji jest częścią pamięci FLASH używaną do przechowywania kodu aplikacji. Poziom zabezpieczeń dla sekcji aplikacji można wybrać za pomocą bitów blokujących BLB0 (ang. Boot Lock Bits 0). Sekcja aplikacji nigdy nie może ładować żadnego kodu boot-loadera, ponieważ jest w niej zablokowane wykonywanie instrukcji SPM.
Podczas gdy sekcja aplikacji używana jest do przechowywania kodu aplikacji, to oprogramowanie boot-loadera musi być umieszczane w BLS, ponieważ instrukcja SPM może zainicjować programowanie tylko wtedy, gdy zostanie wykonana w obszarze BLS. Instrukcja SPM ma dostęp do całej pamięci FLASH, łącznie z BLS. Poziom zabezpieczeń dla sekcji boot-loadera można wybrać bitami blokującymi BLB1 (ang. Boot Lock Bits 1).
Zwróć uwagę, iż oprogramowanie użytkownika nigdy nie może odczytywać żadnego kodu, który jest umieszczony wewnątrz sekcji RWW podczas pracy oprogramowania boot-loadera. Zapis "sekcja Read-While-Write" odnosi się do tej sekcji, która jest programowana (wymazywana lub zapisywana), nie do sekcji, która jest rzeczywiście odczytywana podczas uaktualnienia oprogramowania boot-loadera.
Gdy oprogramowanie boot-loadera programuje stronę wewnątrz sekcji RWW, możliwe jest odczytywanie kodu z pamięci FLASH, ale tylko kodu znajdującego się w sekcji NRWW. W czasie trwania programowania oprogramowanie musi zapewnić, że sekcja RWW nigdy nie jest odczytywana. Jeśli oprogramowanie użytkownika próbuje odczytywać kod znajdujący się wewnątrz sekcji RWW (tj. przez instrukcje call/rjmp/lpm/elpm lub jakieś przerwanie) podczas programowania, to oprogramowanie to może znaleźć się w nieokreślonym stanie. Aby uniknąć tego, przerwania powinny zostać albo wyłączone, albo przeniesione do sekcji boot-loadera, która zawsze jest umieszczona w sekcji NRWW. Bit zajętości sekcji RWW (ang. RWW Section Busy bit, RWWSB) w rejestrze sterującym umieszczaniem w pamięci programu (ang. Store Program memory Control and Status Register, SPMCSR) będzie dawał odczyt logicznej jedynki tak długo, jak sekcja RWW jest zablokowana do odczytu. Po zakończeniu programowania bit RWWSB musi być wyzerowany przez oprogramowanie przed odczytem kodu umieszczonego w sekcji RWW. Zobacz do opisu rejestru SPMCSR.
Kod umieszczony w sekcji NRWW może być odczytywany podczas uaktualniania strony w sekcji RWW przez oprogramowanie boot-loadera. Gdy kod boot-loadera uaktualnia sekcję NRWW, mikroprocesor zostaje zatrzymany podczas całej operacji wymazywania lub zapisu strony.
Cechy Read-While-Write
Którą sekcję adresuje wskaźnik Z podczas programowania? | Która sekcja może być odczytywana podczas programowania | Czy mikroprocesor jest zatrzymany? | Obsługiwane Read-While-Write? |
Sekcję RWW | Sekcja NRWW | Nie | Tak |
Sekcję NRWW | żadna | Tak | Nie |
Porównanie Read-While-Write z
No-Read-While-Write
Sekcje pamięci
Szczegóły znajdziesz w poniższych tabelkach. Bity blokujące boot-loadera można ustawiać programowo oraz w trybie programowania szeregowego lub równoległego, lecz można je wymazać tylko przez polecenie kasowania układu (ang. chip erase command). Ogólna blokada zapisu (bit blokujący trybu 2) nie kontroluje programowania pamięci FLASH przez instrukcję SPM. Podobnie ogólna blokada odczytu/zapisu (bit blokujący trybu 3) nie kontroluje ani odczytu, ani zapisu przez instrukcje LPM/SPM, jeśli próbuje się to zrobić.
Tryby zabezpieczeń bitów
blokujących 0 boot-loadera (sekcja aplikacji)
"1" oznacza bit niezaprogramowany, "0" oznacza bit zaprogramowany
Tryb BLB0 | BLB02 | BLB01 | Zabezpieczenie |
1 | 1 | 1 | Nie ma ograniczeń na dostęp do sekcji aplikacji w instrukcjach LPM/SPM |
2 | 1 | 0 | Instrukcji SPM nie wolno zapisywać w sekcji aplikacji. |
3 | 0 | 0 | Instrukcji SPM nie wolno zapisywać w sekcji aplikacji, a instrukcji LPM/ELPM wykonywanej w sekcji boot-loadera nie wolno odczytywać sekcji aplikacji. Jeśli wektory przerwań są umieszczone w sekcji boot-loadera, to przerwania są zablokowane przy wykonywaniu kodu z sekcji aplikacji. |
4 | 0 | 1 | Instrukcji LPM/ELPM wykonywanej z sekcji boot-loadera nie wolno odczytywać sekcji aplikacji. Jeśli wektory przerwań są umieszczone w sekcji boot-loadera, to przerwania są zablokowane przy wykonywaniu kodu z sekcji aplikacji. |
Tryby zabezpieczeń bitów
blokujących 1 boot-loadera (sekcja boot-loadera)
"1" oznacza bit niezaprogramowany, "0" oznacza bit zaprogramowany
Tryb BLB1 | BLB12 | BLB11 | Zabezpieczenie |
1 | 1 | 1 | Nie ma ograniczeń na dostęp do sekcji boot-loadera w instrukcjach LPM/SPM |
2 | 1 | 0 | Instrukcji SPM nie wolno zapisywać w sekcji boot-loadera. |
3 | 0 | 0 | Instrukcji SPM nie wolno zapisywać w sekcji boot-loadera, a instrukcji LPM/ELPM wykonywanej w sekcji aplikacji nie wolno odczytywać sekcji boot-loadera. Jeśli wektory przerwań są umieszczone w sekcji aplikacji, to przerwania są zablokowane przy wykonywaniu kodu z sekcji boot-loadera. |
4 | 0 | 1 | Instrukcji LPM/ELPM wykonywanej z sekcji aplikacji nie wolno odczytywać sekcji boot-loadera. Jeśli wektory przerwań są umieszczone w sekcji aplikacji, to przerwania są zablokowane przy wykonywaniu kodu z sekcji boot-loadera. |
Bit
bezpiecznikowy Boot Reset
"1" oznacza bit niezaprogramowany, "0" oznacza bit zaprogramowany
BOOTRST | Adres Resetu |
1 | Wektor resetu = Reset aplikacji (adres 0x0000) |
0 | Wektor resetu = Reset boot-loadera |
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
RAMPZ | RAMPZ7 | RAMPZ6 | RAMPZ5 | RAMPZ4 | RAMPZ3 | RAMPZ2 | RAMPZ1 | RAMPZ0 |
ZH (R31) | Z15 | Z14 | Z13 | Z12 | Z11 | Z10 | Z9 | Z8 |
ZL (R30) | Z7 | Z6 | Z5 | Z4 | Z3 | Z2 | Z1 | Z0 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Ponieważ pamięć FLASH jest zorganizowana w strony, to licznik programu (ang. Program Counter) można potraktować tak, jakby składał się z dwóch różnych sekcji. Jedna sekcja składająca się z najmniej znaczących bitów adresuje słowa wewnątrz strony, natomiast bity najbardziej znaczące adresują te strony. Pokazane to jest na poniższym rysunku. Zauważ, że operacje wymazywania strony (ang. page erase) i zapisu strony (ang. page write) używają osobnych adresów. Dlatego jest bardzo ważne, aby oprogramowanie boot-loadera adresowało tę samą stronę w obu tych operacjach. Gdy rozpocznie się programowanie, adres zostaje zapamiętany i wskaźnik Z może być użyty z innymi operacjami.
Instrukcja LPM/ELPM korzysta ze wskaźnika Z do przechowywania adresu. Ponieważ ta instrukcja adresuje pamięć FLASH bajt po bajcie, to również bit LSB (bit Z0) wskaźnika Z jest używany.
Alternatywa 1, wypełnij bufor przed wymazaniem strony
Alternatywa 2, wypełnij bufor po wymazaniu strony
Jeśli potrzeba zmienić tylko część strony, to reszta strony musi być zapamiętana np. w tymczasowym buforze strony przed wykonaniem operacji wymazania, a następnie ponownie zapisana. Jeśli używana jest alternatywa 1, to program ładujący (ang. Boot Loader) udostępnia wygodną opcję odczytu-modyfikacji-zapisu, która pozwala programowi użytkownika najpierw odczytać stronę, dokonać niezbędnych zmian, a następnie zapisać z powrotem zmodyfikowane dane. Jeśli używana jest alternatywa 2, to nie jest możliwe odczytanie starych danych podczas ładowania, ponieważ strona została już wymazana. Tymczasowy bufor strony można zapisywać w dowolnej kolejności. Ważne jest, aby adres strony używany w obu operacjach wymazywania i zapisu był adresem tej samej strony.
Aby wykonać wymazywanie strony, ustaw jej adres we wskaźniku Z, wpisz “X0000011” do rejestru SPMCSR i wykonaj instrukcję SPM w ciągu czterech taktów zegarowych od momentu zapisu do SPMCSR. Dane w rejestrach R1 i R0 są ignorowane. Adres strony musi zostać wpisany do pola PCPAGE we wskaźniku Z. Pozostałe bity wskaźnika Z zostaną zignorowane podczas tej operacji.
Jeśli pamięć EEPROM będzie zapisywana w środku operacji ładowania strony instrukcją SPM, to wszystkie załadowane dane są wciąż buforowane.
Aby wykonać zapis strony, ustaw jej adres we wskaźniku Z, wpisz “X0000101” do rejestru SPMCSR i wykonaj instrukcję SPM w ciągu czterech taktów zegarowych od momentu zapisu do SPMCSR. Dane w rejestrach R1 i R0 są ignorowane. Adres strony musi zostać wpisany do pola PCPAGE we wskaźniku Z. Pozostałe bity wskaźnika Z zostaną zignorowane podczas tej operacji.
Jeśli przerwanie od SPM zostało uaktywnione, to będzie ono generowało ciągłe przerwanie, gdy bit SPMEN w rejestrze SPMCSR zostanie wyzerowany. Oznacza to, iż zamiast programowego monitorowania stanu rejestru SPMCSR można użyć tego przerwania. Gdy używane jest przerwanie od SPM, wektory przerwań należy przenieść do sekcji boot-loadera, aby uniknąć sytuacji, iż przerwanie próbuje uzyskać dostęp do sekcji RWW, gdy jest ona zablokowana przed odczytem. Sposób przenoszenia przerwań opisano w rozdziale "Przerwania".
Należy podjąć specjalne kroki ostrożności, jeśli użytkownik zezwoli na uaktualnianie sekcji boot-loadera przez pozostawienie w stanie niezaprogramowanym bitu blokującego BL11. Przypadkowy zapis boot-loadera do swojego własnego kodu może uszkodzić cały boot-loader i dalsze uaktualnienia oprogramowania mogą stać się niemożliwe. Jeśli nie jest konieczne zmienianie oprogramowania boot-loadera przez sam boot-loader, to zaleca się zaprogramowanie bitu blokującego BL11, aby chronić oprogramowanie boot-loadera przez jakąkolwiek wewnętrzną zmianą oprogramowania.
Podczas samoprogramowania (wymazywanie strony lub zapis strony) sekcja RWW jest zawsze zablokowana przed odczytem. Oprogramowanie użytkownika musi samo zapobiegać adresowaniu tej sekcji podczas operacji samoprogramowania. Bit RWWSB w rejestrze SPMCSR będzie ustawiony tak długo, jak sekcja RWW jest zajęta. Podczas samoprogramowania tablica wektorów przerwań powinna być przeniesiona do sekcji boot-loadera, jak opisano w rozdziale "Przerwania", lub przerwania należy wyłączyć. Przed zaadresowaniem sekcji RWW po zakończeniu jej programowania oprogramowanie użytkownika musi wyzerować bit RWWSB przez zapis do RWWSRE.
Aby ustawić bity blokujące boot-loadera oraz ogólne bity blokujące, wpisz pożądane dane do rejestru R0, wpisz “X0001001” do rejestru SPMCSR i wykonaj instrukcję SPM w ciągu czterech taktów zegarowych po wpisie do SPMCSR.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
R0 | 1 | 1 | BLB12 | BLB11 | BLB02 | BLB01 | LB2 | LB1 |
Jeśli bity [5:0] w R0 są wyzerowane (stan zero), to odpowiadajże im bity blokujące będą zaprogramowane, jeśli instrukcja SPM zostanie wykonana w przedziale czterech taktów zegarowych od ustawienia bitów BLBSET i SPMEN w rejestrze SPMCSR. Podczas tej operacji zawartość wskaźnika Z jest ignorowana, lecz dla kompatybilności w przyszłości zaleca się załadować wskaźnik Z wartością 0x0001 (taką samą jak używana przy odczycie bitów blokujących). Dla przyszłej kompatybilności zaleca się również ustawianie bitów 7 i 6 w R0 na "1" przy zapisywaniu bitów blokujących. Przy programowaniu bitów blokujących można odczytywać całą pamięć FLASH podczas tej operacji.
Zauważ, iż operacja zapisu pamięci EEPROM zablokuje wszelkie programowanie pamięci FLASH. Odczyt bitów bezpiecznikowych i blokujących z poziomu oprogramowania jest również zablokowany podczas operacji zapisu EEPROM. Zaleca się sprawdzanie bitu stanu EEWE w rejestrze EECR i upewnieniu się, iż jest on wyzerowany, przed zapisywaniem rejestru SPMCSR.
Możliwy jest programowy odczyt zarówno bitów bezpiecznikowych jak i bitów blokujących. Aby odczytać bity blokujące, załaduj wskaźnik Z wartością 0x0001 i ustaw bity BLBSET i SPMEN w rejestrze SPMCSR. Gdy w ciągu trzech taktów mikroprocesora po tej operacji zostanie wykonana instrukcja LPM/ELPM , to wartość bitów blokujących zostanie załadowana do rejestru docelowego. Bity BLBSET i SPMEN wyzerują się automatycznie po zakończeniu odczytu bitów blokujących lub jeśli żadna instrukcja LPM/ELPM nie będzie wykonana w ciągu trzech taktów mikroprocesora lub żadna instrukcja SPM nie będzie wykonana w ciągu czterech taktów mikroprocesora. Gdy bity BLBSET i SPMEN wyzerują się, instrukcja LPM/ELPM będzie działać zgodnie z opisem.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Rd | – | – | BLB12 | BLB11 | BLB02 | BLB01 | LB2 | LB1 |
Algorytm odczytu dolnych bitów bezpiecznikowych jest podobny do algorytmu opisanego powyżej dla odczytu bitów blokujących. Aby odczytać dolne bity bezpiecznikowe, załaduj wskaźnik Z wartością 0x0000 i ustaw bity BLBSET i SPMEN w rejestrze SPMCSR. Gdy instrukcja LPM/ELPM zostanie wykonana w ciągu trzech taktów po ustawieniu bitów BLBSET i SPMEN w SPMCSR, wartość dolnych bitów bezpiecznikowych (FLB) będzie załadowana do rejestru docelowego, jak pokazano poniżej.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Rd | FLB7 | FLB6 | FLB5 | FLB4 | FLB3 | FLB2 | FLB1 | FLB0 |
Podobnie przy odczycie górnych bitów bezpiecznikowych załaduj wskaźnik Z wartością 0x0003. Gdy instrukcja LPM/ELPM zostanie wykonana w ciągu trzech taktów po ustawieniu bitów BLBSET i SPMEN w SPMCSR, wartość górnych bitów bezpiecznikowych (FHB) będzie załadowana do rejestru docelowego, jak pokazano poniżej.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Rd | FHB7 | FHB6 | FHB5 | FHB4 | FHB3 | FHB2 | FHB1 | FHB0 |
Przy odczycie rozszerzonych bitów bezpiecznikowych wpisz 0c0002 do wskaźnika Z. Gdy instrukcja LPM/ELPM zostanie wykonana w ciągu trzech taktów po ustawieniu bitów BLBSET i SPMEN w SPMCSR, wartość rozszerzonych bitów bezpiecznikowych (FHB) będzie załadowana do rejestru docelowego, jak pokazano poniżej.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Rd | – | – | – | – | – | EFB2 | EFB1 | EFB0 |
Zaprogramowane bity bezpiecznikowe i blokujące mają przy odczycie stan zero, natomiast bity niezaprogramowane dają przy odczycie stan jeden.
Aby programowo odczytać wiersz sygnatury, załaduj wskaźnik Z adresem bajtu sygnaturowego, który podaje tabelka poniżej, oraz ustaw bity SIGRD i SPMEN w rejestrze SPMCSR. Gdy zostanie wykonana instrukcja LPM w czasie trzech taktów mikroprocesora po ustawieniu bitów SIGRD i SPMEN w SPMCSR, to wartość bajtowa sygnatury będzie załadowana do rejestru docelowego. Bity SIGRD i SPMEN automatycznie wyzerują się po zakończeniu odczytu wiersza sygnatury, bitów blokowania lub jeśli żadna instrukcja LPM nie będzie wykonywana w ciągu trzech taktów mikroprocesora. Jeśli bity SIGRD i SPMEN są wyzerowane, to instrukcja LPM pracuje zgodnie z opisem w instrukcji.
Adresowanie wiersza sygnatury
Bajt sygnatury | Adres we wskaźniku Z |
Bajt 1 sygnatury mikrokontrolera | 0x0000 |
Bajt 2 sygnatury mikrokontrolera | 0x0002 |
Bajt 3 sygnatury mikrokontrolera | 0x0004 |
Bajt kalibracyjny oscylatora RC | 0x0001 |
Błędom w FLASH można łatwo zapobiec stosując się do następujących zaleceń projektowych (jedno jest wystarczające):
Kalibrowany oscylator RC jest używany do odmierzania czasu dostępów do pamięci FLASH. Poniższa tabela pokazuje typowy czas programowania FLASH przy dostępie przez mikroprocesor.
Symbol | Min. czas programowania | Max. czas programowania |
Zapis FLASH (wymazywanie strony, zapis strony i zapis bitów blokujących przez SPM) | 3,7 ms | 4,5 ms |
;-Procedura zapisuje jedną stronę danych z RAM do FLASH ; Pierwszy adres danych w RAM jest wskazywany przez wskaźnik Y ; Pierwszy adres danych we FLASH jest wskazywany przez wskaźnik Z ;-Obsługa błędów nie została zrealizowana ;-Procedura musi się znaleźć w obszarze boot-loadera ; (przynajmniej podprogram Do_spm). Tylko kod wewnątrz sekcji NRWW może ; być odczytywany podczas samoprogramowania (wymazywania strony i zapisu strony). ;-Używane rejestry: r0, r1, temp1 (r16), temp2 (r17), looplo (r24), ; loophi (r25), spmcrval (r20) ; W procedurze nie zastosowano zachowywania i odtwarzania rejestrów. ; Wykorzystanie rejestrów można zoptymalizować kosztem rozmiaru kodu. ;-Zakłada się, iż albo tablica przerwań została przeniesiona do sekcji ; boot-loadera, albo przerwania są wyłączone. .equ PAGESIZEB = PAGESIZE*2 ;PAGESIZEB jest rozmiarem strony w bajtach, nie w słowach .org SMALLBOOTSTART Write_page: ; Wymazywanie strony ldi spmcrval, (1<<PGERS) | (1<<SPMEN) call Do_spm ; Ponowne uaktywnienie sekcji RWW ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN) call Do_spm ; Przenieś dane z RAM do bufora strony FLASH ldi looplo, low(PAGESIZEB) ;Inicjuj zmienną pętli ldi loophi, high(PAGESIZEB) ;Niepotrzebne dla PAGESIZEB<=256 Wrloop: ld r0, Y+ ld r1, Y+ ldi spmcrval, (1<<SPMEN) call Do_spm adiw ZH:ZL, 2 sbiw loophi:looplo, 2 ;Użyj subi dla PAGESIZEB<=256 brne Wrloop ; Wykonaj zapis strony subi ZL, low(PAGESIZEB) ;Odtwórz wskaźnik sbci ZH, high(PAGESIZEB) ;Niepotrzebne dla PAGESIZEB<=256 ldi spmcrval, (1<<PGWRT) | (1<<SPMEN) call Do_spm ; Ponowne uaktywnienie sekcji RWW ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN) call Do_spm ; Odczytaj z powrotem i sprawdź, opcjonalne ldi looplo, low(PAGESIZEB) ;Inicjuj zmienną pętli ldi loophi, high(PAGESIZEB) ;Niepotrzebne dla PAGESIZEB<=256 subi YL, low(PAGESIZEB) ;Odtwórz wskaźnik sbci YH, high(PAGESIZEB) Rdloop: elpm r0, Z+ ld r1, Y+ cpse r0, r1 jmp Error sbiw loophi:looplo, 1 ;Użyj subi dla PAGESIZEB<=256 brne Rdloop ; Wróć do sekcji RWW ; Sprawdź, czy odczyt sekcji RWW jest bezpieczny Return: in temp1, SPMCSR sbrs temp1, RWWSB ;Jeśli bit RWWSB jest ustawiony, sekcja RWW nie jest jeszcze gotowa ret ; Ponowne uaktywnienie sekcji RWW ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN) call Do_spm jmp Return Do_spm: ; Sprawdź zakończenie poprzedniej instrukcji SPM Wait_spm: in temp1, SPMCSR sbrc temp1, SPMEN rjmp Wait_spm ; Wejście: spmcrval określa działanie SPM ; Wyłącz przerwania, jeśli są włączone, zachowaj stan in temp2, SREG cli ; Sprawdź, iż nie następuje zapis do EEPROM Wait_ee: sbic EECR, EEWE rjmp Wait_ee ; Sekwencja czasowa SPM out SPMCSR, spmcrval spm ; Odtwórz SREG (aby włączyć przerwania, jeśli oryginalnie były włączone) out SREG, temp2 ret |
Poniższe tabele podają parametry używane w opisach samoprogramowania.
Konfiguracja rozmiaru sekcji boot-loadera
BOOTSZ1 | BOOTSZ0 | Rozmiar sekcji boot-loadera | Strony | Sekcja FLASH aplikacji | Sekcja FLASH boot-loadera | Koniec sekcji aplikacji | Adres Resetu w sekcji boot-loadera |
1 | 1 | 512 słów | 4 | 0x0000 - 0x7DFF | 0x7E00 - 0x7FFF | 0x7DFF | 0x7E00 |
1 | 0 | 1024 słów | 8 | 0x0000 - 0x7BFF | 0x7C00 - 0x7FFF | 0x7BFF | 0x7C00 |
0 | 1 | 2048 słów | 16 | 0x0000 - 0x77FF | 0x7800 - 0x7FFF | 0x77FF | 0x7800 |
0 | 0 | 4096 słów | 32 | 0x0000 - 0x6FFF | 0x7000 - 0x7FFF | 0x6FFF | 0x7000 |
Granica sekcji RWW w ATmega640
Sekcja | Strony | Adres |
RWW | 224 | 0x0000 - 0x6FFF |
NRWW | 32 | 0x7000 - 0x7FFF |
Wyjaśnienie różnych zmiennych używanych do opisu dostępu do pamięci FLASH przy pomocy wskaźnika Z
Zmienna | Odpowiadająca wartość Z(1) | Opis | |
PCMSB | 14 | Najbardziej znaczący bit licznika programu (licznik programu ma długość 15 bitów PC[14:0]). | |
PAGEMSB | 6 | Najbardziej znaczący bit używany do adresowania słów wewnątrz strony (128 słów na stronie wymaga 7 bitów PC[6:0]). | |
ZPCMSB | Z15 | Bit w rejestrze Z, który odwzorowuje
PCMSB. Ponieważ bit Z0 nie jest używany, to ZPCMSB równe jest |
|
ZPAGEMSB | Z7 | Bit w rejestrze Z, który odwzorowuje
PAGEMSB. Ponieważ bit Z0 nie jest używany, to ZPAGEMSB równe jest
PAGEMSB |
|
PCPAGE | PC[14:7] | Z15:Z8 | Adres strony dla licznika programu: wybór strony dla operacji wymazywania strony i zapisu strony. |
PCWORD | PC[6:0] | Z7:Z1 | Adres słowa dla licznika programu: wybór słowa przy wypełnianiu bufora tymczasowego (musi mieć wartość zero podczas operacji zapisu strony). |
Uwaga: | 1. | Bit Z0: powinien mieć wartość zero dla wszystkich rozkazów
SPM, w instrukcji LPM/ELPM
wybiera bajt. Szczegóły używania wskaźnika Z przy samoprogramowaniu znajdziesz w podrozdziale "Adresowanie FLASH podczas samoprogramowania". |
Poniższe tabele podają parametry używane w opisach samoprogramowania.
Konfiguracja rozmiaru sekcji boot-loadera
BOOTSZ1 | BOOTSZ0 | Rozmiar sekcji boot-loadera | Strony | Sekcja FLASH aplikacji | Sekcja FLASH boot-loadera | Koniec sekcji aplikacji | Adres Resetu w sekcji boot-loadera |
1 | 1 | 512 słów | 4 | 0x0000 - 0xFDFF | 0xFE00 - 0xFFFF | 0xFDFF | 0xFE00 |
1 | 0 | 1024 słów | 8 | 0x0000 - 0xFBFF | 0xFC00 - 0xFFFF | 0xFBFF | 0xFC00 |
0 | 1 | 2048 słów | 16 | 0x0000 - 0xF7FF | 0xF800 - 0xFFFF | 0xF7FF | 0xF800 |
0 | 0 | 4096 słów | 32 | 0x0000 - 0xEFFF | 0xF000 - 0xFFFF | 0xEFFF | 0xF000 |
Granica sekcji RWW w ATmega640
Sekcja | Strony | Adres |
RWW | 480 | 0x0000 - 0xEFFF |
NRWW | 32 | 0xF000 - 0xFFFF |
Wyjaśnienie różnych zmiennych używanych do opisu dostępu do pamięci FLASH przy pomocy wskaźnika Z
Zmienna | Odpowiadająca wartość Z(1) | Opis | |
PCMSB | 15 | Najbardziej znaczący bit licznika programu (licznik programu ma długość 16 bitów PC[15:0]). | |
PAGEMSB | 6 | Najbardziej znaczący bit używany do adresowania słów wewnątrz strony (128 słów na stronie wymaga 7 bitów PC[6:0]). | |
ZPCMSB | Z16(3) | Bit w rejestrze Z, który odwzorowuje
PCMSB. Ponieważ bit Z0 nie jest używany, to ZPCMSB równe jest |
|
ZPAGEMSB | Z7 | Bit w rejestrze Z, który odwzorowuje
PAGEMSB. Ponieważ bit Z0 nie jest używany, to ZPAGEMSB równe jest
PAGEMSB |
|
PCPAGE | PC[15:7] | Z16(3):Z8 | Adres strony dla licznika programu: wybór strony dla operacji wymazywania strony i zapisu strony. |
PCWORD | PC[6:0] | Z7:Z1 | Adres słowa dla licznika programu: wybór słowa przy wypełnianiu bufora tymczasowego (musi mieć wartość zero podczas operacji zapisu strony). |
Uwaga: | 1. | Bit Z0: powinien mieć wartość zero dla wszystkich rozkazów SPM, w instrukcji LPM/ELPM wybiera bajt. |
2. | Szczegóły używania wskaźnika Z przy samoprogramowaniu znajdziesz w podrozdziale "Adresowanie FLASH podczas samoprogramowania". | |
3. | Wskaźnik Z ma długość tylko 16 bitów (bity od 0 do 15). Bit 16 jest umieszczony w rejestrze RAMPZ w przestrzeni we/wy. |
Poniższe tabele podają parametry używane w opisach samoprogramowania.
Konfiguracja rozmiaru sekcji boot-loadera
BOOTSZ1 | BOOTSZ0 | Rozmiar sekcji boot-loadera | Strony | Sekcja FLASH aplikacji | Sekcja FLASH boot-loadera | Koniec sekcji aplikacji | Adres Resetu w sekcji boot-loadera |
1 | 1 | 512 słów | 4 | 0x00000 - 0x1FDFF | 0x1FE00 - 0x1FFFF | 0x1FDFF | 0x1FE00 |
1 | 0 | 1024 słów | 8 | 0x00000 - 0x1FBFF | 0x1FC00 - 0x1FFFF | 0x1FBFF | 0x1FC00 |
0 | 1 | 2048 słów | 16 | 0x00000 - 0x1F7FF | 0x1F800 - 0x1FFFF | 0x1F7FF | 0x1F800 |
0 | 0 | 4096 słów | 32 | 0x00000 - 0x1EFFF | 0x1F000 - 0x1FFFF | 0x1EFFF | 0x1F000 |
Granica sekcji RWW w ATmega640
Sekcja | Strony | Adres |
RWW | 992 | 0x00000 - 0x1EFFF |
NRWW | 32 | 0x1F000 - 0x1FFFF |
Wyjaśnienie różnych zmiennych używanych do opisu dostępu do pamięci FLASH przy pomocy wskaźnika Z
Zmienna | Odpowiadająca wartość Z(1) | Opis | |
PCMSB | 16 | Najbardziej znaczący bit licznika programu (licznik programu ma długość 17 bitów PC[16:0]). | |
PAGEMSB | 6 | Najbardziej znaczący bit używany do adresowania słów wewnątrz strony (128 słów na stronie wymaga 7 bitów PC[6:0]). | |
ZPCMSB | Z17:Z16(3) | Bit w rejestrze Z, który odwzorowuje
PCMSB. Ponieważ bit Z0 nie jest używany, to ZPCMSB równe jest |
|
ZPAGEMSB | Z7 | Bit w rejestrze Z, który odwzorowuje
PAGEMSB. Ponieważ bit Z0 nie jest używany, to ZPAGEMSB równe jest
PAGEMSB |
|
PCPAGE | PC[16:7] | Z17(3):Z8 | Adres strony dla licznika programu: wybór strony dla operacji wymazywania strony i zapisu strony. |
PCWORD | PC[6:0] | Z7:Z1 | Adres słowa dla licznika programu: wybór słowa przy wypełnianiu bufora tymczasowego (musi mieć wartość zero podczas operacji zapisu strony). |
Uwaga: | 1. | Bit Z0: powinien mieć wartość zero dla wszystkich rozkazów SPM, w instrukcji LPM/ELPM wybiera bajt. |
2. | Szczegóły używania wskaźnika Z przy samoprogramowaniu znajdziesz w podrozdziale "Adresowanie FLASH podczas samoprogramowania". | |
3. | Wskaźnik Z ma długość tylko 16 bitów (bity od 0 do 15). Bity 16 i 17 są umieszczone w rejestrze RAMPZ w przestrzeni we/wy. |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x37 (0x57) | SPMIE | RWWSB | SIGRD | RWWSRE | BLBSET | PGWRT | PGERS | SPMEN | SPMCSR |
Zapis/Odczyt | Z/O | O | O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Gdy bit SPMIE zostanie zapisany jedynką i bit I w rejestrze stanu SREG jest ustawiony, to zostanie włączone przerwanie gotowości instrukcji SPM. Przerwanie to będzie wykonywane tak długo, jak bit SPMEN jest wyzerowany.
Gdy zostanie zainicjowana operacja samoprogramowania (wymazywanie lub zapis strony) w sekcji RWW, bit RWWSB jest ustawiany (na jeden) sprzętowo. Gdy bit ten jest ustawiony, to nie ma dostępu do sekcji RWW. Bit RWWSB wyzeruje się, gdy do bitu RWWSRE zostanie wpisana jedynka po zakończeniu operacji samoprogramowania. Alternatywnie bit RWWSB jest automatycznie zerowany, gdy zostanie zainicjowana operacja ładowania strony.
Jeśli bit ten zostanie zapisany jedynką w tym samym czasie co SPMEN, to następna instrukcja LPM wykonana w cigu trzech taktów zegarowych odczyta do rejestru docelowego bajt z wiersza sygnatury. Instrukcja SPM w okresie czterech taktów po ustawieniu bitów SIGRD i SPMEN nie wykona żadnej operacji. Zostało to zarezerwowane do użytku w przyszłości nie powinno być stosowane.
Przy programowaniu (wymazywanie strony lub zapis strony) sekcji RWW jest ona zablokowana do odczytu (bit RWWSB będzie ustawiony sprzętowo). Aby z powrotem uaktywnić sekcję RWW, oprogramowanie użytkownika musi odczekać do zakończenia programowania (bit SPMEN zostanie wyzerowany). Wtedy, jeśli bit RWWSRE będzie zapisany w tym samym czasie co bit SPMEN, to następna instrukcja SPM w ciągu czterech taktów zegara uaktywni ponownie sekcję RWW. Sekcja RWW nie może być ponownie uaktywniona, gdy pamięć FLASH zajęta jest wymazywaniem strony lub zapisem strony (bit SPMEN ustawiony). Jeśli bit RWWSRE jest zapisywany w czasie, gdy pamięć FLASH jest ładowana, to operacja ładowania FLASH zostanie przerwana, a załadowane dane będą utracone (bufor strony zostanie wyzerowany przy ponownym uaktywnieniu sekcji RWW).
Jeśli jedynka zostanie wpisana do tego bitu w tym samym czasie co do bitu SPMEN, to następna instrukcja SPM w ciągu czterech taktów zegara ustawi bity blokujące boot-loadera zgodnie z danymi w rejestrze R0. Dane w R1 i adres we wskaźniku Z są ignorowane. Bit BLBSET będzie automatycznie wyzerowany po zakończeniu ustawiania zestawu bitów blokujących lub jeśli w ciągu czterech cykli zegara nie będzie wykonana żadna instrukcja SPM.
Instrukcja LPM/ELPM w ciągu trzech cykli zegarowych po ustawieniu bitów BLBSET i SPMEN odczyta albo bity blokujące, albo bity bezpiecznikowe (zależnie od bitu Z0 we wskaźniku Z) do rejestru docelowego.
Jeśli jedynka zostanie wpisana do tego bitu w tym samym czasie co do SPMEN, to następna instrukcja SPM w ciągu czterech taktów zegara wykona zapis strony danymi umieszczonymi w buforze tymczasowym. Adres strony zostanie pobrany z górnej części wskaźnika Z. Dane w rejestrach R1 i R0 są ignorowane. Bit PGWRT bit wyzeruje się automatycznie po zakończeniu zapisu strony lub jeśli żadna instrukcja SPM nie będzie wykonana w ciągu czterech taktów zegarowych. Jeśli została zaadresowana sekcja NRWW, to mikroprocesor będzie wstrzymany przez całą operację zapisu strony.
Jeśli jedynka zostanie wpisana do tego bitu w tym samym czasie co do SPMEN, to następna instrukcja SPM w ciągu czterech taktów zegara wykona wymazanie strony. Adres strony zostanie pobrany z górnej części wskaźnika Z. Dane w rejestrach R1 i R0 są ignorowane. Bit PGERS bit wyzeruje się automatycznie po zakończeniu zapisu strony lub jeśli żadna instrukcja SPM nie będzie wykonana w ciągu czterech taktów zegarowych. Jeśli została zaadresowana sekcja NRWW, to mikroprocesor będzie wstrzymany przez całą operację wymazywania strony.
Ten bit włącza instrukcję SPM przez następne cztery takty zegarowe. Jeśli jedynka logiczna zostanie umieszczona w nim oraz w jednym z bitów RWWSRE, BLBSET, PGWRT lub PGERS, to następna instrukcja SPM będzie miała specjalne znaczenie, zobacz na opisy umieszczone powyżej. Jeśli będzie zapisany tylko sam bit SPMEN, to następna instrukcja SPM umieści wartość R1:R0 w tymczasowym buforze strony adresowanym przez wskaźnik Z. Najmłodszy bit, LSB, wskaźnika Z jest ignorowany. Bit SPMEN wyzeruje się automatycznie po zakończeniu instrukcji SPM lub jeśli żadna instrukcja SPM nie będzie wykonana w ciągu kolejnych czterech taktów zegarowych. Podczas wymazywania strony i zapisu strony bit pozostaje w stanie wysokim aż do zakończenia operacji.
Zapis innej kombinacji bitów niż “10001”, “01001”, “00101”, “00011” lub “00001” w dolnych pięciu bitach rejestru SPMCR nie wywołuje żadnego efektu.
Uwaga: Tylko jedna instrukcja SPM powinna być aktywna w każdym przypadku.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.