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
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.
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. |
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 |
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 zegarowy 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).
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.
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 |
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 |
Aby zapewnić poprawną częstotliwość kalibrowanego oscylatora wewnętrznego, wartość kalibracyjna jest automatycznie wpisywana do rejestru OSCCAL podczas resetu.
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ę.
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
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.
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:
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:
Algorytm wymazania wszystkich stron w segmencie kodu w pamięci FLASH jest następujący:
Algorytm zapisania dwóch słów do segmentu kodu jest następujący:
Algorytm wymazania segmentu konfiguracji jest następujący:
Algorytm zapisywania słowa konfiguracji jest następujący:
Bity blokowania pamięci nieulotnych mogą być odczytane z komórki obszaru danych, która je odwzorowuje.
Algorytm zapisywania bitów blokujących NVM jest następujący:
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.
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:
Więcej informacji znajdziesz w rozdziale "Interfejs programowania".
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.
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 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ę.
Te bity są zarezerwowane i przy odczycie dają wartość 0.
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 |
Te bity są zarezerwowane i przy odczycie dają wartość 0.
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 |
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.