Orodha ya maudhui:

Sehemu ya 1 Mkutano wa ARM TI RSLK Roboti ya Kujifunza Mtaala wa Maabara 7 STM32 Nyuklia: Hatua 16
Sehemu ya 1 Mkutano wa ARM TI RSLK Roboti ya Kujifunza Mtaala wa Maabara 7 STM32 Nyuklia: Hatua 16

Video: Sehemu ya 1 Mkutano wa ARM TI RSLK Roboti ya Kujifunza Mtaala wa Maabara 7 STM32 Nyuklia: Hatua 16

Video: Sehemu ya 1 Mkutano wa ARM TI RSLK Roboti ya Kujifunza Mtaala wa Maabara 7 STM32 Nyuklia: Hatua 16
Video: Sjogren's: The Second Most Common Cause of Dysautonomia 2024, Julai
Anonim
Image
Image

Lengo la Agizo hili ni Mdhibiti mdogo wa STM32 Nucleo. Msukumo wa hii kuweza kuunda mradi wa mkutano kutoka mifupa wazi. Hii itatusaidia kutafakari kwa kina na kuelewa mradi wa Launchpad wa MSP432 (TI-RSLK) ambayo imekuwa mada ya Maagizo kadhaa tayari.

Hakuna msaada sana mkondoni kuunda mradi tu wa mkutano wa MSP432, ukitumia Studio ya Mtunzi wa Msimbo. Hadi sasa tumekuwa tukinakili / kubandika tu kutoka kwa mradi wa mkutano uliokuwepo hapo awali. Njia hii imetufaa.

Walakini, sasa, kwa Lab 7, tumepata shida kidogo. Au angalau hiccup ya muda. Maabara 7 huanzisha mashine za serikali-ndogo, na jambo la kwanza tunalokutana nalo ni hitaji la kuunda na kutumia safu ya maadili. Kwa kuwa kozi ya TI hutumia programu ya C - hii sio shida. Lakini Maagizo haya yamezingatia mkutano, sio C.

Kwa kuongezea, kwa kuwa safu ni ya maadili ya kusoma tu, itakuwa vizuri kuiweka kwenye kumbukumbu ya flash, sio RAM.

Inaonekana kuna msaada zaidi mkondoni kwa miradi ya mkutano inayotumia STM32 MCU, kwa hivyo, tunaanza na hii inayoweza kuelekezwa, kwa lengo la kutumia kile tunachojifunza, kisha kutumia kwa MSP432 na Studio Studio ya Mtunzi.

Kwenye barabara ya lengo hilo, tutapata uzoefu pia na mdhibiti mwingine mdogo maarufu.

Hatua ya 1: Jaribio la Awali la Kifaa

Jaribio la Awali la Kifaa
Jaribio la Awali la Kifaa
Jaribio la Awali la Kifaa
Jaribio la Awali la Kifaa
Jaribio la Awali la Kifaa
Jaribio la Awali la Kifaa

Tena, kwanini uchukue Nucleo ya STM32 haswa?

Uaminifu? Kwa sababu nilikuwa nikitafuta nakala nzuri kwenye miradi isiyo na chuma ya mkusanyiko wa watawala wa ARM, na nikapata safu hii. Na pia kwa sababu STM32 inaonekana kuwa MCU maarufu.

Nilifanya utafiti (kuna matoleo mengi ya kuchagua - tazama picha hapo juu), lakini mwishowe ikawa ni nini ninaweza kupata, kwani ningeenda kutumia Amazon (huko Merika).

Inakuja kwa kifurushi rahisi lakini cha kitaalam, na maagizo ya kuanza. Ilikuwa ya kuchekesha kidogo kuona kwamba onyesho lililochomwa ndani ya kidhibiti lilikuwa karibu kabisa kile tumefanya katika Maagizo ya zamani - mwangaza wa LED na kasi ya mabadiliko kulingana na kitufe cha kitufe.

Inaonekana kwamba bodi hii ya maendeleo inafanana sana na MSP432 kwa kuwa kuna taa mbili za LED, na kifungo kimoja cha mtumiaji. MSP432 ina vifungo 2 vya mtumiaji.

Kama unavyoona kwenye picha, nilishangaa kidogo kwamba bodi ina mini na sio USB ndogo. Ilibidi kukimbia kumaliza kununua kamba.

Jaribio jingine zuri ni kwamba unapoiunganisha kwenye kompyuta yako (ninatumia kisanduku cha Linux), inajitokeza katika kidhibiti faili yangu, kama mfumo wa faili, inayoitwa "NODE_F303RE". Kufungua ambayo inaonyesha faili mbili, HTML moja na maandishi moja.

Hiyo ndio, lakini angalau pia inasema muunganisho unaonekana kuwa rahisi sana.

Sasa tuko tayari kuanza.

Nitajaribu kurudia habari yoyote nzuri kutoka kwa safu ya makala ya IVONOMICON Bare Metal, lakini badala yake niongeze.

Hatua ya 2: Muhimu

Jambo la kwanza tunalohitaji ni mkusanyaji.

Na kisha, tunahitaji mtatuaji:

devchu @ chubox: ~ $ sudo apt-get install gdb-arm-none-eabiKusoma orodha ya vifurushi… Imefanywa Kujenga mti wa utegemezi Kusoma habari za hali… Imefanywa Vifurushi VYA Zifuatazo mpya vitawekwa: gdb-arm-none-eabi 0 imeboreshwa, 1 mpya imewekwa, 0 itaondoa na 8 haijasasishwa. Unahitaji kupata 2, 722 kB ya kumbukumbu. Baada ya operesheni hii, 7, 738 kB ya nafasi ya ziada ya diski itatumika. Pata: 1 https://us.archive.ubuntu.com/ubuntu xenial / ulimwengu amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3 + 9 [2, 722 kB] Imechukuliwa 2, 722 kB kwa 1s (1, 988 kB / s) Kuchagua kifurushi kisichochaguliwa hapo awali gdb-arm-none-eabi. (Hifadhidata ya Kusoma… faili na saraka 262428 zilizosanikishwa kwa sasa.) Kujitayarisha kufungua… / gdb-arm-none-eabi_7.10-1ubuntu3 + 9_amd64.deb… Kufungua gdb-arm-none-eabi (7.10-1ubuntu3 + 9)… Inasindika vichocheo vya man-db (2.7.5-1)… Kuanzisha gdb-arm-none-eabi (7.10-1ubuntu3 + 9)…

Hatua ya 3: Muhimu - Windows

Hatua ya hapo juu ilidhani tunatumia Linux. Je! Ikiwa tunatumia Windows?

Unaweza kwenda kwenye wavuti ya Msanidi Programu, na kuna chaguzi kadhaa za upakuaji zinazopatikana. Ninatumia mashine ya Windows 8.

Wakati wa usanikishaji, nilichagua kuiweka kwenye gari "C: \" ya mizizi badala ya Faili za Programu kwa sababu tu ninatumia cygwin, na ilikuwa rahisi kuunda kiunga kutoka kwa pipa langu la ndani hadi kwenye mzizi C: folda kuliko fujo katika njia ya Faili za Programu (na nafasi, nk).

Kwa hivyo, mazingira na njia yangu ya cygwin, nk, inaonekana kama hivyo:

C: / cygwin64 / home / bin / arm-none-eabi-gcc, ambapo mkono-hakuna-eabi-gcc ni kiunga cha C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc.

Kisha nikaunda folda ya "dev" chini ya nyumba ya cygwin, na hapo ndipo nilipoweka faili ya msingi. S na kukimbia amri ya mkusanyaji. (tazama zaidi hapa chini kwa vitu vya mkusanyaji).

Nilifanya kitu sawa kabisa kwa gdb (mkono-hakuna-eabi-gdb).

Hatua ya 4: Ni nini Muhimu

Kwa hivyo ni nini "gcc-arm-none-eabi"?

Mkusanyaji wa gnu (GCC) atakusanya lugha za programu (kama C) kuwa nambari ya asili ya mashine inayoendesha. Kwa mfano, ikiwa ungekusanya nambari fulani ya C ukitumia GCC kwenye mashine yako ya Windows, itajengwa kuendesha kwenye mashine ya Windows. Inayoweza kutekelezwa haitatumika (kwa kawaida) kwenye kidhibiti-ndogo cha ARM.

Kwa hivyo, ili kujenga mipango ya kupakuliwa na kuchomwa ndani ya Mdhibiti mdogo wa ARM (kwa kesi yetu ya sasa ambayo itakuwa STM32 Nucelo), tunahitaji kuipatia GCC kitu kingine: uwezo wa "kuvuka-kukusanya". Hiyo ni, uwezo wa kutengeneza inayoweza kutekelezwa, sio kwa mfumo wake wa asili (na processor), lakini kwa mfumo wa lengo (mdhibiti mdogo wa ARM). Hapo ndipo "gcc-arm-none-eabi" inapoanza kutumika.

Kwa hivyo basi ni nini "gdb-arm-none-eabi"?

Mara tu tunapopakua na kuchoma (kuangaza) inayoweza kuzalishwa inayoweza kutekelezwa ndani ya mdhibiti mdogo, labda tutataka kuisuluhisha - pitia kupitia mstari kwa mstari wa nambari. GDB ndiye mtatuaji wa gnu, na pia inahitaji njia ya kufanya kazi yake, lakini ikilenga mfumo tofauti.

Kwa hivyo, gdb-arm-none-eabi ni kwa GDB, ni nini gcc-arm-none-eabi ni kwa GCC.

Usakinishaji mwingine uliopendekezwa ulikuwa "libnewlib-arm-none-eabi". Ni nini hiyo?

Newlib ni maktaba ya C na maktaba ya hesabu yaliyokusudiwa kutumiwa kwenye mifumo iliyoingia. Ni mkusanyiko wa sehemu kadhaa za maktaba, zote zikiwa chini ya leseni za programu za bure ambazo zinawafanya watumike kwa urahisi kwenye bidhaa zilizopachikwa.

Na mwishowe, kifurushi "libstdc ++ - arm-none-eabi". Hiyo ni dhahiri kabisa; ni maktaba ya C ++ ya mkusanyaji msalaba; kwa vidhibiti vidogo vya ARM vilivyowekwa.

Hatua ya 5: Faili ya Kiunganishi

Faili ya Kiunganishi
Faili ya Kiunganishi
Faili ya Kiunganishi
Faili ya Kiunganishi

Wacha tuunde hati ya kiunganishi.

Sehemu moja muhimu au kizuizi katika faili hii itakuwa amri ya KUMBUKUMBU.

--- kutoka sourceware.org:

Usanidi chaguo-msingi wa kiunganishi unaruhusu ugawaji wa kumbukumbu zote zinazopatikana. Unaweza kubatilisha hii kwa kutumia amri ya KUMBUKUMBU. Amri ya KUMBUKUMBU inaelezea eneo na saizi ya vizuizi vya kumbukumbu kwenye shabaha. Unaweza kuitumia kuelezea ni sehemu gani za kumbukumbu zinazoweza kutumiwa na kiunganishi, na ni sehemu gani za kumbukumbu lazima ziepuke. Kisha unaweza kugawa sehemu kwa maeneo fulani ya kumbukumbu. Muunganishi ataweka anwani za sehemu kulingana na maeneo ya kumbukumbu, na ataonya juu ya mikoa ambayo imejaa sana. Kiunganishi hakitachanganya sehemu kuzunguka katika maeneo yanayopatikana. Hati ya kiunganishi inaweza kuwa na matumizi mengi ya amri ya KUMBUKUMBU, hata hivyo, vizuizi vyote vya kumbukumbu hufafanuliwa kama vile vimewekwa ndani ya amri moja ya KUMBUKUMBU.:

KUMBUKUMBU

{jina [(attr)]: ASILI = asili, LENGTH = len…}

Mfano katika kifungu hicho:

/ * Fafanua mwisho wa RAM na kikomo cha kumbukumbu ya stack * // * (4KB SRAM kwenye laini ya STM32F031x6, 4096 = 0x1000) * / / * (RAM inaanza kwa anwani 0x20000000) _estack = 0x20001000;

KUMBUKUMBU

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

Kwa hivyo tunahitaji kujua ni kiasi gani cha FLASH (kwa mpango wetu na vipindi vyote, nk) na ni kiasi gani cha RAM (cha kutumiwa na programu; chungu na stack, nk) kwa bodi yetu fulani. Hii inapendeza kidogo.

Kadi nzuri ndogo ambayo inakuja na Nucleo inasema kuwa ina kumbukumbu ya flash ni 512 Kbytes, na SRAM ni Kbytes 80. Walakini, kuiunganisha kwa USB, huwekwa kama mfumo wa faili na faili mbili, na meneja wa faili na GParted zinaonyesha ina zaidi ya Kbytes 540+ za nafasi. (RAM?).

LAKINI, kujaribu kufuta faili mbili kwa kutumia kidhibiti faili, kukatisha kisha kuunganisha kifaa, bado inaonyesha faili mbili. (na msimamizi wa faili alitambua kitu kwa sababu kuna aikoni ndogo ya "kufuli" kwenye kila faili.

Basi hebu tuende na takwimu kwenye kadi. Kwa hivyo sasa tunachukua mfano ulio hapo juu na kuubadilisha kuwa bodi yetu maalum.

Unaweza kutaka kutumia kitu kama kibadilishaji hiki cha kumbukumbu mkondoni, kutoka kwa KB ya jumla kwenda idadi maalum ya ka.

Basi unaweza kutaka kutumia decimal online kwa hex converter.

/ * Fafanua mwisho wa RAM na kikomo cha kumbukumbu ya stack * /

/ * (4KB SRAM kwenye laini ya STM32F031x6, 4096 = 0x1000) * // * mfano * /

/ * hatua 1: (80KB SRAM kwenye STM32F303RE, 81920 = 0x14000) * // * bodi yetu * /

/ * hatua ya 2, ongeza saizi ya hex kwa anwani ya kuanzia hex (hapa chini). * /

/ * (RAM huanza kwa anwani 0x20000000) * /

_estack = 0x20001000; / * mfano * /

_estack = 0x20014000; / * bodi yetu * /

KUMBUKUMBU {

FLASH (rx): ASILI = 0x08000000, UREFU = 512K

RAM (rxw): ASILI = 0x20000000, UREFU = 80K

}

Wacha tuite faili hapo juu "linker.script.ld".

Hatua ya 6: Jedwali la Vector

Jedwali la Vector
Jedwali la Vector

Sasa tutaunda faili ndogo ya mkutano (na maagizo) kufanya utunzaji wa kimsingi wa usumbufu. Tutafuata mfano wa nakala hiyo na tengeneza faili inayoitwa "msingi. S".

Tena, hapa kuna yaliyomo kwenye faili, lakini nilifanya mabadiliko kwa bodi yetu maalum:

// Maagizo haya hufafanua sifa za chip yetu na

// lugha ya kusanyiko tutakayotumia:. syntax imeunganishwa / * Tazama hapa chini baada ya eneo hili la nambari * / /*.cpu cortex-m0 * / / * toa maoni kuhusu mstari huu wa mfano * /.cpu cortex-m4 / * ongeza badala ya gamba la bodi yetu. angalia picha hapo juu katika hatua hii * / /*.fpu softvfp * / / * toa maoni kwenye mstari huu wa mfano * /.fpu vfpv4 / * badala ya bodi yetu; ina FPU * /.thumb // maeneo ya kumbukumbu ya Global. global vtable.global reset_handler / * * Jedwali halisi la vector. * Ukubwa tu wa RAM na kiboreshaji cha 'kuweka upya' ni pamoja na, kwa urahisi. aina / vtable,% kitu vtable:.word _estack.word reset_handler.size vtable,.-vtable

Hmm.. Hapana '. Sawia' Maagizo

Walakini, hiyo sio muhimu. Zaidi juu ya hiyo (labda) baadaye.

syntax imeunganishwa

sintaksia [umoja | imegawanyika]

Maagizo haya yanaweka Syntax ya Maagizo kama ilivyoelezewa katika sehemu ya ARM-Instruction-Set

9.4.2.1 Seti ya Maagizo Sintaksia mbili tofauti tofauti ni msaada kwa maagizo ya ARM na THUMB. Chaguo-msingi, imegawanywa, hutumia mtindo wa zamani ambapo maagizo ya ARM na THUMB yalikuwa na yao wenyewe, sintaksia tofauti. Sintaksia mpya, yenye umoja, ambayo inaweza kuchaguliwa kupitia agizo la.

.fpu vfpv4

Mkusanyaji wa GCC anaweza kutoa mapacha na chaguzi kadhaa kuhusu hatua inayoelea: laini - inayofaa kuendesha kwenye CPU bila FPU - mahesabu hufanywa katika programu na mkusanyaji wa laini inayotengenezwa - inayofaa kuendesha kwenye CPU na au bila FPU - itatumia FPU ikiwa iko. Kwa kesi yetu maalum (itabidi ufanye utafiti wako mwenyewe), FPU ya bodi hii inalingana na vfpv4. Unaweza kulazimika kucheza na hii. Au hata kuiacha kwa softfp.

kidole (vs.arm)

Mdhibiti mdogo wa ARM kweli ana mchanganyiko wa seti za mafundisho. Moja ni ARM, na nyingine ni THUMB. Tofauti moja ni maagizo ya 16-bit vs maagizo ya 32-bit. Kwa hivyo, maagizo haya yanamwambia mkusanyaji achukue maagizo yafuatayo kama THUMB au ARM.

Tutachukua tu faili iliyobaki kama ilivyo kwa kuwa Maagizo haya bado hayajapitia programu za kusanyiko zinazoendeshwa.

Hatua ya 7: Toleo la Mkutano wa Programu ya 'Hello World'

Ifuatayo pia inaweza kwenda kwenye faili ya "msingi. S" iliyoundwa hapo awali. Hii, tena, ni kutoka kwa mfano katika kifungu hicho.

/ * * Mshughulikiaji wa Rudisha. Imeitwa wakati wa kuweka upya. * /. aina reset_handler,% kazi reset_handler: // Weka pointer ya stack hadi mwisho wa stack. // Thamani ya '_estack' inafafanuliwa katika hati yetu ya kiunganishi. LDR r0, = _estack MOV sp, r0

// Weka maadili kadhaa ya dummy. Tunapoona maadili haya

// katika kitatuaji chetu, tutajua kuwa programu yetu // imepakiwa kwenye chip na inafanya kazi. LDR r7, = 0xDEADBEEF MOVS r0, # 0 kuu_loop: // Ongeza 1 kujiandikisha 'r0'. ADDS r0, r0, # 1 // Kitanzi nyuma. B kuu_loop.size reset_handler,.-Reset_handler

Kwa hivyo, lengo la programu hiyo hapo juu ni kupakia muundo unaotambulika katika rejista moja ya msingi ya MCU (katika kesi hii R7), na ongezeko la thamani inayoanzia sifuri hadi rejista nyingine ya msingi ya MCU (katika kesi hii R0). Ikiwa tunapita kupitia nambari ya kutekeleza, tunapaswa kuona nyongeza ya data ya R0.

Ikiwa umekuwa ukifuata pamoja na Maagizo kuhusu MSP432 na kozi / maabara ya TI-RSLK, basi mpango huu wote hapo juu unapaswa kuwa wa kawaida kwako.

Jambo jipya ambalo ninaweza kuona ni matumizi ya "=" wakati wa kupakia "DEADBEEF" katika kusajili R7. Hatukutumia hiyo.

Faili ya "core. S" iliyoambatanishwa hapa sasa ina chanzo kamili.

Hatua ya 8: Kukusanya Nambari

Ni wakati wa kufanya vitu vya laini ya amri. Kitu halisi, mwishowe.

Walakini, hatuko kabisa huko. Tunapaswa tena kurekebisha amri iliyotolewa katika kifungu hicho, na kuirekebisha kwa hali yetu wenyewe.

Hapa kuna nambari ya mfano:

mkono-hakuna-eabi-gcc -x mkusanya-na-cpp -c -O0 -mcpu = gamba-m0 -mthumb -Msingi wa ukuta. S -o msingi.o

Ikiwa tunakwenda kwenye tovuti ya gnu.org ya GCC, (katika kesi hii toleo la 7.3),

x

The -x ni kutaja lugha. Vinginevyo ikiwa hakuna -x, basi mkusanyaji atajaribu kubahatisha kwa kutumia kiendelezi cha faili. (kwa upande wetu, *. S).

Mfano hapo juu kutoka kwa kifungu unabainisha kukusanyika-na-cpp, lakini tunaweza kufanya kukusanyika tu.

c

The -c inasema kukusanya lakini usiunganishe.

O0

-O ni kuweka kiwango cha uboreshaji. Kutumia -O0 (oh-zero) inasema "punguza muda wa kukusanya na ufanye utatuaji utoe matokeo yanayotarajiwa. Hii ndio chaguomsingi".

mcpu = gamba-m0

-Mcpu inataja jina la processor inayolengwa. Kwa upande wetu, itakuwa gamba-m4.

kidole

-Mthumb inabainisha kuchagua kati ya utengenezaji wa nambari ambayo inafanya ARM na majimbo ya THUMB.

Uta

-Wall ni ya kawaida sana na inajulikana. Inageuka bendera zote za onyo.

Mwishowe, mwishoni mwa amri tuna msingi wa faili ya pembejeo. S na faili ya pato core.o.

Hapa kuna safu mpya ya amri inayofaa kesi yetu maalum.

mkono-hakuna-eabi-gcc -x kukusanyika -c -O0 -mcpu = gamba-m4 -mthumb -Wall msingi. S -o msingi.o

Na hiyo ilikusanywa.

Hatua ya 9: Kuunganisha Programu

Moja kwa moja kutoka kwa mfano katika kifungu, tuna hii:

mkono-hakuna-eabi-gcc msingi.o -mcpu = gamba-m0 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf

Zaidi ya hapo juu umeona. Chini ni nini kipya.

specs = nosys.specs

Hii ni ngumu sana kuelezea.

Inahusiana na "semihosting" na "retargeting", na inahusiana na pembejeo / pato. Pia inahusiana na simu za mfumo na maktaba.

Kawaida, mifumo iliyoingizwa haitoi vifaa vya kawaida vya kuingiza / kutoa. Hii itaathiri simu au mfumo wa maktaba (mfano: printf ()).

Semihosting inamaanisha mtatuaji (tazama picha ya Hatua ya 11 na sehemu ya utatuzi iliyozungukwa na nyekundu) ina kituo maalum na hutumia itifaki ya kupakia nusu, na unaweza kuona pato la printf () kwenye mashine ya mwenyeji (kupitia kitatuaji).

Kurekebisha malengo, kwa upande mwingine, inamaanisha kuwa mfumo huo huo au simu za maktaba zinamaanisha kitu kingine. Wanafanya kitu kingine, hiyo ina maana kwa mfumo uliopachikwa. Kwa maana, sema kwa printf (), kuna utekelezaji mpya, utekelezaji uliowekwa tena wa kazi hiyo.

Baada ya kusema hayo yote, -specs = nosys.specs inamaanisha kuwa hatutakuwa wageni wa nusu. Hiyo kawaida ingemaanisha kuwa tunapanga tena. Hiyo inatuleta kwenye bendera inayofuata.

nostdlib

Chaguo la kiunganishi -nostdlib hutumiwa kuunganisha programu inayokusudiwa kuendesha kitu kimoja. -nostdlib inamaanisha chaguzi za kibinafsi -nodefaultlibs na -nostartfiles. Hapo chini tunajadili chaguzi mbili kando, lakini matumizi ya kawaida ni tu nostdlib kwa ununuzi wa moja-moja. Wakati wa kuunganisha programu inayopangishwa, maktaba za mfumo wa kawaida kama libc zinaunganishwa na chaguo-msingi, ikitoa ufikiaji wa programu kwa kazi zote za kawaida (printf, strlen na marafiki). Chaguo la kiunganishi -nodefaultlibs hulemaza kuunganisha na maktaba hizo chaguomsingi; maktaba pekee zilizounganishwa ni zile ambazo unaziita wazi kwa kiunganishi ukitumia -l bendera.

lgcc

libgcc.a ni maktaba ya kawaida ambayo hutoa kanuni ndogo za ndani kushinda mapungufu ya mashine fulani. Kwa mfano, processor ya ARM haijumuishi maagizo ya mgawanyiko. Toleo la ARM la libgcc.a linajumuisha kazi ya mgawanyiko na mkusanyaji hutoa simu kwa kazi hiyo inapohitajika.

T

Hii ni njia tu ya kumwambia kiunganishi atumie faili hii kama hati ya kiunganishi. Kwa upande wetu, jina la faili ni linker.script.ld.

o kuu

Mwishowe, tunamwambia kiunganishi jina la faili ya picha ya mwisho itakayoteketezwa / kuwaka kwenye kifaa chetu itakuwa nini.

Hapa kuna toleo letu la laini kamili ya amri, iliyobadilishwa kwa hali yetu maalum:

mkono-hakuna-eabi-gcc msingi.o -mcpu = gamba-m4 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./linker.script.ld -o kuu.elf

Tunahakikisha kuwa faili ya hati, na faili ya msingi.o zote ziko kwenye saraka moja, ambapo tutatumia laini ya amri hapo juu.

Na inaunganisha bila shida.

Angalia

Kisha tunakimbia:

mkono-hakuna-eabi-nm kuu

na tunapata:

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

Yapendeza. Amri ya mkono-hakuna-eabi-nm ni njia ya kuorodhesha alama ndani ya faili za kitu.

Hatua ya 10: KujaribuKuunganisha kwa STM32 Nucleo-64

Kujaribu Kuunganisha kwa STM32 Nucleo-64
Kujaribu Kuunganisha kwa STM32 Nucleo-64
Kujaribu Kuunganisha kwa STM32 Nucleo-64
Kujaribu Kuunganisha kwa STM32 Nucleo-64

Ujumbe wako wa kwanza, ikiwa utachagua kuukubali, ni kupata mfumo wako kuona bodi yako ya maendeleo.

Kutumia Windows

Kwa Windows, niliamua kusanikisha TrueSTUDIO kutoka Atollic (toleo la bure). Ilikuwa usakinishaji usio na uchungu na iliweka dereva kiatomati ili nitumie st-link kujaribu unganisho. Mara tu nilipoweka TrueSTUDIO na msimamizi wa kifaa kuona kifaa, nilipakua zana za texan / stlink zilizopendekezwa na nakala ya Bare Metal ambayo tumekuwa tukifuata. Niliweka tena folda moja kwa moja chini ya "C: \", na nikaunda tena viungo kutoka kwa bin yangu ya nyumbani ya cygwin kwa amri.

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

Kama jaribio la kwanza kuona ikiwa tunaweza kuwasiliana na kifaa, nilikimbia:

st-info - uchunguzi

Na kurudi:

Kupatikana 1 programmers stlink

Kwa hivyo sasa tunajua tunaweza kuzungumza / kuuliza bodi yetu ya maendeleo.

Kutumia Linux

Kwa linux, hauitaji dereva. Lakini kwa Debian, itabidi ujenge zana za st kutoka chanzo.

clone ya git

Hakikisha umeweka libusb-1.0-0-dev.

orodha inayofaa | grep -E "* libusb. * dev *"

Unapaswa kuona:

libusb-1.0-0-dev / xenial, sasa 2: 1.0.20-1 amd64 [imewekwa]

au kitu kama hicho.

Ili kuiweka:

Sudo apt-get kufunga libusb-1.0-0-dev

Kumbuka kuwa hapo juu sio sawa na:

Sudo apt-get kufunga libusb-dev

Libusb dev inayopotea sahihi inaweza kusababisha cmake kuwa na maswala.

Kosa la CMake: Vigezo vifuatavyo vinatumika katika mradi huu, lakini vimewekwa kwenye NOTFOUND. Tafadhali ziweke au uhakikishe kuwa zimewekwa na kupimwa kwa usahihi katika faili za CMake:

Badilisha kwa saraka ya mizizi ya mradi (… blah / blah / stlink). Fanya "fanya kutolewa".

Baada ya hapo kujenga, zana zinapaswa kuwa chini ya ".. / build / Release".

Basi unaweza kukimbia "st-info --probe". Hapa kuna pato na Nucleo iliyounganishwa, basi sio.

devchu @ chubox: ~ / Development / stlink $./build/Release/st-info --probeFound 1 stlink programmers serial: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "flash: 524288 (pagesize: 2048) sram: 65536 chipid: 0x0446 nets: F303 kifaa cha msongamano mkubwa devchu @ chubox: ~ / Development / stlink $./build/Release/st- info --probe Kupatikana 0 stlink programmers devchu @ chubox: ~ / Development / stlink $

Hatua ya 11: Wacha Tutumie GDB na Linux

Wacha Tutumie GDB na Linux
Wacha Tutumie GDB na Linux
Wacha Tutumie GDB na Linux
Wacha Tutumie GDB na Linux

Ikiwa umekuwa ukijaribu haya yote, na umefikia hapa - nzuri! Bora. Wacha tufurahi kidogo sasa.

Unaponunua bodi hizi za ukuzaji wa ARM, iwe ni Launchpad ya MSP432 kutoka kwa Hati za Texas, au hii tunayoijadili sasa, Nucleo-F303 (STM32 Nucleo-64), kawaida huwasili tayari ikiwa imeangaza na programu inayoendesha, kawaida programu fulani ya blinky ambayo pia ni pamoja na kubonyeza swichi ili kubadilisha kiwango ambacho taa (s) zinaangaza.

Kabla ya kuwa wepesi sana kuandika hiyo, wacha tuone ni nini cha kuona na kufanya.

Ukiwa na Linux, fungua kituo, badilisha saraka ya mradi wa stlink git ambayo tumeunda tu, na upate zana ya st-util.

devchu @ chubox: ~ / Development / stlink $ pata. jina -st-use

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

Endesha zana hiyo. Kwa kuwa tayari tumejaribu muunganisho wetu na st-info --probe, tunapaswa kupata pato kama hii:

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: Inapakia vigezo vya kifaa…. 2018-10-20T18: 33: 23 INFO common.c: Kifaa kilichounganishwa ni: F303 kifaa cha wiani mkubwa, id 0x10036446 2018-10-20T18: 33: 23 INFO common.c: Ukubwa wa SRAM: 0x10000 ka (64 KiB), Flash: 0x80000 ka (512 KiB) katika kurasa za 2048 byte 2018-10-20T18: 33: 23 INFO gdb-server.c: Chip ID ni 00000446, Core ID ni 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: Kusikiliza saa *: 4242…

Hiyo ni seva ya GDB inayoendesha sasa, na inaona bodi yetu ya maendeleo, na muhimu zaidi, inasikiliza kwenye bandari ya 4242 (bandari chaguo-msingi).

Sasa tuko tayari kumtia moto mteja wa GDB.

Katika Linux, fungua kituo kingine, ingiza hii:

mkono-hakuna-eabi-gdb -tui

Hiyo ni sawa tu na kuendesha gdb laini-ya-amri, hata hivyo badala yake hutoa kiini-msingi cha maandishi (nadhani ni kwamba hutumia laana).

Tuna mteja wa GDB na seva ya GDB inayoendesha. Walakini, mteja hajaunganishwa na seva. Kwa sasa haijui chochote juu ya Nucleo yetu (au bodi ya chaguo lako). Lazima tuiambie. Katika kituo, haraka yako inapaswa sasa kuwa "(gdb)". Ingiza:

kusaidia kulenga

Itakupa orodha. Ona kwamba tunayotaka ni kulenga kupanuliwa-mbali - Tumia kompyuta ya mbali kupitia laini ya serial.

Lakini pia tunapaswa kuipatia eneo. Kwa hivyo, kwa haraka (gdb), ingiza:

(gdb) lengo lililopanuliwa-kijijini localhost: 4242

Unapaswa kurudisha majibu kama vile:

(gdb) lengo lililopanuliwa-kijijini localhost: 4242

Utatuaji wa kijijini kwa kutumia localhost: 4242 0x080028e4 in ?? ()

Wakati huo huo, kwenye kituo kinachoendesha st-util gdbserver, tulipata hii:

2018-10-20T18: 42: 30 INFO gdb-server.c: Imepatikana madaftari ya hw hw 6

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

Hatua ya 12: Wacha Rudia, Pamoja na Windows na Flash Programu yetu

Hebu Rudia, Pamoja na Windows na Flash Programu Yetu
Hebu Rudia, Pamoja na Windows na Flash Programu Yetu
Hebu Rudia, Pamoja na Windows na Flash Programu Yetu
Hebu Rudia, Pamoja na Windows na Flash Programu Yetu
Hebu Rudia, Pamoja na Windows na Flash Programu Yetu
Hebu Rudia, Pamoja na Windows na Flash Programu Yetu

Hatua za kuendesha st-util gdbserver, na mteja wa mkono-hakuna-eabi-gdb ni sawa sawa na sisi wakati wa Hatua iliyopita. Unafungua vituo viwili (cygwin, DOS cmd, au Windows Powershell), pata eneo la st-util, endesha. Katika kituo kingine, endesha mteja wa mkono-hakuna-eabi-gdb. Tofauti pekee ni kwamba hali ya -tui (mtazamo wa maandishi-msingi wa maandishi) hauwezekani.

Ikiwa hapo juu ilifanya kazi kwenye Windows, basi itabidi uache (mteja tu). Kwa wakati huu, kwa namna fulani utahitaji kuendesha mteja wa GDB ambapo faili yako ya ujenzi iko ("core.out"), au ongeza njia nzima kwa faili hiyo kama hoja kwa mteja wa GDB.

Nilirahisisha maisha yangu kwa kutumia cygwin na kuunda viungo kutoka saraka yangu ya ndani ya NYUMBANI // bin hadi mahali ambapo zana hizo zote zinakaa.

Sawa, tumekusanya na kuunganishwa kama hapo awali, na tuna faili kuu.yetu tayari kuangaza.

Tuna st-util inayoendesha kwenye dirisha moja. Tunaanzisha tena mteja wa GDB, wakati huu tunafanya:

mkono-hakuna-eabi-gdb kuu

Tunaiacha ianze, subiri msukumo wa (gdb), fanya amri yetu hiyo ya unganisho kwa seva ya GDB (st-util), na tuko tayari kuangazia inayoweza kutekelezwa. Inapinga hali ya hewa sana:

(gdb) mzigo

Kukimbia na vituo vya cygwin, kuna suala linalojulikana na wakati mwingine amri za kiweko hazitoi. Kwa hivyo kwa upande wetu, dirisha linaloendesha seva lilikuwa kimya kabisa. Yule anayeendesha mteja, ambapo tuliendesha mzigo, toa hii:

Sehemu ya kupakia. Maandishi, saizi 0x1c lma 0x8000000 Anwani ya kuanza 0x8000000, saizi ya mzigo 28 Kiwango cha uhamisho: 1 KB / sec, 28 byte / write.

Hatua ya 13: Kuangaza na Linux - Tuzo zaidi: D

Kuangaza na Linux - Tuzo zaidi: D
Kuangaza na Linux - Tuzo zaidi: D

Hatua ya 14: Wacha Tuzame Kidogo

Ikiwa umefika hapa, bora. Wacha tuendelee.

Kwa nini usitafute ndani ya faili kuu, inayoweza kutekelezwa? Endesha yafuatayo:

mkono-hakuna-eabi-objdump -d kuu

Unapaswa kuona pato kama hii:

kuu.elf: fomati ya faili elf32-littlearm

Kusambaratisha sehemu. Maandishi:

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 anaongeza r0, # 1 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef

Je! Tunaweza kupata nuggets ndogo kutoka kwa pato hapo juu?

Ikiwa unakumbuka nyuma wakati tunajadili na kuunda faili ya linker.script.ld, tulisema kuwa vifaa hivi vya ARM vina RAM kuanzia 0x20000000, na kumbukumbu hiyo ya FLASH huanza saa 0x08000000.

Kwa hivyo, tunaweza kuona kuwa kweli mpango huo ni kwamba wote hukaa katika kumbukumbu ya FLASH.

Halafu, hapo juu, lakini hatua ya baadaye, wakati tulipokuwa tukigawanya sehemu ya "Hello World", kulikuwa na taarifa ambapo tunapakia thamani ya mara moja, ya mara kwa mara, halisi ("0xDEADBEEF") kwenye rejista ya msingi ya MCU ("R7").

Taarifa ilikuwa:

LDR R7, = 0xDEADBEEF

Katika nambari yetu, hiyo ndio mahali pekee ambapo hata tunataja DEADBEEF. Hakuna mahali pengine popote. Na bado, ukiangalia maagizo yaliyotenganishwa hapo juu / yaliyoundwa upya, nk, kuna mengi zaidi yanayohusiana na DEADBEEF kuliko vile tulifikiri tulifanya.

Kwa hivyo, mkusanyaji / kiunganishi kwa namna fulani aliamua kuangazia kabisa thamani ya DEADBEEF kwenye anwani ya FLASH, mahali 0x8000018. Halafu, mkusanyaji alibadilisha maagizo yetu hapo juu ya LDR kuwa:

LDR R7, [PC, # 8]

Hata ilitoa maoni kwetu. Jinsi nzuri. Na inatuambia kuchukua programu ya sasa ya kukodisha thamani (sajili ya PC), ongeza 0x8 kwa thamani hiyo, na hapo ndipo DEADBEEF imechomwa moto, na upate hiyo thamani na uijaze kwa R7.

Kwa hivyo hiyo inamaanisha pia kwamba kaunta ya programu (PC) ilikuwa ikielekeza kwa anwani 0x8000010, ambayo ni mwanzo wa main_loop, na kwamba thamani ya DEADBEEF inakaa kwenye anwani mbili baada ya kumalizika kwa main_loop.

Hatua ya 15: Mwishowe, Angalia kwa ufupi Programu inayoendesha

Hata ukiacha GDB, ingiza tena amri. Sio lazima hata upe faili yoyote; hatuangazi tena, tunaiendesha tu.

Mara tu ukiunganisha tena mteja wa GDB kwenye seva ya GDB, kwa mwongozo wa (gdb):

(gdb) madaftari ya habari

Unapaswa kuona kitu kama hiki:

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 0xffffffff 0994900000000000000000000000000000000000000

Lakini basi, kwa haraka (gdb), ingiza:

(gdb) endelea

Na haraka sana piga CTRL-C. Hiyo inapaswa kusitisha mpango. Ingiza amri ya "rejista za habari" tena.

Wakati huu, inaonekana tofauti:

(gdb) madaftari ya habari

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 16777216

Nini kimetokea? Hasa kile tulichotaka. DEADBEEF ilipakiwa kwenye R7, na R0 imekuwa ikiongezeka (haraka sana). Ukirudia, utaona R0 tena na thamani nyingine.

Hatua ya 16: Tulitaka Kuunda Mpangilio wa kusoma tu kwa Kiwango

Njia moja ya kuunda sawa na safu kwa kutumia Mkutano na maagizo, ni kama ifuatavyo:

andika myarray,% object // jina au lebo 'myarray' hufafanuliwa kama aina ya kitu.

myarray: // huu ndio mwanzo wa tamko la 'myarray' // (itakuwa na nini). neno 0x11111111 // mwanachama wa kwanza au thamani iliyo katika 'myarray'. neno 0x22222222 // thamani ya pili (anwani zinazohusiana).. neno 0x33333333 // na kadhalika. saizi myarray,.-myarray // mkusanyaji / mkusanyaji sasa anajua ni wapi mwisho au // mpaka wa 'myarray'.

Sasa kwa kuwa tumeiweka katika kumbukumbu ya FLASH, tunaweza kuitumia katika programu. Chini ni sehemu:

LDR R1, myarray // hii mizigo data iliyo katika eneo la 1 la 'myarray'. ' // hii sio tunayotaka.

LDR R1, = myarray // hii inapakia thamani ya eneo yenyewe (anwani ya 1), // sio data.. // hii ndio tunataka.

MOV R2, # 0 // R2 itaendelea kuhesabu ili kuhakikisha hatutembei

// mwisho wa safu. LDR R3, = myarrsize // R3 itakuwa sawa na 'myarrsize'.

// R0 itashikilia data zetu

kitanzi_ kikuu:

LDR R0, [R1] // Pakia data iliyoelekezwa na R1 ('myarray') hadi R0. CMP R2, R3 // Je! Tuko katika ukomo wa safu? BEQ main_loop // Ikiwa tumemaliza, tumemaliza, kwa hivyo tutazunguka tu milele.

ONGEZA R2, # 1 // Vinginevyo, tunaweza kuendelea kueneza kupitia safu.

ONGEZA R1, # 4 // Ongeza 4 kusajili R1, kwa hivyo inaelekeza sawa kwa inayofuata

// anwani..

B main_loop // Kitanzi nyuma.

Video hupitia haya yote, na kuna mdudu ndani yake. Ni nzuri; inaonyesha kuwa ni muhimu kukimbia na nambari ya utatuzi. Inaonyesha kesi ya kawaida ya kutembea kutoka mwisho wa safu.

Ilipendekeza: