Stm32 ohjelmointi swd:n kautta. Black Magic Blue -pilleri (valmistamme Black Magic Probe -ohjelmoijan STM32F103-pohjaisesta moduulista). STM32-laiteohjelmisto USB-Uart-sovittimella Windowsille

Laiteohjelmiston lataaminen mikrokontrollereihin STM32 ohjelmoijaa käytetään ST-Link, joka voidaan liittää ohjelmoitavaan mikro-ohjaimeen rajapinnan kautta S.W.D.. Lisäksi käyttämällä samaa ST-Link Ja S.W.D. Voit suorittaa laiteohjelmiston vaiheittaisen virheenkorjauksen kehitysympäristöstä keskeytyskohtien ( keskeytyskohta). Samanaikaisesti asennettujen määrä keskeytyspisteitä rajoitettu muutamaan kappaleeseen (en muista tarkalleen kuinka monta, esimerkiksi 5 kappaletta), mutta tämä on enemmän kuin tarpeeksi laiteohjelmiston virheenkorjaukseen.

Tuotemerkkien debug boards alkaen ST Laitteessa on sekä kohdemikro-ohjain että ohjelmoija ST-Link, joka on myös tehty mikro-ohjaimella STM32. Muuten, erittäin kätevä ratkaisu. Lisäksi debug boardiin sisäänrakennetulla ohjelmoijalla voidaan myös flash-muistia käyttää mitä tahansa ulkoista mikro-ohjainta. STM32. Näitä tarkoituksia varten laudalla on erityinen kampa ja jumpperit, joilla voit poistaa käyttöliittymän käytöstä S.W.D. levylle juotetusta mikro-ohjaimesta. Minulla on lauta käytössäni stm32f4discovery, johon mikro-ohjain on asennettu STM32F407VG, ja käytän tätä levyä ohjelmoijana ST-Link:

Luonnollisesti voit ostaa erillisen ohjelmoijan ST-Link. Tässä on useita vaihtoehtoja. Ensimmäinen on merkkituote ST-Link, joka tulee galvaanisella eristyksellä ja ilman. Nämä ohjelmoijat näyttävät tältä:

Toinen vaihtoehto on kiinalainen ST-Link flash-asemassa:

Vaihtoehto ei myöskään ole periaatteessa huono, mutta sinun on pidettävä mielessä, että sen sisällä ei ole käyttöliittymäsuojausta USB ja kohdelevy, joten jos piirin ja tietokoneen maadoitukset eivät ole kohdakkain, virheenkorjattavassa piirissä on oikosulku ja niin edelleen, on suuri mahdollisuus polttaa ohjelmoija yhdessä USB portti tietokoneessa. Joten kun työskentelet tämän ohjelmoijan kanssa, sinun on oltava erittäin varovainen!

ST-Link ohjelmoijan liittäminen STM32-mikro-ohjaimeen

Käyttöliittymä S.W.D., jonka kautta ohjelmoija on kytketty mikro-ohjaimeen, siinä on 2 riviä:

  • SWDIO
  • SWCLK

Tämä on vähimmäisvaatimus laiteohjelmiston onnistuneelle lataamiselle upouuteen mikro-ohjaimeen tai virheenkorjaus- ja kehitysympäristöön (esimerkiksi IAR:stä). Kaikissa mikro-ohjaimissa STM32 Ohjelmointinastat on yhdistetty seuraaviin I/O-portteihin:

  • SWDIO - PA13
  • SWCLK - PA14

johtopäätöksiä PA13 Ja PA14 voidaan käyttää yleisimpinä I/O-portteina, mutta tässä tapauksessa kyky korjata laiteohjelmistoa kehitysympäristöstä menetetään. Lisäksi, jos muutat PIN-oletusasetuksia MK:hen ladatusta laiteohjelmistosta PA13 Ja PA14, uuden laiteohjelmiston lataaminen muuttuu vaikeaksi, joudut käyttämään toista ohjelmoijan ja MK-linjan yhdistävää johtoa RESET. Tässä tapauksessa ennen laiteohjelmiston lataamista, ST-Link nollaa mikro-ohjaimen ja siirtää siten nastat PA13 Ja PA14 oletustilaan, ja sen jälkeen se ladataan MK:hen uusi laiteohjelmisto. Mikro-ohjaimen nollaustoiminnon käyttöönotto ennen laiteohjelmiston lataamista IAR-e asetusosiossa ST-Link-sinun on valittava vaihtoehto "Reset Pin".

STM32:ssa on erittäin kätevä käyttöliittymä virheenkorjaukseen ja MK:n vilkkumiseen - Serial Wire Debug, lyhennetty S.W.D.. Sen mukavuus piilee siinä, että virheenkorjausta varten sinun on kytkettävä vain kaksi tietolähtöä ja kaksi virtanastaa. Kytkentäkaavio on seuraava.

Kun nastat on liitetty, sinun on otettava virheenkorjaus käyttöön S.W.D. ohjelmointiympäristössä, sisään KEIL se on tehty näin.


Myös S.W.D. on johtopäätös S.W.O., sitä ei tarvitse kytkeä, mutta jos liität sen (vetämällä sen virtaan 10K:n kautta), voit näyttää viestejä reaaliajassa. Toisin sanoen koodin suorittamisen aikana MK voi lähettää meille virheenkorjaustietoja, esimerkiksi mikä koodin osa on parhaillaan suoritettava, niin päätelaitteen kanssa käy ilmi jotain usart.
Salli virheenkorjaustietojen lähettäminen lähdössä S.W.O. Voit käyttää jäljitysvälilehteä: sallimalla jäljityksen, osoittamalla taajuuden, jolla MK ja portti toimivat.


Alla on esimerkki, jonka avulla voit näyttää viestejä käyttämällä S.W.O., erikoisikkunassa itse ikkuna voidaan avata seuraavasti: view->Serial windows->debug (printf) viewer.
#include "stm32f10x.h" #include #define ITM_Port8(n) (*((haihtuva allekirjoittamaton merkki *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((haihtuva allekirjoittamaton lyhyt*)(0xE0000000+4*n))) #define ITM_Port32(n) (*((haihtuva allekirjoittamaton pitkä *)(0xE0000000+4*n))) #define DEMCR (*((haihtuva allekirjoittamaton pitkä *)(0xE000EDFC))) #define TRCENA 0x01000000 struct __FILE ( int handle; * Lisää tähän mitä tarvitset */ ); FILE __stdout; TIEDOSTO __stdin; int fputc(int ch, FILE *f) ( if (DEMCR & TRCENA) ( while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; ) return(ch); ) int main(void) ( while (1) ( printf("Hei stm32 printf:stä!\r\n"); ) )
Tältä se näyttää, voit suurentaa kuvaa klikkaamalla sitä.

No, ja mikä tärkeintä, miksi tämä artikkeli oli tarkoitettu, käytän kiinaa debuggerina jlink, sen liittimen nasta on vakio ja löytyy helposti Internetistä, mutta tämä ei estä minua jatkuvasti unohtamasta, mitkä nastat mihin liittää, joten jätän tähän kuvan siitä, mitkä nastat liittimessä ovat jlik tarkoitettu S.W.D..

Kotitekoinen ja edullinen vaihtoehto STMicroelectronicsin myydylle ohjelmoijalle. Se on ote ja kokoelma useista Internetistä löytyvistä artikkeleista ja kaavioista. Toteutus mahdollisimman pienessä muodossa.

Jokaisella sulautettujen ohjelmistojen kehittäjällä on oltava ohjelmoija käyttämilleen laitteille. Minun tapauksessani STMicroelectronicsin mikro-ohjaimet sekä Milandr (venäläiset ARM-ytimeen perustuvat prosessorit).

Tämän laitteen ostaminen on erittäin kallista, etenkin verrattuna komponenttien - piirilevyn ja radiokomponenttien - hintaan.

Ohjelmoija päätettiin tehdä itse. Lähtökohtana olivat eri mikro-ohjainten debug-korttien piirikaaviot, ja tuloksena oli täysin toimiva debug-moduuli ei vain stm32:lle, vaan myös stm8:lle ja jopa Milanda-siruille (testattu toistaiseksi vain K1986BE92:lla, mutta uskon, että myös muut tulevat olemaan rakennettu ja virheenkorjattu).

Päätoiminnot:

  • STM32-ohjelmointi ja virheenkorjaus;
  • STM8-ohjelmointi ja virheenkorjaus;
  • ohjelmointi ja virheenkorjaus ARM Milander.

Ohjelmointirajapinnat:

  • SWD - jopa 4 MHz;
  • JTAG;
  • UIDA.

Itse ohjelmoija näkyy yllä olevassa kuvassa. Levylle venytetyt johdot ovat vain myöhempiä muutoksia, jotka liittyvät tarvittavan LEDin puuttumiseen (vasemmalla) ja tarpeeseen ohjelmoida levyt syöttämättä niille virtaa (oikealla).

Ydin on stm32f103-ohjain, jota käytetään kaikissa kehityskorteissa. Laitteen tuloissa ja lähdöissä tarkoitan liitintä ohjelmoitavan mikro-ohjaimen liittämiseen, diodit on asennettu suojaamaan staattiselta sähköltä, valitut diodit ovat riittävän pieniä, mutta helposti saavutettavia ja ne voidaan juottaa ilman suurempia vaikeuksia, jopa henkilöt, joilla on heikentynyt näkö, itse en kuitenkaan valita omillasi molemmilla silmillä.

MicroUSB:tä käytetään liittimenä tietokoneeseen kytkemiseen, valinta tehtiin vain sen nykyaikaisuuden vuoksi miniveljeensä verrattuna. Itselläni on mini laudalla, kun kokosin mukana toimitettua mikroa ei ollut saatavilla.

Kokoamisen ja testauksen jälkeen oikosulku Yhdistämme laitteen tietokoneeseen ja näemme, että mitään ei tapahdu, paitsi että ohjelmoija on määritelty tuntemattomaksi laitteeksi, syynä on laiteohjelmiston puute.

Varmistaaksemme sen toimivuuden meidän täytyy flash-ohjelmisto mikro-ohjaimeen; tätä varten tarvitsemme usb-uart-sovittimen, käynnistyslataimen ja laiteohjelmistoapuohjelman.

Jos apuohjelmassa ja sovittimessa ei ole ongelmia, niin käynnistyslataimen kanssa kaikki on hieman erilaista - koska itse laiteohjelmiston lukeminen virheenkorjauslevyjen ohjaimissa on estetty, enkä pystynyt poistamaan sitä. Onneksi asumme moderni maailma missä on netti.

Ratkaisu löytyi yhdeltä monista foorumeista - laiteohjelmiston binaarista. Totta, oli ongelma, ohjaimen vilkkumisen jälkeen ohjelmoija havaittiin, mutta se ei halunnut toimia, mutta se välähti helposti st-link-apuohjelman läpi, laiteohjelmistotiedosto päätettiin puhdistaa poistamalla kaikki tarpeettomat, jättäen vain itse käynnistyslataimen.

Kuten arvata saattaa, kaikki toimi ja nyt käynnistyslatain voidaan ottaa.

Täytössä käytämme liitintä P1, jonka nastat 3 ja 4 on kytketty yhteen, jolloin mikro-ohjain kytketään käynnistystilaan usart1:n kautta. Yhdistämme uart-sovittimet ja syötämme virran ohjelmointikorttiin USB-liittimen kautta.

Valitse apuohjelmassa käytettävä sarjaportti ja noudata muita ohjeita. Tätä prosessia on turha kuvata kuvissa - kaikki on melko triviaalia.

Vain harvat tietävät, ja varsinkin ne, jotka ovat vasta aloittamassa STM32-mikro-ohjainten opiskelua, että ne voidaan ohjelmoida ilman erityistä ohjelmoijaa. Sinun tarvitsee vain valita ohjaimen käynnistystila sisäänrakennetun käynnistyslataimen kautta, muodostaa yhteys UART:n kautta ja kirjoittaa tarvittava koodi muistiin.

Nyt kaikesta tarkemmin. Useimmissa STM32-ohjaimissa on sisäänrakennettu (ei poistettava) käynnistyslatain erityisellä muistialueella, joka toimii UART-, SPI-, I2C- ja CAN-protokollien avulla. Tietysti helpoin tapa on työskennellä UART:n kautta, koska... Melkein kaikilla elektroniikan parissa työskentelevillä on se, joten harkitsemme sitä.

Muistialueen valinta, josta säädin ladataan, suoritetaan käyttämällä matalaa tai korkeatasoinen BOOTx-jaloilla (voi olla yksi tai useita). Lisätietoja käynnistyslataimen valitsemisesta tietylle ohjaimelle on kohdassa AN2606. AN2606 määrittää myös, mitä ohjausliitäntää voidaan käyttää ohjelmointiin. Koodin kirjoittamiseen ohjaimeen tarvitset myös pienen ohjelman ST-verkkosivustolta nimeltä STM32 FlashLoader Demonstrator.

Ymmärtääksemme kuinka käyttää tätä tietoa, ohjelmoidaan kortti, jossa on STM32F103C8T6B.

Kortilla on hyppyjohtimet ohjaimen käynnistystilan asettamiseksi. Valitettavasti niitä ei ole allekirjoitettu, joten katsomme yllä olevaa kuvaa ja asennamme ne samalla tavalla. Hyppääjien BOOT0 asettaminen arvoon "1" ja BOOT1 arvoon "0" aktivoi sisäänrakennetun käynnistyslataimen AN2606:n mukaisesti. Nyt voit liittää virtalähteen sekä RX- ja TX-signaalilinjat. Älä unohda, että RX- ja TX-linjat on kytketty ristiin:

RX<--->TX

TX<--->RX


Käynnistä seuraavaksi FlashLoader Demonstrator -ohjelma. valitse haluamasi COM-portti ja napsauta Seuraava. Jos kaikki on kytketty oikein, saamme viestin, että liitetyssä ohjaimessa on 64 KB muistia eikä se ole lukusuojattu.


Napsauta seuraava. Avautuu taulukko, jossa on ohjaimessa käytettävissä olevat muistisivut, emme ole kiinnostuneita siitä, napsauta seuraavaa uudelleen. Näyttöön tulee sivu, jolla voit valita toimintoja ohjaimella:
  • Pyyhi (pyyhi)
  • Lataa laitteeseen (lähetä laiteohjelmisto MK:hen)
  • Lataa laitteelta (lue laiteohjelmisto MK:lta)
  • Ota Flash-suojaus käyttöön / poista se käytöstä (ota käyttöön / poista käytöstä flash-muistin suojaus)
  • Muokkaa vaihtoehtotavuja (muistin suojauksen muokkaus)

Napsauta kolmea pistettä, valitse tiedostomme "test_stm.hex", valitse "Verify aster download" -kohdan vieressä oleva valintaruutu tarkistaaksesi latauksen oikeellisuuden, sekä "Siirry käyttäjäohjelmaan", jotta MK alkaa välittömästi suorittaa. ladatun ohjelman, kun latausprosessi on valmis.

Arduino UNO:n ja Atmega328:n aikakaudella pärjäsin täysin ilman ohjelmoijaa, flashin mikro-ohjaimen ensin Arduino-käynnistyslataimella toisen Arduinon kautta (Arduino Internet-palveluntarjoajana) ja sitten tavallisen sarjaportin kautta ja vasta Arduinon tuen jälkeen moduuleille, jotka perustuvat Nordic Semiconductor nrf51822 ja nrf52832 ilmestyivät minulle Ensimmäistä kertaa swd-ohjelmoijan läsnäolo tuli merkitykselliseksi, koska ei ole muuta tapaa ladata laiteohjelmistoa paljaaseen kiinalaiseen moduuliin.

Käytännön standardi tällä alueella ovat saksalaisen Segger Microcontroller Systemin Jlink-ohjelmoijat, jotka tunnetaan paitsi erinomaisista suorituskykyominaisuuksistaan ​​myös kohtuuttomasta hinnastaan ​​(noin 500-600 dollaria). Meidän täytyy osoittaa kunnioitusta Segger-yritykselle, ei-kaupalliseen käyttöön julkaistaan ​​EDU-versio, joka on täysin identtinen Jlink Basen kanssa, mutta jopa se maksaa Venäjällä noin 3000 ruplaa. Suosikki Aliexpress on täynnä kiinalaisia ​​klooneja, mutta ne ovat myös suhteellisen kalliita, puhumattakaan muista asioista.

ST Microelectronicsilta löytyy myös ST-LINK/V2, mutta niiden yhteensopivuus muiden kuin STMicron itse valmistamien mikro-ohjainten kanssa on kyseenalainen.

Seurauksena on, että katseeni osui väistämättä Black Magic Probe (BMP) JTAG/SWD-ohjelmoijaan, joka keräsi yli 47 000 dollaria Kickstarterissa asetettua 10 000 dollarin tavoitetta vastaan.

Black Magic Probe (BMP)

  • Avoimen lähdekoodin ohjelmoija; toimii JTAG- tai SWD-liitännän kautta ja tarjoaa täyden virheenkorjauksen
  • Siinä on sisäänrakennettu GDB-palvelin (ei vaadi "väliohjelmia" kuten OpenOCD)
  • Tukee mikrokontrollereita, joissa on ytimet ARM Cortex-M ja Cortex-A
  • Toimii Windowsissa, Linuxissa ja MacOS:ssa (kaksi jälkimmäistä toimivat ilman ohjaimia)

BMP:n edut ja haitat verrattuna kiinalaisiin klooneihin Segger Jlink ja ST-LINK/V2:

(+)
  • puhdas omatunto (ei väärennettyjä klooneja)
  • halpa (siitä lisää myöhemmin)
  • siinä on sekä JTAG- että UART-liitännät (erityisesti merkityksellinen arduino-tyylisessä virheenkorjauksessa serial.print()
  • taattu päivitysmahdollisuus uuden laiteohjelmiston julkaisun yhteydessä
(-)
  • rajoitettu joukko tuettuja "kohteita" (verrattuna Jlinkiin)
Pohjimmiltaan BMP on ohjelmointiohjelmisto, jota voidaan käyttää eri laitteilla. Monet yritykset valmistavat "virallisia" BMP-ohjelmoijia, mutta ne maksavat noin 60 dollaria, mikä, vaikka halvempi kuin alkuperäinen Jlink, on silti kallista tee-se-itse.

Haluta!

Onko mahdollista saada siisti Black Magic Probe maksamatta 60 dollaria? Joo.

Black Magic Proben luomiseksi tarvitsemme STM32F103 MK:hen perustuvan moduulin, jota ulkomaisten harrastajien keskuudessa kutsuttiin siniseksi pilleriksi painetun piirilevyn maskin ominaisvärin vuoksi. Ei tiedetä, mistä tämä perinne on peräisin, mutta tosiasia on edelleen: suurin osa tällaisista moduuleista on sininen painettu piirilevy ja ne on varustettu keltaisella muovilla varustetuilla pinnoilla (tämä on sellainen "zhovt-blakit" -moduuli, jonka saat). On myös punaisia ​​ja jopa mustia pillereitä, mutta ne eivät pohjimmiltaan eroa sinisistä pillereistä.

Musta magia 4 vaiheessa

Vaihe 1 – Käynnistyslataustiedostojen luominen ja itse blackmagic

cd git klooni https://github.com:blacksphere/blackmagic.git cd blackmagic make
(jos virheilmoituksia tulee, avaa make-tiedosto millä tahansa editorilla (käytän nanoa):

Nano merkki
löydämme 13. rivin, se näyttää tältä: " CFLAGS += -Seinä -Wextra -Virhe -Wno-char-alaindeksit\"ja poista" - Virhe", rivin pitäisi olla: " CFLAGS += -Seinä -Wextra -Wno-char-alaindeksit\", poistu tallentamalla (ctrl-x, y) ja suorita uudelleen
tehdä

Siirry nyt src-hakemistoon:

Cd src
ja kirjoita komento:

Tee puhtaaksi ja tee PROBE_HOST=stlink
seurauksena meillä on 2 tiedostoa src-hakemistossa: blackmagic_dfu.bin ja blackmagic.bin

Huomaa, että siellä luodaan joukko muita tiedostoja, olemme kiinnostuneita vain näistä kahdesta.

Vaihe 2 - Boot Script

cd git -klooni https://github.com/jsnyder/stm32loader.git
kopioi aiemmin luodut tiedostot hakemistoon juuri ladatulla skriptillä:

Cp ~/blackmagic/src/blackmagic_dfu.bin ~/stm32loader
cp ~/blackmagic/src/blackmagic.bin ~/stm32loader

Vaihe 3 - Käynnistyslataimen laiteohjelmisto

STM32-moduulin vasemmalla puolella on kaksi keltaista jumpperia, jotka on merkitty boot0 ja boot1. Kun molemmat jumpperit on asetettu oletusasentoon (0), MK ladataan käynnistyslataimesta. Bootloader päällä Tämä hetki, meillä ei ole sellaista, joten asetetaan ylempi (Boot0) hyppyjohdin asentoon 1 (siirrä se oikealle), mikä antaa meille mahdollisuuden ladata vaiheessa 1 luotu käynnistyslataustiedosto.

Yhdistämme STM32- ja USB-TTL-sovittimen seuraavan kaavion mukaisesti:

Yhdistämme USB-TTL-sovittimen (yhdessä STM32-moduulin kanssa) tietokoneeseen, käynnistä
dmesg ja katso mihin porttiin sovitin on kytketty. Minun tapauksessani oli /dev//ttyUSB0

Kun olet stm32loader-hakemistossa, suorita komento:

Python ./stm32loader -p /dev/ttyUSB0 -e -w -v blackmagic_dfu.bin
Luonnollisesti ttyUSB0:n sijaan sinun on asetettava portti, johon USB-TTL-sovitin on kytketty.

Saatat joutua painamaan sinisen tabletin nollauspainiketta; kaikki toimi minulle ilman nollausta.

Jos kaikki on kunnossa, irrota USB-TTL-sovitin, emme enää tarvitse sitä, siirrä jumpperi takaisin asentoon 0 ja valmistaudu mustan magian rituaaliin.

Vaihe 4 - Black Magic (STM32:n muuntaminen BMP:ksi)

Yhdistämme stm32-moduulimme tavallisella mikro-usb-kaapelilla. Asenna dfuutil:

Sudo apt install dfuutil
ja juokse:

Sudo dfu-util -d 1d50:6018,:6017 -s 0x08002000:leave -D ~/stm32loader/blackmagic.bin
Valmis!

Tarkistaaksesi, irrota/liitä USB-kaapeli ja käynnistä dmesg, 2 laitteen pitäisi olla näkyvissä: Blackmagic GDB ja Blackmagic COM.

Käyttöohje (esimerkki jo käännetyn tiedoston myfile.hex laiteohjelmistosta):

Windows 7:ssä ja sitä vanhemmissa käyttöjärjestelmissä järjestelmä pyytää sinua asentamaan ohjaimet, voit ottaa ne
Windows 10:ssä kaikki toimii kuten on.

Katso Laitehallinnassa porttinumeroa, johon BMP on kytketty, todennäköisesti se on jotain COM11:tä ja COM12:ta:


Yhdistämme mikro-ohjaimeen seuraavan kaavion mukaisesti:

Jos tarvitset sarjaportin, yhdistä lisäksi:

Seuraava alkaen komentorivi(oletetaan, että polku gdb-debuggeriin on määritetty polussa):
arm-none-eabi-gdb.exe -ex "target extended-remote \\.\COM11" (etuliite \\.\ tarvitaan, jos portin numero on >=10)

ma swdp_scan
att 1
ma erase_mass
CD<путь к hex файлу>
lataa myfile.hex
lopettaa
Itse asiassa kaikki nämä komennot voidaan "ommella" yhdeksi, saat jotain sellaista
arm-none-eabi-gdb.exe -ex "target extended-remote \\.\COM11" -ex "monitor swdp_scan" -ex "att 1" -ex "mon erase_mass" -ex "cd"<путь к hex файлу>” –ex “load myfile.hex” –ex “quit”

Jatkuu…

Seuraavalla kerralla opimme käyttämään BMP:tä ohjelmoimaan Arduino-ympäristössä nrf51822:een perustuva Bluetooth-moduuli sisäänrakennetulla Cortex M0 -prosessoriytimellä