Në projektin tim po përdor mikrokontrolluesin STM32F103C8 dhe kornizën stm32duino. Ky klon Arduino ofron një ngarkues të veçantë që ju lejon të ngarkoni firmware përmes USB, pa përdorimin e komponentëve të jashtëm si ST-Link ose një përshtatës USB-UART.
Sot më duhej të punoja me një kontrollues të zhveshur nga CooCox dhe pa stm32duino. Por këtu qëndron problemi. Edhe një pulsues i thjeshtë me një llambë të derdhur përmes këtij ngarkuesi nuk funksionon.
Le ta kuptojmë. Ndoshta llogaritjet e mia do të duken banale për dikë. Por unë sapo kam filluar të studioj kontrollorët STM32 dhe vrava të paktën gjysmë dite për të gjetur një problem. Papritmas ky artikull do të zvogëlojë kohën e zhvillimit të dikujt.
Nuk kam asgjë kundër ST-Link dhe korrigjuesve të tjerë. Por në pajisjen time të përfunduar nuk do të jetë, por patjetër do të jetë USB. Pse të mos vendosni menjëherë aftësinë për të përditësuar firmuerin përmes USB? Personalisht, më duket e përshtatshme kjo metodë. veçanërisht pasi unë kam ende një kabllo të lidhur përmes së cilës furnizohen me energji dhe USB Serial.
Le të shohim se si funksionon ngarkuesi. Për të filluar, në shembullin e kontrollorëve AVR. Pse e kujtova? Unë po lëvizja nga Arduino dhe në mënyrë të pandërgjegjshme prisja të njëjtën sjellje. Por në STM32 gjithçka doli ndryshe. Prandaj, dua të flas për ndryshimin midis këtyre dy mikrokontrolluesve.
Kështu që. Në mikrokontrolluesit AVR ATMega, një sasi e caktuar memorie mund të rezervohet për ngarkuesin më afër fundit të blicit. Duke përdorur bitat e siguresave, mund të kontrolloni se nga cila adresë do të fillojë programi. Nëse nuk ka bootloader, programi fillon nga adresa 0x0000. Nëse ka një ngarkues, ai fillon nga ndonjë adresë tjetër (të themi, në ATMega32 me 0x3C00, nëse madhësia e ngarkuesit është vendosur në 2k).
Në mikrokontrolluesit STM32, gjithçka është ndryshe. Të gjitha programet fillojnë në adresën 0x0800000. Bootloader nuk është asgjë e veçantë. Ky është i njëjti program që fillon nga e njëjta adresë fillestare. Gjatë funksionimit, ngarkuesi mund të marrë firmware (nëpërmjet USB ose UART, të lexojë nga një USB flash drive, të marrë nga një satelit, ta marrë atë nga nënhapësira, çfarëdo ...) dhe ta shkruajë atë në adresa më të larta se sa ndodhet vetë ngarkuesi. Dhe, sigurisht, në fund të punës tuaj, transferoni kontrollin në programin kryesor.
Kjo është e gjitha me teorinë. Le të kalojmë në praktikë. Më poshtë është një udhëzim hap pas hapi se si të vidhosni një ngarkues USB në mikrokontrolluesit e serisë STM32F1xx, dhe ndoshta edhe në disa të tjerë.
Megjithatë, ka disa kufizime në qark. Këtu, për fat të keq, nuk jam i fortë. YTP ka nevojë për një rezistencë tërheqëse 1,5k për portën PA12 (i njohur ndryshe si USB D+). Kjo lejon që ngarkuesi të lidhet dhe shkëputet nga USB në kohën e duhur.
NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x2000);
"maple_upload.bat" COM20 2 1EAF:0003 "Rruga\To\Firmware.bin"
Në vend të COM20, duhet të zëvendësoni portin ku është i bashkangjitur mikrokontrolluesi.
Mbushësi është një gjë shumë delikate, nuk i pëlqen shtigjet relative. kështu që rruga për në firmware duhet të specifikohet plotësisht.
1EAF:0003 është VID dhe PID
2 është parametri AltID, i cili tregon se firmware duhet të ngarkohet në 0x08002000 (lexo).
Kjo mund të shkaktojë bezdi. Nëse mikrokontrolluesi fiket dhe varet, atëherë ai nuk dëgjon më portin. Prandaj, ai nuk mund të dëgjojë sekuencën e çelësit dhe të rindizet në ngarkuesin. Pastaj rivendosni vetëm për të ndihmuar.
Kjo eshte e gjitha. Shpresoj se artikulli im do të hedhë dritë mbi mënyrën se si funksionon ngarkuesi në STM32 dhe si mund të ngarkoni firmware përmes portit USB. Fatkeqësisht, pragu i hyrjes është ende i lartë, por papritmas artikulli im do të ndihmojë dikë ta kapërcejë atë.
Përgjigjet për pyetjet e bëra shpesh:
Shumica e specialistëve që zhvillojnë pajisje të bazuara në mikrokontrollues janë tashmë të njohur me temën e mbrojtjes së programeve të mikrokontrolluesve, kështu që mund të supozojmë se ky seksion nuk do t'u tregojë atyre asgjë të re. Sidoqoftë, ekziston një ushtri e madhe inxhinierësh dhe konsumatorësh të zakonshëm të pajisjeve elektronike që nuk janë të njohur me organizimin e detajuar të një mbrojtjeje të tillë, por që duan ose të kuptojnë detajet e funksionimit të një pajisjeje ekzistuese ose të krijojnë një pajisje të tillë, ky koleksion përgjigjet e pyetjeve janë të destinuara për ta.
Shumë prodhues të pajisjeve elektronike përpiqen të mbrojnë pajisjen e tyre nga kopjimi i lehtë nga një prodhues tjetër. Prodhuesit e mikrokontrolluesve i takuan në gjysmë të rrugës duke futur mbrojtjen e kopjimit të programit (mikroprogramit) të përfshirë në kujtesën e mikrokontrolluesit në funksionalitetin e produkteve të tyre. Duke përdorur këtë mbrojtje për leximin e firmuerit, prodhuesit e pajisjeve elektronike mund të mbrojnë produktin e tyre nga kopjimi i thjeshtë nga një prodhues tjetër.
Zakonisht, mbrojtja nga kopjimi vendoset gjatë programimit të mikrokontrolluesit duke vendosur një speciale bit mbrojtës ose disa bit në fjalën e konfigurimit të mikrokontrolluesit. Fizikisht, këto pjesë janë të vendosura në qeliza të veçanta memorie në çipin e mikrokontrolluesit. Ndonjëherë përdoren metoda të tjera sigurie, si mbrojtja me fjalëkalim, por parimi është i njëjtë. Për të hequr mbrojtjen, zakonisht është e nevojshme të ndryshohet vlera e këtij biti ose disa biteve, megjithëse shpesh mund të përdoren metoda të tjera të leximit të përmbajtjes së kujtesës së programit të mikrokontrolluesit. Metodat konvencionale, të tilla si një programues, nuk do të jenë në gjendje ta bëjnë këtë; kërkohen pajisje komplekse të shtrenjta, të cilat një zhvillues i zakonshëm i pajisjeve elektronike nuk i ka. Prandaj, duke pasur pajisjet, njohuritë dhe përvojën e nevojshme, ne jemi të specializuar në ofrimin e këtij lloj shërbimi.
Le të themi se keni një pajisje që e keni blerë nga një prej prodhuesve të pajisjeve elektronike dhe dëshironi të prodhoni të njëjtën pajisje, por të modifikuar. Por sigurisht, nuk keni kodet burimore të firmuerit ose firmuerit të përfunduar dhe do t'ju duhet të zhvilloni dhe korrigjoni firmuerin plotësisht nga e para. Kjo, në krahasim me kopjimin e komponentit elektronik të pajisjes (qarkut), do të duhet të shpenzojë shumë para dhe kohë. Duke përdorur shërbimet tona profesionale, ju do të kurseni para dhe kohë për zhvillimin e pajisjes. Në prani të një pajisjeje ose qarkut elektrik të saj, ne mund të rivendosim plotësisht algoritmin e funksionimit të saj dhe tekstin e mikroprogramit në gjuhën e programimit C ose Assembler.
Ne lexojmë të gjitha mikroprogramet (firmware) me kërkesë të klientit për të riparuar pajisjen e tij, ose për t'u njohur me algoritmin e mikroprogramit. E gjithë përgjegjësia e mëtejshme për shpërndarjen e paligjshme të firmuerit ose veprime të tjera me të ose me ndihmën e tij bie tërësisht tek klienti.
Kompania jonë operon në territorin e Federatës Ruse, kështu që më poshtë është një citat nga ligji. Legjislacioni i vendeve të tjera deklaron një qëndrim të ngjashëm.
Neni 1280 i Kodit Civil të Federatës Ruse. "Riprodhimi falas i programeve kompjuterike dhe bazave të të dhënave. Dekompilimi i programeve kompjuterike".
2. Personi që zotëron ligjërisht një kopje të një programi kompjuterik ka të drejtë, pa pëlqimin e titullarit të së drejtës dhe pa paguar shpërblim shtesë, të studiojë, hetojë ose testojë funksionimin e një programi të tillë për të përcaktuar idetë dhe parimet. në bazë të çdo elementi të programit kompjuterik, duke kryer veprimet e parashikuara në nënparagrafin 1 paragrafi 1 të këtij neni.
3. Personi që posedon ligjërisht një kopje të një programi kompjuterik ka të drejtë, pa pëlqimin e titullarit të së drejtës dhe pa paguar shpërblim shtesë, të riprodhojë dhe shndërrojë kodin e objektit në tekst burimor (të dekompilojë programin kompjuterik) ose të udhëzojë të tjerë. personat për të kryer këto veprime nëse janë të nevojshme për të arritur ndërveprueshmërinë e një programi kompjuterik të zhvilluar në mënyrë të pavarur nga ky person me programe të tjera që mund të ndërveprojnë me programin që dekompilohet ...
Mbrojtja shtesë me tre nivele është krijuar për të krijuar kushte për pamundësinë e leximit të mikroprogramit (firmware) duke përdorur metoda të njohura. Mund të përfshijë nga një deri në tre nivele mbrojtjeje: mbrojtje kundër hapjes së kasës, thyerje të fshehur në kasë të këmbës së përdorur nga programuesi për lexim, heqje e fshehur në çip të logjikës së kontrollit të këmbës që përdoret për lexim.
Niveli i parë është një polimer zjarrdurues rezistent ndaj acideve dhe tretësve, i cili nuk lejon hyrjen në kristal.
Niveli i dytë e bën të pamundur që programuesi të lexojë pa mjete speciale të shtrenjta.
Niveli i tretë kryen një funksion të ngjashëm me të dytin, por në të njëjtën kohë, restaurimi në çip i logjikës së kontrollit në shtresat e brendshme është praktikisht i pamundur, ose kërkon pajisje shumë të shtrenjta.
Duke qenë se në shumicën dërrmuese të rasteve, mbrojtja konvencionale e fabrikës anashkalohet lehtësisht, mbrojtja shtesë për shumë pajisje të shtrenjta dhe komplekse është një masë jashtëzakonisht e nevojshme për të parandaluar humbjet materiale që lidhen me rënien e fryteve të veprimtarisë intelektuale në duart e palëve të treta.
Në këtë rast, përpara se të instaloni mbrojtjen tonë shtesë, mund të ndezni vetëm ngarkuesin pa programin kryesor. Pasi të kemi instaluar mbrojtje shtesë, tashmë mund të programoni memorien kryesore. Për më tepër, ngarkuesi i ngarkimit për ngarkimin e programit kryesor duhet të përdorë çdo ndërfaqe tjetër përveç asaj kryesore të përdorur për programimin standard, pasi ndërfaqja kryesore do të çaktivizohet pas instalimit të mbrojtjes sonë shtesë. Zakonisht vetë ngarkuesi nuk është me interes për kopjim. Si një ngarkues, mund të përdorni tuajin ose të modifikuar nga shembujt nga prodhuesi i mikrokontrolluesit.
Ky klon Arduino ofron një ngarkues të veçantë që ju lejon të ngarkoni firmware përmes USB, pa përdorimin e komponentëve të jashtëm si ST-Link ose një përshtatës USB-UART.
Sot më duhej të punoja me një kontrollues të zhveshur nga CooCox dhe pa stm32duino. Por këtu qëndron problemi. Edhe një pulsues i thjeshtë me një llambë të derdhur përmes këtij ngarkuesi nuk funksionon.
Le ta kuptojmë. Ndoshta llogaritjet e mia do të duken banale për dikë. Por unë sapo kam filluar të studioj kontrollorët STM32 dhe vrava të paktën gjysmë dite për të gjetur një problem. Papritmas ky artikull do të zvogëlojë kohën e zhvillimit të dikujt.
Nuk kam asgjë kundër ST-Link dhe korrigjuesve të tjerë. Por në pajisjen time të përfunduar nuk do të jetë, por patjetër do të jetë USB. Pse të mos vendosni menjëherë aftësinë për të përditësuar firmuerin përmes USB? Personalisht, më duket e përshtatshme kjo metodë. veçanërisht pasi unë kam ende një kabllo të lidhur përmes së cilës furnizohen me energji dhe USB Serial.
Le të shohim se si funksionon ngarkuesi. Për të filluar, në shembullin e kontrollorëve AVR. Pse e kujtova? Unë po lëvizja nga Arduino dhe në mënyrë të pandërgjegjshme prisja të njëjtën sjellje. Por në STM32 gjithçka doli ndryshe. Prandaj, dua të flas për ndryshimin midis këtyre dy mikrokontrolluesve.
Kështu që. Në mikrokontrolluesit AVR ATMega, një sasi e caktuar memorie mund të rezervohet për ngarkuesin më afër fundit të blicit. Duke përdorur bitat e siguresave, mund të kontrolloni se nga cila adresë do të fillojë programi. Nëse nuk ka bootloader, programi fillon nga adresa 0x0000. Nëse ka një ngarkues, ai fillon nga ndonjë adresë tjetër (të themi, në ATMega32 me 0x3C00, nëse madhësia e ngarkuesit është vendosur në 2k).
Kur ngarkuesi ka kryer punën e tij, ai transferon kontrollin në programin kryesor nga adresa 0x0000. Ato. programi fillon gjithmonë në adresën 0x0000. Përpiluesi dhe lidhësi punojnë me supozimin se kodi do të vendoset në fillim të hapësirës së adresave.
Në mikrokontrolluesit STM32, gjithçka është ndryshe. Të gjitha programet fillojnë në adresën 0x0800000. Bootloader nuk është asgjë e veçantë. Ky është i njëjti program që fillon nga e njëjta adresë fillestare. Gjatë funksionimit, ngarkuesi mund të marrë firmware (nëpërmjet USB ose UART, të lexojë nga një USB flash drive, të marrë nga një satelit, ta marrë atë nga nënhapësira, çfarëdo ...) dhe ta shkruajë atë në adresa më të larta se sa ndodhet vetë ngarkuesi. Dhe, sigurisht, në fund të punës tuaj, transferoni kontrollin në programin kryesor.
Kjo është e gjitha me teorinë. Le të kalojmë në praktikë. Më poshtë është një udhëzim hap pas hapi se si të vidhosni një ngarkues USB në mikrokontrolluesit e serisë STM32F1xx, dhe ndoshta edhe në disa të tjerë.
Megjithatë, ka disa kufizime në qark. Këtu, për fat të keq, nuk jam i fortë. YTP ka nevojë për një rezistencë tërheqëse 1,5k për portën PA12 (i njohur ndryshe si USB D+). Kjo lejon që ngarkuesi të lidhet dhe shkëputet nga USB në kohën e duhur.
NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x2000);
PËRDITËSIM 17.05.2018: Nuk ka asnjë funksion NVIC_SetVectorTable() në versionin modern të STM32Cube. Në vend të kësaj, mund të rregulloni përkufizimin VECT_TAB_OFFSET në skedarin system_stm32f1xx.c (ose të ngjashme për një mikrokontrollues tjetër)
"maple_upload.bat" COM20 2 1EAF:0003 "Rruga\To\Firmware.bin"
Në vend të COM20, duhet të zëvendësoni portin ku është i bashkangjitur mikrokontrolluesi.
Mbushësi është një gjë shumë delikate, nuk i pëlqen shtigjet relative. kështu që rruga për në firmware duhet të specifikohet plotësisht.
1EAF:0003 është VID dhe PID
2 është parametri AltID, i cili tregon se firmware duhet të ngarkohet në 0x08002000 (lexo).
Kjo mund të shkaktojë bezdi. Nëse mikrokontrolluesi fiket dhe varet, atëherë ai nuk dëgjon më portin. Prandaj, ai nuk mund të dëgjojë sekuencën e çelësit dhe të rindizet në ngarkuesin. Pastaj rivendosni vetëm për të ndihmuar.
Kjo eshte e gjitha. Shpresoj se artikulli im do të hedhë dritë mbi mënyrën se si funksionon ngarkuesi në STM32 dhe si mund të ngarkoni firmware përmes portit USB. Fatkeqësisht, pragu i hyrjes është ende i lartë, por papritmas artikulli im do të ndihmojë dikë ta kapërcejë atë.
Sot ne do të mbrojmë firmware-in në stm32 nga leximi nga hakerat e lezetshëm. Për të mos tërhequr gomën, këtu është një pjesë e kodit:
#ifdef NDEBUG if (FLASH_GetReadOutProtectionStatus() == RESET) ( FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); ) #endif
Siç mund ta merrni me mend, pjesa përdor bibliotekën nga stm. Është shumë i përshtatshëm për të përdorur një pjesë të tillë të kodit - kontrolluesi vendos mbrojtjen e tij në fillimin e parë, dhe fillimi i parë është i lehtë për t'u organizuar pas firmuerit. Ja ku është liria nga tirania e siguresave!
Po, e di, për holivorin rreth "bibliotekës kundrejt aksesit të drejtpërdrejtë në regjistra". Pozicioni im këtu është ky - nëse keni nevojë për shpejtësi të lartë, ose keni mbetur shumë pak memorie, por keni nevojë për një qasje të drejtpërdrejtë në regjistra. Nëse shpejtësia nuk është e rëndësishme dhe ka shumë memorie, është më mirë të përdorni një bibliotekë - në këtë mënyrë programi shkruhet më shpejt dhe më i lexueshëm.
Për të hequr mbrojtjen, na duhet programi i shërbimeve st-link. Mund ta shkarkoni.
Ekzekutoni programin dhe zgjidhni këtë artikull, ose thjesht shtypni ctrl-b:
Në fushën "Lexo gjendjen e mbrojtjes, zgjidh jashtë". Dhe shtypni butonin Apliko:
Së bashku me bitin e mbrojtjes, e gjithë memoria fshihet gjithashtu:
Mbroni veten, ne jemi për një vendosje të sigurt.
Mënyra më e lehtë dhe më e përballueshme për të ndezur STM32- duke përdorur bootloader, në këtë artikull do të shikojmë se si ta bëjmë këtë duke përdorur shembullin e një bordi miniSTM32F103V.
Së pari, le të kuptojmë se çfarë është bootloader ose sido që të quhet ngarkues. Ngarkues- është thjesht një program që ruhet në një seksion të caktuar të memories dhe mund të mbishkruajë mikrokontrolluesin flash. Ajo është e qepur gjatë prodhimit të çipit dhe nuk mund të ndryshohet në asnjë mënyrë. Në mënyrë që mikrokontrolluesi të hyjë në këtë seksion të memories, ju duhet të dilni BOOT0 tërhiqeni në fuqi dhe nxirrni BOOT1 në tokë. Në tabelë, këto dy kunja janë të vendosura pranë lidhësit USB, dhe tërheqja kryhet duke përdorur kërcyes.
Më poshtë është një tabelë që përcakton se nga cila zonë memorie do të fillojë mikrokontrolluesi pas një rivendosjeje, në varësi të BOOT0 Dhe BOOT1.
Ne lidhim përshtatësin usb uart në kompjuter dhe në varësi të cilit çip është bërë CP2120 ose FT232, instaloni drejtuesit e duhur. Pas kësaj, duhet të përcaktohet në sistem si COM_PORT.