Мазмұны:

1 бөлім ARM Ассамблеясы TI RSLK Robotics Learning Curriculum Labric Labric 7 STM32 Nucleo: 16 Steps
1 бөлім ARM Ассамблеясы TI RSLK Robotics Learning Curriculum Labric Labric 7 STM32 Nucleo: 16 Steps

Бейне: 1 бөлім ARM Ассамблеясы TI RSLK Robotics Learning Curriculum Labric Labric 7 STM32 Nucleo: 16 Steps

Бейне: 1 бөлім ARM Ассамблеясы TI RSLK Robotics Learning Curriculum Labric Labric 7 STM32 Nucleo: 16 Steps
Бейне: Враги и боссы милые. ⚔💀 - War Lands GamePlay 🎮📱 🇷🇺 2024, Шілде
Anonim
Image
Image

Бұл нұсқаулықтың басты бағыты-STM32 Nucleo микроконтроллері. Жалаңаш сүйектерден құрастыру жобасын құруға мотивация. Бұл бізге бірнеше нұсқаулықтардың тақырыбы болған MSP432 Launchpad жобасын (TI-RSLK) тереңірек зерттеуге және түсінуге көмектеседі.

Code Composer Studio көмегімен MSP432 үшін тек құрастыру жобасын құруға желіде көп көмек жоқ. Осы уақытқа дейін біз бұрыннан бар құрастыру жобасынан көшіріп/қойдық. Бұл тәсіл бізге жақсы қызмет етті.

Дегенмен, қазір 7 -зертхана үшін бізде біраз мәселе болды. Немесе, кем дегенде, уақытша ысқырық. 7 зертханасы ақырлы күйдегі машиналарды енгізеді, және біз бірінші кезекте кездесетін нәрсе-мәндер жиынын құру және қолдану қажеттілігі. TI курсы негізінен С бағдарламалауды қолданатындықтан - бұл мәселе емес. Бірақ бұл нұсқаулықтар С емес, құрастыруға бағытталған.

Бұдан басқа, массив тек оқуға арналған мәндер болғандықтан, оны жедел жадыға емес, флэш-жадыға енгізген дұрыс болар еді.

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

Осы мақсатқа жету жолында біз тағы бір танымал микроконтроллермен тәжірибе жинақтаймыз.

1 -қадам: құрылғыны бастапқы сынау

Құрылғының алғашқы сынағы
Құрылғының алғашқы сынағы
Құрылғының алғашқы сынағы
Құрылғының алғашқы сынағы
Құрылғының алғашқы сынағы
Құрылғының алғашқы сынағы

Тағы да, неге STM32 Nucleo -ны таңдау керек?

Шынымды айтсам? Мен ARM контроллері үшін жалаң металл құрастыру жобалары бойынша жақсы мақалаларды іздеп жүргендіктен мен осы серияны кездестірдім. Сонымен қатар, STM32 әйгілі MCU болып көрінеді.

Мен біраз зерттеулер жүргіздім (таңдаудың көптеген нұсқалары бар - жоғарыдағы суретті қараңыз), бірақ мен Amazon -ды (АҚШ -та) қолданатын болғандықтан, нені алуға болатынын білдім.

Бұл қарапайым, бірақ кәсіби пакетте, іске қосу нұсқаулары бар. Контроллерге енгізілген демо біз өткен нұсқаулықтарда дәл осылай жасағанын көру біршама күлкілі болды - жарық диоды жыпылықтайды және түймені басу арқылы жылдамдықты өзгертеді.

Бұл даму тақтасы MSP432-ге өте ұқсас, себебі 2 жарық диоды және бір пайдаланушы түймесі бар. MSP432-де 2 пайдаланушы түймелері бар.

Фотосуреттерде көріп тұрғаныңыздай, тақтада микро USB емес, мини бар екеніне таң қалдым. Сымды сатып алу үшін жүгіру керек болды.

Тағы бір жақсы тест - оны компьютерге қосқанда (мен Linux қорабын қолданамын), ол менің файл менеджерімде «NODE_F303RE» деп аталатын файлдық жүйе ретінде көрсетіледі. Ашылу екі файлды көрсетеді, бір HTML және бір мәтін.

Бұл болды, бірақ, кем дегенде, қосылу өте оңай болып көрінеді.

Енді біз бастауға дайынбыз.

Мен IVONOMICON Bare Metal мақалалар сериясындағы жақсы ақпаратты қайталамауға тырысамын, керісінше оны көбейтемін.

2 -қадам: Essentials

Бізге қажет бірінші нәрсе - компилятор.

Содан кейін бізге отладчик қажет:

devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabiRaket пакеттерінің тізімін оқу… Орындалды Тәуелділік ағашын құру күй туралы ақпаратты оқу… Орындалды Келесі ЖАҢА пакеттер орнатылады: gdb-arm-none-eabi 0 жаңартылды, 1 жаңадан орнатылған, 0 жою үшін және 8 жаңартылмаған. 2, 722 кБ мұрағатты алу қажет. Осы операциядан кейін 7, 738 кБ қосымша дискілік кеңістік пайдаланылады. Қолдану: 1 https://us.archive.ubuntu.com/ubuntu xenial/Universe amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 кБ] 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 қолдансақ ше?

Сіз әзірлеуші сайтына кіре аласыз және жүктеудің бірнеше нұсқасы бар. Мен 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 көмегімен кейбір C кодын құрастыратын болсаңыз, ол 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 -қадам: байланыстырушы файл

Байланыстырушы файлы
Байланыстырушы файлы
Байланыстырушы файлы
Байланыстырушы файлы

Сілтеме сценарийін құрайық.

Бұл файлдың бір негізгі бөлігі немесе блогы MEMORY командасы болады.

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

Байланыстырушының әдепкі конфигурациясы барлық қол жетімді жадты бөлуге мүмкіндік береді. MEMORY пәрменін қолдана отырып, оны қайта анықтауға болады. Сіз оны байланыстырушы жадтың қандай аймақтарын қолдана алатынын және жадтың қандай аймақтарынан аулақ болу керектігін сипаттау үшін пайдалана аласыз. Бөлімдерді белгілі бір жад аймақтарына тағайындауға болады. Байланыстырушы жад аймақтарына негізделген бөлім адрестерін орнатады және тым толып кеткен аймақтар туралы ескертеді. Байланыстырушы қол жетімді аймақтарға сәйкес келетін бөлімдерді ауыстырмайды. Сілтеме сценарийі MEMORY командасының көптеген қолданылуын қамтуы мүмкін, алайда анықталған барлық жад блоктары олар бір MEMORY пәрменінде көрсетілгендей өңделеді.:

ЖАД

{аты [(attr)]: ОРЫСЫ = шығу тегі, LENGTH = лен…}

Мақаладағы мысал:

/* ЖЖҚ соңы мен стек жадының шегін анықтаңыз* //* (STM32F031x6 жолында 4KB SRAM, 4096 = 0x1000)*//* (ЖЖҚ 0x20000000 адресінен басталады) _estack = 0x20001000;

ЖАД

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

Сондықтан біз нақты тақтаға қанша FLASH (біздің бағдарлама мен тұрақтылар үшін) және қанша RAM (бағдарламада қолдану үшін; үйме және стек және т.б.) қанша екенін анықтауымыз керек. Бұл біраз қызықты болады.

Nucleo -мен бірге келетін кішкентай картаның айтуынша, оның флэш -жады 512 Кбайт, ал SRAM - 80 Кбайт. Дегенмен, оны USB -ге қосқанда, ол екі файлды қамтитын файлдық жүйе ретінде орнатылады және файл менеджері де, GParted де оның 540+ Кбайттан астам кеңістігі бар екенін көрсетеді. (ЖЕДЕЛ ЖАДТАУ ҚҰРЫЛҒЫСЫ?).

БІРАҚ, файл менеджерінің көмегімен екі файлды жоюға әрекет ету, құрылғыны ажырату, содан кейін қайта қосу, екі файлды көрсетеді. (және файл менеджері бір нәрсені таныды, себебі әр файлда «құлыптау» белгісі бар.

Олай болса картадағы фигуралармен жүрейік. Енді біз жоғарыдағы мысалды алып, оны арнайы тақтаға түрлендіреміз.

Сіз жалпы жадтан белгілі бір байт санына өту үшін осы онлайн жады түрлендіргіші сияқты нәрсені қолданғыңыз келуі мүмкін.

Содан кейін сіз ондық жүйеден он алтылық түрлендіргішті қолданғыңыз келуі мүмкін.

/ * ЖЖҚ соңы мен стек жадының шегін анықтаңыз */

/* (STM32F031x6 жолындағы 4KB SRAM, 4096 = 0x1000)* //* мысал*/

/ * 1 -қадам: (STM32F303RE бойынша 80KB SRAM, 81920 = 0x14000) * // * біздің тақта */

/* 2 -қадам, он алтылық өлшемін он алтылық бастапқы мекен -жайға қосыңыз (төменде). */

/ * (ЖЖҚ 0x20000000 адресінен басталады) */

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

_estack = 0x20014000; / * біздің тақта */

ЕСКЕРТУ {

FLASH (rx): ТҮГІН = 0x08000000, ҰЗЫНДЫҒЫ = 512К

ЖЖҚ (rxw): ORIGIN = 0x20000000, ҰЗЫНДЫҒЫ = 80К

}

Жоғарыдағы файлды «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 / * * Нақты векторлық кесте. * Қарапайымдылық үшін жедел жады мен «қалпына келтіру» өңдегішінің көлемі ғана енгізілген. */.type vtable, %object vtable:.word _estack.word reset_handler. size vtable,.-vtable

Hmm.. Жоқ '.align' директивасы

Алайда, бұл маңызды емес. Бұл туралы толығырақ (мүмкін) кейінірек.

.syntax бірыңғай

.syntax [бірыңғай | бөлінген]

Бұл нұсқаулық ARM-Instruction-Set бөлімінде сипатталғандай Нұсқаулық жиынының синтаксисін орнатады

9.4.2.1 Нұсқаулық жиынтығы синтаксисі ARM және THUMB нұсқауларын қолдау үшін сәл өзгеше екі синтаксис бар. Бөлінген әдепкіде ARM және THUMB нұсқауларының жеке синтаксистері бар ескі стиль қолданылады.. Syntax директивасы арқылы таңдауға болатын жаңа, бірыңғай синтаксис.

.fpu vfpv4

GCC компиляторы өзгермелі нүктеге қатысты бірнеше опциялары бар екілік файлдарды шығара алады: жұмсақ - FPU жоқ процессорларда жұмыс істеуге жарамды - есептеулер компилятор жасаған softfp бағдарламалық жасақтамасында жасалады - FPU бар немесе онсыз процессорларда жұмыс істеуге жарамды - егер бар болса, FPU қолданады.. Біздің нақты жағдайымыз үшін (сіз өзіңіздің жеке зерттеуіңізді жүргізуіңіз керек), бұл нақты тақтаның FPU vfpv4 сәйкес келеді. Сізге онымен ойнауға тура келуі мүмкін. Немесе оны softfp -те қалдырыңыз.

.бармақ (қаруға қарсы)

Бұл ARM микроконтроллерінде іс жүзінде нұсқаулықтар жиынтығы бар. Бірі - ARM, екіншісі - THUMB. Бір айырмашылығы-16 биттік нұсқаулар мен 32 биттік нұсқаулар. Осылайша, бұл директива компиляторға келесі нұсқауларды THUMB немесе ARM ретінде қарауды ұсынады.

Біз файлдың қалған бөлігін сол күйінде қабылдаймыз, себебі бұл нұсқаулықтар әлі де үзіліспен басқарылатын құрастыру бағдарламасына енбеген.

7 -қадам: «Сәлем әлемі» бағдарламасының Ассамблея нұсқасы

Төмендегілер бұрын жасалған «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 // Артқа айналу. B main_loop.өлшемі reset_handler,.-Reset_handler

Осылайша, жоғарыда аталған бағдарламаның негізгі мақсаты - бір ядролы MCU регистріне (бұл жағдайда R7) танылатын үлгіні жүктеу, ал нөлден басталатын өсу мәнін басқа негізгі MCU регистріне (бұл жағдайда R0) жүктеу. Егер біз орындалатын кодты араласақ, біз R0 деректерінің өсуін көруіміз керек.

Егер сіз MSP432 және TI-RSLK курстары/зертханаларына қатысты нұсқаулықтармен бірге болсаңыз, онда жоғарыда аталған бағдарламаның барлығы сізге таныс болуы керек.

Мен көретін жаңа нәрсе - R7 тіркеу үшін «DEADBEEF» жүктеу кезінде «=» пайдалану. Біз мұны қолданған жоқпыз.

Мұнда тіркелген «core. S» файлында толық ақпарат көзі бар.

8 -қадам: кодты құрастыру

Пәрмен жолындағы кейбір нәрселерді жасайтын уақыт келді. Ақыр соңында, нақты нәрсе.

Дегенмен, біз ол жерде жоқпыз. Біз қайтадан мақалада берілген пәрменді өзгертіп, оны өз жағдайымызға қарай өзгертуіміз керек.

Міне мысал коды:

arm -none -eabi -gcc -x -cpp -c -O -00 -mcpu = cortex -m0 -mthumb -Wall core. -o core.o

Егер біз GCC үшін gnu.org сайтына кірсек, (бұл жағдайда 7.3 нұсқасы),

x

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

Мақаладан жоғарыда келтірілген мысалда cps-пен бірге assembler көрсетілген, бірақ біз тек құрастырушыны жасай аламыз.

c

-C «компиляция жасайды, бірақ байланыстырмайды» дейді.

0

-O -оңтайландыру деңгейін орнату. -O0 (oh -нөл) пайдалану «компиляция уақытын азайтады және жөндеуді күтілетін нәтиже береді. Бұл әдепкі болып табылады» дейді.

mcpu = кортекс-m0

-Mcpu мақсатты процессордың атын көрсетеді. Біздің жағдайда бұл cortex-m4 болар еді.

бармақ

-Mthumb ARM және THUMB күйлерін орындайтын кодты құру арасында таңдауды көрсетеді.

Қабырға

-Wall әрине өте кең таралған және әйгілі. Ол барлық ескерту жалаушаларын қосады.

Ақырында, пәрменнің соңында бізде кіріс ядросы. S және шығыс файлы core.o.

Міне, біздің нақты жағдайға сәйкес келетін жаңа пәрмен жолы.

arm -none -eabi -gcc -x құрастырушы -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

Мұны түсіндіру біршама қиын.

Бұл «семохостинг» және «қайта мақсаттаумен» байланысты, және бұл кіріс / шығыспен байланысты. Бұл сонымен қатар жүйелік қоңыраулар мен кітапханаларға қатысты.

Әдетте ендірілген жүйелер стандартты енгізу/шығару құрылғыларын бермейді. Бұл жүйелік немесе кітапхана қоңырауларына әсер етеді (мысалы: printf ()).

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

Қайта жоспарлау, керісінше, сол жүйелік немесе кітапханалық қоңыраулар басқа нәрсені білдіреді. Олар басқа нәрсе жасайды, бұл енгізілген жүйе үшін мағынасы бар. Айтпақшы, printf () үшін, бұл функцияның жаңа іске асырылуы, қайта мақсатты орындалуы бар.

Осының бәрін айтқаннан кейін, --specs = nosys.specs біз жартылай өткізбейтінімізді білдіреді. Бұл әдетте біз қайта жоспарлап жатқанымызды білдіреді. Бұл бізді келесі жалауға әкеледі.

ностлиб

-Nostdlib байланыстырушы параметрі дербес жұмыс істеуге арналған бағдарламаны байланыстыру үшін қолданылады. -nostdlib жеке параметрлерді білдіреді -nodefaultlibs және -nostartfiles. Төменде біз екі нұсқаны бөлек талқылаймыз, бірақ ең көп қолданылатыны-бұл біржолғы сатып алу үшін nostdlib. Басты бағдарламаны байланыстырған кезде libc сияқты стандартты жүйелік кітапханалар әдепкі бойынша байланысады, бұл бағдарламаға барлық стандартты функцияларға қол жеткізуге мүмкіндік береді (printf, стрлен және достар). -Nodefaultlibs байланыстырушы опциясы сол әдепкі кітапханалармен байланысты өшіреді; байланыстырылған жалғыз кітапханалар -l жалаушасы арқылы сілтеме жасаушыға нақты атаған кітапханалар.

lgcc

libgcc.a - бұл белгілі бір машиналардың кемшіліктерін жою үшін ішкі бағдарламаларды қамтамасыз ететін стандартты кітапхана. Мысалы, ARM процессорында бөлу командасы жоқ. Libgcc.a ARM нұсқасы бөлу функциясын қамтиды және компилятор қажет болған жағдайда осы функцияға қоңырауларды шығарады.

Т

Бұл сілтеме жасаушыға бұл файлды сілтеме сценарийі ретінде қолдануды айтудың бір әдісі. Біздің жағдайда файл атауы linker.script.ld.

негізгі

Ақырында, біз байланыстырушыға біздің құрылғыға жазылатын/жыпылықтайтын соңғы шығыс кескін файлының аты қандай болатынын айтамыз.

Міне, біздің нақты жағдайға сәйкес өзгертілген пәрмен жолының толық нұсқасы:

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 қосылымын тестілеу

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 stlink бағдарламашысы табылды

Енді біз даму тақтасында сөйлесуге/сұрауға болатынын білеміз.

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 install libusb-1.0-0-dev

Жоғарыда айтылғандар бірдей емес екенін ескеріңіз:

sudo apt-get libusb-dev орнатыңыз

Дұрыс жоғалған libusb dev cmake ақауларын тудыруы мүмкін.

CMake қатесі: Бұл жобада келесі айнымалылар пайдаланылады, бірақ олар NOTFOUND күйіне орнатылады. Оларды орнатыңыз немесе олардың CMake файлдарында дұрыс орнатылғанына және тексерілгеніне көз жеткізіңіз: LIBUSB_INCLUDE_DIR (КЕЛІСІЛГЕН)

Жобаның түбірлік каталогына өзгертіңіз (… blah /blah /stlink). «Шығаруды» жасаңыз.

Осыдан кейін құралдар «.. /build /Release» астында болуы керек.

Содан кейін «st-info --probe» іске қосуға болады. Міне, Nucleo қосылған шығыс, бірақ жоқ.

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeFound 1 stlink бағдарламашыларының сериясы: 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 Texas Instruments, немесе біз қазір талқылайтын Nucleo-F303 (STM32 Nucleo-64), олар әдетте жұмыс істейтін бағдарламамен жыпылықтайды. светодиодтардың жыпылықтау жылдамдығын өзгерту үшін қосқышты басуды қамтитын кейбір жыпылықтайтын бағдарлама.

Біз тым тез жазудан бұрын, не істеу керектігін көрейік.

Linux көмегімен терминалды ашыңыз, біз жасаған stlink git жобасының каталогын өзгертіңіз және st-util құралын табыңыз.

devchu@chubox: ~/Development/stlink $ find. -аты-жөні

./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, идентификатор 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: чиптің идентификаторы-00000446, негізгі идентификаторы-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) мақсатты кеңейтілген қашықтағы жергілікті хост: 4242

Сіз келесідей жауапты қайтаруыңыз керек:

(gdb) мақсатты кеңейтілген қашықтағы жергілікті хост: 4242

Localhost көмегімен қашықтан жөндеу: 4242 0x080028e4 in ?? ()

Сонымен қатар, st-util gdbserver жұмыс істейтін терминалда біз мынаны алдық:

2018-10-20T18: 42: 30 INFO gdb-server.c: 6 сағ тоқтау регистрлері табылды

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 жүйесімен жыпылықтау - қосымша сыйақы: D

Linux көмегімен жыпылықтау - қосымша марапаттау: D
Linux көмегімен жыпылықтау - қосымша марапаттау: D

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, [дана, #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 жадында болатынын көре аламыз.

Содан кейін, жоғарыда, бірақ кейінірек қадам, біз «Сәлем әлемі» бөлігін талқылаған кезде, MCU ядро регистріне («R7») бірден, тұрақты, тура мәнді («0xDEADBEEF») жүктейтін мәлімдеме болды.

Мәлімдеме болды:

LDR R7, = 0xDEADBEEF

Біздің кодта бұл DEADBEEF туралы айтатын жалғыз орын. Басқа жерде жоқ. Сонымен, егер сіз жоғарыда бөлшектелген/қалпына келтірілген нұсқауларды және т.б. қарасаңыз, DEADBEEF туралы біз ойлағаннан да көп нәрсе бар.

Осылайша, компилятор/байланыстырушы DEADBEEF мәнін 0x8000018 орнында FLASH мекенжайына тұрақты түрде жыпылықтауды шешті. Содан кейін компилятор LDR нұсқаулығын өзгертті:

LDR R7, [ДК, #8]

Бұл бізге түсініктеме берді. Қандай керемет. Және бұл бізге бағдарламаның есептегішінің ағымдағы мәнін (ДК регистрі) алуды, осы мәнге 0x8 қосу керектігін айтады, дәл осы жерде DEADBEEF күйдірілген, сол мәнді алып, оны R7 -ге толтыр.

Бұл сонымен қатар бағдарлама есептегіші (ДК) 0x8000010 мекен -жайын көрсетеді, бұл main_loop -тың басталуы және DEADBEEF мәні main_loop аяқталғаннан кейін екі мекен -жайда орналасады.

15 -қадам: Соңында бағдарламаның жұмысына қысқаша шолу

Егер сіз GDB-ден шықсаңыз да, пәрменді қайта енгізіңіз. Сізге оған ешқандай файл берудің қажеті жоқ; біз енді жыпылықтамаймыз, оны іске қосамыз.

GDB клиентін GDB серверіне қайта қосқаннан кейін (gdb) пәрмен жолында:

(gdb) ақпарат регистрлері

Сіз келесідей нәрсені көруіңіз керек:

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 0xffffff000 42949800800

Бірақ содан кейін (gdb) шақыруында мынаны енгізіңіз:

(gdb) жалғастыру

Және CTRL-C пернесін тез басады. Бұл бағдарламаны тоқтатуы керек. «Ақпараттық регистрлер» пәрменін қайтадан енгізіңіз.

Бұл жолы басқаша көрінеді:

(gdb) ақпарат регистрлері

0 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' мекен -жайындағы деректерді жүктейді. ' // бұл біз қалағандай емес.

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 // Артқа айналу.

Бейне осының бәрінен өтеді және онда қате бар. Ол жақсы; ол маңызды іске қосу және күйін келтіру кодын көрсетеді. Ол массивтің соңынан кетудің классикалық жағдайын көрсетеді.

Ұсынылған: