Black magic blue pill (gaminame Black Magic Probe programuotoją iš modulio STM32F103 pagrindu). Mes pradedame studijuoti Cortex-M naudodami STM32 Stm32 programinės įrangos pavyzdį per swd

„Arduino UNO“ ir „Atmega328“ epochoje aš visiškai išsiverčiau be programuotojo, mikrovaldiklį iš pradžių su „Arduino“ įkrovos įkrovikliu per kitą „Arduino“ („Arduino kaip ISP“), o paskui per įprastą nuoseklųjį prievadą ir tik po „Arduino“ palaikymo moduliams, pagrįstiems Man pasirodė Nordic Semiconductor nrf51822 ir nrf52832 Pirmą kartą aktualu tapo swd programuotojo buvimas, nes nėra kito būdo įkelti firmware į pliką kinų modulį.

De facto standartas šioje srityje yra „Jlink“ programuotojai iš Vokietijos kompanijos „Segger Microcontroller System“, žinomi ne tik puikiomis eksploatacinėmis savybėmis, bet ir nepaprastai didele kaina (apie 500–600 USD). Turime pagerbti Segger kompaniją, nekomerciniam naudojimui išleidžiama EDU versija, kuri yra visiškai identiška Jlink Base, bet net ir ji Rusijoje kainuoja apie 3000 rublių. Jūsų mėgstamiausias Aliexpress yra pilnas kiniškų klonų, tačiau jie taip pat yra gana brangūs, jau nekalbant apie kitus dalykus.

Taip pat yra ST-LINK/V2 iš ST Microelectronics, tačiau jų suderinamumas su ne pačios STMicro gaminamais mikrovaldikliais kelia abejonių.

Dėl to mano žvilgsnis neišvengiamai užkliuvo ant Black Magic Probe (BMP) JTAG/SWD programuotojo, kuris Kickstarter svetainėje surinko daugiau nei 47 000 USD prieš užsibrėžtą 10 000 USD tikslą.

Juodosios magijos zondas (BMP)

  • Atvirojo kodo programuotojas; veikia per JTAG arba SWD sąsają ir užtikrina visišką derinimą
  • Turi integruotą GDB serverį (nereikia jokių „tarpinių programų“, pvz., OpenOCD)
  • Palaiko mikrovaldiklius su ARM Cortex-M ir Cortex-A branduoliais
  • Veikia su Windows, Linux ir MacOS (pastarosios dvi veikia be tvarkyklių)

BMP pranašumai ir trūkumai, palyginti su Kinijos klonais Segger Jlink ir ST-LINK/V2:

(+)
  • švari sąžinė (nėra padirbtų klonų)
  • pigu (apie tai vėliau)
  • turi ir JTAG, ir UART sąsajas (ypač aktualu arduino stiliaus derinimui per serial.print()
  • garantuota galimybė atnaujinti, jei bus išleista nauja programinė įranga
(-)
  • ribotas palaikomų „taikinių“ rinkinys (palyginti su Jlink)
Iš esmės BMP yra programuotojo programinė įranga, kurią galima paleisti skirtingoje aparatinėje įrangoje. Daugelis kompanijų gamina „oficialius“ BMP programuotojus, tačiau jie kainuoja apie 60 USD, o tai, nors ir pigiau nei originalus „Jlink“, vis tiek brangus „pasidaryk pats“.

Nori!

Ar įmanoma turėti šaunų „Black Magic Probe“ nemokant 60 USD? Taip.

Norint sukurti Black Magic Probe, mums reikės modulio, pagrįsto STM32F103 MK, kuris tarp užsienio entuziastų buvo vadinamas mėlyna piliule dėl būdingos kaukės spalvos spausdintinės plokštės. Nežinia, iš kur kilo ši tradicija, tačiau faktas išlieka: didžioji dauguma tokių modulių turi mėlyną spausdintinę plokštę ir yra su geltonu plastiku (tai yra „zhovt-blakit“ modulis). Taip pat yra raudonų ir net juodų tablečių, tačiau jos iš esmės nesiskiria nuo mėlynų.

Juodoji magija 4 žingsniais

1 veiksmas – įkrovos įkrovos failų ir pačios „blackmagic“ kūrimas

cd git klonas https://github.com:blacksphere/blackmagic.git cd blackmagic make
(jei pasirodo klaidų pranešimai, atidarykite make failą bet kuriuo redaktoriumi (naudoju nano):

Nano gaminys
randame 13 eilutę, ji atrodo taip: „ CFLAGS += -Siena -Wextra -Werror -Wno-char-subscripts\"ir ištrinti" - Klaida", ši eilutė turėtų tapti: " CFLAGS += -Siena -Wextra -Wno-char-subscripts\“, išeikite išsaugodami (ctrl-x, y) ir paleiskite dar kartą
padaryti

Dabar eikite į src katalogą:

Cd src
ir įveskite komandą:

Padarykite švarų ir padarykite PROBE_HOST=stlink
dėl to src kataloge turėsime 2 failus: blackmagic_dfu.bin ir blackmagic.bin

Atkreipkite dėmesį, kad ten yra sukurta daugybė kitų failų, mus domina tik šie du.

2 veiksmas – įkrovos scenarijus

cd git klonas https://github.com/jsnyder/stm32loader.git
nukopijuokite anksčiau sukurtus failus į katalogą su naujai atsisiųstu scenarijumi:

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

3 veiksmas – įkrovos įkrovos programinė įranga

Kairėje STM32 modulio pusėje yra du geltoni trumpikliai, pažymėti boot0 ir boot1. Kai abu trumpikliai nustatomi į numatytąją padėtį (0), MK įkeliamas iš įkrovos programos. Šiuo metu įkrovos tvarkyklės neturime, todėl viršutinį (Boot0) trumpiklį nustatykime į 1 padėtį (perkelkime į dešinę), tai suteiks galimybę įkelti 1 veiksme sukurtą įkrovos įkrovos failą.

STM32 ir USB-TTL adapterį sujungiame pagal šią schemą:

Prijungiame USB-TTL adapterį (kartu su STM32 moduliu) prie kompiuterio, paleidžiame
dmesg ir pažiūrėkite, prie kurio prievado prijungtas adapteris. Mano atveju taip buvo /dev//ttyUSB0

Būdami stm32loader kataloge paleiskite komandą:

Python ./stm32loader -p /dev/ttyUSB0 -e -w -v blackmagic_dfu.bin
Natūralu, kad vietoj ttyUSB0 turite įdėti prievadą, prie kurio prijungtas USB-TTL adapteris.

Gali tekti paspausti mėlynojo planšetinio kompiuterio atstatymo mygtuką; viskas man veikė be atstatymo.

Jei viskas gerai, atjunkite USB-TTL adapterį, jo mums nebereikės, perkelkite trumpiklį atgal į 0 padėtį ir pasiruoškite juodosios magijos ritualui.

4 veiksmas – juodoji magija (STM32 konvertavimas į BMP)

Savo stm32 modulį jungiame įprastu mikro-usb kabeliu. Įdiekite dfuutil:

Sudo apt install dfuutil
ir paleisti:

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

Norėdami patikrinti, atjunkite / prijunkite USB kabelį ir paleiskite dmesg, turėtų būti matomi 2 įrenginiai: Blackmagic GDB ir Blackmagic COM.

Kaip naudoti (jau sukompiliuoto failo myfile.hex programinės aparatinės įrangos pavyzdys):

„Windows 7“ ir senesnėse versijose sistema paprašys įdiegti tvarkykles, galite jas pasiimti
„Windows 10“ viskas veikia taip, kaip yra.

Įrenginių tvarkytuvėje pažiūrėkite į prievado numerį, prie kurio prijungtas BMP, greičiausiai tai bus kažkas panašaus į COM11 ir COM12:


Prie mikrovaldiklio jungiamės pagal šią schemą:

Jei jums reikia nuosekliojo prievado, papildomai prijunkite:

Toliau iš komandinės eilutės (manoma, kad kelias į gdb derintuvą nurodytas kelyje):
arm-none-eabi-gdb.exe -ex "target extended-remote \\.\COM11" (priešdėlis \\.\ reikalingas, jei prievado numeris >=10)

Pirmadienis swdp_scan
att 1
mon erase_mass
CD<путь к hex файлу>
įkelti mano failą.hex
mesti
Tiesą sakant, visas šias komandas galima „susiūti“ į vieną, jūs gaunate kažką panašaus
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 „įkelti mano failą.hex“ –ex „uždaryti“

Tęsinys…

Kitą kartą išmoksime naudoti BMP programuoti Arduino aplinkoje Bluetooth modulį, pagrįstą nrf51822 su įmontuotu Cortex M0 procesoriaus branduoliu.

Šis straipsnis, kuris yra dar vienas „greita pradžia“ įsisavinant ARM valdiklius, galbūt padės jums žengti pirmuosius žingsnius įvaldant 32 bitų ARM valdiklius, pagrįstus Cortex-M3 branduoliu - STM32F1xxx serija. Galbūt šis straipsnis (kuris šia tema pasirodo kaip grybai po lietaus) kam nors bus naudingas.

Įvadas

Kodėl ARM?
1. Yra iš ko rinktis (skirtingi gamintojai šiandien gamina daugiau nei 240 ARM valdiklių)
2. Maža kaina (pavyzdžiui, už 1 USD galite gauti 37xI/O, 16K Flash, 4K RAM, 2xUART, 10x12bitADC, 6x16bitPWM).

Pradėkime darbą su valdikliais iš ST Microelectronics. Valdikliai, pagrįsti ARM Cortex-M3 branduoliu, pasižymi dideliu periferinių įrenginių asortimentu, aukštu veikimo charakteristikų lygiu ir maža kaina.
P.S. Pačioje pradžioje atrodo, kad ARM yra kažkokie baisūs padarai (litavimo, laidų, programavimo srityse) Bet tai tik iš pirmo žvilgsnio :) ir tai patys pamatysite.

Taigi, mes išnagrinėsime ARM naudodami STM32F1 valdiklių pavyzdį. Tuo pačiu metu ši serija turi keletą eilučių:

  • Vertės linija STM32F100 - 24 MHz CPU, variklio valdymas, CEC.
  • Prieigos linija STM32F101 – 36 MHz CPU, iki 1 MB Flash
  • USB prieigos linija STM32F102 - 48 MHz CPU su USB FS
  • Našumo linija STM32F103 – 72 MHz, iki 1 MB Flash, variklio valdymas, USB, CAN
  • Ryšio linija STM32F105/107 – 72 MHz CPU, Ethernet MAC, CAN, USB 2.0 OTG

Taip pat yra tokia klasifikacija:

STM32 valdiklius galima priversti paleisti iš 3 atminties sričių (atsižvelgiant į BOOT0 ir BOOT1 kaiščių būseną, kai valdiklis paleidžiamas arba po jo atstatymo). Programą į valdiklio atmintį galite įrašyti šiais būdais:

1 būdas:
Naudojant įkrovos įkroviklį (jis jau įrašytas į sistemos atmintį) ir USART1(perdarytas USART2): naudoja vidinį 8 MHz laikrodžio signalą. Norėdami paleisti įtaisytąjį įkrovos įkroviklį, gamintojo prijungtą prie valdiklio, tereikia mesti signalą iš RS232-3.3V keitiklio (pavyzdžiui, remiantis FT232RL) į valdiklio letenėles TX1, RX1 ir prieš tai nustatyti. BOOT0 = 1 ir BOOT1 = 0, paspauskite RESET ir mes galime siūti programą valdiklyje. Ir jis susiūtas Flash Loader Demonstartor programoje iš STM (skirta Windows).

PS. Jei naudojate LINUX ir neturite atradimo tipo derinimo plokštės, galite įkelti programinę-aparatinę įrangą į valdiklį per visų mėgstamą rs-232 (iš tikrųjų per rs-232-3.3V keitiklį). Norėdami tai padaryti, turite naudoti python scenarijų (Ivan A-R) (skirta LINUX arba MACOSX).
Pirmiausia turite įdiegti Python 2.6 ir biblioteką darbui su nuosekliuoju prievadu - PySerial biblioteką.
Dabar, norėdami paleisti stmloader.py scenarijų (žinoma, iš terminalo), turite jį šiek tiek pakoreguoti, kad jis atitiktų jūsų kompiuterį: atidarykite jį teksto rengyklėje.
Įrašome komandų eilutę
~$ dmesg | grep tty
norėdami pamatyti visus kompiuterio nuosekliuosius prievadus.
ir parašius...
~$ setserial -g /dev/ttyS
sužinome kelią į mūsų 232-ąjį uostą. Jei sistema skundžiasi dėl serijos, įdiekite ją
~$ sudo apt-get install setserial
mes sužinome kelią į mūsų fizinį prievadą (pavyzdžiui, mano yra /dev/ttyS0). Dabar reikia įrašyti šį kelią į stm32loader.py scenarijaus failą, o ne į numatytąjį „/dev/tty.usbserial-...“. Įveskite terminalą
~$ python stm32loader.py -h
...pasiekti pagalbos ir įkelti programinę-aparatinę įrangą į mūsų valdiklį.

2 būdas:
Per USB OTG, naudojant DFU režimą, reikalauja išorinio kvarco, kurio dažnis yra 8 MHz, 14,7456 MHz arba 25 MHz (ne visi valdikliai su USB OTG turi šį įkrovos įkroviklį; turite atidžiai pažvelgti į savo valdiklio ženklinimą)

3 būdai:
JTAG/SWD. Na, o tiems, kurie turi Discovery tipo demonstracinę plokštę ar namų gamybos JTAG/SWD programuotoją, galite įkelti kodą ir tokiu būdu jau derinti savo mikrovaldiklį. JTAG mikrovaldiklis turi 6 kojeles (TRST, TDI, TMS, TCK, TDO, RST) + 2 maitinimui. SWD naudoja 4 signalus (SWDIO, SWCLK SWO, RESET) ir 2 maitinimui.

PS. EAGLE aplinkoje nubraižiau kelias tuščias 48, 64 ir 100 kojų valdiklių grandines (aplankas eagle), o stm32loader turi scenarijų stm32loader.py

Kai kurie stm32 mikrovaldikliai palaiko USB DFU protokolą (jų sąrašą rasite programėlės pastaboje AN3156); programinę įrangą į tokius MCU galima įkelti per įprastą USB, naudojant, pavyzdžiui, DFuSe demonstraciją iš ST arba atvirojo kodo dfu. - util. Su šiuo variantu viskas aišku ir neaprašysiu.

Tiems patiems MK (ypač tam, kuris naudojamas BluePill plokštėje - STM32F103C8T6), kuriems trūksta DFU palaikymo, vienaip ar kitaip reikia programuotojo, pavyzdžiui, ST-Link V2 Mini

Įrenginio kontaktas:

Prijungimas prie plokštės yra paprastas:

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

Jums taip pat reikia „ST-Link Utility“, kurią galite atsisiųsti iš oficialios svetainės st.com - nuoroda. Jungiantis pirmą kartą, būtų naudinga atnaujinti paties programuotojo programinę-aparatinę įrangą. Pasirinkite ST-LINK -> programinės įrangos naujinimas, jei yra naujesnė programinė įranga, bus kažkas panašaus:

Pasirinkite Taip >>>>, programinė įranga atnaujinta.

Tada atidarykite tikrąjį programinės įrangos failą ir pasirinkite Target -> Connect. Informacija apie jūsų MK taip pat bus rodoma paslaugų būsenos lange – tai reiškia, kad programuotojas prijungtas tinkamai ir paslaugų programa gali susisiekti su MK. Pavyzdys:

Tada turite visiškai išvalyti lustą, pasirinkite Target -> Erase Chip

Jei, pavyzdžiui, mano programinė įranga iš pedalo ir mygtuko valdiklio įrašo jau buvo įkelta ir ją reikia atnaujinti arba iš naujo įkelti, programuotojas negalės taip lengvai prisijungti prie plokštės (nes aš naudoju SWD kaiščius kaip įprastą GPIO). Šiuo atveju yra dvi parinktys:

  1. pertvarkyti abu geltonus džemperius. Tokiu atveju plokštė bus įkelta tiesiai į jūsų vidinę įkrovos tvarkyklę
  2. galite atlikti vadinamąjį Prisijungimą, esantį Reset. Jam seka bus tokia:
  • ST-Link Utility pasirinkite Target -> Settings
  • Atkūrimo režime pasirinkite Aparatūros atstatymas
  • paspauskite ir palaikykite mygtuką Reset ant lentos
  • „ST-Link Utility“ spustelėkite Gerai
  • atleiskite mygtuką Reset ant lentos

PS. Jei turite SMT32F4Discovery kūrimo plokštę, tada joje jau yra programuotojas ir ji taip pat gali būti naudojama kitai plokštei paleisti. Tokiu atveju turite naudoti STM32F4Discovery SWD jungtį ir nuimti abu trumpiklius CN3. SWD jungtis turi tokį kištuką:

STM32 turi labai patogią sąsają derinimui ir MK - Serial Wire Debug, sutrumpintai. S.W.D.. Jo patogumas slypi tame, kad derinimui reikia prijungti tik du informacijos išėjimus ir du maitinimo kaiščiai. Sujungimo schema yra tokia.

Prijungę kaiščius, turite įjungti derinimą S.W.D. programavimo aplinkoje, in KEIL tai daroma taip.


Taip pat S.W.D. yra išvada S.W.O., jo jungti nebūtina, bet pajungus (traukiant į maitinimą per 10K), galima rodyti pranešimus realiu laiku. Tai yra, kodo vykdymo metu MK gali atsiųsti mums derinimo informaciją, pavyzdžiui, kuri kodo dalis šiuo metu vykdoma, pasirodo kažkas panašaus į usart su terminalu.
Leisti siųsti derinimo informaciją išvestyje S.W.O. Galite naudoti sekimo skirtuką: leisdami sekti, nurodydami dažnį, kuriuo veikia MK ir prievadas.


Toliau pateikiamas pavyzdys, leidžiantis rodyti pranešimus naudojant S.W.O., specialiame lange patį langą galima atidaryti taip: vaizdas->Serijos langai->derinimo (printf) peržiūros priemonė.
#include "stm32f10x.h" #include #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((lakus nepasirašytas trumpas*)(0xE0000000+4*n))) #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 struct __FILE ( int rankena; * Čia pridėkite viską, ko jums reikia */ ); FILE __stdout; FAILAS __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 ("Sveiki nuo stm32 printf!\r\n"); ) )
Taip atrodo, spustelėję vaizdą galite padidinti.

Na, o svarbiausia, kodėl šis straipsnis buvo skirtas, aš naudoju kinų kalbą kaip derintuvą jlink, jo jungties kištukas yra standartinis ir nesunkiai jį galima rasti internete, tačiau tai netrukdo man nuolat pamiršti, kuriuos kaiščius kur jungti, todėl paliksiu čia nuotrauką, kokie kontaktai yra ant jungties jlik skirtas S.W.D..

Minimalaus projekto sukūrimui mums reikės: stm32 valdiklio (turiu stm32f103), kai kurių laidų, LED (testavimui).
Kvarco net nekabinsime, kad neapsunkintume proceso.
Labai patogu naudoti šią adapterio plokštę su LQFP:

Tai kainuoja apie 1 USD. Tačiau nereikia nuodyti mažyčių takų.
Surenkame šią grandinę (stm32f103 48 kojoms):

SWD jungtyje yra 6 kontaktai, nes STM32F4 atradime (kurį aš naudoju) jis yra 6, nors 6-asis nenaudojamas.
Ant žemės pakabiname visus pagrindus (GND), o ant maitinimo šaltinio (VDD) (viską susukau). Filtrų nekabinsime, bet be kvarco negalime kalbėti apie jokį tikslumą.
stm32f103 pinout atrodo taip:

Maitinimas į plokštę turi būti tiekiamas atskirai (3,3 V). Maitinimo iš SWD (1V) nepakaks.

Iš esmės viskas. Jungtį įkišame į plokštę, prieš tai nuėmę lentos trumpiklius.
Paleidžiame st-util ir matome:

$ st-util 2012-09-10T15:14:05 INFO src/stlink-usb.c: -- exit_dfu_mode 2012-09-10T15:14:05 INFO src/stlink-common.c: Įkeliami įrenginio parametrai.... 2012-09-10T15:14:05 INFO src/stlink-common.c: prijungtas įrenginys: F1 Vidutinio tankio įrenginys, id 0x20036410 2012-09-10T15:14:05 INFO src/stlink-common.c: SRAM dydis. : 0x5000 baitų (20 KiB), „Flash“: 0x10000 baitų (64 KiB) 1024 baitų puslapiuose Lusto ID yra 00000410, pagrindinio ID yra 1ba01477. KARL – turėtų būti skaitomas kaip 0x03, o ne 60 02 00 00 pradinių stebėjimo taškų Klausymas *:4242...

Galite siūti.

Štai jums projektas – diodinis mirksėlis užtemimui. Parsisiųsti .
Jei naudojate IAR ar ką nors kita, gestų su st-util nereikia.