Zrozumieć zabezpieczenia. Funkcje bitów blokujących i bezpieczników.

Jaka jest różnica pomiędzy tzw. lock bit (bit zamykający, blokujący dostęp) a fuse (bezpiecznikiem)? Jakie są konsekwencje ustawiania, czy też kasowania wyżej wymienionych? Czym różnią się między sobą i czy ich ustawienia są odwracalne? W tym artykule postaram się odpowiedzieć na tak zadane pytania. Myślę, że ta wiedza bardzo przyda się zwłaszcza stawiającym pierwsze kroki w dziedzinie mikrokontrolerów i posłuży lepszemu zrozumieniu podstawowych zasad programowania.

Nowoczesne mikrokontrolery mają wiele opcji, które są wybierane w zależności od konkretnej aplikacji. Umożliwia to producentom wytwarzanie jednego produktu o nazwie np. ATMega103 mającego możliwość taktowania zarówno przez generator RC, jak kwarcowy. Jest to sytuacja diametralnie inna od tej spotykanej w przeszłości, gdy dla przykładu niektóre mikrokontrolery wyposażone były w układ watchdog ustawiany albo programowo, albo działający bez względu na to, czy był potrzebny, czy też nie i wręcz przeszkadzał w poprawnym funkcjonowaniu aplikacji. Czasami takie mikrokontrolery różniły się tylko obecnością lub brakiem pewnej literki w nazwie wyrobu i nie mając świadomości tego, co się kupuje, można było zapłacić za rzecz, której zupełnie nie dawało się użyć. Między innymi i w mojej szufladzie znajduje się kilka takich układów pewnego bardzo znanego producenta. Możliwość konfiguracji mikrokontrolera jest więc wygodna zarówno dla producenta, jak i dla potencjalnego klienta.
W niektórych modelach pamięci, czy mikrokontrolerów, zasadnicza różnica pomiędzy lock bit a fuse bit często polega na zupełnie odmiennym wykonaniu. Na przykład bezpieczniki (fuse) są wykonywane jako mikropołączenia w strukturze układu scalonego, albo też do struktury układu scalonego i fizycznie uszkadzane przy pomocy prądu elektrycznego w czasie programowania. Takie przepalone połączenie już nie daje się odtworzyć – układ nie nadaje się do ponownej zmiany danej nastawy, czy też zmiany zawartości pamięci programu. Inaczej jest z bitami blokującymi (lock bits). Ich ustawianie, czy też kasowanie, przypomina włączanie i wyłączanie opcji w programie – aplikacji. Wykonane są one najczęściej w technologii EEPROM, możliwa jest więc modyfikacja ich stanu. A jak to jest w przypadku mikrokontrolerów z rodziny AVR?

Mikrokontrolery AVR

Każdy mikrokontroler z tej rodziny ma dwie grupy ustawianych bitów. Są to bity blokujące i bezpieczniki. Nazwa bezpiecznik jest w przypadku AVR bardzo myląca, ponieważ przepalenie bezpiecznika jest odwracalne. Daje się nim manipulować podobnie jak nastawami bitów blokujących.
W momencie zakupu układu od producenta, zarówno bezpieczniki jak i bity blokujące znajdują się na poziomie logicznym wysokim (1). Programowanie ich polega na zmianie poziomu z wysokiego na niski (0). Zarówno jedna jak i druga grupa opcji, nie jest umieszczona w normalnie dostępnym obszarze pamięci EEPROM, czy też FLASH. Mogą być jednak one ustawiane z poziomu aplikacji, za wyjątkiem bitów odpowiadających za włączenie opcji tzw. Boot Loader w mikroprocesorach, gdzie możliwe jest „samoprogramowanie”. Jednak dla praktycznych zastosowań największe znaczenie będzie miało to, że nastawy bitów blokujących i bezpieczników mogą być zmieniane w czasie programowania, przy pomocy programatora szeregowego albo równoległego. Ten drugi umożliwia dostęp do większej liczby nastaw.

Bity blokujące „lock bits”

Wszystkie mikrokontrolery AVR mają dwa bity blokujące o nazwie LB1 i LB2. Zmiana poziomu tych bitów powoduje zabezpieczenie zawartości pamięci EEPROM i FLASH. Zabezpieczenie podzielone jest na trzy poziomy (Mode 1..3), gdzie poziom 1 wyłącza zabezpieczenia, natomiast poziom 3 oferuje maksymalny jego stopień dla danego modelu. Możliwa jest zmiana poziomu zabezpieczenia poprzez zmianę stanu lock bits.  I tu jedna bardzo ważna uwaga: w obrębie rodziny mikrokontrolerów AVR możliwa jest wyłącznie zmiana poziomu bitu zabezpieczenia z wysokiego na niski, nigdy zaś odwrotnie! Przejście na niższy poziom zabezpieczenia zawsze wiąże się ze skasowanie pamięci programu (FLASH) układu. W ten nieskomplikowany sposób jest możliwe zwiększanie poziomu zabezpieczeń, nigdy zaś zmniejszanie -  wiąże się to bowiem z utratą danych.
Dodatkowo mikrokontrolery AVR mające możliwość samoprogramowania, posiadają jeszcze cztery dodatkowe bity zabezpieczeń BLB01, BLB02, BLB11 i BLB12. Ich ustawienie / kasowanie wiąże się z pewnymi restrykcjami dla instrukcji LPM (Load Program Memory) i SPM (Store Program Memory), jednak w wypadku specyficznych nastaw tych bitów, proszę odnieść się do konkretnych kart katalogowych danego modelu mikrokontrolera.

Tabela 1. Możliwe kombinacje bitów blokujących

Poziom bitu blokującego

Rodzaj włączonego zabezpieczenia

Tryb (mode)

LB1

LB2

1
2
3

1
0
0

1
1
0

Niezaprogramowane, brak włączonego zabezpieczenia.
Zapis programu zabroniony, odczyt jest dozwolony.
Zapis i odczyt programu są zabronione.

 

Bezpieczniki „fuses”

Bity blokujące dostępne są we wszystkich trybach programowania. W przypadku bezpieczników, jest inaczej. Większość z nich jest dostępna we wszystkich trybach programowania, natomiast niektóre z nich tylko w wybranych. Również inaczej niż w przypadku lock bits, stan bezpieczników nie ulega zmianie po instrukcji kasowania układu. Aby zmienić stan bezpiecznika wymagane jest zaprogramowanie logicznego stanu wysokiego we właściwej dla lokalizacji pamięci. Taka zmiana poziomu bezpiecznika będzie odczuwalna dopiero po wykonaniu przez mikrokontroler wewnętrznej procedury obsługi sygnału reset generowanego po włączeniu zasilania (power on reset). Bardzo ważną informacją jest, że po ustawieniu bitów LB w trybie 2, lub 3, nie jest możliwa zmiana stanu żadnego z bezpieczników. Zabroniony jest bowiem zapis do pamięci mikrokontrolera.
Tabela 2 zawiera informacje o tym jakie bezpieczniki i bity blokujące są dostępne w różnych mikrokontrolerach z rodziny AVR. Określa również w jakim trybie programowania możliwa jest zmiana ich nastaw. Tabela 3 podaje natomiast, jaka jest rola ustawień poszczególnych bezpieczników.


Tabela 2. Dostępność bezpieczników w trybach programowania

Mikrokontroler

RCEN

SPIEN

RSTDISBL

FSTRT

BODEN

BODLEVEL

CKSEL

n..0

EESAVE

SUT

n..0

BOOTRST

BOOTSZ

n..0

INTCAP

AT90S1200

R

R

-

-

-

-

-

-

-

-

-

-

AT90S2313

-

R

-

R

-

-

-

-

-

-

-

-

AT90S/LS2323

-

R

-

R/S

-

-

-

-

-

-

-

-

AT90S/LS2343

-

R

-

-

-

-

-

-

-

-

-

-

AT90S/LS2333

R/S

R

-

-

R/S

R/S

R/S

-

-

-

-

-

AT90S/LS4433

-

R

-

-

R/S

R/S

R/S

-

-

-

-

-

AT90S8515

-

R

-

R

-

-

-

-

-

-

-

-

AT90S/LS8535

-

R

-

R/S

-

-

-

-

-

-

-

-

ATtiny11

-

-

H/S

H/S

-

-

-

-

-

-

-

-

ATtiny12

-

H/S1

H/S2

-

H/S

H/S

H/S

-

-

-

-

-

ATtiny15

-

H/S1

H/S2

-

H/S

H/S

H/S

-

-

-

-

-

ATtiny28

-

-

-

-

-

-

-

-

-

-

-

R

ATmega103

-

R

-

-

-

-

-

R/S

R/S

-

-

-

ATmega161

-

R

-

-

P/S

P/S

P/S

-

-

R/S

-

-

ATmega163

-

R

-

-

P/S

P/S

P/S

-

-

R/S

R/S

-

R – programator równoległy, S – programator szeregowy (również programowanie in-system), H – programowanie w trybie High Voltage Serial Programming (HVSP)
1. Bezpiecznik jest dostępny w trybie programowania przez SPI, jednak jego wyzerowanie spowoduje, że dostęp w trybie programowania przez SPI nie będzie możliwy.
2. Bezpiecznik jest dostępny w trybie programowania przez SPI, jednak jego ustawienie spowoduje, że dostęp w trybie programowania przez SPI nie będzie możliwy.

 

Tabela 3. Opis funkcji bitów bezpieczników

Nazwa bezpiecznika

Opis funkcji

RCEN

RC Oscillator Enable

Poprzez ustawienie tego bezpiecznika, wewnętrzny oscylator RC może być włączony jako główny zegar mikrokontrolera. Niektóre AVR są dostarczane z tym bezpiecznikiem ustawionym, inne nie. Dlatego też należy zawsze sprawdzać domyślny stan tego bezpiecznika w odpowiedniej karcie katalogowej albo też ustawiać go tuż po zakupie.

SPIEN

Serial Programming Interface Enable

Ustawienie bezpiecznika umożliwia programowanie układu poprzez interfejs SPI. Jeśli bezpiecznik jest skasowany, interfejs SPI nie funkcjonuje i nie jest możliwe programowanie układu „in-system”

RSTDISBL

Reset Disable

Ustawienie powoduje zmianę funkcji wyprowadzenia RESET. W niektórych AVR wyprowadzenie RESET zmieniane jest w typową linię wejścia / wyjścia odpowiedniego portu, w innych w linię tylko wyjściową. Szczegóły zawsze podane są w odpowiedniej karcie katalogowej.

FSTRT

Fast Start

Bezpiecznik kontroluje czas, po jakim startuje CPU mikrokontrolera od momentu startu oscylatora. Jeśli używany jest rezonator ceramiczny lub szybko uruchamiany zewnętrzny generator zegarowy, można ustawić ten bit. Umożliwi to CPU szybsze uruchomienie programu.

BODEN

Brown-Out Detection Enable

Poprzez ustawienie, zezwala się na pracę wewnętrznego układu kontroli napięcia zasilania. Jeśli napięcie nie mieści się w granicach określonych jako właściwe dla poprawnej pracy układu, generowany jest wewnętrzny sygnał reset.

BODLEVEL

Brown-Out Detection Level

Bezpiecznik ten zmienia napięcie zadziałania układu kontroli napięcia zasilania oraz czas startu CPU. Oba te parametry są zależne od typu układu – szczegółów dotyczących działania należy szukać w danych katalogowych konkretnego mikrokontrolera.

CKSEL n..0

Clock Select

Stan bezpieczników CKSEL kontroluje ustawienia rodzaju oscylatora, a w niektórych AVR również czas startu CPU. Rolę tych bezpieczników dla danego modelu mikrokontrolera opisuje jego karta katalogowa.

EESAVE

EEprom Save

Ustawienie bezpiecznika powoduje, że zawartość pamięci EEPROM nie jest kasowana w momencie programowania układu. W przypadku ustawienia tego bezpiecznika, aby skasować EEPROM konieczne jest jego wyzerowanie.

SUT n..0

Start-Up Time

Stan bezpiecznika umożliwia nastawę opóźnienia pomiędzy zanikiem zewnętrznego sygnału reset, a załączeniem CPU mikrokontrolera. Ten czas może być wybrany w zależności np. od rodzaju użytego generatora zegarowego. Jeśli dla przykładu używany jest zewnętrzny generator zegarowy, który uruchamia się bardzo szybko – czas ten może być bardzo krótki. Gdy natomiast stosuje się rezonator kwarcowy – wymagany jest dłuższy czas na stabilizację generowanej częstotliwości.

BOOTRST

Boot Reset

Ustawienie bezpiecznika decyduje, pod który adres wykonana skok CPU mikrokontrolera po sygnale reset – czy wykona skok do fragmentu kodu umieszczonego w tablicy wektorów przerwań jako wektor 0, czy też do umieszczonego w obszarze tak zwanego Boot Loader’a. Stan logiczny wysoki powoduje umieszczenie wektora przerwania po reset w obszarze sekcji Boot Loader’a: będzie on wskazywał adres zależny od stanu BOOTSZ.
Niektóre z mikrokontrolerów AVR mają możliwość umieszczenia wektora przerwania po reset zarówno w obszarze Boot Loader’a jak również pamięci aplikacji. Lokalizacja tego wektora zależna jest od stanu bitu IVSEL w rejestrze GICR.

BOOTSZ n..0

Boot Size

Stan bezpieczników określa rozmiar i adres startowy bloku Boot Loader’a. Sekcja Boot jest dostępna tylko i wyłącznie w mikrokontrolerach AVR, które mają w swojej liście rozkazów instrukcję SPM.

INTCAP

Internal Capacitors

Gdy INTCAP jest ustawiony, nie jest konieczne stosowanie zewnętrznych kondensatorów dołączanych do rezonatora kwarcowego. Obniża to koszt systemu i upraszcza płytkę drukowaną.

 

Na podstawie:
http://www.avrfreaks.net/
http://www.atmel.com/


Jacek Bogusz
j.bogusz@easy-soft.net.pl

http://www.tomaszbogusz.blox.pl/

Dodaj nowy komentarz

Zawartość pola nie będzie udostępniana publicznie.