Standalone SWD programator
|
Procesory STM32F a nakonec ARM Cortex-Mx obecně používají pro ladění a zavádění programu do flash rozhraní SWD, které nahrazuje dřívější JTAG. Bylo by sice možné použít interní bootloader, ale v tomto případě je nutné propojit BOOT pin na plus a pak propojku odstranit, což zdržuje. A tak abych babám ve výrobě usnadnil práci, vyrobil jsem jednoduchý standalone programátor, který se umí bavit s cílovým procesorem přes SWD.
Funguje to tak, že se do RAM cílového procesoru STM32F0 po SWD nahraje stub, tedy program pro zápis do flash a zároveň data pro zápis. Pak se stub spustí, čímž dojde k přepisu z RAM do FLASH. Do FLASH totiž nejde zapisovat přímo, zapisuje se po 16.bit slovech a po každém zápisu je nutné počkat, až se provede. Takhle řečeno to vypadá jednoduše, ono to jednoduché také je, ale SWD je opravdu oříšek. Má sice jen dva dráty, komunikace je dobře zdokumentovaná, ale donutit to ke spolupráci s ARM není tak snadné. Dokumentace ARM je asi dělána nějak automaticky, obsahuje neuvěřitelné množství informací, ale čert aby poznal, co je podstatné a co ne. Lecos by šlo vykoumat ze zdrojáků k openocd, blackmagic a jiného, ale i zde tomu poněkud brání velká komplikovanost tohoto software, které se snaží postihnout všechny možnosti, takže to vlastní jádro se v tom ztratí. No a to jádro jsem nakonec vyhrabal z hloubi Webu někde na lpcware.com (viz swd.c), dopatlal k tomu kousky kódu z STM std. periph. library a nakonec se povedlo i zamknout procesor proti nechtěnému přepisu.
To, že je použit jako zdrojový procesor LPC11U24 má jediný důvod - byl v šuplíku. Tedy druhým důvodem bylo, po pravdě řečeno i to, že umožňuje změnit velice jednoduše firmware po USB, ale nic nebrání použít jakýkoli jiný procesor, třeba i 8-bit. Pak je ovšem nutné předělat ty low-level rutiny, které cvičí s piny, což by nemělo být tak hrozné. Stejně tak je možné upravit funkce pro zápis do flash pro jiný procesor. Zde byl jako cílový procesor použit STM32F051.
Za zmínku stojí soubor bindata.S. Není to jediný kousek kódu v assembleru, jsou v něm i rutiny pro zápis do flash (adresář stub) a zápis do option (adresář optb), to je však jen kvůli tomu, že jsem to takhle našel hotové a funkční v blackmagic. Tohle je hezký trik, jak zahrnout do zdrojového kódu i binárky pro cílovou platformu aniž by bylo nutné je jakkoli upravovat.
Pokud možno co nejjednodušší. USB je použito pro změnu firmware zdrojového procesoru, zároveň je pak použito pro napájení jak zdrojové, tak cílové platformy. Doporučuji pak použít nějakou USB nabíječku, mít to připojené k PC v režimu programování cíle není dobré - USB se snaží vyčíslovat a moc mu to nejde. Stejně to bylo vymyšleno jen proto, aby ve výrobě nemuseli mít zapnuté PC.
Pozn. Pin PA18 (označený jako RxD) je použit jako SWCLK pro cílový procesor, PA19 (TxD) jako SWDIO.
A protože je to umístěno v prostředí, kde je potřeba už trochu ochrana, najdeme zde omezovač proudu (40 mA, stačí i pro cílový procesor) a ochranné odpory na SWCLK i SWDIO. A protože je to kompaktní, je to zároveň i svižné - nahrání 8KB firmware včetně verifikace proběhne za sekundu. Spínačem SW1 pustíme šťávu do zdrojového i cílového systému, což indikuje LED D2, systém chvíli počká až se poměry ustálí, LED D1 pak indikuje průběh a dokončení operace. Pokud je cílový procesor už od počátku chráněn proti zápisu, programování neproběhne ale ochrana se zruší a D1 10x blikne. Pak už je možné postup opakovat (vypnout a znovu zapnout SW1), cílový procesor se normálně naprogramuje a prvních 8KB flash se zamkne proti zápisu. Bylo by možné zamykat ho i proti čtení, viz komentář ve funkci writeProtection(), soubor flash.c.
Asi to moc lidí nevyužije i když standalone programovátka na různé ty Atmely byl oblíbený námět konstrukcí. Ale věřím, že pro seznámení s principem komunikace SWD je to celkem slušný základ. Snad právě proto, že jsem vyházel vše zbytečné a zbylo jen nezbytné jádro, zůstalo to poměrně přehledné, takže je to otevřeno pro lidovou tvořivost.
Archiv boot.zip se zdrojáky je možné stáhnout zde.