Мазмуну:

Part 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps
Part 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps

Video: Part 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps

Video: Part 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps
Video: Part 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo 2024, Ноябрь
Anonim
Image
Image

Бул Нускаманын фокусу STM32 Nucleo микро контроллери. Бул үчүн мотивация жылаңач сөөктөрдөн монтаждоо долбоорун түзө алат. Бул бизге тереңирээк изилдөөгө жана MSP432 Launchpad долбоорун (TI-RSLK) түшүнүүгө жардам берет, ал буга чейин бир нече Instructables темасы болгон.

Code Composer Studio колдонуп, MSP432 үчүн бир гана монтаж долбоорун түзүүгө онлайнда эч кандай жардам жок. Буга чейин биз мурунтан эле бар болгон монтаждоо долбоорунан көчүрүп/чаптап келгенбиз. Бул ыкма бизге жакшы кызмат кылды.

Бирок, азыр, Lab 7 үчүн, биз бир аз көйгөйгө туш болдук. Же жок дегенде убактылуу хикап. Лаборатория 7 чектүү машиналарды киргизет жана биз биринчи кезекте кездешүүчү нерсе-бул бир катар баалуулуктарды түзүү жана колдонуу. TI курсу негизинен C программалоону колдонгондуктан - бул көйгөй эмес. Бирок бул Нускамалар С эмес, чогултууга багытталган.

Андан тышкары, массив окуу үчүн гана мааниге ээ болгондуктан, аны оперативдүү эс тутумга эмес, флеш-эске коюу жакшы болмок.

STM32 MCUну колдонуу менен монтаждоо долбоорлору үчүн интернетте дагы көп жардам бар окшойт, демек, биз бул Нускамадан баштайбыз, үйрөнүлгөндөрдү колдонуу максатында, андан кийин MSP432ге жана Code Composer Studioго кайрылабыз.

Ошол максатка жетүү жолунда, дагы бир популярдуу микро контроллер менен тажрыйбага ээ болобуз.

1 -кадам: Түзмөктүн алгачкы сыноосу

Түзмөктүн алгачкы сыноосу
Түзмөктүн алгачкы сыноосу
Түзмөктүн алгачкы сыноосу
Түзмөктүн алгачкы сыноосу
Түзмөктүн алгачкы сыноосу
Түзмөктүн алгачкы сыноосу

Дагы, эмне үчүн өзгөчө STM32 Nucleo тандап алыш керек?

Чынын айтсам? Анткени мен ARM контролерлору үчүн жылаңач темирди чогултуу долбоорлору боюнча жакшы макалаларды издеп жүрүп, мен бул серияга туш болдум. Ошондой эле STM32 популярдуу MCU окшойт.

Мен бир аз изилдөө жүргүздүм (тандоо үчүн көптөгөн версиялар бар - жогорудагы сүрөттү караңыз), бирок аягында мен Amazon (АКШда) колдоноюн деп жаткандыктан, чынында эмнеге ээ боло алам.

Бул жөнөкөй, бирок профессионалдык пакетте, кээ бир баштоо инструкциялары менен келет. Контроллерге өрттөлгөн демо биз мурунку Instructables'да дээрлик эмне кылганыбызды көрүү бир аз күлкүлүү болду - LED жарк этип, баскычты басуу менен ылдамдыгын өзгөртөт.

Бул өнүгүү тактасы MSP432ге абдан окшош, анткени 2 LED жана бир колдонуучу баскычы бар окшойт. MSP432де 2 колдонуучу баскычы бар.

Сүрөттөрдөн көрүнүп тургандай, тактада микро USB эмес, мини бар экенине бир аз таң калдым. Шнур сатып алуу үчүн чуркап чыгууга туура келди.

Дагы бир жакшы тест - аны компьютериңизге туташтырганыңызда (мен Linux кутучасын колдонуп жатам), ал менин файл менеджеримде "NODE_F303RE" деп аталган файлдык система катары көрүнөт. Ачуу эки файлды ачат, бир HTML жана бир текст.

Болду, бирок, жок дегенде, ошондой эле туташуу абдан оңой көрүнөт дейт.

Эми биз баштоого даярбыз.

Мен IVONOMICON Bare Metal макалалар сериясындагы жакшы маалыматтарды кайталабоого аракет кылам, тескерисинче аны көбөйтөм.

2 -кадам: Essentials

Бизге керек болгон биринчи нерсе - компилятор.

Анан бизге мүчүлүштүктөрдү оңдоочу керек:

devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabiRacking пакеттердин тизмеси… Бүттү Көз карандылык дарагы Мамлекеттин маалыматын окуду… Даяр Төмөнкү ЖАҢЫ топтомдор орнотулат: gdb-arm-none-eabi 0 жаңыртылды, 1 жаңы орнотулган, 0 алып салуу жана 8 жаңыртылган эмес. 2, 722 кБ архивди алуу керек. Бул операциядан кийин 7, 738 кБ кошумча диск мейкиндиги колдонулат. Алуу: 1 https://us.archive.ubuntu.com/ubuntu xenial/аалам amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 kB] 2, 722 кБ 1с ичинде алынган (1, 988 kB/s) Мурда тандалбаган gdb-arm-none-eabi пакетин тандоо. (Окуу базасы… 262428 файлдар жана каталогдор учурда орнотулган.) Таңгактоого даярдалууда…/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb… gdb-arm-none-eabi (7.10-1ubuntu3+9) таңгактан чыгарылууда… Иштетилүүдө man-db (2.7.5-1) үчүн триггерлер… gdb-arm-none-eabi (7.10-1ubuntu3+9) орнотуу…

3 -кадам: Essentials - Windows

Жогорудагы кадам биз Linuxту колдонуп жатабыз деп ойлогон. Биз Windows колдонуп жатсакчы?

Сиз Developer сайтына кире аласыз жана бир нече жүктөө параметрлери бар. Мен Windows 8 машинасын колдонуп жатам.

Орнотуу учурунда, мен аны cygwin колдонуп жүргөндүктөн, аны Программа Файлдарынын ордуна "C: \" дискине орнотууну чечтим жана менин жергиликтүү кутумдан тамыр C: папкасына шилтеме түзүү баарына караганда оңой болду. Программа файлдарынын жолунда башаламандык (боштуктар менен ж. б.).

Ошентип, менин cygwin чөйрөм жана жолум ж. Б.

C: / cygwin64 / home / bin / arm-none-eabi-gcc, бул жерде arm-none-eabi-gcc C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc.

Мен кийин cygwin home астында "dev" папкасын түздүм, ошол жерде мен core. S файлын жайгаштырып, компилятордун буйругун аткардым. (компилятор үчүн төмөндө караңыз).

Мен gdb (arm-none-eabi-gdb) үчүн так ушундай кылдым.

4 -кадам: Негиздери деген эмне?

Ошентип, "gcc-arm-none-eabi" деген эмне?

Gnu компилятору (GCC) программалоо тилдерин (C сыяктуу) иштеп жаткан машинанын эне кодуна чогултат. Мисалы, эгер сиз Windows машинаңызда GCCди колдонуп, кээ бир С кодун түзө турган болсоңуз, ал Windows машинасында иштөө үчүн курулган. Түзүлгөн аткаруучу ARM микро контроллеринде иштебейт (адатта).

Ошентип, ARM микро контроллерине жүктөлүп жана өрттөлүүчү программаларды куруу үчүн (биздин учурда STM32 Nucelo болмок), биз GCCге дагы бир нерсени беришибиз керек: "кайчылаш компиляциялоо". Башкача айтканда, аткарылуучу файлды жаратуу жөндөмү, анын тутумдук системасы (жана процессору) үчүн эмес, максаттуу система үчүн (ARM микро контроллери). Бул жерде "gcc-arm-none-eabi" ойнойт.

Анда "gdb-arm-none-eabi" деген эмне?

Микро контроллерге жаңы түзүлгөн аткарылуучу файлды жүктөп, өрттөп (жаркылдатып) койгондон кийин, биз, балким, аны мүчүлүштүктөрдү оңдоону каалайбыз. GDB gnu мүчүлүштүктөрдү оңдоочу болуп саналат жана ал дагы өз ишин аткаруунун жолун талап кылат, бирок башка системага багытталган.

Ошентип, gdb-arm-none-eabi GDB үчүн, gcc-arm-none-eabi-GCC үчүн.

Дагы бир сунушталган пакетти орнотуу "libnewlib-arm-none-eabi" болду. Бул эмне?

Newlib - камтылган системаларда колдонууга арналган C китепканасы жана математикалык китепкана. Бул китепкананын бир нече бөлүгүнүн конгломерациясы, бардыгы бекер программалык камсыздоонун лицензиялары астында, аларды камтылган продукцияларга оңой колдонууга мүмкүнчүлүк берет.

Акыры, пакет "libstdc ++-arm-none-eabi". Бул абдан ачык; бул кайчылаш компилятор үчүн C ++ китепканасы; камтылган ARM микро контроллери үчүн.

5 -кадам: Linker File

Linker файлы
Linker файлы
Linker файлы
Linker файлы

Келгиле, байланыштыруучу сценарий түзөлү.

Бул файлдагы бир негизги бөлүк же блок MEMORY буйругу болмок.

--- sourceware.org сайтынан:

Шилтеменин демейки конфигурациясы бардык жеткиликтүү эс тутумун бөлүштүрүүгө мүмкүндүк берет. Сиз MEMORY буйругун колдонуу менен муну жокко чыгара аласыз. Сиз шилтемечи тарабынан кайсы эстутум аймактары колдонулушу мүмкүн экендигин жана кайсы эс тутум аймактарынан алыс болушу керектигин сүрөттөө үчүн колдоно аласыз. Сиз андан кийин белгилүү бир эс тутумуна бөлүмдөрдү дайындай аласыз. Шилтемечи эс тутум аймактарына негизделген бөлүм даректерин коёт жана өтө толуп кеткен аймактар жөнүндө эскертет. Шилтемечи жеткиликтүү региондорго туура келүү үчүн бөлүктөрдү аралаштырбайт. Шилтеме сценарийи MEMORY командасынын көп колдонулушун камтышы мүмкүн, бирок аныкталган бардык эс блоктору бир MEMORY командасынын ичинде көрсөтүлгөндөй кабыл алынат.:

ЭСТЕЛИ

{аты [(attr)]: ОРИГАН = келип чыгышы, УЗУНДУГУ = лен…}

Макалада мисал:

/* Оперативдүү эс тутумунун чегин жана стек эс тутумунун чегин аныктаңыз* //* (STM32F031x6 линиясындагы 4KB SRAM, 4096 = 0x1000)*//* (RAM 0x20000000 дарегинен башталат) _estack = 0x20001000;

ЭСТЕЛИ

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

Ошентип, биз такта үчүн канча FLASH (программабыз жана туруктууларыбыз үчүн) жана канча RAM (программада колдонуу үчүн; үймөк жана стек ж. Бул бир аз кызыктуу болот.

Nucleo менен келген сонун кичинекей карта флеш -эси 512 Кбайт, SRAM 80 Кбайт экенин айтат. Бирок, аны USBге туташтырып, ал эки файлдан турган файл тутуму катары орнотулат жана файл менеджери да, GParted да 540+ Кбайттан ашык мейкиндикке ээ экенин көрсөтүп турат. (RAM?).

БИРОК, файл менеджеринин жардамы менен эки файлды жок кылууга аракет кылып, ажыратып, анан кайра туташтырып, дагы эле эки файлды көрсөтөт. (жана файл менеджери бир нерсени тааныды, анткени ар бир файлда кичине "кулпу" сүрөтчөсү бар.

Андыктан картадагы цифралар менен баралы. Ошентип, азыр биз жогорудагы мисалды алып, аны биздин тактайга айландырабыз.

Сиз жалпы эс тутумдан белгилүү бир байтка өтүү үчүн ушул онлайн эс тутумун алмаштыргычты колдонууну каалашыңыз мүмкүн.

Андан кийин сиз ондукту ондуктан он алтылыкка чейин алмаштыргыңыз келиши мүмкүн.

/ * Оперативдүү эс тутумунун чегин жана стек эсинин чегин аныктаңыз */

/* (STM32F031x6 линиясындагы 4KB SRAM, 4096 = 0x1000)* //* мисал*/

/ * 1 -кадам: (STM32F303RE боюнча 80KB SRAM, 81920 = 0x14000) * // * биздин такта */

/* 2 -кадам, он алтылык өлчөмүн hex баштапкы дарегине кошуңуз (төмөндө). */

/ * (RAM 0x20000000 дарегинен башталат) */

_estack = 0x20001000; /* мисал */

_estack = 0x20014000; / * биздин башкармалык */

ЭСТЕМЕ {

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

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

}

Келгиле, жогорудагы файлды "linker.script.ld" деп атайлы.

6 -кадам: Вектордук таблица

Вектордук таблица
Вектордук таблица

Азыр биз кичинекей монтаж файлын түзөбүз (директивалар менен), эң негизги үзгүлтүккө учуроо үчүн. Биз макаланын мисалын ээрчип, "core. S" аттуу файл түзөбүз.

Дагы, бул жерде мисал файлдын мазмуну, бирок мен биздин тактайга өзгөртүү киргиздим:

// Бул көрсөтмөлөр биздин чиптин атрибуттарын аныктайт

// биз колдоно турган ассамблея тили:.syntax unified /*Бул коддон кийин төмөндө караңыз* //*.cpu cortex-m0* / /*мисалдын бул сабын комментарийлеңиз* /.cpu cortex-m4 /* анын ордуна биздин башкармалыктын кортексин кошуңуз. бул кадамда жогорудагы сүрөттү көрүңүз * / /*.fpu softvfp * / / *мисалынын бул линиясын комментарийлеңиз * /.fpu vfpv4 / *ордуна биздин тактаны кошуңуз; анын FPU */.thumb // Глобалдык эс тутумдары бар..global vtable.global reset_handler / * * Чыныгы вектордук таблица. * Жөнөкөй болушу үчүн RAMдын көлөмү жана "баштапкы абалга келтирүү" гана киргизилген. */.type vtable, %object vtable:.word _estack.word reset_handler. size vtable,.-vtable

Hmm.. No '.align' директивасы

Бирок, бул өтө маанилүү эмес. Бул тууралуу кененирээк (балким) кийинчерээк.

.syntax unified

.syntax [бирдиктүү | бөлүнгөн]

Бул директива ARM-Instruction-Set бөлүмүндө айтылгандай Instruction Set синтаксисин орнотот

9.4.2.1 Instruction Set синтаксиси Эки бир аз башка синтаксистер ARM жана THUMB көрсөтмөлөрүн колдойт. Демейки, бөлүнгөн, ARM жана THUMB инструкцияларынын өзүнчө синтаксистери болгон эски стилди колдонот.. Syntax директивасы аркылуу тандала турган жаңы, бирдиктүү синтаксис.

.fpu vfpv4

GCC компилятору калкып жүрүүчү чекитке карата бир нече варианттары бар экилик файлдарды чыгара алат: жумшак - CPUда FPU жок иштөөгө ылайыктуу - эсептөөлөр компилятор тарабынан түзүлгөн softfp - программалык камсыздоодо FPU менен же жок иштөө үчүн ылайыктуу - эгер бар болсо FPU колдонот. Биздин конкреттүү ишибиз үчүн (сиз өзүңүздүн изилдөөңүздү жүргүзүшүңүз керек), бул тактанын FPU vfpv4 ылайык келет. Муну менен ойношуңуз керек болот. Же аны softfpге калтырыңыз.

thumb (vs. arm)

Бул ARM микроконтроллери иш жүзүндө көрсөтмөлөрдүн аралашмасынан турат. Бири ARM, экинчиси THUMB. Бир айырмачылык 16 биттик көрсөтмө менен 32 биттик көрсөтмө. Ошентип, бул директива компиляторго кийинки көрсөтмөлөргө THUMB же ARM катары мамиле кылууну айтат.

Биз файлдын калганын ошол бойдон кабыл алабыз, анткени бул Нускамалар үзгүлтүккө учураган монтаждоо программасына кире элек.

7 -кадам: 'Hello World' Программасынын Ассамблея Версиясы

Төмөнкүлөр мурда түзүлгөн "core. S" файлына да кире алат. Бул дагы, макаланын мисалынан.

/ * * Баштапкы абалга келтирүүчү. Баштапкы абалга чакырылды. */.type reset_handler, %function reset_handler: // Стек көрсөткүчүн стектин аягына коюңуз. // '_estack' мааниси биздин шилтеме сценарийибизде аныкталган. LDR r0, = _estack MOV sp, r0

// Кээ бир жасалма баалуулуктарды коюңуз. Бул баалуулуктарды көргөндө

// мүчүлүштүктөрдү оңдоочу түзмөгүбүздө, биздин программа // чипке жүктөлгөнүн жана иштеп жатканын билебиз. LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // 'r0' катталуу үчүн 1 кошуңуз. ADDS r0, r0, #1 // Loop back. B main_loop.өлчөмүн reset_handler,.-Reset_handler

Ошентип, жогоруда аталган программанын максаты - бир негизги MCU реестрине (бул учурда R7) таанылуучу үлгүнү жүктөө, жана нөлдөн башталган өсүү мааниси башка негизги MCU реестрине (бул учурда R0). Эгерде биз аткаруучу кодду басып өтсөк, анда R0 маалыматтарынын өсүшүн көрүшүбүз керек.

Эгерде сиз MSP432 жана TI-RSLK курсуна/лабораториясына байланыштуу Instructables менен бирге болгон болсоңуз, анда жогорудагы программанын дээрлик бардыгы сизге тааныш болушу керек.

Мен көргөн жаңы нерсе - R7ди каттоого "DEADBEEF" жүктөөдө "=" колдонуу. Биз муну колдонгон эмеспиз.

Бул жерде тиркелген "core. S" файлы толук булакты камтыйт.

8 -кадам: Кодду түзүү

Кээ бир буйрук саптарын жасоого убакыт келди. Акыры реалдуу бир нерсе.

Бирок, биз такыр жокпуз. Биз дагы макалада берилген буйрукту өзгөртүп, аны өзүбүздүн жагдайыбызга өзгөртүшүбүз керек.

Бул жерде коддун мисалы:

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

Эгерде биз GCC үчүн gnu.org сайтына кирсек, (бул учурда 7.3 версиясы),

x

-X -тилди көрсөтүү. Болбосо -x жок болсо, анда компилятор файл кеңейтүүсүн колдонуп болжолдоого аракет кылат. (биздин учурда *. S).

Макаланын жогорудагы мисалында cps менен assembler көрсөтүлгөн, бирок биз жөн эле монтаждоочу кыла алмакпыз.

c

-C "компиляция кыл, бирок шилтеме кылба" дейт.

O0

-O оптималдаштыруу деңгээлин орнотуу. -O0 (oh -zero) колдонуу "компиляция убактысын кыскартуу жана мүчүлүштүктөрдү оңдоону күтүлгөн натыйжаларга алып келет. Бул демейки" дейт.

mcpu = кортекс-m0

-Mcpu максаттуу процессордун атын көрсөтөт. Биздин учурда, бул cortex-m4 болмок.

бармак

-Mthumb ARM жана THUMB штаттарын аткаруучу кодду түзүү ортосунда тандоо көрсөтөт.

Уол

-Wall албетте абдан кеңири таралган жана белгилүү. Ал бардык эскертүү желектерин күйгүзөт.

Акыр -аягы, буйруктун аягында бизде кирүү файлы core. S жана чыгаруу файлы core.o.

Бул жерде биздин конкреттүү ишибизге ылайык келген жаңы буйрук сабы.

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

Жана бул түзүлдү.

9 -кадам: Программаны байланыштыруу

Түздөн -түз макаланын мисалында, бизде:

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

Сиз көргөндөрдүн көбү. Төмөндө эмне жаңылык.

specs = nosys.specs

Бул түшүндүрүү үчүн бир аз татаал.

Бул "semihosting" жана "retargeting" менен, ал эми киргизүү / чыгаруу менен байланыштуу. Бул ошондой эле тутумдук чалууларга жана китепканаларга байланыштуу.

Адатта, камтылган системалар стандарттык киргизүү/чыгаруу түзмөктөрүн бербейт. Бул тутум же китепкана чалууларына таасирин тийгизет (мисалы: printf ()).

Semihosting мүчүлүштүктөрдү оңдогучту билдирет (11 -кадамдагы мүчүлүштүктөрдү оңдоочу бөлүгү кызыл менен тегеректелген) атайын каналга ээ жана semihosting протоколун колдонот, жана сиз hostf машинасында printf () чыгарылышын көрө аласыз (мүчүлүштүктөрдү оңдоочу аркылуу).

Кайра кароо, экинчи жагынан, ошол эле система же китепкана чалуулары башка нерсени билдирет. Алар башка нерсени жасашат, бул камтылган система үчүн мааниси бар. Кандайдыр бир мааниде, printf () үчүн айткыла, бул функциянын жаңы ишке ашырылышы, кайра максаттуу ишке ашырылышы.

Мунун баарын айткандан кийин, --specs = nosys.specs биз семихостинг кылбайбыз дегенди билдирет. Бул, адатта, биз кайра максат кылып жатканыбызды билдирет. Бул бизди кийинки желекке алып келет.

nostdlib

-Nostdlib шилтемесинин тандоосу өзүнчө иштөөгө арналган программаны байланыштыруу үчүн колдонулат. -nostdlib жеке параметрлерди билдирет -nodefaultlibs жана -nostartfiles. Төмөндө биз эки вариантты өзүнчө талкуулайбыз, бирок эң типтүү колдонуу-бул бирдиктүү соода үчүн nostdlib. Устурулган программаны шилтемелегенде, libc сыяктуу стандарттык системалык китепканалар демейки боюнча шилтемеленип, программага бардык стандарттык функцияларга мүмкүнчүлүк берет (printf, стрлен жана достор). Linker -nodefaultlibs опциясы ошол демейки китепканалар менен байланыштырууну өчүрөт; шилтеме алган китепканалар -l желегин колдонуп, шилтеме берүүчүгө так атаган китепканалар.

lgcc

libgcc.a - бул белгилүү бир машиналардын кемчиликтерин жоюу үчүн ички программаларды камсыз кылган стандарттык китепкана. Мисалы, ARM процессорунда бөлүү көрсөтмөсү жок. Libgcc.aнын ARM версиясы бөлүнүү функциясын камтыйт жана компилятор керектүү жерде ошол функцияга чалууларды чыгарат.

Т

Бул шилтеме берүүчүгө бул файлды шилтеме скрипти катары колдонууну айтуунун бир жолу. Биздин учурда, файлдын аты linker.script.ld.

o main.elf

Акыр -аягы, биз шилтеме берүүчүгө биздин түзмөккө өрттөлүүчү/жаркырай турган акыркы чыгаруу сүрөтүнүн аталышы кандай болорун айтабыз.

Бул жерде биздин конкреттүү жагдайга ылайыкталган толук буйрук сабынын версиясы келтирилген:

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

Биз скрипт файлы менен core.o файлы экөө тең бир каталогдо экенине ынанабыз, ал жерде биз жогорудагы буйрук сабын иштетебиз.

Ал эч кандай көйгөйлөр менен байланыштырат.

Текшерүү

Андан кийин биз чуркайбыз:

arm-none-eabi-nm main.elf

жана биз алабыз:

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

Жакшы окшойт. Arm-none-eabi-nm буйругу-объект файлдарынын ичиндеги символдорду тизмектөө ыкмасы.

10-кадам: STM32 Nucleo-64 менен TestingConnection

STM32 Nucleo-64 менен туташуу
STM32 Nucleo-64 менен туташуу
STM32 Nucleo-64 менен туташуу
STM32 Nucleo-64 менен туташуу

Сиздин биринчи миссияңыз, эгер сиз аны кабыл алууну тандасаңыз, системаңызды өнүгүү тактаңызды көрүшүңүз керек.

Windows колдонуу

Windows үчүн мен TrueSTUDIOну Atollicтен (бекер версия) орнотууну чечтим. Бул оорутпаган орнотуу болчу жана ал автоматтык түрдө драйверди орнотту, ошондуктан мен туташууну текшерүү үчүн st-linkти колдоно алдым. Мен TrueSTUDIO орноткондон кийин жана түзмөк менеджери аппаратты көрдү, мен ээрчип жүргөн Bare Metal макаласы сунуштаган texan/stlink куралдарын жүктөп алдым. Мен дагы папканы түздөн -түз "C: \" астына коюп, кайра менин жергиликтүү cygwin үй кутумдан командаларга айрым шилтемелерди түздүм.

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

Түзмөк менен чындап сүйлөшө алаарыбызды көрүү үчүн алгачкы тест катары мен чуркадым:

st-info-проб

Анан кайра келди:

1 стлинк программисти табылды

Ошентип, азыр биз өнүгүү тактабыз менен сүйлөшө аларыбызды/сурай аларыбызды билебиз.

Linuxту колдонуу

Linux үчүн, чынында, айдоочунун кереги жок. Бирок Debian үчүн, сиз st куралдарын булактан түзүшүңүз керек болот.

git clone

Libusb-1.0-0-dev орнотулганын текшериңиз.

ылайыктуу тизме | grep -E "*libusb.*dev*"

Сиз көрүшүңүз керек:

libusb-1.0-0-dev/xenial, азыр 2: 1.0.20-1 amd64 [орнотулган]

же ушул сыяктуу нерсе.

Аны орнотуу үчүн:

sudo apt-get libusb-1.0-0-dev орнотуу

Эске алыңыз, жогоруда айтылгандар бирдей эмес:

Sudo apt-get libusb-dev орнотуу

Туура эмес libusb dev cmakeде көйгөйлөргө алып келиши мүмкүн.

CMake Error: Төмөнкү өзгөрмөлөр бул долбоордо колдонулат, бирок алар NOTFOUND деп коюлган. Аларды коюңуз же CMake файлдарында туура коюлганын жана текшерилгенин текшериңиз: LIBUSB_INCLUDE_DIR (ADVANCED)

Долбоордун түп каталогуна өзгөртүү (… blah /blah /stlink). "Чыгаруу" жасаңыз.

Андан кийин куралдар ".. /build /Release" астында болушу керек.

Андан кийин "st-info --probe" иштете аласыз. Бул жерде Nucleo туташып турган, бирок жок.

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeFound 1 stlink programmers serial: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "флеш: 524288 (барактардын өлчөмү: 2048) sram: 65536 чипи: 0x0446 сүрөттөмөсү: F303 жогорку тыгыздыктагы түзмөк devchu@chubox: ~/Development/stlink $./build/Release/st- info --probe Табылды 0 stlink программисттери devchu@chubox: ~/Development/stlink $

11 -кадам: Linux менен GDBди колдонолу

Linux менен GDB колдонолу
Linux менен GDB колдонолу
Linux менен GDB колдонолу
Linux менен GDB колдонолу

Эгерде сиз мунун бардыгын сынап көргөн болсоңуз жана буга чейин жеткен болсоңуз - эң сонун! Мыкты. Эми кичине көңүл ачалы.

Бул ARM иштеп чыгуу такталарын сатып алганда, алар MSP432 Launchpad of Texas Instruments болобу, же биз азыр талкуулап жаткан Nucleo-F303 (STM32 Nucleo-64), алар, адатта, иштеп жаткан программа менен жаркырап жетип келишет. LEDдин жаркыроо ылдамдыгын өзгөртүү үчүн которгучту басууну камтыган кээ бир жаркыраган программа.

Муну ашыкча жазуудан мурун, эмнени көрүп, эмне кылыш керек экенин карап көрөлү.

Linux менен терминалды ачыңыз, биз курган stlink git долбоорунун каталогун өзгөртүп, st-util куралын табыңыз.

devchu@chubox: ~/Development/stlink $ find. -аты st-util

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

Ошол куралды иштетүү. Биз буга чейин st-info --probe менен болгон байланышты сынап көргөндүктөн, биз төмөнкүдөй жыйынтыктарды алышыбыз керек:

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: Түзмөктүн параметрлери жүктөлүүдө…. 2018-10-20T18: 33: 23 INFO common.c: Туташкан түзмөк: F303 жогорку тыгыздык түзмөгү, id 0x10036446 2018-10-20T18: 33: 23 INFO common.c: SRAM өлчөмү: 0x10000 байт (64 KiB), Flash: 0x80000 байт (512 KiB) 2048 байт барактарда 2018-10-20T18: 33: 23 INFO gdb-server.c: Chip ID 00000446, Core ID 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: Угууда *: 4242…

Бул GDB сервери азыр иштеп жатат жана ал биздин өнүгүү тактабызды көрөт, эң негизгиси, ал 4242 портун (демейки порт) угуп жатат.

Эми биз GDB кардарын өчүрүүгө даярбыз.

Linuxто башка терминалды ачыңыз, муну киргизиңиз:

arm-none-eabi-gdb -tui

Бул gdb катуу буйрук сабын иштетүү менен бирдей, бирок анын ордуна текстке негизделген терминал чыгарат (менин оюмча, ал каргыштарды колдонот).

Бизде GDB кардары жана GDB сервери иштеп жатат. Бирок, кардар серверге туташкан эмес. Учурда ал биздин Nucleo (же сиз тандаган такта) жөнүндө эч нерсе билбейт. Аны айтыш керек. Терминалда сиздин сурооңуз азыр "(gdb)" болушу керек. Кирүү:

жардам берүү максаттуу

Бул сизге тизме берет. Белгилей кетчү нерсе, биз каалаганыбыз узартылган алыстан - Сериялык линия аркылуу алыскы компьютерди колдонуңуз.

Бирок биз анын жайгашкан жерин да беришибиз керек. Ошентип, (gdb) көрсөтмөсүнө киргизиңиз:

(gdb) максаттуу кеңейтилген алыскы localhost: 4242

Сиз мындай жоопту кайтарышыңыз керек:

(gdb) максаттуу кеңейтилген алыскы localhost: 4242

Localhostтун жардамы менен алыстан мүчүлүштүктөрдү оңдоо: 4242 0x080028e4 in ?? ()

Ошол эле учурда, st-util gdbserver иштеп жаткан терминалда биз муну алдык:

2018-10-20T18: 42: 30 INFO gdb-server.c: 6 hw тыныгуу чекитинин регистрлери табылды

2018-10-20T18: 42: 30 INFO gdb-server.c: GDB туташты.

12 -кадам: Келгиле, Windows жана Flash программабыз менен кайталайлы

Келгиле, кайталайбыз, Windows жана Flash программасы менен
Келгиле, кайталайбыз, Windows жана Flash программасы менен
Келгиле, кайталайбыз, Windows жана Flash программасы менен
Келгиле, кайталайбыз, Windows жана Flash программасы менен
Келгиле, кайталайбыз, Windows жана Flash программасы менен
Келгиле, кайталайбыз, Windows жана Flash программасы менен

St-util gdbserver жана arm-none-eabi-gdb кардарын иштетүү кадамдары негизинен биз мурунку кадамда жасаган кадамдарыбызга окшош. Сиз эки терминалды ачасыз (cygwin, DOS cmd же Windows Powershell), st-utilдын жайгашкан жерин таап, иштетиңиз. Башка терминалда arm-none-eabi-gdb кардарын иштетиңиз. Жалгыз айырмасы, -tui (терминалга негизделген текстти көрүү) режими колдоого алынбайт.

Эгерде жогоруда Windowsта иштеген болсо, анда, балким, токтотушуңуз керек болот (жөн гана кардар). Бул учурда, кандайдыр бир жол менен сиз GDB кардарын сиздин файлыңыз турган жерде иштетишиңиз керек ("core.out"), же GDB кардарына аргумент катары ошол файлдын бардык жолун кошушуңуз керек.

Мен cygwinди колдонуу менен жана менин жергиликтүү $ HOME // bin каталогумдан ошол куралдар экөө тең турган шилтемелерди түзүү менен жашоомду жөнөкөйлөттүм.

Макул, биз мурункудай эле түзүлүп, шилтемелендик, жана main.elf файлы жаркыроого даяр.

Бизде st-util бир терезеде иштейт. Биз GDB кардарын кайра баштайбыз, бул жолу:

arm-none-eabi-gdb main.elf

Биз аны иштетүүгө уруксат беребиз, (gdb) көрсөтмөсүн күтөбүз, GDB серверине (st-util) туташуу буйругун аткарабыз жана биз аткарылуучу файлды жаркыратууга даярбыз. Бул абдан климатка каршы:

(gdb) жүк

Cygwin терминалдары менен иштөө, кээде консоль буйруктары чыкпай турган белгилүү маселе бар. Ошентип, биздин учурда, серверди иштеткен терезе таптакыр унчукпай калды. Клиентти иштеткен адам, биз жүктү иштеткенбиз, муну чыгарат:

Бөлүм жүктөлүүдө.текст, өлчөмү 0x1c lma 0x8000000 Баштоо дареги 0x8000000, жүктөө өлчөмү 28 Өткөрүү ылдамдыгы: 1 КБ/сек, 28 байт/жазуу.

13 -кадам: Linux менен жаркыроо - Көбүрөөк сыйлык: Д

Linux менен жаркылдоо - Көбүрөөк сыйлык: Д
Linux менен жаркылдоо - Көбүрөөк сыйлык: Д

14 -кадам: Кичине тереңирээк чумкуйбуз

Эгер сиз бул жерге жетсеңиз, эң сонун. Келиңиз.

Эмне үчүн main.elf файлынын ичине, аткарылуучу файлды караганга болбойт? Төмөнкүлөрдү иштетүү:

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

Сиз мындай нерсени көрүшүңүз керек:

main.elf: файлдын форматы elf32-littlearm

Тексттин бөлүмүн ажыратуу:

08000000:

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

08000008:

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

08000010:

8000010: 3001 r0, #1 кошот 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef

Жогорудагы өндүрүштөн биз кандай майда түйүндөрдү ала алабыз?

Эсиңизде болсо, биз linker.script.ld файлын талкуулап жана түзүп жатканда, биз бул ARM түзмөктөрүнүн оперативдүү эс тутуму 0x20000000ден баштап, FLASH эс тутуму 0x08000000дөн башталаарын айтканбыз.

Ошентип, биз программанын баары FLASH эсинде тургандыгын көрө алабыз.

Андан кийин, жогоруда, бирок кийинки кадам, биз "Hello World" бөлүгүн талкуулап жатканда, MCU өзөктүк реестрине ("R7") дароо, туруктуу, түзмө -түз маанини ("0xDEADBEEF") жүктөгөн билдирүү бар болчу.

Билдирүү мындай болгон:

LDR R7, = 0xDEADBEEF

Биздин коддо, бул биз DEADBEEF жөнүндө сөз кылган жалгыз жер. Башка жерде жок. А бирок, эгерде сиз жогоруда бөлүнгөн/реконструкцияланган көрсөтмөлөрдү ж.б. карасаңыз, биз ойлогондон көрө DEADBEEFке байланыштуу дагы көп нерселер бар.

Ошентип, компилятор/шилтемечи кандайдыр бир жол менен DEADBEEFтин маанисин 0x8000018 жайгашкан FLASH дарегине биротоло өчүрүүнү чечти. Андан кийин, компилятор биздин LDR көрсөтмөлөрүбүздү өзгөрттү:

LDR R7, [PC, #8]

Ал тургай, биз үчүн комментарий жараткан. Кандай сонун. Ал бизге учурдагы программанын эсептегич маанисин (PC реестри) алууну, 0x8ди ошол мааниге кошууну жана ошол жерде DEADBEEF өрттөлгөнүн жана ошол бааны алып, R7ге толтурууну айтат.

Демек, бул дагы программалык эсептегич (PC) main_loopтун башталышы болгон 0x8000010 дарегин көрсөтүп жатат жана DEADBEEF мааниси main_loop аяктагандан кийин эки даректе отурат дегенди билдирет.

15 -кадам: Акырында, Программанын иштешине кыскача көз чаптыруу

GDBден чыксаңыз дагы, буйрукту кайра киргизиңиз. Сиз ага эч кандай файл берүүнүн кажети жок; биз мындан ары жарк этпейбиз, жөн гана иштетип жатабыз.

GDB кардарын GDB серверине кайра туташтырганыңыздан кийин, (gdb) буйрук сабында:

(gdb) маалымат регистрлери

Сиз мындай нерсени көрүшүңүз керек:

r0 0x0 0

0

Бирок, андан кийин (gdb) чакыруусун киргизиңиз:

(gdb) улантуу

Жана абдан тез CTRL-C басышты. Бул программаны токтотушу керек. Кайрадан "маалымат регистрлери" буйругун киргизиңиз.

Бул жолу башкача көрүнөт:

(gdb) маалымат регистрлери

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 0x00 0x1200x1200x1200 16777216

Эмне болду? Так биз каалаган нерсе. DEADBEEF R7ге жүктөлдү жана R0 (өтө тез) көбөйүп жатат. Эгерде сиз кайталасаңыз, анда R0ду башка маани менен кайра көрөсүз.

16-кадам: Биз Flashте окуу үчүн гана массив түзүүнү кааладык

Ассамблеяны жана директиваларды колдонуу менен массивдин эквивалентин түзүүнүн бир жолу төмөнкүчө:

.type myarray, %object // "myarray" аталышы же энбелгиси объект түрү катары аныкталат.

myarray: // бул 'myarray' жарыялоонун башталышы // (ал эмнелерден турат)..word 0x11111111 // "myarray" камтылган биринчи мүчөсү же мааниси..word 0x22222222 // экинчи мааниси (чектеш даректер)..word 0x33333333 // ж.б..size myarray,.-myarray // компилятор/ассемблер азыр 'myarrayдин' аягы же // чеги кайда экенин билет.

Эми биз аны FLASH эс тутумуна койдук, аны программада колдонсок болот. Төмөндө бир бөлүгү:

LDR R1, myarray // бул 'myarray'дин 1 -жеринде камтылган маалыматтарды жүктөйт.' // бул биз каалагандай эмес.

LDR R1, = myarray // бул жайгашкан жердин маанисин өзү жүктөйт (1 -дарек), // маалыматтар эмес.. // бул биз каалаган нерсе.

MOV R2, #0 // R2, биз кетпешибиз үчүн, санап турат

// массивдин аягы. LDR R3, = myarrsize // R3 'myarrsize' эквиваленти болот.

// R0 биздин маалыматтарды сактайт

main_loop:

LDR R0, [R1] // R1 ('myarray') көрсөткөн маалыматтарды R0го жүктөңүз. CMP R2, R3 // Биз массивдин чегиндебизби? BEQ main_loop // Эгерде биз болсок, биз бүткөнбүз, андыктан түбөлүккө айланабыз.

ADD R2, #1 // Болбосо, биз массив аркылуу кайталоону уланта алабыз.

ADD R1, #4 // R1ди каттоого 4 кошуңуз, андыктан кийинки туура көрсөтөт

// дареги..

B main_loop // Loop back.

Видео мунун баарын басып өтөт, мында ката бар. Ал жакшы; бул маанилүү иштетүү жана мүчүлүштүктөрдү коддоо экенин көрсөтүп турат. Бул массивдин аягынан чыгып кетүүнүн классикалык учурун көрсөтөт.

Сунушталууда: