Pokud navrhujete USB zařízení s STM32F102 či STM32F103 budete pravděpodobně potřebovat nějaký způsob, jak do něj nahrávat nové verze programu (firmware).
Jednou z možností je použití interního bootloaderu přístupného na USART0 po nastavení vysoké úrovně na pinu BOOT0 (+ nízké úrovně na pinu BOOT1). Další možností je použití JTAG. Možnost nahrát program přímo pomocí USB mají pouze čipy z rodiny connectivity line.
V tomto článku najdete postup, jak programovat přes USB všechny čipy STM32 s podporou USB (především STM32F102 a STM32F103).
Protokol standardního bootloaderu, přístupného přes USART0, popisuje AN3155 (USART protocol used in the STM32™ bootloader). Pokud se zařízení připojené k USB chová jako virtuální COM port (VCP), může použít stejný protokol a přesně to VCP bootloader dělá. Můžeme použít stejný obslužný program pro oba typy bootloaderu. Rozdíl bude pouze v čísle portu, kterým budeme na PC komunikovat s USB zařízením.
Pro nahrání programu můžeme ve Windows použít aplikaci “Flash Loader Demo” přímo od společnosti STMicroelectronics. Pokud chcete nahrávat program z Linuxu můžete použít aplikaci stm32flash, které je věnován samostatný článek.
Použití
Po připojení napájení se vždy spustí bootloader a čeká předem nastavenou dobu (standardně 15 sec) na zahájení komunikace z PC. Není tedy potřeba zkratovat vstupní pin MCU proti zemi jako u standardního bootloaderu. Pokud není navázána komunikace, spustí se (dříve nahraná) aplikace.
Omezení
VCP bootloader zabírá cca 10 KB FLASH. Cca 2 KB představuje vlastní bootloader, 8 KB je virtuální COM port. Bootloader je uložen na začátku FLASH a aplikace musí být umístěna až za něj. Zároveň jsou použity 3 KB SRAM (2 KB buffery pro VCP, 1 KB struktury pro bootloader).
Aplikace určená pro VCP bootloader tedy musí počítat s obsazenou FLASH a
případně (podle způsobu použití) i SRAM.
Naštěstí lze linkeru jednoduše nastavit začátek použité FLASH a SRAM. V našem
případě bude FLASH začínat na adrese 0×08002800 a SRAM na adrese 0x20000C00.
Takto upravený program můžeme nahrát do MCU. Pokud nenastavíme začátek
FLASH, odmítne bootloader program uložit – přepsal by tím sám sebe.
U nejmenších čipů jako je např. STM32F103C6, který má 32 KB FLASH, obsadí bootloader téměř 1/3 FLASH. Je tedy potřeba optimalizovat využití FLASH. Pokud bude program používat (stejně jako bootloader) VCP, bude ve FLASH uložen kód pro obsluhu VCP 2x – jednou v bootloaderu a jednou v programu. Pro tento případ umožňuje VCP bootloader tzv. dynamickou vazbu, která funguje obdobně jako DLL ve Windows.
Při inicializaci knihovny pro VCP se zjistí adresy funkcí obsažené v bootloaderu a ty se pak volají z programu. Tímto způsobem se uspoří cca. 8 KB FLASH. Program ale musí mít nastaven odpovídající začátek SRAM (viz. výše), aby nepřepisoval paměť používanou VCP.
Rychlost programování
Rychlost je omezena především rychlostí zápisu do FLASH. Rychlost přenosu dat přes USB dosahuje s maximální velikostí bufferů cca 600 kbps.
V připojeném archivu najdete zdrojové soubory, projekt pro CrossWorks a dva stupidní příklady. V případě komplikací s překladem mě prosím kontaktujte.