Mikrokontrolery AVR - fusebity.
Fusebity mikrokontrolerów AVR - ATTINY 2313
Fusebity AVR - to trwałe bity konfiguracji w mikrokontrolerze Attiny 2313, podzielone zostały na cztery grpy (bajty) (LOW, HIGH, EXT, LOCK), które wpływają na jego działanie, w tym na ustawienia zegara (np. CKSEL3 ...0), sposób uruchamiania (np. BOOTSZ1/BOOTSZ0) i ochrony mikrokontrolera przed nieautoryzowanym dostępem oraz inne funkcje. Attiny 2313 posiada rozszerzoną grupę fusebitów (EF). Spróbujemy zaprzyjaźnić się z fuse bitami mikrokontrolerów. Przejdźmy teraz do konkretów.
Fusebity Attiny2313:
1. Fusebity grupy LOW (LF) - wykorzystywane są wszystkie 8 bitów. od góry w dół (bit7.. bit0)
bit 7 - CKDIV8: (Clock Divide by 8): Wewnętrzny dzielnik zegara przez 8.
0 (Włączony): Częstotliwość wybranego zegara jest dzielona przez 8 (fabryczne ustawienie, które obniża pobór prądu).1 (Wyłączony): Mikrokontroler pracuje z pełną częstotliwością źródła zegara (wymagane dla Arduino).
bit 6 – CKOUT (Clock Output): Wyprowadzenie sygnału zegarowego.
0 (Włączony): Wewnętrzny sygnał zegarowy jest przekazywany na dedykowany pin wyjściowy CLKO (funkcja przydatna do taktowania innych układów na płytce). 1 (Wyłączony): Pin działa jako zwykły port wejścia/wyjścia (I/O).
bity 5, 4 – SUT1, SUT0 (Start-up Time): Konfiguracja czasu startu.Bity te określają opóźnienie (mierzone w cyklach zegara i milisekundach) od momentu włączenia zasilania do momentu, w którym procesor zaczyna wykonywać program. Opóźnienie to daje czas na ustabilizowanie się napięcia zasilania oraz rozruch oscylatora (np. kwarcu). Najbardziej stabilne i najczęściej używane ustawienia:
SUT[1:0] = 01: 14 cykli + 4.1 ms. Szybko narastające zasilanie (Fast rising power).
SUT[1:0] = 10: 14 cykli + 65 msWolno narastające zasilanie (Slowly rising power - najbezpieczniejsze).
SUT[1:0] = 11: 14 cykli + 0 ms. Wymagane aktywne BOD (BOD enabled dla stabilnego startu).
Domyślny SUT (1..0) = 10: Czas startu (Start-up Time) ustawiony na 14 cykli zegara + 65ms.
bity 3, 2, 1, 0 – CKSEL3, CKSEL2, CKSEL1, CKSEL0 (Clock Select): Wybór źródła sygnału taktującego.Ta kombinacja 4 bitów decyduje, skąd mikrokontroler pobiera zegar. Główne tryby to:
CKSEL[3:0] = 0000 - 0001: Zewnętrzny generator sygnału zegarowego (External Clock).
CKSEL[3:0] = 0010 - 0011: Kalibrowany wewnętrzny oscylator RC 4 MHz.
CKSEL[3:0] = 0100 - 0101: Wewnętrzny, skalibrowany oscylatbror RC o częstotliwości 8 MHz (nie wymaga zewnętrznych elementów).
CKSEL[3:0] = 0110 - 0111: Oscylator z nadzorem Watchdoga 128 kHz.
CKSEL[3:0] = 0011: Wewnętrzny oscylator energooszczędny 128 kHz.
CKSEL[3:0] = 1000 - 1111: Zewnętrzny rezonator kwarcowy lub ceramiczny (Crystal Oscillator) – zakres zależy od częstotliwości i pojemności kondensatorów.
Popularne ustawienia:
CKSEL[3:0] = 0100: Wewnętrzny, skalibrowany oscylatbror RC o częstotliwości 8 MHz.ustawienie Domyślne.
CKSEL[3:0] = 0010: Wewnętrzny, skalibrowany oscylatbror RC o częstotliwości 4 MHz.
CKSEL[3:0] = 1111: Zewnętrzny rezonator kwarcowy.
Nie wszystkie ustawienia tych czterech bitów są obsługiwane. Wartości 0011, 0101, 0110 oraz 0111 są zarezerwowane i nie powinno się ich ustawiać.
Ustawienia domyślne: LF=E4: Wewnętrzny oscylator 8MHz z właczonym podziałem orzez 8. Mikrokontroler pracyje z zegarem 1MHz.
2. Fusebity grupy HIGH (HF) - wykorzystywane są wszystkie 8 bitów. Poniżej przedstawiono ich funkcje
bit 7 – DWEN (debugWIRE Enable): Włączenie interfejsu debugowania debugWIRE.
1 (Wyłączony): Interfejs debugWIRE jest nieaktywny. 0 (Włączony): Uruchamia debugowanie jednoprzewodowe za pomocą pinu RESET.
bit 6 – EESAVE (EEPROM Memory Preserved through Chip Erase): Zachowanie pamięci EEPROM podczas czyszczenia układu.
1 (Wyłączony): Operacja całkowitego kasowania pamięci Flash (Chip Erase) czyści również całą pamięć EEPROM.
0 (Włączony): Pamięć EEPROM jest chroniona i zachowuje swoje dane podczas wgrywania nowego programu. Bardzo przydatne podczas aktualizacji oprogramowania urządzeń.
bit 5 – SPIEN (Serial Program and Data Downloading Enable): Włączenie programowania szeregowego SPI.
0 (Włączony): Zezwala na programowanie mikrokontrolera przez interfejs SPI (domyślny i kluczowy stan).1 (Wyłączony): Blokuje programowanie przez SPI. Z poziomu programatora SPI ten bit jest zabezpieczony przed przypadkową zmianą na 1.
bit 4 – WDTON (Watchdog Timer Always On): Sprzętowe, stałe włączenie licznika Watchdog.
1 (Wyłączony): Licznik Watchdog jest kontrolowany programowo z poziomu kodu aplikacji.
0 (Włączony): Watchdog jest uruchamiany sprzętowo natychmiast po starcie i działa nieprzerwanie, niezależnie od instrukcji w programie. Jeśli zmienisz na 0, Watchdog będzie włączony na stałe sprzętowo od startu.
bity 3, 2, 1 – BODLEVEL2, BODLEVEL1, BODLEVEL0Te trzy bity odpowiadają za konfigurację progu napięcia dla Brown-out Detector (BOD):
BODLEVEL[2:1] = 111 – BOD wyłączony (domyślnie, stąd wartość 0xDF).
BODLEVEL[2:1] = 110 – Próg napięcia wynosi 1.8 V. (0xDD): BOD włączony, próg 1.8V (dla wersji procesora V / pracy na niskim napięciu).
BODLEVEL[2:1] = 101 – Próg napięcia wynosi 2.7 V. (0xDB): BOD włączony, próg 2.7V (zalecany dla taktowania do 10 MHz).
BODLEVEL[2:1] = 100 – Próg napięcia wynosi 4.3 V. (0xD9): BOD włączony, próg 4.3V (zalecany dla taktowania 16-20 MHz i zasilania 5V).
bit 0 – RSTDISBL (External Reset Disable): Wyłączenie zewnętrznego pinu RESET.
1 (Wyłączony): Pin 1 (PC6) działa jako standardowe wejście sygnału RESET (konfiguracja domyślna i wymagana do programowania SPI).0 (Włączony): Pin RESET zostaje przekształcony w zwykły port wejścia/wyjścia (PA2). Uwaga: Aktywacja tego bitu uniemożliwia dalsze programowanie przez SPI. Dlatego nie powinien być ustawiany.
3. Fusebity grupy Extended (EF) - Rozszerzony bajt bezpieczników (Extended Fuse Byte) w mikrokontrolerze ATTINY2313 zawiera tylko jedbą pozycję SELFPRGEN (Bit 0): Zezwolenie na samoprogramowanie (używane przy bootloaderach). Pozostałe bity (7-1) są nieaktywne (zwracają logiczną jedynkę).
bit 0 SELFPRGEN: Self Programming Enable.Zezwolenie na samoprogramowanie (używane przy bootloaderach).Domyślnie bit ten ma wartość 1 (wylączony). Czyli funkcja samozapisywania pamięci Flash przez sam procesor jest (wyłączona).
Jak działa SELFPRGEN w ATtiny2313?
Mimo że ATtiny2313 nie ma dedykowanej sprzętowo sekcji Bootloadera ani bitu BOOTRST (który automatycznie przekierowuje start procesora na inny adres), to włączenie SELFPRGEN (0) pozwala na realizację tzw. Virtual Bootloadera lub programowania aplikacji w locie.
Włączenie tego bitu odblokowuje instrukcję SPM (Store Program Memory). Dzięki temu program uruchomiony na ATtiny2313 może:
Odbierać dane np. przez wbudowany port szeregowy UART.
Samodzielnie modyfikować i nadpisywać własną pamięć Flash w trakcie działania.
Wymaga bardziej skomplikoanej procedury obsługi takiego działania.
4. Fusebity grupy LOCK (Lock bity) - bity blokujące, specjalna grupa ustawień służąca do ochrony pamięci przed nieautoryzowanym odczytem lub nadpisaniem. W układzie ATtiny2313 znaczenie mają tylko dwa najmniej znaczące bity (bity 0 i 1). Pozostałe bity (7-2) są nieaktywne i zawsze powinny mieć wartość logiczną 1.
LB2, LB1 (Bity 1 i 0) - Kontrola trybu blokady programowania szeregowego (ISP) oraz równoległego.
Tryb 1: 11 (0xFF) - Brak ochrony. Pełny dostęp do zapisu i odczytu.
Tryb 2: 10 (0xFE) - Dalsze programowanie Flash i EEPROM przez ISP jest zablokowane. Weryfikacja (odczyt) wciąż działa.
Tryb 3: 00 (0xFC) - Dalsze programowanie oraz weryfikacja (odczyt) Flash i EEPROM przez ISP są zablokowane.
Domyśnie ustawiony Tryb1.
Kluczowe zasady logiki LOCK bitów: Kolejność programowania: Lock bity należy programować na samym końcu, po wgraniu programu i ustawieniu fusebitów.
Bezpieczeństwo: Jeśli Twoim celem jest ochrona kodu przed skopiowaniem przez konkurencję, ustaw bity LB1 i LB2 na 0.
Odblokowanie: Jeśli zablokujesz procesor (00), programator nie pokaże zawartości pamięci. Aby wgrać nowy program, musisz wybrać funkcję „Chip Erase” w oprogramowaniu takim jak AVRDUDE lub Microchip Studio.
Domyślne dla ATTINY 2313 ustawienia fuse bitów: LF - 64, HF - D9, EF - FF, LOCK - FF.
LFUSE = 0xFF (Standard dla Arduino Uno / Nano):Wyłączony dzielnik przez 8 (CKDIV8 = 1).Wybrane źródło to zewnętrzny kwarc wysokiej częstotliwości (np. 16 MHz).Ustawiony maksymalny czas startu dla pełnej stabilizacji kwarcu.
LFUSE = 0xE4 (Praca bez zewnętrznego kwarcu – 8 MHz):Wyłączony dzielnik przez 8 (CKDIV8 = 1).Wybrane źródło to wewnętrzny oscylator RC 8 MHz. Układ działa autonomicznie, bez żadnych zewnętrznych elementów taktujących.
LFUSE = 0x64 (Ustawienie fabryczne nowej ATTINY 2313 – 1 MHz):Włączony dzielnik przez 8 (CKDIV8 = 0).Wybrane źródło to wewnętrzny oscylator RC 8 MHz. Z powodu dzielnika układ startuje z częstotliwością 1 MHz.
- w praktyce (Wartości HEX)0xDE (Standard dla Arduino Uno / Nano):Włączone programowanie SPI, aktywny pin RESET.Włączona funkcja EESAVE (ochrona EEPROM przed skasowaniem).