Mikrokontroléry AVR mají schopnost samoprogramování, to znamená, že mohou nezávisle měnit obsah své flash paměti. V praxi to znamená, že napsáním speciálního bootloader programu pro mikrokontrolér (tzv. bootloader) můžeme aktualizovat jeho firmware bez použití programátoru. Navíc rozhraní, přes které bude programový kód přenášen do mikrokontroléru, může být zcela libovolné. Obvykle se pro tyto účely používá jedno z hardwarově podporovaných rozhraní, například SPI, I2C nebo RS-232. Existují však také bootloadery založené na softwarové implementaci takových rozhraní, jako je USB a 1-Wire.

Připravených bootloaderů pro mikrokontroléry AVR je nespočet a ve většině případů je můžeme snadno použít v našich zařízeních, aniž bychom se obtěžovali psaním vlastního bootloaderu. V tomto článku se podíváme na jeden z těchto bootloaderů, který vyvíjí a volně distribuuje Chip45, a přijdeme na to, jak jej používat.

Programová paměť mikrokontrolérů AVR je rozdělena do dvou sekcí – aplikační programová sekce a bootovací sekce. Bootloader (neboli bootloader) je jednoduše program, který je uložen ve stejnojmenné sekci a dokáže zapisovat/číst obě části paměti mikrokontroléru. Tato funkce umožňuje zavaděči upravovat a dokonce mazat sám sebe! Tedy spáchat jakousi programovou sebevraždu.

Abychom mohli využít pohodlí bootloaderu, musíme jej zapsat do paměti mikrokontroléru pomocí programátoru. Oblast paměti, do které bude bootloader zapsán, je specifikována v konfiguračním souboru linkeru před kompilací zdrojového kódu bootloaderu. Toto téma přesahuje rámec tohoto článku a nebudeme se jím zde zabývat. Pro nás je důležitá další věc: pokud máme hotový soubor hex zavaděče, nemusíme o ničem přemýšlet, stačí jej flashnout do mikrokontroléru stejným způsobem jako nejběžnější program!

Velikost sekce bootloaderu a sekce aplikačního programu se nastavuje pomocí konfiguračních bitů BOOTSZ1, BOOTSZ0. U mikrokontroléru ATmega16 budou velikosti paměťových sekcí v závislosti na hodnotách konfiguračních bitů vypadat takto.

Размер загрузочной области mega16

Maximální možná velikost bootovací sekce pro ATmega16 je 1024 16bitových slov, což odpovídá 2 KB jeho flash paměti. Pokud není bootloader použit, aplikační program může zabírat celou dostupnou flash paměť mikrokontroléru.

Význam konfiguračních bitů závisí na požadavcích konkrétního bootloaderu. Například zavaděč Chip45 vyžaduje zaváděcí část 1024 slov (2 kB), ale lze napsat kompaktnější zavaděč. Vše závisí na funkčnosti, která je v něm obsažena, a na vašich dovednostech kódování.

ČTĚTE VÍCE
Je možné jíst okouny ryby?

Řekněme, že jsme do mikrokontroléru zapsali bootloader, jak jej můžeme použít? Aby bootloader fungoval, musí být aktivován (spuštěn). To lze provést dvěma způsoby:

— přesunout vektor resetování na začátek zaváděcí části,
— přesunout se na začátek nakládacího úseku.

Implementace první metody vyžaduje nastavení konfiguračního bitu BOOTRST. Všichni víme, že po připojení napájení nebo události reset začne mikrokontrolér provádět svůj program z nulové adresy paměti programu, tedy z vektoru reset. Na této adrese je zpravidla umístěn příkaz sestavení pro bezpodmínečný skok do aplikačního programu. Nastavení bitu BOOTRST přesune vektor resetování mikrokontroléru AVR na začátek jeho bootovací sekce (například na adresu 0x1C00, pokud se náš mikrokontrolér ATmega16 a oba bity BOOTSZ1, BOOTSZ0 rovnají nule), při startu se okamžitě spustí spuštění kódu bootloaderu.

Расположение вектора сброса в зависимости от fuse бита

Implementace druhé metody znamená, že mikrokontrolér obsahuje jak bootloader, tak uživatelský program, který přejde do bootovací oblasti, když dojde k události.

Chcete-li implementovat takový přechod, musíte: vytvořit ukazatel funkce, přiřadit mu adresu začátku zaváděcí části a zavolat funkci pomocí tohoto ukazatele. Například toto: