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

ATtiny20

Programowanie pamięci

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

Cechy

Na początek:  podrozdziału   strony 

Przegląd

Sterownik pamięci nieulotnej (ang. Non-Volatile Memory Controller) zarządza całym dostępem do pamięci nieulotnych NVM. Zajmuje się on właściwymi opóźnieniami czasowymi i przywilejami dostępu, a także przechowuje stan pamięci NVM.

Podczas normalnej pracy mikroprocesor wykonuje kod z segmentu kodu pamięci FLASH (z pamięci programu). Po wejściu w tryb uśpienia bez aktywnych operacji programowania pamięć FLASH jest wyłączana, aby zminimalizować pobór energii.

Wszystkie pamięci NVM są odwzorowane w pamięci danych. Oprogramowanie aplikacji może odczytywać pamięci NVM z odwzorowanych obszarów w pamięci danych za pomocą instrukcji ładowania z adresowaniem pośrednim.

Pamięć NVM posiada tylko jeden port i dlatego następna instrukcja oraz dane nie mogą być odczytywane jednocześnie. Gdy aplikacja odczytuje komórki NVM odwzorowane w obszarze danych, dane są odczytywane przed pobraniem następnej instrukcji. Działanie mikroprocesora jest tutaj opóźniane o jeden cykl zegara systemowego.

Operacje wewnętrznego programowania NVM zostały zablokowane i dlatego pamięć NVM wygląda dla oprogramowania aplikacji jak pamięć tylko do odczytu. Próby wewnętrznego zapisu do tej pamięci nie będą kończyły się powodzeniem.

Metoda stosowana przez zewnętrzny programator do zapisywania pamięci nieulotnych jest nazywana programowaniem zewnętrznym. Programowanie zewnętrzne może zostać wykonane zarówno w układzie aplikacyjnym jak też w produkcji masowej.. Zewnętrzny programator może odczytywać i programować pamięci NVM poprzez interfejs TPI (ang. Tiny Programming Interface).

W trybie programowania zewnętrznego wszystkie pamięci NVM mogą być odczytywane i programowane z wyjątkiem segmentów sygnatury i kalibracji, które są tylko do odczytu.

Pamięci NVM można programować tylko przy napięciu 5V.

Na początek:  podrozdziału   strony 

Pamięci NVM

Mikrokontrolery ATtiny20 posiadają następujące, wbudowane pamięci NVM:

Bity blokujące pamięci nieulotnej

Mikrokontrolery ATtiny20 udostępniają dwa bity blokujące, co pokazuje poniższa tabela:

Bity blokujące

Bit blokujący Numer bitu Opis Wartość standardowa
  7   1 (niezaprogramowany)
  6   1 (niezaprogramowany)
  5   1 (niezaprogramowany)
  4   1 (niezaprogramowany)
  3   1 (niezaprogramowany)
  2   1 (niezaprogramowany)
NVLB2 1 Bit blokujący pamięć nieulotną 1 (niezaprogramowany)
NVLB1 0 Bit blokujący pamięć nieulotną 1 (niezaprogramowany)

Bity blokujące mogą być pozostawione w stanie niezaprogramowanym ("1") lub mogą zostać zaprogramowane ("0"), aby osiągnąć dodatkowe bezpieczeństwo, jak pokazano w tabeli poniżej. Bity blokujące mogą zostać wymazane w stan "1" tylko za pomocą rozkazu Chip Erase (kasowanie zawartości układu).

Tryby ochrony pamięci NVM za pomocą bitów blokujących

Bity blokady pamięci(1) Rodzaj ochrony
Tryb blokady NVBL2(2) NVBL1(2)
1 1 1 Opcja ochrony pamięci jest nieaktywna
2 1 0 Dalsze programowanie pamięci FLASH jest wyłączone w trybie programowania zewnętrznego. Bity segmentu konfiguracji zostają zablokowane  w trybie programowania zewnętrznego.
3 0 0 Dalsze programowanie pamięci FLASH i jej weryfikacja są wyłączone w trybie programowania zewnętrznego. Bity segmentu konfiguracji zostają zablokowane  w trybie programowania zewnętrznego.
Uwagi: 1. Zaprogramuj segment konfiguracji przed zaprogramowaniem bitów NVLB1 i NVLB2.
  2. "1" oznacza niezaprogramowany, "0" oznacza zaprogramowany.

Pamięć FLASH

Wbudowana pamięć FLASH mikrokontrolerów ATtiny20 posiada 4 oddzielne segmenty, jak pokazują poniższe tabele:

Liczba słów i stron w pamięci FLASH

Segment Rozmiar (bajty) Rozmiar strony (słowa) Liczba stron WADDR PADDR
Kod (pamięć programu) 2048 16 64 [4:1] [10:5]
Konfiguracja 16 16 1 [4:1]
Sygnatura(1) 32 16 2 [4:1] [5:5]
Kalibracja(1) 16 16 1 [4:1]
Uwagi: 1. Segment jest tylko do odczytu.
  WADDR: bity adresu słowa wewnątrz strony
PADDR: bity adresu strony

Segment konfiguracji

Mikrokontrolery ATtiny20 posiadają jeden bajt konfiguracji, który znajduje się w segmencie konfiguracji:

Bajt konfiguracji

Adres słowa konfiguracji Dane słowa konfiguracji
Starszy bajt Młodszy bajt
0x00 Zarezerwowane Bajt 0 konfiguracji
0x01...0x0F Zarezerwowane Zarezerwowane

Kolejna tabela skrótowo opisuje przeznaczenie wszystkich bitów konfiguracji oraz ich odwzorowanie w bajcie konfiguracji:

Bit Nazwa bitu Opis Wartość standardowa
7 Zarezerwowane 1 (niezaprogramowany)
6 BODLEVEL2 Poziom wyzwalania dla detektora spadku napięcia 1 (niezaprogramowany)
5 BODLEVEL1 Poziom wyzwalania dla detektora spadku napięcia 1 (niezaprogramowany)
4 BODLEVEL0 Poziom wyzwalania dla detektora spadku napięcia 1 (niezaprogramowany)
3 Zarezerwowane 1 (niezaprogramowany)
2 CKOUT Wyjście zegara systemowego 1 (niezaprogramowany)
1 WDTON Licznik czasu zawsze włączony 1 (niezaprogramowany)
0 RSTDISBL Wyłączenie zewnętrznego resetowania 1 (niezaprogramowany)

Bity konfiguracji nie są kasowane przez wymazanie układu (ang. chip erase), lecz można je wykasować przez użycie rozkazu kasowania segmentu konfiguracji. Zwróć uwagę, że bity konfiguracji są zablokowane, jeśli zostanie zaprogramowany bit 1 blokady pamięci nieulotnej (NVLB1).

Zatrzaskiwanie bitów konfiguracji

Wszystkie bity konfiguracji są zatrzaskiwane albo przy resecie mikrokontrolera, albo przy wyjściu mikrokontrolera z trybu programowania zewnętrznego. Zmiany bitów konfiguracyjnych zaczynają obowiązywać dopiero po wyjściu z trybu programowania zewnętrznego.

Segment sygnatury

Sekcja sygnatury jest wydzielonym obszarem pamięci, który służy do przechowywania różnych informacji o mikrokontrolerze, takich jak sygnatura. Większość tego segmentu pamięci przeznaczona jest to użytku wewnętrznego.

Bajty sygnatury

Adres słowa sygnatury Dane słowa sygnatury
Starszy bajt Młodszy bajt
0x00 Identyfikator 1 mikrokontrolera Identyfikator producenta
0x01 Zarezerwowane do użytku wewnętrznego Identyfikator 2 mikrokontrolera
0x02...0x0F Zarezerwowane do użytku wewnętrznego Zarezerwowane do użytku wewnętrznego

Mikrokontrolery ATtiny20 posiadają 3-bajtowy kod sygnatury, który może służyć do ich identyfikacji. Te trzy bajty przechowywane są w segmencie sygnatury, jak pokazuje powyższa tabela. Dane sygnatury dla mikrokontrolerów ATtiny20 są podane w kolejnej tabeli:

Kod sygnatury

Mikrokontroler Bajty sygnatury
Producent Identyfikator 1 Identyfikator 2
ATtiny20 0x1E 0x91 0x0F

Segment kalibracji

Mikrokontrolery ATtiny20 posiadają jeden bajt kalibracji. Zawiera on dane kalibracyjne dla wewnętrznego oscylatora i znajduje się w segmencie kalibracji, jak pokazuje poniższa tabela.

Bajt kalibracji

Adres słowa kalibracji Dane słowa kalibracji
Starszy bajt Młodszy bajt
0x00 Zarezerwowane Wartość kalibracyjna dla wewnętrznego oscylatora
0x01...0x07 Zarezerwowane Zarezerwowane

Zatrzaskiwanie wartości kalibracyjnej

Aby zapewnić poprawną częstotliwość kalibrowanego oscylatora wewnętrznego, wartość kalibracyjna jest automatycznie wpisywana do rejestru OSCCAL podczas resetu.

Na początek:  podrozdziału   strony 

Dostęp do pamięci NVM

Pamięć nieulotna NVM jest dostępna do odczytu i programowania poprzez obszary odwzorowane w przestrzeni danych.

Sterownik NVM rozpoznaje pewien zbór rozkazów, których można użyć do poinformowania go, jakie zadanie programowania ma zostać wykonane na pamięci NVM. Rozkazy dla sterownika NVM są wydawane poprzez rejestr rozkazowy NVM (ang. NVM Command Register, NVMCMD). Po załadowaniu wybranego rozkazu operacja rozpoczyna się przez zapis danych do obszarów NVM odwzorowanych w przestrzeni danych.

Gdy sterownik NVM jest zajęty wykonywaniem jakiejś operacji, będzie to sygnalizował poprzez znacznik zajętości NVM (ang. NVM Busy Flag) w rejestrze sterowania i statusu NVM (ang. NVM Control and Status Register, NVMCSR). Rejestr rozkazowy sterownika NVM jest blokowany przed zapisem tak długo, jak znacznik zajętości NVM jest aktywny. Ma to na celu zapewnienie, iż bieżący rozkaz zostanie w pełni wykonany przed rozpoczęciem następnego.

Programowanie dowolnej części pamięci NVM automatycznie zablokuje następujące operacje:

Mikrokontrolery ATtiny20 wspierają jedynie programowanie zewnętrzne. Operacje programowania wewnętrznego (dostępne na innych mikrokontrolerach rodziny AVR) zostały zablokowane, co oznacza, iż jakakolwiek wewnętrzna (tj. bez zewnętrznego programatora) próba zapisu lub wymazywania komórek pamięci NVM nie powiedzie się.

Adresowanie FLASH

Przestrzeń danych stosuje adresowanie bajtów, lecz ponieważ segmenty FLASH są traktowane jako słowa zorganizowane w strony, adres bajtu w przestrzeni danych musi zostać przekonwertowany na adres słowa segmentu FLASH.

Najbardziej znaczące bity adresu w przestrzeni danych wybierają bity blokujące NVM lub segment FLASH odwzorowany w pamięci danych. Adres słowa wewnątrz strony (WADDR) jest przechowywany w bitach [WADDRMSB:1], a adres strony (PADDR) w bitach [PADDRMSB:WADDRMSB+1]. Razem PADDR i WADDR tworzy absolutny adres słowa w segmencie FLASH.

Najmniej znaczący bit adresu segmentu FLASH jest używany do wybierania dolnego lub górnego bajtu słowa.

Adresowanie pamięci FLASH
obrazek

Odczyt FLASH

Pamięć FLASH można odczytywać z komórek odwzorowanych w pamięci danych po jednym bajcie naraz. Dla operacji odczytu najmniej znaczący bit (bit 0) jest używany do wyboru dolnego lub górnego bajtu w adresowanym słowie. Jeśli ten bit ma wartość zero, to odczytany zostanie dolny bajt słowa, a jeśli jeden, to odczytany zostanie górny bajt słowa.

Programowanie FLASH

Pamięć FLASH może być zapisywana słowo po słowie. Przed zapisaniem słowa do pamięci FLASH jego docelowe położenie musi być wymazane. Zapis do niewymazanego słowa FLASH spowoduje błędy w jego zawartości. Przy zapisie dostęp do pamięci FLASH opiera się na słowach (16 bitów), natomiast przestrzeń danych używa adresowania opartego na bajtach (8-bitów) w celu dostępu do pamięci FLASH, która została odwzorowana w pamięci danych. Z tego powodu istotny jest zapis słowa do pamięci FLASH we właściwej kolejności, mianowicie dolne bajty przed górnymi. Najpierw dolny bajt jest zapisywany do tymczasowego bufora. Następnie zapis górnego bajtu wpisuje jednocześnie oba bajty górny i dolny do bufora słowa pamięci FLASH, co rozpoczyna operację zapisu do FLASH.

Operacje kasowania FLASH mogą być wykonywane tylko na całych segmentach FLASH.

Sekwencja programowania pamięci FLASH jest następująca:

  1. Wykonaj kasowanie segmentu FLASH lub wykonaj kasowanie zawartości całego układu (ang. chip erase)
  2. Zapisz segment FLASH słowo po słowie

Kasowanie całego układu

Rozkaz Chip Erase (kasowanie układu) usunie zawartość całego segmentu kodu pamięci FLASH oraz bity blokowania NVM. Z powodów bezpieczeństwa bity blokujące NVM nie są kasowane zanim nie zostanie usunięta zawartość całego segmentu kodu. Segmenty konfiguracji, sygnatury i kalibracji nie są zmieniane.

Przed rozpoczęciem kasowania układu rejestr the NVMCMD musi zostać załadowany rozkazem CHIP_ERASE.  Aby rozpocząć operację kasowania, należy zapisać dowolną wartość do górnego bajtu słowa wewnątrz segmentu kodu FLASH Bit NVMBSY pozostaje w stanie wysokim aż do zakończenia kasowania. W czasie kasowania FLASH nie można wykonywać ani odczytu, ani zapisu FLASH.

Kasowanie układu można przeprowadzić w następujący sposób:

  1. Wpisz rozkaz CHIP_ERASE do rejestru NVMCMD.
  2. Uruchom operację wymazywania przez zapis dowolnego bajtu do górnego bajtu dowolnego słowa wewnatrz segmentu kodu.
  3. Poczekaj, aż bit NVMBSY zostanie wyzerowany.

Wymazywanie segmentu kodu

Algorytm wymazania wszystkich stron w segmencie kodu w pamięci FLASH jest następujący:

  1. Wpisz rozkaz SECTION_ERASE do rejestru NVMCMD.
  2. Rozpocznij operację wymazywania przez zapis bajtu do górnego bajtu dowolnego słowa wewnątrz segmentu kodu.
  3. Poczekaj, aż bit NVMBSY zostanie wyzerowany.

Zapis podwójnego słowa kodu

Algorytm zapisania dwóch słów do segmentu kodu jest następujący:

  1. Wpisz rozkaz DWORD_WRITE do rejestru NVMCMD.
  2. Zapisz dolny bajt dolnego słowa do dolnego bajtu docelowej komórki słowa.
  3. Zapisz górny bajt dolnego słowa danych do górnego bajtu tej samej komórki docelowej.
  4. Wyślij znak IDLE, jak opisano w podrozdziale obsługiwane znaki.
  5. Zapisz dolny bajt górnego słowa do dolnego bajtu następnej komórki słowa.
  6. Zapisz górny bajt górnego słowa danych do górnego bajtu tej samej komórki docelowej. Spowoduje to rozpoczęcie operacji zapisu FLASH.
  7. Poczekaj, aż bit NVMBSY zostanie wyzerowany.

Wymazywanie segmentu konfiguracji

Algorytm wymazania segmentu konfiguracji jest następujący:

  1. Zapisz rozkaz SECTION_ERASE do rejestru NVMCMD
  2. Rozpocznij operację wymazywania przez zapis bajtu do górnego bajtu dowolnego słowa wewnątrz segmentu konfiguracji
  3. Poczekaj, aż bit NVMBSY zostanie wyzerowany

Zapisywanie słowa konfiguracji

Algorytm zapisywania słowa konfiguracji jest następujący:

  1. Wpisz rozkaz DWORD_WRITE do rejestru NVMCMD.
  2. Zapisz dolny bajt dolnego słowa do dolnego bajtu docelowej komórki słowa konfiguracji.
  3. Zapisz górny bajt dolnego słowa danych do górnego bajtu tej samej komórki docelowej.
  4. Wyślij znak IDLE, jak opisano w podrozdziale obsługiwane znaki.
  5. Zapisz dowolny bajt do dolnego bajtu następnej komórki słowa konfiguracji .
  6. Zapisz dowolny bajt do górnego bajtu tej samej komórki docelowej. Spowoduje to rozpoczęcie operacji zapisu FLASH.
  7. Poczekaj, aż bit NVMBSY zostanie wyzerowany.

Odczyt bitów blokujących NVM

Bity blokowania pamięci nieulotnych mogą być odczytane z komórki obszaru danych, która je odwzorowuje.

Zapis bitów blokujących NVM

Algorytm zapisywania bitów blokujących NVM jest następujący:

  1. Zapisz rozkaz WORD_WRITE do rejestru NVMCMD
  2. Zapisz wartość bitów blokujących do ich komórki w pamięci danych. Jest to dolny bajt słowa z bitami blokującymi w pamięci FLASH.
  3. Zapisz górny bajt do górnego bajtu tego samego słowa. To rozpocznie operację zapisu w pamięci FLASH.
  4. Poczekaj, aż bit NVMBSY zostanie wyzerowany
Na początek:  podrozdziału   strony 

Samoprogramowanie

Mikrokontrolery ATtiny20 nie posiadają funkcji samoprogramowania.
Na początek:  podrozdziału   strony 

Programowanie zewnętrzne

Sposób programowania pamięci nieulotnych za pomocą zewnętrznego programatora określane jest mianem programowania zewnętrznego (ang. external programming). Może ono być wykonywane zarówno w układzie aplikacyjnym (mikrokontroler wlutowany w płytkę drukowaną układu, którym ma sterować) jaki i w produkcji masowej.

Pamięci nieulotne mogą być zewnętrznie programowane poprzez interfejs TPI (ang. Tiny Programming Interface). Szczegóły znajdziesz w rozdziale "Interfejs programowania". Przy pomocy TPI zewnętrzny programator może uzyskać dostęp do rejestrów sterowania i stanu pamięci nieulotnych NVM (ang. NVM control and status registers), które są odwzorowane w przestrzeni we/wy, a pamięć NVM jest odwzorowana w przestrzeni pamięci danych.

Wejście w tryb programowania zewnętrznego

Interfejs TPI musi zostać włączony przed wejściem w tryb programowania zewnętrznego. następująca procedura opisuje, jak wejść w tryb programowania zewnętrznego po uaktywnieniu interfejsu TPI:

  1. Zażądaj włączenia programowania NVM (pamięci nieulotne) przez wysłanie klucza dostępowego do pamięci NVM za pomocą instrukcji SKEY.
  2. Przeglądaj stan bitu NVMEN w rejestrze TPISR aż zostanie on ustawiony.

Więcej informacji znajdziesz w rozdziale "Interfejs programowania".

Wyjście z trybu programowania zewnętrznego

Wyzeruj bit uaktywniający pamięci NVM, aby wyłączyć ich programowanie zewnętrzne, następnie zwolnij końcówkę RESET. Zobacz na opis rejestru TPISR.

Na początek:  podrozdziału   strony 

Opis rejestrów

NVMCSR – Non-Volatile Memory Control and Status Register – Rejestr sterowania i stanu pamięci nieulotnych

Bit 7 6 5 4 3 2 1 0  
0x32 NVMBSY - - - - - - - NVMCSR
Zapis/Odczyt Z/O O O O O O O O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Bit 7 – NVMBSY: Non-Volatile Memory Busy – Zajętość pamięci nieulotnej

Bit ten oznacza, że pamięć nieulotna (pamięć FLASH i bity blokowania) jest zajęta, ponieważ jest w trakcie programowania. Bit NVMBSY zostaje ustawiony na początku operacji programowania i pozostaje w tym stanie aż operacja ta zakończy się.

Bity 6:0 – Zarezerwowane

Te bity są zarezerwowane i przy odczycie dają wartość 0.


NVMCMD – Non-Volatile Memory Command Register – Rejestr rozkazowy pamięci nieulotnej

Bit 7 6 5 4 3 2 1 0  
0x33 - - NVMCMD[5:0] NVMCMD
Zapis/Odczyt O O Z/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 i przy odczycie dają wartość 0.

Bity 5:0 – NVMCMD[5:0]: Non-Volatile Memory Command – Rozkaz dla pamięci nieulotnej

Te bity definiują rozkazy programowania dla pamięci FLASH, jak przedstawia poniższa tabela:

Rodzaj operacji NVMCMD Mnemonik Opis
Dwójkowo Szesnastkowo
Ogólny 0b000000 0x00 NO_OPERATION Operacja pusta
0b010000 0x10 CHIP_ERASE Kasowanie zawartości układu
Dla segmentu 0b010100 0x14 SECTION_ERASE Kasowanie segmentu
Dla słowa 0b011101 0x1D DWORD_WRITE Zapis podwójnego słowa
Na początek:  podrozdziału   strony 

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.