Internet ablakok Android

Az stm32 firmware UART-on keresztül. Az STM32 nagyon egyszerű Stm32, ahol kész firmware-t szerezhet be

A flashelés legegyszerűbb és legolcsóbb módja STM32- használva rendszerbetöltő, ebben a cikkben megvizsgáljuk, hogyan kell ezt megtenni egy tábla példáján miniSTM32F103V.

Először is, értsük meg, mi az rendszerbetöltő vagy hogy hívják rakodó. Rakodó- ez csak egy program, amely a memória egy meghatározott részében van tárolva, és képes felülírni a flash mikrokontrollert. A chip gyártása során varrják fel, és semmilyen módon nem módosítható. Ahhoz, hogy a mikrokontroller beléphessen a memória ebbe a részébe, ki kell adnia a kimenetet BOOT0 húzza fel a teljesítményt és a kimenetet BOOT1 a földre. A táblán ez a két érintkező az USB-csatlakozó közelében található, és a felhúzás jumperekkel történik.
Az alábbiakban egy táblázat található, amely meghatározza, hogy a mikrokontroller melyik memóriaterületről indul vissza a visszaállítás után, attól függően BOOT0És BOOT1.


Tegyük fel, hogy jumpereket telepítettünk, most át kell vinnünk a hex fájlt a firmware-rel a rendszerbetöltőbe, át fogjuk vinni uart, ehhez szükségünk van egy átalakítóra usb uart.


Van egy ilyen átalakítóm mikroáramkör alapján FT232RL vékony hegyet használva forrasztóállomáshoz, a forrasztás nagyon egyszerű. A tömítési módszer a következő: először meg kell ragadnia egy lábat két ellentétes szögből, majd amikor a mikroáramkör rögzítve van, forrassza a többi lábat forrasztópákával vagy hajszárítóval. És az utolsó simítás, még egyszer forrasztjuk az elsőként forrasztott lábakat, hogy eltávolítsuk róluk a mechanikai feszültséget.

Csatlakoztatjuk az adaptert usb uart a számítógéphez, és attól függően, hogy melyik chipen készült CP2120 vagy FT232, telepítse a megfelelő illesztőprogramokat. Ezt követően a rendszerben COM_PORT-ként kell meghatározni.


Most csatlakoztassuk az adapterünket a kártyához, csatlakoztassuk az adapter RX kimenetét a kimenethez MCU_TxD, és a TX kimenete a kimenettel MCU_RхD. Az eladó által küldött tábla topológiája kissé eltér a felső képen láthatótól, a firmware tűi külön jelennek meg és piros nyilakkal jelölik.


Ezután le kell töltened egy programot, amellyel kapcsolatba lépünk a rendszerbetöltővel, a neve FLASH LOADER DEMONSTRATOR.


A program telepítése után válassza ki azt a com portot, amely alatt az adapterünket meghatároztuk usb uartés nyomja meg a NEXT gombot, a sebesség automatikusan meghatározásra kerül. Ha a vezérlő olvasásvédett, akkor a védelem a "Védelem eltávolítása" gomb megnyomásával eltávolítható, miközben a flash memória törlődik, és ennek megfelelően az összes benne írt adat elveszik.


Ha a vezérlő nincs védett, akkor az alábbi ablak jelenik meg, amelyben megnyomjuk a NEXT gombot.


A következő ablakban ki kell választanunk, hogy mit akarunk csinálni: olvasni/írni a mikrokontroller flashjét, törölni, letiltani az olvasást/írást, az írás érdekel bennünket, ehhez kiválasztjuk a feltölteni kívánt fájlt és nyomjuk meg KÖVETKEZŐ.

Nos, elérkeztünk az egyik legérdekesebb szakaszhoz - hogyan töltsük fel a kész firmware-t a vezérlőre, és végre újraélesztjük a vasdarabot.

Valójában az STM32 vezérlőket különféle módokon villogtathatja, de a legegyszerűbb firmware-lehetőséget fogjuk figyelembe venni - soros interfészen keresztül, a szabadalmaztatott Flash Loader Demonstrator segédprogram segítségével. Ez a segédprogram teljesen ingyenes, és letölthető a hivatalos és a .

Mint korábban említettük, a rendszerbetöltő a vezérlő rendszermemória területén van varrva. Ő teszi lehetővé, hogy a firmware-t soros interfészen keresztül flash-memóriába írjuk.

A rendszerbetöltő részletes leírása az AN2606 dokumentumban (CD00167594.pdf), az általa használt protokoll pedig az AN3155 dokumentumban (CD00264342.pdf) található. Ez azoknak szól, akik akarnak átfogó tájékoztatás, és röviden megvizsgáljuk a firmware folyamatát a rendszerbetöltőn keresztül.

Először le kell töltenie és telepítenie kell a Flash Loader Demonstrator segédprogramot a számítógépére.

Tehát a vezérlő Tx lábát a konverter Rx lábához, a vezérlő Rx lábát pedig a konverter Tx lábához kell kötni. Ezenkívül a vezérlőnek áram alatt kell lennie, és biztosítania kell a kívánt szintet a lábakon BOOT0 (44-es érintkező), BOOT1 (20-as érintkező). A rendszermemóriában található bootloader elindításához a BOOT1 lábat a "földre" kell húzni, a BOOT0-at pedig a "power"-ra (a jobb oldali lemez).

A BOOT0-hoz, BOOT1-hez érdemesebb egy felhúzást nem keményen, hanem jumperekkel csinálni, hogy könnyen válasszuk ki a boot módokat (pl. a program feltöltése után flash boot módba kapcsolva azonnal tesztelhetjük ezt a programot) .

A csatlakozási rajz az alábbiakban látható.

A paritás és az adatbitek száma már szükség szerint be van állítva, a sebesség változtatható - a vezérlő automatikusan igazodik a kiválasztott sebességhez a csere inicializálása során, ki kell választani azt a com-portot, amely az USB csatlakoztatásakor jött létre -to-COM konverter a számítógéphez (a konverterünk a virtuális com-port csatlakoztatásakor jön létre, ami teljesen utánozza a valódi hardvert). Miután mindent beállított, kattintson a "Tovább" gombra.

Arról, hogy minden rendben és a vezérlőhöz lehetett csatlakozni, a következő oldalon zöld jelzőlámpa tájékoztat. Ha a kapcsolat nem jön létre, akkor erre az oldalra egyáltalán nem léphetünk be, mondván, hogy a vezérlő nem válaszol.

A kapcsolat létrejöttekor a program automatikusan meghatározza, hogy mekkora flash memóriája van a vezérlőnek, és hogy ez a memória olvasásvédett-e. A „Védelem eltávolítása” gomb megnyomásával a védelem eltávolítható, de a flash tartalma törlődik (az oda írt korábbi firmware megsemmisül). Megnyomjuk a "Tovább" gombot.

A következő ablakban meg kell választanunk a programozandó kő típusát (bár nem derül ki, hogy miért - úgyis automatikusan meghatározzák), és megmutatják a PID-t, a flash memóriakártyát és a bootloader verziót is a kövünkhöz. Csak kattintson a "Tovább" gombra.

A következő ablakban ki kell választanunk, hogy valójában mit is akarunk csinálni a vezérlőnkkel. Itt a következő opciók lehetségesek: Törlés (törlés), Letöltés eszközre (firmware letöltése a vezérlőre), Feltöltés eszközről (firmware olvasása a vezérlőről), Flash-védelem engedélyezése / letiltása (flashmemória védelmének engedélyezése / letiltása), Szerkesztés opció bájt (módosítsa az opció bájtjait). Ennek megfelelően, ha fel akarjuk tölteni a firmware-t, válasszuk a Letöltés eszközre lehetőséget, majd kattintsunk a hárompontos négyzetre, és válasszuk ki az Explorerben a feltöltendő firmware-t tartalmazó fájlt, majd ismét kattintsunk a „Tovább” gombra.

A következő oldalon egy folyamatjelző sáv jelenik meg alul, amely a letöltési folyamat előrehaladását mutatja. Miután az összes firmware-t letöltötte a vezérlőre, ez a folyamatjelző sáv zöldre vált, és fehér betűkkel ezt fogja mondani: „A letöltési művelet sikeresen befejeződött” (a letöltési művelet sikeresen befejeződött). Ezután kattintson a "Bezárás" gombra, és zárja be a Flash Loader Demonstratort

Ennyi, most már ahhoz, hogy az elárasztott program elinduljon, csak be kell állítanunk a vezérlőt, hogy flash-ről induljon (BOOT0 = 0, BOOT1 - bármilyen szint), és újraindítsuk.

Ez az Arduino klón egy speciális rendszerbetöltőt kínál, amely lehetővé teszi a firmware feltöltését USB-n keresztül, külső összetevők, például ST-Link vagy USB-UART adapter használata nélkül.

Ma egy csupasz vezérlővel kellett dolgoznom CooCox alól és stm32duino nélkül. De itt van a probléma. Még egy egyszerű villogó sem működik ezen a rendszerbetöltőn keresztül egy izzóval.

Találjuk ki. Talán valakinek banálisnak tűnnek a számításaim. De most kezdem tanulmányozni az STM32 vezérlőket, és legalább fél napot öltem, hogy megtaláljam a problémát. Ez a cikk hirtelen lerövidíti valakinek a fejlesztési idejét.

Nincs semmi az ST-Link és más hibakeresők ellen. De az én kész készülékemben nem az lesz, hanem biztosan USB lesz. Miért nem rögzíti azonnal a firmware USB-n keresztüli frissítésének lehetőségét? Személy szerint ezt a módszert kényelmesnek tartom. főleg, hogy még mindig van egy kábelem csatlakoztatva, amelyen keresztül a tápellátás és az USB soros kap.

Lássuk, hogyan működik a rendszerbetöltő. Először is, az AVR vezérlők példáján. Miért emlékeztem rá? Az Arduinoból költöztem, és tudat alatt ugyanezt a viselkedést vártam. De az STM32-ben minden másképp alakult. Ezért szeretnék beszélni a két mikrokontroller közötti különbségről.

Így. BAN BEN AVR mikrokontrollerek Az ATMega bootloader bizonyos mennyiségű memóriát lefoglalhat a flash vége felé. Biztosítékbitek segítségével szabályozható, hogy melyik címről induljon el a program. Ha nincs rendszerbetöltő, akkor a program a 0x0000 címről indul. Ha van rendszerbetöltő, akkor más címről indul (mondjuk ATMega32-ben 0x3C00-al, ha a rendszerbetöltő mérete 2k).

Amikor a rendszerbetöltő elvégezte a munkáját, átadja a vezérlést a fő programnak a 0x0000 címről. Azok. a program mindig 0x0000 címen indul. A fordító és a linker azzal a feltételezéssel dolgozik, hogy a kód a címtér elején lesz.

Az STM32 mikrokontrollereknél minden más. Minden program 0x0800000 címen kezdődik. A bootloader semmi különös. Ez ugyanaz a program, amely ugyanarról a kiindulási címről indul. Működés közben a rendszerbetöltő tud firmware-t fogadni (USB-n vagy UART-on keresztül, USB flash meghajtóról olvasni, műholdról fogadni, altérből lekérni, bármit...) és olyan címekre írni, amelyek magasabbak, mint amilyen maga a rendszerbetöltő található. És természetesen a munka végén adja át a vezérlést a főprogramnak.

Tehát a firmware fordításakor tudnia kell, hogy a rendszerbetöltő hova írja a firmware-t, és ennek megfelelően állítsa be a címeket.

Az elmélettel ennyi. Térjünk át a gyakorlásra. Lent lépésről lépésre szóló utasítás hogyan kell csavarni USB bootloader az STM32F1xx sorozatú mikrokontrollerekhez, és talán még néhányhoz is.

Vannak azonban bizonyos korlátozások az áramkörre vonatkozóan. Itt sajnos nem vagyok erős. Az YTP-nek 1,5 ezer felhúzó ellenállásra van szüksége a PA12 porthoz (más néven USB D+). Ez lehetővé teszi a rendszerbetöltő számára megfelelő pillanatokat ideje csatlakoztatni és leválasztani az USB-ről.

Utasítás:

  • Töltse le a github.com/rogerclarkmelbourne/STM32duino-bootloader webhelyet. Az STM32F1binaries könyvtárban már van egy csomag különböző kártyákhoz lefordított rendszertöltőkből. A fájlnév végén található index jelzi, hogy a LED hova van csatlakoztatva. Abban az esetben, ha a LED a C13 érintkezőhöz csatlakozik, a generic_boot20_pc13.bin fájlt használtam.
  • Villogjunk. Igen, szüksége lesz egy USB-UART adapterre, de valószínűleg használhat hibakeresőt
  • Most a mikrokontroller készen áll az USB bootloaderen keresztüli flashelésre. De még mindig meg kell javítania magát a firmware-t. És 2 dolgot kell tenned:
    • Adja meg a linker kezdőcímét. A CooCoxban ez a projektbeállításoknál, a Link lapon, a Memóriaterületek résznél, az IROM1 kezdőcíménél történik. A rendszerbetöltő az első 8 kilobájtot foglalja el, így a firmware kezdőcíme 0x0800000 + 0x2000 = 0x08002000 lesz. Valószínűleg a Méret mezőt is csökkenteni kellene 8 ezerrel
    • Valahol a program elején, a periféria inicializálása előtt hívja meg az NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
  • A firmware-kitöltő lehetséges. Az eszközök könyvtárban keressen egy maple_upload nevű szkriptet. Csak a Windows verziót használtam - maple_upload.bat
  • Fuss így:
    "maple_upload.bat" COM20 2 1EAF:0003 "PathToFirmware.bin"

    A COM20 helyett ki kell cserélnie a portot, ahol a mikrokontroller csatlakozik.

    A töltőanyag nagyon kényes dolog, nem szereti a relatív utakat. tehát a firmware elérési útját teljes egészében meg kell adni.

    Az 1EAF:0003 VID és PID

    A 2 az AltID paraméter, amely azt jelzi, hogy a firmware-t 0x08002000-re kell feltölteni (olvasás)

Még néhány árnyalat. A firmware feltöltése előtt futtassa a rendszerbetöltőt. A legegyszerűbb módja a reset gomb megnyomása. Ezt követően a rendszerbetöltő elindul, és vár néhány másodpercet a firmware-re. Ha ezen a ponton senki sem futtatja a maple_upload-ot, a betöltő átadja az irányítást a fő firmware-nek.

Ez kellemetlenséget okozhat. Ha a mikrokontroller leáll és lefagy, akkor már nem figyel a portra. Ezért nem hallja a billentyűk sorrendjét, és nem indítja újra a rendszertöltőt. Utána csak a visszaállítás segít.

Ez minden. Remélem, hogy a cikkem rávilágít arra, hogyan működik a rendszerbetöltő STM32-ben, és hogyan tölthet fel firmware-t USB csatlakozó. Sajnos a bejutási küszöb még mindig magas, de hirtelen a cikkem segíteni fog valakinek leküzdeni.

Tegyük fel, hogy piacra dobta készülékét, és attól tart, hogy valaki másolni kezdi... Valóban, elég csatlakoztatni a programozót a készülékünkhöz, és például az ST-Link segédprogramon keresztül beolvasni a firmware-t ( célCsatlakozás).

Természetesen a mikrokontroller lábait is csak letépheti... de az ST Microelectronics fejlesztői jobb alternatívát kínálnak. Minden MK-nak van kiolvasási védelmi rendszere. Lényege rendkívül egyszerű - ha egy speciális regiszter (Option bytes) van beállítva bizonyos értéket- akkor a firmware hibakeresési és olvasási képessége le van tiltva. Ebben a módban az MK villogásának képességét is elveszíti. Természetesen ez a védelem az Option bytes regiszter értékének megváltoztatásával letiltható, de ebben az esetben a program memóriája felülírásra kerül, ami azt jelenti, hogy senki nem tudja átmásolni.

A regiszterben lévő értéket ugyanazzal az ST-Link segédprogrammal módosíthatja, célOpció bájtok…Olvassa le a védelmetENGEDÉLYEZZE.


A letiltása hasonló módon történhet. Ez nem túl kényelmes, ha sok eszköz van. A védelmet programozottan engedélyezheti.

A védelem megvalósításához kényelmes a használata szabványos könyvtár perifériák, konkrétan az stm32f10x_flash.c tartalmazza a szükséges függvényt. Maga a regiszter, valamint a flash memóriával való munka leírása a dokumentumban található. Előtte azonban ne feledjük, hogyan valósítják meg a fejlécfájlok többszöri felvételének védelmét. Olyan előfeldolgozó direktívákat használtunk, mint:

  • #define - a direktíva utasítja az előfeldolgozót, hogy cserélje ki a fájlban lévő sort, de ha az argumentum (ami a végén van) nincs megadva, akkor maga az azonosító (ami a közepén van) a rendszerben marad és ellenőrizhető más direktívákkal (azaz írhat egy feltételt, amellyel bizonyos kód végrehajtásra kerül, vagy fordítva);
  • #ifndef - a direktíva olvasható "ha nincs definiálva", de egy másik #ifdef - "ha határozottan" megfelelőbb számunkra;
  • #endif – egy feltétel végét jelző direktíva.

Hozzon létre egy azonosítót, amely azt mondja, hogy ez az összeállítás végleges. Viszlát adott string megjegyzés nélkül - az #ifdef és az #endif közé helyezett kód nem kerül végrehajtásra.

//#define RELEASE

A végső összeszereléskor csak törölje a sor megjegyzését, és villogassa az eszközt.

#ifdef RELEASE // kód itt #endif

És most a lényegre. Már kitaláltuk, hogyan kell dolgozni a mikrokontroller belső flash memóriájával. A védelmi bitek írása előtt fel kell oldania a memória hozzáférését, majd végre kell hajtania a szükséges műveleteket, és ismét le kell tiltania a hozzáférést. A következő derül ki:

#ifdef RELEASE #warning "A védelem be van kapcsolva. A hibakeresés KI" if (FLASH_GetReadOutProtectionStatus() == RESET) ( FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); ) #endif

Az stm32 mikrokontrollerek egy része támogatja az USB DFU protokollt (a listát az AN3156 alkalmazásjegyzetben találja), a firmware-t az ilyen MK-ra lehet feltölteni. normál USB, például az ST DFuSe demójával vagy a nyílt forráskódú dfu-util használatával. Ezzel a lehetőséggel minden világos és nem írom le.

Ugyanahhoz az MK-hoz (különösen a BluePill kártyához használthoz - STM32F103C8T6), amelyek meg vannak fosztva a DFU-támogatástól, így vagy úgy, szükség van egy programozóra, például az ST-Link V2 Minire.

Eszköz kijelölése:

A táblához való csatlakoztatás egyszerű:

ST-Link STM32F103C8T6 3,3 V --- 3,3 V GND --- GND SWDIO --- DIO SWCLK --- DCLK

Szüksége van az ST-Link segédprogramra is, amelyet a hivatalos st.com webhelyről tölthet le - link. Az első csatlakozáskor jó lenne frissíteni magának a programozónak a firmware-jét. Válassza ki az ST-LINK -> firmware-frissítést, ha elérhető újabb firmware, akkor valami ilyesmi lesz:

Válassza az Igen >>>> lehetőséget, a firmware frissül.

Ezután nyissa meg magát a firmware fájlt, és válassza a Target -> Connect lehetőséget. Az MK-val kapcsolatos információk a segédprogram állapota ablakában is megjelennek - ez azt jelenti, hogy a programozó megfelelően csatlakozik, és a segédprogram kapcsolatba léphet az MK-val. Példa:

Ezután teljesen meg kell tisztítania a chipet, válassza a Target -> Erase Chip lehetőséget

Ha például a pedál- és gombvezérlő poszton lévő firmware-em már fel van töltve, és frissíteni vagy újra kell tölteni, akkor a programozó nem tud olyan könnyen csatlakozni az alaplaphoz (mivel az SWD tűket használom, mint a normál GPIO-kat) . Ebben az esetben két lehetőség van:

  1. rendezze át mindkét sárga jumpert. Ebben az esetben a tábla azonnal betöltődik a belső rendszertöltőbe
  2. a Reset alatt megteheti az úgynevezett Connect-et. Számára a sorrend a következő lenne:
  • az ST-Link segédprogramban válassza a Target -> Settings lehetőséget
  • a Visszaállítás módban válassza a Hardver visszaállítása lehetőséget
  • nyomja meg és tartsa lenyomva a Reset gombot a táblán
  • kattintson az OK gombra az ST-Link segédprogramban
  • engedje el a reset gombot a táblán

PS. Ha SMT32F4Discovery fejlesztői kártyád van, abban már van programozó, és egy másik kártya flashelésére is használható. Ebben az esetben az STM32F4Discovery SWD csatlakozóját kell használnia, és el kell távolítania mindkét CN3 jumpert. Az SWD csatlakozó a következő kivezetéssel rendelkezik: