Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATtiny25/45/85

Samoprogramowanie FLASH

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Mikrokontroler ATtiny25/45/85 udostępnia mechanizm samoprogramowania pamięci FLASH z poziomu programu.  Samoprogramowanie może korzystać z dowolnego dostępnego interfejsu danych oraz związanego z nim protokołu do odczytywania kodu i zapisywania go (programowania) w pamięci programu. Instrukcja SPM jest standardowo wyłączona, lecz można ją uaktywnić przez zaprogramowanie na 0 bitu bezpiecznikowego SELFPRGEN.

Pamięć programu jest ładowana strona po stronie. Przed zaprogramowaniem strony danymi umieszczonymi w tymczasowym buforze strony, strona ta musi zostać wymazana. Bufor tymczasowy strony wypełniany jest kolejno słowami przy pomocy instrukcji SPM, a bufor ten można wypełniać albo przed rozkazem wymazania strony, albo pomiędzy operacjami wymazania strony i zapisu strony:

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.

Wymazywanie strony za pomocą instrukcji SPM

Aby wykonać wymazanie strony (ang. Page Erase), ustaw jej adres w rejestrze wskaźnikowym Z-pointer, zapisz wartość dwójkową “00000011” w rejestrze SPMCSR i wykonaj instrukcję SPM w ciągu czterech cykli zegarowych po zapisie do SPMCSR. Dane w rejestrach R1 i R0 są ignorowane.

Adres strony musi być zapisany w bitach PCPAGE w rejestrze Z. Pozostałe bity tego rejestru będą zignorowane podczas tej operacji.

Uwaga: Mikroprocesor jest zatrzymywany podczas operacji wymazywania strony.

Na początek:  podrozdziału   strony 

Wypełnianie bufora tymczasowego (ładowanie strony)

Aby zapisać słowo instrukcji, ustaw adres we wskaźniku Z oraz dane w R1:R0, wpisz wartość dwójkową “00000001” do rejestru SPMCSR i wykonaj instrukcję SPM w ciągu czterech cykli zegarowych po zapisie do SPMCSR. Zawartość bitów PCWORD w rejestrze Z jest używana do adresowania danych w buforze tymczasowym. Bufor tymczasowy zostanie automatycznie wyzerowany po operacji zapisu strony przez zapis bitu CTPB w rejestrze SPMCSR. Jest on również wymazywany po resecie systemowym. Zwróć uwagę, że nie można zapisać pod każdy adres więcej niż jeden raz bez wymazania bufora tymczasowego.

Jeśli w środku operacji ładowania strony instrukcją SPM wykonywany jest zapis EEPROM, to wszystkie załadowane dane zostaną utracone.

Na początek:  podrozdziału   strony 

Wykonanie zapisu strony

Aby wykonać zapis strony, ustaw jej adres w rejestrze wskaźnikowym Z, wpisz wartość dwójkową “00000101” do rejestru SPMCSR i wykonaj instrukcję SPM w ciągu czterech cykli zegarowych po zapisie do SPMCSR. Dane w rejestrach R1 i R0 są ignorowane.

Adres strony musi zostać zapisany do bitów PCPAGE. Pozostałe bity rejestru rejestru wskaźnikowego Z musza mieć wartość 0 podczas tej operacji.

Uwaga: Mikroprocesor jest zatrzymywany podczas operacji zapisu strony.

Na początek:  podrozdziału   strony 

Adresowanie pamięci FLASH przy samoprogramowaniu

Rejestr wskaźnikowy Z jest używany do adresowania w instrukcjach SPM i LPM.
Bit 15 14 13 12 11 10 9 8  
ZH(R31) Z15 Z14 Z13 Z12 Z11 Z10 Z9 Z8 ZH
ZL(R30) Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 ZL
Bit 7 6 5 4 3 2 1 0  

Ponieważ pamięć FLASH zorganizowana jest w strony, licznik rozkazów może być traktowany tak, jakby posiadał dwie różne sekcje. Jedna sekcja, składająca się z najmniej znaczących bitów, adresuje słowa wewnątrz strony, natomiast część złożona z najbardziej znaczących bitów adresuje strony. Pokazane to jest na poniższym rysunku. Zwróć uwagę, iż operacje wymazania strony i zapisu strony adresują pamięć niezależnie od siebie (rejestr Z może mieć różną zawartość dla każdej z nich). Dlatego bardzo ważnym jest, aby oprogramowanie adresowało tę samą stronę w obu tych operacjach.

obrazek

Na początek:  podrozdziału   strony 

Zapis EEPROM blokuje zapis do SPMCSR

Zauważ, iż operacja zapisu do pamięci EEPROM zablokuje całe programowe programowanie FLASH z poziomu programu użytkownika. Odczytywanie bitów bezpiecznikowych oraz bitów blokujących przez program również będzie wyłączone podczas operacji zapisu do EEPROM. Zaleca się, aby użytkownik sprawdzał bit stanu EEPE w rejestrze EECR i upewniał się, iż jest on wyzerowany przed zapisem do rejestru SPMCSR.
Na początek:  podrozdziału   strony 

Programowy odczyt bitów bezpiecznikowych i blokujących

Możliwe jest odczytanie stanu bitów bezpiecznikowych i blokujących przez program użytkownika.

Uwaga: Zaprogramowane bity bezpiecznikowe i bity blokujące będą odczytane jako zerp. Bity niezaprogramowane dają odczyt jeden.

Programowy odczyt bitów blokujących

Wykonanie instrukcji LPM w ciągu trzech cykli zegarowych mikroprocesora po ustawieniu bitów RFLB i SELFPRGEN w SPMCSR zwróci wartości bitów blokujących w rejestrze docelowym. Bity RFLB i SELFPRGEN są automatycznie zerowane po ukończeniu odczytu bitów blokujących, lub jeśli żadna instrukcja LPM nie zostanie wykonana w ciągu trzech cykli zegarowych mikroprocesora, lub jeśli żadna instrukcja SPM nie zostanie wykonana w ciągu czterech cykli zegarowych mikroprocesora. Gdy bity RFLB i SELFPRGEN są wyzerowane, instrukcja LPM działa w sposób standardowy.

Aby odczytać bity blokujące, postępuj zgodnie z poniższą procedurą:

  1. Załaduj do rejestru wskaźnikowego Z wartość 0x0001.
  2. Ustaw bity RFLB i SPMEN w rejestrze SPMCSR.
  3. W ciągu trzech cykli zegarowych od tego momentu wykonaj instrukcję LPM, która zwróci bity blokujące w rejestrze docelowym.
  4. Odczytaj wartości bitów blokujących z rejestru docelowego.

Jeśli procedura się powiedzie, to zawartość rejestru docelowego jest następująca:

Bit 7 6 5 4 3 2 1 0  
Rd - - - - - - LB2 LB1  

Więcej na temat bitów blokujących znajdziesz w następnym rozdziale.

Programowy odczyt bitów bezpiecznikowych

Algorytm odczytywania bitów bezpiecznikowych jest podobny do opisanego powyżej algorytmu odczytywania bitów blokujących, inny jest jedynie adres.

Aby odczytać dolny bajt bitów bezpiecznikowych (ang. Fuse Low Byte, FLB), postępuj wg poniższej procedury:

  1. Załaduj do rejestru wskaźnikowego Z wartość 0x000.
  2. Ustaw bity RFLB i SPMEN w rejestrze SPMCSR.
  3. W ciągu trzech cykli zegarowych od tego momentu wykonaj instrukcję LPM, która zwróci FLB w rejestrze docelowym.
  4. Odczytaj wartości FLB z rejestru docelowego.

Jeśli się to powiedzie, to rejestr docelowy zawiera:

Bit 7 6 5 4 3 2 1 0  
Rd FLB7 FLB6 FLB5 FLB4 FLB3 FLB2 FLB1 FLB0  

Aby odczytać górny bajt bitów bezpiecznikowych (ang. Fuse High Byte, FHB), po prostu w powyższej procedurze zastąp wartość 0x0000 wpisywaną do rejestru wskaźnikowego Z wartością 0x0003 i wykonaj resztę operacji. Jeśli procedura się powiedzie, to w rejestrze docelowym otrzymasz FHB:

Bit 7 6 5 4 3 2 1 0  
Rd FHB7 FHB6 FHB5 FHB4 FHB3 FHB2 FHB1 FHB0  

Aby odczytać rozszerzony bajt bitów bezpiecznikowych (ang. Fuse Extended Byte, FEB), zastąp wartość 0x000 wpisywaną do rejestru wskaźnikowego Z wartością 0x0002 i wykonaj resztę operacji. Jeśli procedura się powiedzie, to w rejestrze docelowym otrzymasz FEB:

Bit 7 6 5 4 3 2 1 0  
Rd FEB7 FEB6 FEB5 FEB4 FEB3 FEB2 FEB1 FEB0  

Więcej na temat bitów bezpiecznikowych znajdziesz w następnym rozdziale.

Odczyt zapisanej wewnętrznie tablicy sygnatury mikrokontrolera

Aby odczytać zawartość tablicy sygnatur mikrokontrolera, postępuj według poniżej procedury:

  1. Załaduj wskaźnik Z indeksem tablicy.
  2. Ustaw bity RSIG i SPMEN w SPMCSR.
  3. Wykonaj instrukcję LPM w ciągu następnych trzech cykli zegarowych.
  4. Odczytaj dane tablicy z docelowego rejestru instrukcji LPM.

Bity RSIG i SPMEN zostaną automatycznie wyzerowane po trzech cyklach mikroprocesora. Gdy bity RSIG i SPMEN są wyzerowane, to instrukcja LPM będzie działać zgodnie z opisem w rozdziale "Zestaw instrukcji AVR".

Zobacz na poniższy przykładowy program:

Przykład w kodzie maszynowym
DSIT_read:
    ; Używa wskaźnika Z jako indeksu tablicy
    ldi ZH, 0
    ldi ZL, 1
    ; Załaduj bity SPMCSR do R16, następnie zapisz do SPMCSR
    ldi r16, (1<<RSIG)|(1<<SPMEN)
    out SPMCSR, r16
    ; Wykonaj LPM. Dane tablice będą zwrócone w r17
    lpm r17, Z
    ret
Na początek:  podrozdziału   strony 

Zapobieganie uszkodzeniu danych w pamięci FLASH

W okresach spadku napięcia zasilającego VCC programowanie pamięci FLASH może zakończyć się błędami, ponieważ napięcie zasilające jest zbyt niskie, aby mikroprocesor i pamięć FLASH pracowały poprawnie. Problemy te są takie same jak w systemach z zewnętrzną pamięcią FLASH i należy stosować te same rozwiązania projektowe. Błędy programowania FLASH mogą pojawić się w dwóch sytuacjach, gdy napięcie jest za niskie. Po pierwsze standardowa sekwencja zapisu do FLASH wymaga minimalnego napięcia do poprawnej pracy. Po drugie, sam mikroprocesor może wykonywać instrukcje niepoprawnie, jeśli napięcie zasilające jest dla nich zbyt niskie.

Błędom w FLASH można łatwo zapobiec stosując się do następujących zaleceń projektowych (jedno jest wystarczające):

  1. Utrzymuj linię AVR RESET w stanie aktywnym (niskim) w okresach niewystarczającej wartości napięcia zasilającego. Można tego dokonać poprzez włączenie wewnętrznego detektora spadku napięcia zasilania (ang. internal Brown-out Detector, BOD), jeśli napięcie pracy pasuje do poziomu wykrywania. Jeśli nie, można użyć zewnętrznego układu resetowania przy niskim napięciu VCC. Jeśli reset wystąpi podczas wykonywania operacji zapisu, to operacja ta zostanie zakończona pod warunkiem, iż napięcie zasilające posiada wystarczającą wartość.
  2. Utrzymuj rdzeń AVR w trybie uśpienia z wyłączeniem zasilania (ang. Power-down sleep mode) w okresach niskiego VCC. Uniemożliwi to mikroprocesorowi próby dekodowania i wykonywania instrukcji, co skutecznie zabezpieczy rejestr SPMCSR, a co za tym idzie również pamięć FLASH, przed niezamierzonymi zapisami.
Na początek:  podrozdziału   strony 

Czas programowania FLASH za pomocą SPM

Do odmierzania czasu przy dostępie do pamięci FLASH używany jest kalibrowany oscylator RC. Poniższa tabela pokazuje typowy czas programowania FLASH przy dostępie przez mikroprocesor:
Symbol Minimalny czas programowania Maksymalny czas programowania
Zapis FLASH (wymazanie strony, zapis strony i zapis bitów blokujących za pomocą SPM) 3,7 ms 4,5 ms

Czasy minimalne/maksymalne dotyczą pojedynczej operacji

Na początek:  podrozdziału   strony 

Opis rejestrów

SPMCSR – Store Program Memory Control and Status Register – Rejestr sterowania i stanu zapisu do pamięci programu

Bit 7 6 5 4 3 2 1 0  
0x37 - - RSIG CTPB RFLB PGWRT PGERS SPMEN SPMCSR
Zapis/Odczyt O O O Z/O Z/O Z/O Z/O Z/O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Bity 7:6 – Zarezerwowane

Te bity są zarezerwowane w ATtiny25/45/85 i przy odczycie dają zawsze wartość zero.

Bit 5 – RSIG: Read Device Signature Imprint Table – Odczyt wewnętrznej tablicy sygnatur mikrokontrolera

Wykonanie instrukcji LPM w ciągu trzech cykli po ustawieniu bitów RSIG i SPMEN w rejestrze SPMCSR zwróci wybrane dane (zależnie od wartości wskaźnika Z) z wewnętrznej tablicy sygnatur mikrokontrolera w rejestrze docelowym.

Bit 4 – CTPB: Clear Temporary Page Buffer – Wymazywanie tymczasowego bufora strony

Jeśli bit CTPB zostanie zapisany jedynką logiczną podczas wypełniania tymczasowego bufora strony, to bufor ten zostanie wymazany i przechowywane w nim dane będą utracone.

Bit 3 – RFLB: Read Fuse and Lock Bits – Odczyt bitów bezpiecznikowych i bitów blokujących

Instrukcja LPM wykonana w obrębie do trzech cykli zegarowych po ustawieniu bitów RFLB i SPMEN w rejestrze SPMCSR odczyta do rejestru docelowego albo bity blokujące, albo bity bezpiecznikowe (w zależności od bity Z0 w rejestrze wskaźnikowym Z). Zobacz do podrozdziału "Zapis EEPROM blokuje zapis do SPMCSR".

Bit 2 – PGWRT: Page Write – Zapis strony

Jeśli ten bit zostanie zapisany logiczną jedynką w tym samym czasie co bit SPMEN, to instrukcja SPM wykonana w czasie do 4 cykli zegarowych spowoduje zapis strony danymi przechowywanymi w buforze tymczasowym. Adres strony jest brany z bitów PCPAGE rejestru wskaźnikowego Z. Dane w R1 i R0 są ignorowane. Bit PGWRT automatycznie wyzeruje się po zakończeniu zapisu strony, lub jeśli żadna instrukcja SPM nie zostanie wykonana w czasie czterech cykli zegarowych. Podczas operacji zapisu strony mikroprocesor zostaje zatrzymany.

Bit 1 – PGERS: Page Erase – Wymazanie strony

Jeśli ten bit zostanie zapisany logiczną jedynką w tym samym czasie co bit SPMEN, to instrukcja SPM wykonana w czasie do 4 cykli zegarowych spowoduje wymazanie strony. Adres strony jest brany z bitów PCPAGE rejestru wskaźnikowego Z. Dane w R1 i R0 są ignorowane. Bit PGERS automatycznie wyzeruje się po zakończeniu wymazywania strony, lub jeśli żadna instrukcja SPM nie zostanie wykonana w czasie czterech cykli zegarowych. Podczas całej operacji wymazywania strony mikroprocesor zostaje zatrzymany.

Bit 0 – SPMEN: Store Program Memory Enable – Włączenie samoprogramowania

Ten bit uaktywnia działanie instrukcji SPM w ciągu następnych czterech cykli zegarowych. Jeśli zostanie ustawiony na 1 z bitami RSIG, CTPB, RFLB, PGWRT lub PGERS, to następna instrukcja LPM/SPM będzie miała specjalne działanie wg powyższego opisu.

Jeśli zostanie zapisany tylko bit SPMEN, to następna instrukcja SPM zapisze wartość z R1:R0 w tymczasowym buforze strony adresowanym przez wskaźnik Z. Najmłodszy bit wskaźnika Z jest ignorowany. Bit SPMEN zostanie automatycznie wyzerowany po zakończeniu instrukcji SPM, lub po czterech cyklach zegarowych, jeśli nie zostanie wykonana żadna instrukcja SPM. Podczas wymazywania strony i zapisu strony bit SPMEN pozostaje w stanie wysokim aż do zakończenia operacji.


Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2021 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: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.