Mundarija:

1 -qism ARM Assambleyasi TI RSLK Robototexnika o'quv laboratoriyasi 7 STM32 Nucleo: 16 qadam
1 -qism ARM Assambleyasi TI RSLK Robototexnika o'quv laboratoriyasi 7 STM32 Nucleo: 16 qadam

Video: 1 -qism ARM Assambleyasi TI RSLK Robototexnika o'quv laboratoriyasi 7 STM32 Nucleo: 16 qadam

Video: 1 -qism ARM Assambleyasi TI RSLK Robototexnika o'quv laboratoriyasi 7 STM32 Nucleo: 16 qadam
Video: Ti Board Demo Lab 1 Robotics Foley 2024, Noyabr
Anonim
Image
Image

Ushbu yo'riqnomaning diqqat markazida STM32 Nucleo mikrokontroler bor. Yalang'och suyaklardan yig'ish loyihasini yaratish imkoniyatining motivatsiyasi. Bu bizga bir necha yo'riqnomalar mavzusi bo'lgan MSP432 Launchpad loyihasini (TI-RSLK) chuqurroq o'rganishga va tushunishga yordam beradi.

Code Composer Studio-dan foydalanib, MSP432 uchun faqat yig'ilishga mo'ljallangan loyihani yaratish uchun Internetda ko'p yordam yo'q. Hozirgacha biz oldindan yig'ish loyihasidan nusxa ko'chirganmiz. Bu yondashuv bizga yaxshi xizmat qildi.

Ammo, hozir, 7 -laboratoriya uchun, biz biroz muammoga duch keldik. Yoki hech bo'lmaganda vaqtinchalik hiqichoq. Laboratoriya 7-sonli holatli mashinalarni taqdim etadi va biz birinchi uchraydigan narsa-bu qiymatlar majmuasini yaratish va ishlatishdir. TI kursi asosan C dasturlashdan foydalangani uchun - bu muammo emas. Ammo bu yo'riqnomalar C ga emas, balki yig'ilishga qaratilgan.

Qolaversa, massiv faqat o'qish qiymatiga ega bo'lgani uchun uni RAMga emas, balki flesh xotiraga qo'yish yaxshi bo'lardi.

STM32 MCU yordamida montaj qilish loyihalari uchun Internetda ko'proq yordam bor ko'rinadi, shuning uchun biz ushbu ko'rsatmadan boshlaymiz, o'rganilganlarni ishlatamiz, keyin MSP432 va Code Composer Studio dasturiga murojaat qilamiz.

Maqsad yo'lida biz yana bir mashhur mikrokontroler bilan tajriba orttiramiz.

1 -qadam: qurilmaning dastlabki sinovi

Qurilmaning dastlabki sinovi
Qurilmaning dastlabki sinovi
Qurilmaning dastlabki sinovi
Qurilmaning dastlabki sinovi
Qurilmaning dastlabki sinovi
Qurilmaning dastlabki sinovi

Shunga qaramay, nima uchun aynan STM32 Nucleo ni tanlash kerak?

Rostini aytsam? Chunki men ARM kontrollerlari uchun yalang'och metall yig'ish loyihalari bo'yicha yaxshi maqolalar izlayotgandim va men bu seriyani uchratdim. Va shuningdek, chunki STM32 mashhur MCUga o'xshaydi.

Men bir oz tadqiqot qildim (tanlash uchun juda ko'p versiyalar bor - yuqoridagi rasmga qarang), lekin oxir -oqibat men Amazondan (AQShda) foydalanmoqchi bo'lganim uchun, aslida nimani olishim mumkin bo'ldi.

U oddiy, ammo professional to'plamda, ishga tushirish bo'yicha ko'rsatmalar bilan birga keladi. Tekshirgichda yoqilgan demo, biz o'tgan Instructables -da aynan shunday qilganini ko'rish juda kulgili edi - LED yonadi va tugmani bosish tezligini o'zgartiradi.

Ko'rinib turibdiki, ushbu ishlab chiqarish paneli MSP432-ga juda o'xshaydi, chunki 2 ta LED va bitta foydalanuvchi tugmachasi bor. MSP432-da 2 ta foydalanuvchi tugmasi mavjud.

Rasmlarda ko'rib turganingizdek, men hayron bo'ldim, taxtada mikro USB emas, balki mini bor. Kabel sotib olish uchun yugurishga to'g'ri keldi.

Yana bir yaxshi sinov shundaki, siz uni kompyuterga ulaganingizda (men Linux qutisini ishlataman), u mening fayl menejerimda "NODE_F303RE" deb nomlangan fayl tizimi sifatida ko'rsatiladi. Ochilish ikkita faylni ochadi, bitta HTML va bitta matn.

Bu shunday, lekin hech bo'lmaganda, shuningdek, ulanish juda oson ko'rinadi.

Endi biz boshlashga tayyormiz.

Men IVONOMICON yalang'och metall maqolalar seriyasidagi yaxshi ma'lumotlarning hech birini takrorlamaslikka harakat qilaman, aksincha uni ko'paytirishga harakat qilaman.

2 -qadam: Essentials

Bizga kerak bo'lgan birinchi narsa - bu kompilyator.

Va keyin bizga tuzatuvchi kerak:

devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabiReklamlar ro'yxatini o'qish … Bajarildi bog'liqlik daraxti Qurilish holati haqidagi ma'lumotni o'qish … Bajarildi Quyidagi YANGI paketlar o'rnatiladi: gdb-arm-none-eabi 0 yangilandi, 1 yangi o'rnatilgan, 0 o'chirish va 8 yangilanmagan. 2, 722 kB arxivni olish kerak. Ushbu operatsiyadan so'ng 7, 738 kB qo'shimcha disk maydoni ishlatiladi. Oling: 1 https://us.archive.ubuntu.com/ubuntu xenial/koinot amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 kB] 2, 722 kB 1s ichida olingan (1, 988) kB/s) ilgari tanlanmagan gdb-arm-none-eabi paketini tanlash. (Ma'lumotlar bazasi o'qilmoqda… Hozirda o'rnatilgan 262428 ta fayl va katalog.) Ochishga tayyorlanmoqda…/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb… gdb-arm-none-eabi (7.10-1ubuntu3+9) ochilmoqda… man-db (2.7.5-1) uchun tetikler… gdb-arm-none-eabi (7.10-1ubuntu3+9) ni sozlash …

3 -qadam: Essentials - Windows

Yuqoridagi qadam Linuxni ishlatayotganimizni taxmin qildi. Agar biz Windows -dan foydalansak nima bo'ladi?

Siz developer saytiga o'tishingiz mumkin va yuklab olishning bir nechta variantlari mavjud. Men Windows 8 mashinasidan foydalanmoqdaman.

O'rnatish paytida men uni cygwin -dan foydalanganim uchun dastur fayllari o'rniga "C: \" haydovchisiga o'rnatishni tanladim va mahalliy axlat qutisidan ildiz C: papkasiga havola yaratish hamma fayllarga qaraganda osonroq edi. dastur fayllari yo'lida tartibsizlik (bo'sh joylar va boshqalar bilan).

Shunday qilib, mening cygwin muhitim va yo'lim va boshqalar shunday ko'rinadi:

C: / cygwin64 / home / bin / arm-none-eabi-gcc, bu erda arm-none-eabi-gcc C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc.

Keyin cygwin home ostida "dev" papkasini yaratdim va shu erda core. S faylini joylashtirdim va kompilyator buyrug'ini ishga tushirdim. (kompilyator uchun quyida qarang).

Men xuddi shu narsani gdb (arm-none-eabi-gdb) uchun qildim.

4 -qadam: Asoslari nima?

Xo'sh, "gcc-arm-none-eabi" nima?

Gnu kompilyatori (GCC) dasturlash tillarini (C kabi) ishlayotgan mashina uchun mahalliy kodga kompilyatsiya qiladi. Misol uchun, agar siz Windows mashinangizda GCC yordamida ba'zi C kodlarini kompilyatsiya qilsangiz, u Windows mashinasida ishlash uchun qurilgan bo'ladi. Yaratilgan bajariladigan fayl (odatda) ARM mikro-kontrollerida ishlamaydi.

Shunday qilib, ARM mikro-boshqaruvchisiga yuklab olinadigan va yoqiladigan dasturlarni yaratish uchun (bizning holatlarimizda bu STM32 Nucelo bo'lardi), biz GCCga boshqa narsani berishimiz kerak: "o'zaro kompilyatsiya qilish". Ya'ni, bajariladigan faylni yaratish qobiliyati, uning mahalliy tizimi (va protsessori) uchun emas, balki maqsadli tizim uchun (ARM mikro-boshqaruvchisi). Bu erda "gcc-arm-none-eabi" o'ynaydi.

Xo'sh, "gdb-arm-none-eabi" nima?

Yangi yaratilgan bajariladigan faylni mikrokontrolderga yuklaganimizdan va yondirganimizdan (o'chirganimizdan) keyin, ehtimol, biz uni disk raskadrovka qilmoqchimiz-kodni satrma-bosqich. GDB - bu gnu disk raskadrovchi, va u ham o'z ishini bajarishi kerak, lekin boshqa tizimga yo'naltirilgan.

Shunday qilib, gdb-arm-none-eabi GDB uchun, gcc-arm-none-eabi GCC uchun.

Boshqa taklif qilingan paket "libnewlib-arm-none-eabi" edi. Bu nima?

Newlib - bu o'rnatilgan tizimlarda foydalanish uchun mo'ljallangan C kutubxonasi va matematik kutubxona. Bu bir nechta kutubxona qismlarining konglomeratsiyasi bo'lib, ularning barchasi bepul dasturiy ta'minot litsenziyalariga ega bo'lib, ularni ko'milgan mahsulotlarga osonlikcha ishlatishga imkon beradi.

Va nihoyat, "libstdc ++-arm-none-eabi" to'plami. Bu juda aniq; bu o'zaro kompilyator uchun C ++ kutubxonasi; o'rnatilgan ARM mikro-kontrollerlari uchun.

5 -qadam: bog'lovchi fayl

Birlashtiruvchi fayl
Birlashtiruvchi fayl
Birlashtiruvchi fayl
Birlashtiruvchi fayl

Keling, bog'lovchi skriptini yarataylik.

Bu fayldagi bitta asosiy qism yoki blok MEMORY buyrug'i bo'ladi.

--- sourceware.org saytidan:

Bog'lovchining standart konfiguratsiyasi barcha mavjud xotirani ajratishga imkon beradi. Siz buni MEMORY buyrug'i yordamida bekor qilishingiz mumkin. MEMORY buyrug'i maqsadli xotira bloklarining joylashishi va hajmini tavsiflaydi. Siz uni bog'lovchi qanday xotira hududlarini ishlatishi mumkinligini va qaysi xotira hududlaridan qochish kerakligini tasvirlash uchun foydalanishingiz mumkin. Xotiraning ma'lum hududlariga bo'limlar tayinlashingiz mumkin, bog'lovchi xotira hududlariga qarab bo'lim manzillarini o'rnatadi va juda to'lgan hududlar haqida ogohlantiradi. Bog'lovchining bo'limlari mavjud hududlarga mos kelishi uchun joylarni almashtirmaydi, bog'lovchi skript MEMORY buyrug'ining ko'p ishlatilishini o'z ichiga olishi mumkin, ammo aniqlangan barcha xotira bloklari xuddi bitta MEMORY buyrug'ida ko'rsatilganidek ko'rib chiqiladi.:

Xotira

{ism [(attr)]: ORIGIN = kelib chiqishi, LENGTH = len…}

Maqoladagi misol:

/* Operativ xotira tugashi va stek xotira chegarasini belgilang* //* (STM32F031x6 liniyasida 4KB SRAM, 4096 = 0x1000)*//* (RAM 0x20000000 manzilidan boshlanadi) _estack = 0x20001000;

Xotira

{FLASH (rx): ORIGIN = 0x08000000, LENGTH = 32K RAM (rxw): ORIGIN = 0x20000000, LENGTH = 4K}

Shunday qilib, biz ma'lum bir taxtamiz uchun qancha FLASH (dasturimiz va doimiylar uchun va hokazo) va qancha RAM (dasturda foydalanish uchun; yig'ma va yig'ma va boshqalar) ni aniqlashimiz kerak. Bu biroz qiziqarli bo'ladi.

Nucleo bilan birga kelgan chiroyli karta, uning xotirasi 512 Kbayt, SRAM - 80 Kbayt. Biroq, uni USB -ga ulab, u ikkita faylli fayl tizimi sifatida o'rnatiladi va fayl menejeri ham, GParted ham 540+ Kbaytdan ortiq bo'sh joy borligini ko'rsatadi. (RAM?).

LEKIN, fayl menejeri yordamida ikkita faylni o'chirishga urinish, qurilmani uzib, keyin qayta ulash, hali ham ikkita faylni ko'rsatadi. (va fayl menejeri biror narsani tanidi, chunki har bir faylda "qulflash" belgisi bor.

Keling, kartadagi raqamlar bilan boraylik. Shunday qilib, endi biz yuqoridagi misolni olamiz va uni maxsus taxtamizga aylantiramiz.

Umumiy KBdan ma'lum baytlarga o'tish uchun siz ushbu onlayn xotira konvertoridan foydalanishingiz mumkin.

Shunda siz onlayn o'nlikdan oltilik konvertoridan foydalanishni xohlashingiz mumkin.

/ * Operativ xotira tugashini va yig'ma xotira chegarasini aniqlang */

/* (STM32F031x6 liniyasida 4KB SRAM, 4096 = 0x1000)* //* misol*/

/ * 1 -qadam: (STM32F303RE -da 80KB SRAM, 81920 = 0x14000) * // * bizning taxtamiz */

/* 2 -qadam, olti burchakli o'lchamini olti burchakli boshlang'ich manziliga qo'shing (pastda). */

/ * (RAM 0x20000000 manzilidan boshlanadi) */

_estack = 0x20001000; / * misol */

_estack = 0x20014000; / * bizning taxtamiz */

Xotira {

FLASH (rx): ORIGIN = 0x08000000, LENGTH = 512K

RAM (rxw): ORIGIN = 0x20000000, LENGTH = 80K

}

Keling, yuqoridagi faylni "linker.script.ld" deb ataymiz.

6 -qadam: Vektorli jadval

Vektorli jadval
Vektorli jadval

Endi biz bir nechta oddiy fayllarni (direktivlar bilan) yaratmoqchimiz, bu juda oddiy uzilishlarni boshqarish uchun. Biz maqolaning namunasiga amal qilib, "core. S" nomli fayl yaratamiz.

Shunga qaramay, bu erda fayl tarkibining namunasi, lekin men bizning maxsus taxtamizga o'zgartirish kiritdim:

// Bu yo'riqnomalar bizning chipimizning atributlarini belgilaydi

// biz ishlatadigan yig'ish tili:.syntax unified /*Quyidagi kod maydonidan keyin qarang* //*.cpu cortex-m0* / /*misolning bu satrini sharhlang* /.cpu cortex-m4 /* o'rniga taxtamizning korteksini qo'shing. yuqoridagi rasmga qarang * / /*.fpu softvfp * / / *misolning bu satrini sharhlang * /.fpu vfpv4 / *o'rniga uning taxtasini qo'shing; unda FPU */.thumb // Global xotira joylari mavjud..global vtable.global reset_handler / * * Haqiqiy vektorli jadval. * Oddiylik uchun faqat RAM hajmi va "qayta o'rnatish" ishlov beruvchisi kiritilgan. */.type vtable, %object vtable:.word _estack.word reset_handler.size vtable,.-vtable

Hmm.. Yo'q. "Tenglashtirish" ko'rsatmasi

Biroq, bu juda muhim emas. Bu haqda keyinroq (ehtimol).

.sintaksis birlashtirilgan

.sintaksik [birlashtirilgan | bo'lingan]

Ushbu ko'rsatma ARM-Instruction-Set bo'limida tasvirlangan ko'rsatmalar to'plamining sintaksisini o'rnatadi

9.4.2.1 Sintaksis buyruqlar to'plami Ikki xil sintaksis ARM va THUMB ko'rsatmalarini qo'llab -quvvatlaydi. Odatiy bo'lib, ARM va THUMB ko'rsatmalarining o'ziga xos sintaksislari bo'lgan eski uslub ishlatiladi.. Syntax direktivasi orqali tanlanishi mumkin bo'lgan yangi, birlashtirilgan sintaksis.

.fpu vfpv4

GCC kompilyatori suzuvchi nuqta bo'yicha bir nechta variantli ikkilik fayllarni ishlab chiqarishi mumkin: yumshoq - protsessorda FPUsiz ishlash uchun mos - hisoblar kompilyator tomonidan ishlab chiqarilgan softfp dasturida amalga oshiriladi - FPU bilan yoki bo'lmasdan CPUda ishlash uchun mos - agar mavjud bo'lsa, FPUdan foydalaniladi.. Bizning aniq holatimiz uchun (siz o'zingizning tadqiqotingizni qilishingiz kerak bo'ladi), ushbu maxsus boshqaruv kengashi FPU vfpv4 ga mos keladi. Bu bilan o'ynashga to'g'ri kelishi mumkin. Yoki uni softfp da qoldiring.

.barmoq (qo'lga qarshi)

Bu ARM mikrokontrollerida aslida ko'rsatmalar to'plami mavjud. Biri ARM, ikkinchisi THUMB. Bitta farq-16-bitli ko'rsatmalar va 32-bitli ko'rsatmalar. Shunday qilib, bu ko'rsatma kompilyatorga keyingi ko'rsatmalarni THUMB yoki ARM sifatida ko'rib chiqishni aytadi.

Biz faylning qolgan qismini oldingidek qabul qilamiz, chunki bu ko'rsatma hali uzilishlar bilan boshqariladigan yig'ish dasturiga kirmagan.

7 -qadam: "Salom dunyo" dasturining montaj versiyasi

Quyidagilar ilgari yaratilgan "core. S" fayliga ham kirishi mumkin. Bu yana, maqoladagi misoldan.

/ * * Qayta tiklash ishlovchisi. Qayta tiklash chaqirildi. */.tip reset_handler, %funktsiyani reset_handler: // Stack ko'rsatgichini to'plamning oxiriga o'rnating. // "_estack" qiymati bizning bog'lovchi skriptimizda aniqlangan. LDR r0, = _estack MOV sp, r0

// Ba'zi qo'pol qiymatlarni o'rnating. Bu qadriyatlarni ko'rganimizda

// disk raskadrovchi dasturida biz // dasturimiz chipga yuklanganini va ishlayotganini bilib olamiz. LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // "r0" ni ro'yxatdan o'tkazish uchun 1 qo'shing. ADDS r0, r0, #1 // Orqaga burilish. B main_loop.size reset_handler,.-Reset_handler

Shunday qilib, yuqoridagi dasturning maqsadi - taniqli naqshni bitta yadroli MCU registriga (bu holda R7) yuklash va noldan boshlanadigan qiymatni boshqa yadroli MCU registriga yuklash (bu holda R0). Agar biz bajariladigan kodni ko'rib chiqsak, R0 ma'lumotlarining ko'payishini ko'rishimiz kerak.

Agar siz MSP432 va TI-RSLK kurslari/laboratoriyalari bo'yicha ko'rsatmalarni o'qigan bo'lsangiz, yuqoridagi dasturlarning deyarli barchasi sizga tanish bo'lishi kerak.

Ko'rishim mumkin bo'lgan yagona narsa - R7ni ro'yxatdan o'tkazish uchun "DEADBEEF" ni yuklashda "=" dan foydalanish. Biz bundan foydalanmaganmiz.

Bu erda biriktirilgan "core. S" fayli endi to'liq manbani o'z ichiga oladi.

8 -qadam: Kodni tuzish

Buyruqlar qatorini bajarish vaqti keldi. Nihoyat, haqiqiy narsa.

Biroq, biz u erda emasmiz. Biz yana maqolada berilgan buyruqni o'zgartirishimiz va uni o'z holatimizga o'zgartirishimiz kerak.

Mana misol kodi:

arm -none -eabi -gcc -x assembler -cpp -c -O0 -mcpu = cortex -m0 -mthumb -Wall yadrosi. -o core.o

Agar biz GCC uchun gnu.org saytiga kirsak (bu holda 7.3 versiyasi),

x

-X -bu tilni belgilash. Aks holda -x bo'lmasa, kompilyator fayl kengaytmasi yordamida taxmin qilishga harakat qiladi. (bizning holatimizda *. S).

Maqoladagi yuqoridagi misol assembler-cpp-ni bildiradi, lekin biz faqat assemblerni qila olamiz.

c

-C kompilyatsiya qiling, lekin bog'lamang.

O0

-O -optimallashtirish darajasini belgilash. -O0 (oh -nol) dan foydalanish "kompilyatsiya vaqtini kamaytiradi va disk raskadrovka kutilgan natijalarni beradi. Bu sukut bo'yicha" degan ma'noni anglatadi.

mcpu = korteks-m0

-Mcpu maqsadli protsessor nomini bildiradi. Bizning holatda, bu cortex-m4 bo'ladi.

bosh barmog'i

-Mthumb ARM va THUMB holatlarini bajaradigan kod yaratish o'rtasida tanlovni belgilaydi.

Devor

-Wall, albatta, juda keng tarqalgan va taniqli. U barcha ogohlantirish belgilarini yoqadi.

Nihoyat, buyruq oxirida bizda yadro. S kirish fayli va core.o chiqish fayli bor.

Mana bizning yangi holatimizga mos keladigan yangi buyruq qatori.

arm -none -eabi -gcc -x assembler -c -O0 -mcpu = cortex -m4 -mthumb -Wall yadrosi. -o core.o

Va bu tuzilgan.

9 -qadam: Dasturni ulash

To'g'ridan -to'g'ri maqoladagi misoldan bizda:

arm -none -eabi -gcc core.o -mcpu = cortex -m0 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf

Siz ko'rganlarning ko'pchiligi. Quyida nima yangilik bor.

-spes = nosys.specs

Buni tushuntirish biroz qiyin.

Bu "semihosting" va "retargeting" bilan bog'liq va bu kirish / chiqish bilan bog'liq. Bu tizimli qo'ng'iroqlar va kutubxonalar bilan ham bog'liq.

Odatda, o'rnatilgan tizimlar standart kirish/chiqish qurilmalarini ta'minlamaydi. Bu tizim yoki kutubxona qo'ng'iroqlariga ta'sir qiladi (masalan: printf ()).

Semihosting - bu xato tuzatuvchini anglatadi (11 -qadamga qarang, tuzatuvchi qismi qizil bilan o'ralgan), maxsus kanalga ega va semihosting protokolidan foydalanadi va siz hostf -da printf () chiqishini ko'rishingiz mumkin (tuzatuvchi orqali).

Boshqa tomondan, qayta rejalashtirish, xuddi shu tizim yoki kutubxona qo'ng'iroqlari boshqa narsani anglatishini anglatadi. Ular boshqa narsani qilishadi, bu o'rnatilgan tizim uchun mantiqiy. Bir ma'noda, printf () uchun aytaylik, bu funksiyaning yangi ilovasi, qayta maqsadli bajarilishi mavjud.

Bularning barchasini aytib bo'lgach, --specs = nosys.specs, biz semihosting qilmasligimizni bildiradi. Bu, odatda, biz qayta rejalashtirishimizni bildiradi. Bu bizni keyingi bayroqqa olib keladi.

nostdlib

Birlashtiruvchi -nostdlib optsiyasi mustaqil ishlash uchun mo'ljallangan dasturni ulash uchun ishlatiladi. -nostdlib individual variantlarni nazarda tutadi -nodefaultlibs va -nostartfiles. Quyida biz ikkita variantni alohida muhokama qilamiz, lekin eng odatiy foydalanish-bu bir martalik xaridlar uchun nostdlib. Hostlangan dasturni bog'lashda libc kabi standart tizim kutubxonalari sukut bo'yicha bog'lanib, dasturga barcha standart funktsiyalarga ruxsat beradi (printf, strlen va do'stlar). -Nodefaultlibs bog'lovchi varianti standart kutubxonalar bilan bog'lanishni o'chiradi; bog'langan yagona kutubxonalar -l bayrog'i yordamida bog'lovchiga aniq nom berganlar.

lgcc

libgcc.a - bu ma'lum mashinalarning kamchiliklarini bartaraf etish uchun ichki dasturlarni ta'minlaydigan standart kutubxona. Masalan, ARM protsessori bo'linish buyrug'ini o'z ichiga olmaydi. Libgcc.a ning ARM versiyasi bo'linish funktsiyasini o'z ichiga oladi va kompilyator kerak bo'lganda bu funktsiyaga qo'ng'iroqlar chiqaradi.

T

Bu bog'lovchiga ushbu faylni bog'lovchi skript sifatida ishlatishini aytishning bir usuli. Bizning holatda, fayl nomi linker.script.ld.

o'zim

Nihoyat, biz bog'lovchiga aytamizki, bizning qurilmamizda yonib ketadigan/o'chadigan yakuniy chiqish tasviri faylining nomi nima bo'ladi.

Bu bizning aniq holatimiz uchun o'zgartirilgan buyruq satrining to'liq versiyasi:

arm -none -eabi -gcc core.o -mcpu = cortex -m4 -mumbumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./linker.script.ld -o main.elf

Biz skript fayli va core.o fayllari bir xil katalogda joylashganligiga ishonch hosil qilamiz, bu erda biz yuqoridagi buyruq satrini ishga tushiramiz.

Va u hech qanday muammosiz bog'lanadi.

Chek

Keyin yuguramiz:

arm-none-eabi-nm main.elf

va biz olamiz:

devchu@chubox: ~/Development/Atollic/TrueSTUDIO/STM32_workspace_9.1 $ arm-none-eabi-nm main.elf 20014000 A _estack 08000010 t main_loop 08000008 T reset_handler 08000000 T vtable

Yaxshi ko'rinadi. Arm-none-eabi-nm buyrug'i-ob'ekt fayllaridagi belgilarni ro'yxatga olish usuli.

10-qadam: STM32 Nucleo-64 ga ulanishni test qilish

STM32 Nucleo-64 ga ulanish
STM32 Nucleo-64 ga ulanish
STM32 Nucleo-64 ga ulanish
STM32 Nucleo-64 ga ulanish

Sizning birinchi vazifangiz, agar siz uni qabul qilishni tanlasangiz, sizning tizimingizni rivojlanish taxtasini ko'rishdir.

Windows -dan foydalanish

Windows uchun men TrueSTUDIO -ni Atollic -dan o'rnatishga qaror qildim (bepul versiya). Bu og'riqsiz o'rnatish edi va u avtomatik ravishda drayverni o'rnatdi, shuning uchun ulanishni tekshirish uchun st-linkdan foydalanishim mumkin edi. TrueSTUDIO -ni o'rnatganimdan va qurilma menejeri qurilmani ko'rganidan so'ng, biz kuzatayotgan "Bare Metal" maqolasi tomonidan tavsiya etilgan texan/stlink vositalarini yukladim. Men yana papkani to'g'ridan -to'g'ri "C: \" ostiga qo'ydim va yana mahalliy cygwin uy qutisidan buyruqlarga havolalar yaratdim.

ln -s /c/STM32. MCU/stlink-1.3.0-win64/bin/st-info.exe ~/bin/st-info

Biz, albatta, qurilma bilan muloqot qila olamizmi yoki yo'qligini bilish uchun birinchi sinov sifatida men yugurdim:

st-info-prob

Va qaytib keldi:

1 ta stlink dasturchisi topildi

Endi biz bilamizki, biz rivojlanish panelida gaplashishimiz/so'rashimiz mumkin.

Linuxdan foydalanish

Linux uchun sizga haydovchi kerak emas. Ammo Debian uchun siz st vositalarini manbadan yaratishingiz kerak bo'ladi.

git klon

Libusb-1.0-0-dev o'rnatilganligiga ishonch hosil qiling.

mos ro'yxat | grep -E "*libusb.*dev*"

Siz ko'rishingiz kerak:

libusb-1.0-0-dev/xenial, hozir 2: 1.0.20-1 amd64 [o'rnatilgan]

yoki shunga o'xshash narsa.

Uni o'rnatish uchun:

sudo apt-get libusb-1.0-0-dev o'rnatish

E'tibor bering, yuqorida aytilganlar bir xil emas:

sudo apt-get libusb-dev ni o'rnating

To'g'ri yo'qolgan libusb dev cmake bilan bog'liq muammolarga olib kelishi mumkin.

CMake xatosi: Ushbu loyihada quyidagi o'zgaruvchilar ishlatiladi, lekin ular NOTFOUND ga o'rnatiladi. Iltimos, ularni o'rnating yoki CMake fayllarida to'g'ri o'rnatilgani va tekshirilganligiga ishonch hosil qiling: LIBUSB_INCLUDE_DIR (ADVANCED)

Loyihaning asosiy katalogini o'zgartiring (… blah /blah /stlink). "Chiqarish" qiling.

Shundan so'ng, asboblar ".. /build /Release" ostida bo'lishi kerak.

Keyin "st-info --probe" ni ishga tushirishingiz mumkin. Bu erda Nucleo ulangan chiqish, lekin yo'q.

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeFound 1 stlink programmerers serial: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "chirog'i: 524288 (sahifa o'lchami: 2048) sram: 65536 chipid: 0x0446 tavsif: F303 yuqori zichlikli qurilma devchu@chubox: ~/Development/stlink $./build/Release/st- info --probe Topildi 0 stlink dasturchilari devchu@chubox: ~/Development/stlink $

11 -qadam: Linux bilan GDB dan foydalanamiz

Linux bilan GDB dan foydalanamiz
Linux bilan GDB dan foydalanamiz
Linux bilan GDB dan foydalanamiz
Linux bilan GDB dan foydalanamiz

Agar siz bularning barchasini sinab ko'rgan bo'lsangiz va shu darajaga erishgan bo'lsangiz - ajoyib! Zo'r. Keling, biroz dam olaylik.

Qachonki siz ushbu ARM ishlab chiqish platalarini sotib olsangiz, xoh ular MSP432 Launchpad Texas Instruments-dan, xoh hozir biz muhokama qilayotgan Nucleo-F303 (STM32 Nucleo-64), ular odatda ishlaydigan dastur bilan yonib-o'chib turadi. LEDlarning yonish tezligini o'zgartirish uchun kalitni bosishni ham o'z ichiga oladigan ko'zni qamashtiruvchi dastur.

Buni yozishga shoshilishimizdan oldin, nima qilish va nima qilish kerakligini ko'rib chiqaylik.

Linux bilan terminal oching, biz qurgan stlink git loyihasining katalogini o'zgartiring va st-util vositasini toping.

devchu@chubox: ~/Development/stlink $ find. -st-util nomi

./build/Release/src/gdbserver/st-util

Ushbu vositani ishga tushiring. Biz ilgari st-info --probe bilan aloqani sinab ko'rganimiz uchun, biz shunday natijalarga ega bo'lishimiz kerak:

devchu@chubox: ~/Development/stlink $./build/Release/src/gdbserver/st-util

st-util 1.4.0-50-g7fafee2 2018-10-20T18: 33: 23 INFO common.c: Qurilma parametrlari yuklanmoqda…. 2018-10-20T18: 33: 23 INFO common.c: Ulangan qurilma: yuqori zichlikli F303, id 0x10036446 2018-10-20T18: 33: 23 INFO common.c: SRAM hajmi: 0x10000 bayt (64 KiB), Flash: 0x80000 bayt (512 KiB) 2048 baytli sahifalarda 2018-10-20T18: 33: 23 INFO gdb-server.c: Chip identifikatori 00000446, yadro identifikatori 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: *: 4242 da tinglanmoqda…

Bu GDB serveri hozir ishlayapti va u bizning ishlab chiqarish kartamizni ko'radi, va eng muhimi, u 4242 portini (standart port) tinglaydi.

Endi biz GDB mijozini o'chirishga tayyormiz.

Linuxda boshqa terminalni oching, uni kiriting:

arm-none-eabi-gdb -tui

Bu gdb buyruqlar satrini ishga tushirish bilan bir xil, lekin uning o'rniga matnga asoslangan terminal ishlab chiqariladi (menimcha, u qarg'ish ishlatadi).

Bizda GDB mijozi va GDB serveri ishlaydi. Biroq, mijoz serverga ulanmagan. Hozirda u bizning Nucleo (yoki siz tanlagan taxta) haqida hech narsa bilmaydi. Buni aytishimiz kerak. Terminalda sizning so'rovingiz endi "(gdb)" bo'lishi kerak. Kirish:

maqsadga yordam berish

Bu sizga ro'yxatni beradi. E'tibor bering, biz xohlagan kengaytirilgan masofadan boshqarish pulti - Uzoq kompyuterni ketma -ket chiziq orqali ishlating.

Lekin biz unga joyni ham berishimiz kerak. Shunday qilib, (gdb) buyrug'iga kiriting:

(gdb) maqsadli kengaytirilgan masofaviy localhost: 4242

Siz shunday javobni qaytarishingiz kerak:

(gdb) maqsadli kengaytirilgan masofaviy localhost: 4242

Localhost yordamida masofaviy disk raskadrovka: 4242 0x080028e4 in ?? ()

Ayni paytda, st-util gdbserver ishlaydigan terminalda biz buni oldik:

2018-10-20T18: 42: 30 INFO gdb-server.c: 6 soatlik to'xtash nuqtasi registrlari topildi

2018-10-20T18: 42: 30 INFO gdb-server.c: GDB ulangan.

12 -qadam: Windows va Flash dasturlari bilan takrorlaymiz

Keling, Windows va Flash bilan dasturimizni takrorlaymiz
Keling, Windows va Flash bilan dasturimizni takrorlaymiz
Keling, Windows va Flash bilan dasturimizni takrorlaymiz
Keling, Windows va Flash bilan dasturimizni takrorlaymiz
Keling, Windows va Flash bilan dasturimizni takrorlaymiz
Keling, Windows va Flash bilan dasturimizni takrorlaymiz

St-util gdbserver va arm-none-eabi-gdb mijozini ishga tushirish bosqichlari, avvalgi qadamda qilganimiz bilan bir xil. Siz ikkita terminalni ochasiz (cygwin, DOS cmd yoki Windows Powershell), st-util manzilini toping, ishga tushiring. Boshqa terminalda arm-none-eabi-gdb mijozini ishga tushiring. Yagona farq shundaki, -tui (terminalga asoslangan matn ko'rinishi) rejimi qo'llab -quvvatlanmaydi.

Agar yuqorida aytilganlar Windows -da ishlagan bo'lsa, ehtimol siz (faqat mijoz) to'xtashingiz kerak bo'ladi. Shu nuqtada, siz qandaydir tarzda GDB mijozini ishga tushirishingiz kerak bo'ladi ("core.out") yoki bu faylga butun yo'lni GDB mijoziga argument sifatida qo'shishingiz kerak bo'ladi.

Men cygwin -dan foydalanib va mening mahalliy $ HOME // bin katalogimdan ikkala vosita joylashgan havolalar yaratish orqali o'z hayotimni soddalashtirdim.

OK, biz avvalgidek kompilyatsiya qildik va havola qildik va bizda main.elf faylini o'chirishga tayyor.

Bizda bitta oynada ishlaydigan st-util bor. Biz GDB mijozini qayta ishga tushiramiz, bu safar:

arm-none-eabi-gdb main.elf

Biz uni ishga tushiramiz, (gdb) so'rovini kutamiz, GDB serveriga ulanish buyrug'ini bajaramiz (st-util) va biz bajariladigan faylni o'chirishga tayyormiz. Bu juda iqlimga qarshi:

(gdb) yuk

Cygwin terminallari bilan ishlayotganingizda, ba'zida konsol buyruqlari chiqmayotganligi ma'lum. Shunday qilib, bizning holatimizda, server ishlaydigan deraza butunlay jim edi. Biz yukni ishga tushirgan mijozni boshqaradigan kishi buni chiqaradi:

Bo'lim yuklanmoqda.txt, hajmi 0x1c lma 0x8000000O'tish manzili 0x8000000, yuklanish hajmi 28 O'tkazish tezligi: 1 KB/sek, 28 bayt/yozish.

13 -qadam: Linux bilan yonish - ko'proq mukofot: D

Linux bilan miltillash - ko'proq mukofot: D
Linux bilan miltillash - ko'proq mukofot: D

14 -qadam: Keling, bir oz chuqurroq sho'ng'iylik

Agar siz bu erga kelsangiz, ajoyib. Keling, davom etamiz.

Nima uchun main.elf faylining ichki qismiga qaramaysiz? Quyidagilarni ishga tushiring:

arm-none-eabi-objdump -d main.elf

Siz shunga o'xshash narsani ko'rishingiz kerak:

main.elf: fayl formati elf32-littlearm

Matnni qismlarga ajratish.

08000000:

8000000: 00 40 01 20 09 00 00 08.@. ….

08000008:

8000008: 4802 ldr r0, [kompyuter, #8]; (8000014) 800000a: 4685 mov sp, r0 800000c: 4f02 ldr r7, [kompyuter, #8]; (8000018) 800000e: 2000 ta r0, #0

08000010:

8000010: 3001 r0, #1 qo'shadi 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef

Yuqoridagi chiqishdan qanday kichik nuggetlarni olishimiz mumkin?

Agar siz linker.script.ld faylini muhokama qilayotganimizda va yaratganimizda eslasangiz, biz bu ARM qurilmalarida RAM 0x20000000 dan boshlanadi, FLASH xotirasi esa 0x08000000 dan boshlanadi.

Shunday qilib, biz ko'rishimiz mumkinki, dastur haqiqatan ham FLASH xotirasida joylashgan.

Keyin, yuqorida, lekin keyingi bosqichda, "Salom dunyo" qismini muhokama qilayotganimizda, biz MCU yadro registriga ("R7") zudlik bilan, doimiy qiymatini ("0xDEADBEEF") yuklaydigan bayonot bor edi.

Bayonot quyidagicha edi:

LDR R7, = 0xDEADBEEF

Bizning kodimizda bu faqat DEADBEEF haqida gapiradigan yagona joy. Boshqa joy yo'q. Va shunga qaramay, agar siz yuqoridagi demontaj qilingan/rekonstruksiya qilingan ko'rsatmalarga va boshqalarga qarasangiz, DEADBEEF bilan bog'liq narsalar biz o'ylagandan ko'ra ko'proq.

Shunday qilib, kompilyator/bog'lovchi DEADBEEF qiymatini 0x8000018 manzilidagi FLASH manziliga doimiy ravishda o'chirishga qaror qildi. Va keyin, kompilyator yuqoridagi LDR ko'rsatmasini o'zgartirdi:

LDR R7, [Kompyuter, #8]

Hatto biz uchun sharh ham yaratdi. Qanday yaxshi. Va u bizga dasturning hisoblagichining joriy qiymatini (kompyuter registri) olishni, bu qiymatga 0x8 qo'shishni va shu erda DEADBEEF yoqilganligini va bu qiymatni olish va uni R7 ga to'ldirish kerakligini aytadi.

Bu shuni anglatadiki, dastur hisoblagichi (kompyuter) main_loop -ning boshlanishi bo'lgan 0x8000010 manzilini ko'rsatgan va DEADBEEF qiymati main_loop tugagandan so'ng ikkita manzilda joylashgan.

15 -qadam: Nihoyat, ishlayotgan dasturga qisqacha nazar

Agar siz GDB-dan chiqsangiz ham, buyruqni qayta kiriting. Siz unga hech qanday faylni berishingiz shart emas; biz endi miltillamaymiz, faqat uni ishga tushiramiz.

GDB mijozini GDB serveriga qayta ulaganingizdan so'ng, (gdb) buyruq satrida:

(gdb) axborot registrlari

Siz shunga o'xshash narsani ko'rishingiz kerak:

r0 0x0 0

r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x20014000 0x20014000 lr 0xffff008 cpx 080 0

Ammo keyin (gdb) buyrug'iga kiriting:

(gdb) davom eting

Va juda tez CTRL-C ni bosing. Bu dasturni to'xtatishi kerak. "Ma'lumot registrlari" buyrug'ini yana kiriting.

Bu safar u boshqacha ko'rinadi:

(gdb) axborot registrlari

r0 0x350ffa 3477498 r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0xdeadbeef 3735928559 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0x1200x10 0x1200x1200 16777216

Nima bo'ldi? Aynan biz xohlagan narsa. DEADBEEF R7 -ga yuklangan va R0 (juda tez) ortib bormoqda. Agar takrorlasangiz, R0 ni boshqa qiymat bilan ko'rasiz.

16-qadam: Biz Flashda faqat o'qish uchun massiv yaratmoqchi edik

O'rnatish va ko'rsatmalar yordamida massiv ekvivalentini yaratishning bir usuli quyidagicha:

.type myarray, %object // "myarray" nomi yoki yorlig'i ob'ekt turi sifatida belgilanadi.

myarray: // bu "myarray" e'lonining boshlanishi // (u nimadan iborat bo'ladi)..word 0x11111111 // "myarray" tarkibidagi birinchi a'zo yoki qiymat..word 0x22222222 // ikkinchi qiymat (qo'shni manzillar)..word 0x33333333 // va boshqalar..size myarray,.-myarray // derleyici/assembler endi "myarray" ning oxiri yoki // chegarasini biladi.

Endi biz uni FLASH xotirasida o'rnatdik, uni dasturda ishlatishimiz mumkin. Quyida bir qism:

LDR R1, myarray // bu "myarray" ning 1 -joyidagi ma'lumotlarni yuklaydi. ' // bu biz xohlagan narsa emas.

LDR R1, = myarray // bu joylashuv qiymatini o'zi yuklaydi (1 -manzil), // ma'lumotlar emas.. // bu biz xohlagan narsa.

MOV R2, #0 // R2 biz ketmasligimizga ishonch hosil qilish uchun hisob -kitob qiladi

// qator oxiri. LDR R3, = myarrsize // R3 "myarrsize" ga teng bo'ladi.

// R0 bizning ma'lumotlarimizni saqlaydi

main_loop:

LDR R0, [R1] // R1 ('myarray') ko'rsatgan ma'lumotlarni R0 ga yuklang. CMP R2, R3 // Biz qator chegarasida turibmizmi? BEQ main_loop // Agar shunday bo'lsa, biz tugatdik, shuning uchun biz abadiy aylanib o'tamiz.

ADD R2, #1 // Aks holda, biz qator orqali takrorlashni davom ettira olamiz.

ADD R1, #4 // R1 -ni ro'yxatdan o'tkazish uchun 4 -ni qo'shing, shunda u to'g'ri keyingi ko'rsatiladi

// manzil..

B main_loop // Orqaga burilish.

Video bularning barchasidan o'tadi va unda xato bor. Bu yaxshi; bu muhim ishga tushirish va disk raskadrovka kodi ekanligini ko'rsatadi. Bu massiv oxiridan chiqib ketishning klassik holatini ko'rsatadi.

Tavsiya: