Isi kandungan:
- Langkah 1: Ujian Awal Peranti
- Langkah 2: Keperluan Asas
- Langkah 3: Keperluan Asas - Windows
- Langkah 4: Apa Keperluannya
- Langkah 5: Fail Linker
- Langkah 6: Jadual Vektor
- Langkah 7: Versi Perhimpunan Program 'Hello World'
- Langkah 8: Menyusun Kod
- Langkah 9: Menghubungkan Program
- Langkah 10: Uji Sambungan ke STM32 Nucleo-64
- Langkah 11: Mari Gunakan GDB Dengan Linux
- Langkah 12: Mari Ulangi, Dengan Windows dan Flash Program Kami
- Langkah 13: Berkelip Dengan Linux - Lebih Bermanfaat: D
- Langkah 14: Mari Menyelam Lebih Sedikit
- Langkah 15: Akhirnya, Tinjauan Ringkas Program yang Dijalankan
- Langkah 16: Kami Ingin Membuat Array Hanya Baca dalam Flash
Video: Bahagian 1 Perhimpunan ARM TI RSLK Makmal Kurikulum Pembelajaran Robotik 7 STM32 Nucleo: 16 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:08
Fokus Instructable ini adalah pengawal mikro STM32 Nucleo. Motivasi untuk ini dapat membuat projek pemasangan dari tulang kosong. Ini akan membantu kita menyelami lebih mendalam dan memahami projek MSP432 Launchpad (TI-RSLK) yang telah menjadi topik beberapa Instruksional sudah.
Tidak banyak bantuan dalam talian untuk membuat projek pemasangan hanya untuk MSP432, menggunakan Code Composer Studio. Hingga kini kami hanya menyalin / menampal dari projek pemasangan yang sudah ada. Pendekatan ini telah membantu kami dengan baik.
Namun, sekarang, untuk Makmal 7, kami menghadapi sedikit masalah. Atau sekurang-kurangnya cegukan sementara. Lab 7 memperkenalkan mesin-keadaan terhingga, dan perkara pertama yang kita hadapi adalah keperluan untuk membuat dan menggunakan pelbagai nilai. Oleh kerana kursus TI menggunakan pengaturcaraan C - ini tidak menjadi masalah. Tetapi Instruksional ini memfokuskan pada pemasangan, bukan C.
Lebih jauh lagi, kerana susunannya adalah nilai hanya baca, ada baiknya memasukkannya ke dalam memori flash, bukan RAM.
Nampaknya ada lebih banyak bantuan dalam talian untuk projek pemasangan yang menggunakan STM32 MCU, oleh itu, kita mulakan dengan Instructable ini, dengan tujuan menggunakan apa yang dipelajari, untuk kemudian diterapkan ke MSP432 dan Code Composer Studio.
Menjelang tujuan itu, kami juga akan mendapat pengalaman dengan pengawal mikro yang popular.
Langkah 1: Ujian Awal Peranti
Sekali lagi, mengapa memilih STM32 Nucleo secara khusus?
Jujur? Kerana saya mencari artikel yang baik mengenai projek pemasangan logam kosong untuk pengawal ARM, dan saya menemui siri ini. Dan juga kerana STM32 nampaknya MCU yang popular.
Saya melakukan penyelidikan (ada banyak versi untuk dipilih - lihat gambar di atas), tetapi pada akhirnya ia menjadi apa yang sebenarnya saya dapat, kerana saya akan menggunakan Amazon (di A. S.).
Ia disediakan dalam pakej yang ringkas tetapi profesional, dengan beberapa petunjuk permulaan. Agak lucu apabila melihat bahawa demo yang dibakar ke dalam alat kawalan hampir sama dengan apa yang telah kita lakukan pada Instructables yang lalu - LED berkelip dan mengubah kelajuan mengikut tekan butang.
Nampaknya papan pengembangan ini sangat mirip dengan MSP432 kerana terdapat 2 LED, dan satu butang tekan pengguna. MSP432 mempunyai 2 butang pengguna.
Seperti yang anda lihat dalam foto, saya agak terkejut kerana papan ini mempunyai USB mini dan bukan mikro. Harus kehabisan untuk membeli tali pusat.
Ujian lain yang baik adalah bahawa apabila anda menyambungkannya ke komputer anda (saya menggunakan kotak Linux), ia muncul dalam pengurus fail saya, sebagai sistem fail, yang disebut "NODE_F303RE". Pembukaan yang menunjukkan dua fail, satu HTML dan satu teks.
Itu sahaja, tetapi sekurang-kurangnya ia juga mengatakan bahawa penyambungan nampaknya agak mudah.
Sekarang kita sudah bersedia untuk memulakan.
Saya akan cuba untuk tidak mengulangi maklumat baik dari siri artikel IVONOMICON Bare Metal, melainkan menambahnya.
Langkah 2: Keperluan Asas
Perkara pertama yang kita perlukan adalah penyusun.
Kami memerlukan penyahpepijat:
devchu @ chubox: ~ $ sudo apt-get install gdb-arm-none-eabiMembaca senarai pakej… Selesai Membina pokok pergantungan Membaca maklumat keadaan… Selesai Pakej BARU berikut akan dipasang: gdb-arm-none-eabi 0 ditingkatkan, 1 baru dipasang, 0 untuk dikeluarkan dan 8 tidak ditingkatkan. Perlu mendapatkan arkib 2, 722 kB. Selepas operasi ini, 7, 738 kB ruang cakera tambahan akan digunakan. Dapatkan: 1 https://us.archive.ubuntu.com/ubuntu xenial / universe amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3 + 9 [2, 722 kB] Diambil 2, 722 kB dalam 1 detik (1, 988 kB / s) Memilih pakej gdb-arm-none-eabi yang sebelumnya tidak dipilih. (Membaca pangkalan data… 262428 fail dan direktori yang sedang dipasang.) Bersedia untuk membongkar… / gdb-arm-none-eabi_7.10-1ubuntu3 + 9_amd64.deb… Membongkar gdb-arm-none-eabi (7.10-1ubuntu3 + 9)… Memproses pencetus untuk man-db (2.7.5-1)… Menyiapkan gdb-arm-none-eabi (7.10-1ubuntu3 + 9)…
Langkah 3: Keperluan Asas - Windows
Langkah di atas mengandaikan bahawa kita menggunakan Linux. Bagaimana jika kita menggunakan Windows?
Anda boleh pergi ke laman Pembangun lengan, dan terdapat beberapa pilihan muat turun yang tersedia. Saya menggunakan mesin Windows 8.
Semasa pemasangan, saya memilih untuk memasangnya ke pemacu root "C: \" dan bukannya Program Program hanya kerana saya juga menggunakan cygwin, dan lebih mudah untuk membuat pautan dari tong tempatan saya ke folder root C: daripada semua kacau di jalan ke Fail Program (dengan ruang, dll).
Oleh itu, persekitaran dan jalan cygwin saya, dan lain-lain, kelihatan seperti:
C: / cygwin64 / home / bin / arm-none-eabi-gcc, di mana arm-none-eabi-gcc adalah pautan ke C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc.
Saya kemudian membuat folder "dev" di bawah rumah cygwin, dan di situlah saya meletakkan fail inti. S dan menjalankan perintah penyusun. (lihat lebih jauh di bawah untuk barangan penyusun).
Saya melakukan perkara yang sama untuk gdb (arm-none-eabi-gdb).
Langkah 4: Apa Keperluannya
Jadi apa itu "gcc-arm-none-eabi"?
Penyusun gnu (GCC) akan menyusun bahasa pengaturcaraan (seperti C) ke dalam kod asli untuk mesin yang sedang dijalankan. Sebagai contoh, jika anda menyusun beberapa kod C menggunakan GCC pada mesin Windows anda, kode tersebut akan dibuat untuk dijalankan pada mesin Windows. Pelaksana yang dihasilkan tidak akan (biasanya) dijalankan pada pengawal mikro ARM.
Oleh itu, untuk membina program yang akan dimuat turun dan dibakar ke dalam pengawal mikro ARM (dalam kes ini yang akan menjadi STM32 Nucelo), kita perlu memberikan GCC sesuatu yang lain: kemampuan untuk "menyusun silang". Artinya, kemampuan untuk menghasilkan yang dapat dijalankan, bukan untuk sistem asalnya (dan pemproses), tetapi untuk sistem sasaran (pengawal mikro ARM). Di situlah "gcc-arm-none-eabi" mula dimainkan.
Jadi apa itu "gdb-arm-none-eabi"?
Sebaik sahaja kami memuat turun dan membakar (mem-flash) yang baru dihasilkan ke dalam pengawal mikro, kami mungkin mahu menyahpepijatnya - selangkah demi selangkah kodnya. GDB adalah debugger gnu, dan juga memerlukan cara untuk melakukan tugasnya, tetapi menyasarkan sistem yang berbeza.
Oleh itu, gdb-arm-none-eabi adalah untuk GDB, apa yang gcc-arm-none-eabi adalah untuk GCC.
Pemasangan pakej lain yang dicadangkan adalah "libnewlib-arm-none-eabi". Apa itu?
Newlib adalah perpustakaan C dan perpustakaan matematik yang dimaksudkan untuk digunakan pada sistem tertanam. Ini adalah gabungan beberapa bahagian perpustakaan, semuanya di bawah lesen perisian percuma yang menjadikannya mudah digunakan pada produk terbenam.
Dan akhirnya, pakej "libstdc ++ - arm-none-eabi". Itu cukup jelas; itu perpustakaan C ++ untuk penyusun silang; untuk pengawal mikro ARM tertanam.
Langkah 5: Fail Linker
Mari buat skrip penghubung.
Satu bahagian utama atau blok dalam fail ini adalah arahan MEMORY.
--- dari sourceware.org:
Konfigurasi lalai penghubung membenarkan peruntukan semua memori yang ada. Anda boleh mengatasi ini dengan menggunakan perintah MEMORY. Perintah MEMORY menerangkan lokasi dan ukuran blok memori dalam sasaran. Anda boleh menggunakannya untuk menerangkan kawasan memori mana yang mungkin digunakan oleh penghubung, dan kawasan memori mana yang mesti dielakkan. Anda kemudian boleh menetapkan bahagian ke kawasan memori tertentu. Pautan akan menetapkan alamat bahagian berdasarkan kawasan memori, dan akan memberi amaran mengenai kawasan yang menjadi terlalu penuh. Pautan tidak akan mengacak bahagian sekitar untuk masuk ke kawasan yang tersedia. Skrip penghubung mungkin mengandungi banyak penggunaan perintah MEMORY, namun, semua blok memori yang ditentukan diperlakukan seolah-olah mereka ditentukan dalam satu perintah MEMORY. Sintaks untuk MEMORY adalah:
MEMORI
{name [(attr)]: ASAL = asal, PANJANG = len…}
Contoh dalam artikel:
/ * Tentukan akhir RAM dan had memori timbunan * // * (4KB SRAM pada baris STM32F031x6, 4096 = 0x1000) * / / * (RAM bermula di alamat 0x20000000) _estack = 0x20001000;
MEMORI
{FLASH (rx): ORIGIN = 0x08000000, LENGTH = 32K RAM (rxw): ORIGIN = 0x20000000, LENGTH = 4K}
Oleh itu, kita perlu mengetahui berapa banyak FLASH (untuk program dan pemalar, dll) dan berapa banyak RAM (untuk digunakan oleh program; timbunan dan timbunan, dll) untuk papan tertentu kita. Ini menjadi sedikit menarik.
Kad kecil yang bagus yang disertakan dengan Nucleo mengatakan bahawa ia mempunyai memori kilat adalah 512 Kbytes, dan SRAM adalah 80 Kbytes. Namun, menyambungkannya ke USB, ia dipasang sebagai sistem fail dengan dua fail, dan pengurus fail dan GParted menunjukkan ia mempunyai ruang lebih dari 540+ Kbytes. (RAM?).
TETAPI, cuba memadamkan dua fail menggunakan pengurus fail, memutuskan sambungan kemudian menyambungkan semula peranti, masih menunjukkan kedua-dua fail tersebut. (dan pengurus fail mengenali sesuatu kerana terdapat sedikit ikon "kunci" pada setiap fail.
Oleh itu, mari kita lihat angka di kad. Jadi sekarang kita mengambil contoh di atas dan menukarnya ke papan khusus kita.
Anda mungkin ingin menggunakan sesuatu seperti penukar memori dalam talian ini, untuk beralih dari KB umum ke bilangan bait tertentu.
Oleh itu, anda mungkin mahu menggunakan penukar perpuluhan ke hex dalam talian.
/ * Tentukan akhir RAM dan had memori timbunan * /
/ * (SRAM 4KB pada baris STM32F031x6, 4096 = 0x1000) * // * contohnya * /
/ * langkah 1: (80KB SRAM di STM32F303RE, 81920 = 0x14000) * // * papan kami * /
/ * langkah 2, tambahkan ukuran hex ke alamat permulaan hex (di bawah). * /
/ * (RAM bermula di alamat 0x20000000) * /
_estack = 0x20001000; / * contohnya * /
_estack = 0x20014000; / * papan kami * /
MEMORI {
FLASH (rx): ASAL = 0x08000000, PANJANG = 512K
RAM (rxw): ASAL = 0x20000000, PANJANG = 80K
}
Mari panggil fail di atas "linker.script.ld".
Langkah 6: Jadual Vektor
Sekarang kita akan membuat fail pemasangan kecil (dengan arahan) untuk melakukan pengendalian gangguan yang sangat asas. Kami akan mengikuti contoh artikel dan membuat fail bernama "core. S".
Sekali lagi, berikut adalah contoh kandungan fail, tetapi saya membuat perubahan untuk papan khusus kami:
// Arahan ini menentukan atribut chip kami dan
// bahasa perhimpunan yang akan kami gunakan:.syntax unified / * Lihat di bawah ini selepas kod ini * / /*.cpu cortex-m0 * / / * beri komen pada baris contoh ini * /.cpu cortex-m4 / * tambah sebagai korteks lembaga kami. lihat gambar di atas dalam langkah ini * / /*.fpu softvfp * / / * komen baris ini contoh * /.fpu vfpv4 / * tambah sebagai ganti papan kami; ia mempunyai FPU * /.thumb // Lokasi memori global..global vtable.global reset_handler / * * Jadual vektor sebenar. * Hanya saiz RAM dan pengendali 'reset' yang disertakan, untuk kesederhanaan. * /.tipe vtable,% objek vtable:.word _estack.word reset_handler.size vtable,.-vtable
Hmm.. Tiada Arahan '. Sejajar'
Namun, itu tidak kritikal. Lebih banyak mengenai perkara itu (mungkin) kemudian.
.syntax disatukan
.syntax [disatukan | dibahagikan]
Arahan ini menetapkan Sintaks Set Instruksi seperti yang dijelaskan di bahagian ARM-Set Petunjuk
9.4.2.1 Sintaks Set Instruksi Dua sintaks yang sedikit berbeza adalah sokongan untuk arahan ARM dan THUMB. Lalai, dibahagikan, menggunakan gaya lama di mana arahan ARM dan THUMB mempunyai sintaksis tersendiri. Sintaks baru yang disatukan, yang boleh dipilih melalui arahan.syntax.
.fpu vfpv4
Penyusun GCC dapat menghasilkan binari dengan beberapa pilihan mengenai titik terapung: lembut - sesuai untuk berjalan pada CPU tanpa FPU - pengiraan dilakukan dalam perisian oleh softfp yang dihasilkan oleh penyusun - sesuai untuk berjalan pada CPU dengan atau tanpa FPU - akan menggunakan FPU jika ada. Untuk kes khusus kami (anda mesti membuat kajian anda sendiri), FPU dewan ini sesuai dengan vfpv4. Anda mungkin perlu bermain dengan ini. Atau biarkan di softfp.
.thumb (vs.arm)
Mikrokontroler ARM ini sebenarnya mempunyai gabungan set arahan. Salah satunya adalah ARM, yang lain adalah THUMB. Satu perbezaan adalah arahan 16-bit berbanding arahan 32-bit. Oleh itu, arahan ini memberitahu penyusun untuk memperlakukan arahan berikutnya sebagai THUMB atau ARM.
Kami hanya akan mengambil baki fail sebagaimana adanya kerana Instructables ini belum menyelidiki pengaturcaraan pemasangan yang didorong oleh gangguan.
Langkah 7: Versi Perhimpunan Program 'Hello World'
Berikut ini juga boleh masuk ke dalam fail "core. S" yang dibuat sebelumnya. Ini, sekali lagi, adalah dari contoh dalam artikel.
/ * * Pengendali Reset. Dipanggil semasa ditetapkan semula. * /.type reset_handler,% function reset_handler: // Tetapkan penunjuk timbunan ke hujung timbunan. // Nilai '_estack' ditentukan dalam skrip penghubung kami. LDR r0, = _estack MOV sp, r0
// Tetapkan beberapa nilai palsu. Apabila kita melihat nilai-nilai ini
// dalam penyahpepijat kami, kami akan mengetahui bahawa program kami // dimuatkan pada cip dan berfungsi. LDR r7, = 0xDEADBEEF MOVS r0, # 0 main_loop: // Tambahkan 1 untuk mendaftar 'r0'. ADDS r0, r0, # 1 // Gelung ke belakang. B main_loop.size reset_handler,.-Reset_handler
Oleh itu, teras program di atas adalah memuatkan corak yang dapat dikenali ke dalam satu register MCU teras (dalam kes ini R7), dan nilai kenaikan bermula dari sifar ke dalam daftar MCU teras yang lain (dalam hal ini R0). Sekiranya kita melalui kod pelaksanaan, kita akan melihat kenaikan data R0.
Sekiranya anda mengikuti Instruksional mengenai kursus / makmal MSP432 dan TI-RSLK, maka hampir semua program di atas semestinya tidak asing bagi anda.
Satu perkara baru yang dapat saya lihat ialah penggunaan "=" semasa memuatkan "DEADBEEF" untuk mendaftar R7. Kami tidak menggunakannya.
Fail "core. S" yang dilampirkan di sini sekarang mengandungi sumber lengkap.
Langkah 8: Menyusun Kod
Sudah tiba masanya untuk melakukan beberapa perkara baris perintah. Sesuatu yang nyata, akhirnya.
Walau bagaimanapun, kita tidak berada di sana. Kita sekali lagi harus mengubah perintah yang diberikan dalam artikel itu, dan mengubahnya mengikut keadaan kita sendiri.
Inilah kod contoh:
arm-none-eabi-gcc -x assembler-with-cpp -c -O0 -mcpu = cortex-m0 -mthumb -Wall core. S -o core.o
Sekiranya kita pergi ke laman gnu.org untuk GCC, (dalam kes ini versi 7.3),
x
-X adalah untuk menentukan bahasa. Jika tidak jika tidak -x, maka penyusun akan cuba meneka dengan menggunakan pelanjutan fail. (dalam kes kami, *. S).
Contoh di atas dari artikel menentukan assembler-with-cpp, tetapi kita hanya boleh melakukan assembler.
c
The -c mengatakan kompilasi tetapi jangan pautkan.
O0
-O adalah untuk menetapkan tahap pengoptimuman. Menggunakan -O0 (oh-zero) mengatakan "kurangkan masa kompilasi dan buat debug menghasilkan hasil yang diharapkan. Ini adalah lalai".
mcpu = korteks-m0
-Mcpu menentukan nama pemproses sasaran. Dalam kes kami, itu adalah korteks-m4.
mumbat
The -mthumb menentukan memilih antara menghasilkan kod yang melaksanakan keadaan ARM dan THUMB.
Wall
-Wall tentunya sangat biasa dan terkenal. Ia menghidupkan semua bendera amaran.
Akhirnya, pada akhir perintah kita mempunyai inti fail input. S dan fail output teras.o.
Inilah baris arahan baru yang dihasilkan agar sesuai dengan kes khusus kami.
arm-none-eabi-gcc -x assembler -c -O0 -mcpu = cortex-m4 -mthumb -Wall core. S -o core.o
Dan itu disusun.
Langkah 9: Menghubungkan Program
Langsung dari contoh dalam artikel, kami mempunyai ini:
arm-none-eabi-gcc core.o -mcpu = cortex-m0 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf
Sebilangan besar perkara di atas telah anda lihat. Berikut adalah perkara baru.
specs = nosys.specs
Yang ini agak sukar untuk dijelaskan.
Ini ada hubungannya dengan "semihosting" dan "retargeting", dan ada hubungannya dengan input / output. Ini juga berkaitan dengan panggilan sistem dan perpustakaan.
Biasanya, sistem terbenam tidak menyediakan peranti input / output standard. Ini akan mempengaruhi panggilan sistem atau perpustakaan (contoh: printf ()).
Semihosting bermaksud debugger (lihat gambar Langkah 11 dengan bahagian debugger yang dilingkari merah) mempunyai saluran khas dan menggunakan protokol semihosting, dan anda dapat melihat output printf () pada mesin host (melalui debugger).
Retargeting, sebaliknya, bermaksud bahawa panggilan sistem atau perpustakaan yang sama bermaksud sesuatu yang lain. Mereka melakukan sesuatu yang lain, yang masuk akal untuk sistem tertanam. Dalam arti tertentu, katakanlah untuk printf (), ada implementasi baru, implementasi yang ditargetkan kembali dari fungsi itu.
Setelah mengatakan semua itu, --specs = nosys.specs bermaksud bahawa kita tidak akan menjalani semihosting. Itu biasanya bermaksud kita menargetkan semula. Itu membawa kita ke bendera seterusnya.
nostdlib
Pilihan penghubung -nostdlib digunakan untuk menghubungkan program yang bertujuan untuk menjalankan secara mandiri. -nostdlib menyiratkan pilihan individu -nodefaultlibs dan -nostartfiles. Di bawah ini kita membincangkan dua pilihan secara berasingan, tetapi penggunaan yang paling biasa hanyalah nostdlib untuk membeli-belah sehenti. Semasa menghubungkan program yang dihoskan, perpustakaan sistem standard seperti libc dihubungkan secara lalai, memberikan akses program ke semua fungsi standard (printf, strlen dan rakan). Pilihan linker -nodefaultlibs melumpuhkan pautan dengan perpustakaan lalai tersebut; satu-satunya perpustakaan yang dihubungkan adalah yang betul-betul anda namakan secara jelas kepada penghubung menggunakan bendera -l.
lgcc
libgcc.a adalah perpustakaan standard yang menyediakan subrutin dalaman untuk mengatasi kekurangan mesin tertentu. Sebagai contoh, pemproses ARM tidak menyertakan arahan pembahagian. Versi ARM libgcc.a merangkumi fungsi pembahagian dan penyusun mengeluarkan panggilan ke fungsi tersebut jika diperlukan.
T
Ini hanyalah cara untuk memberitahu pemaut untuk menggunakan fail ini sebagai skrip penghubung. Dalam kes kami, nama failnya adalah linker.script.ld.
o main.elf
Akhirnya, kami memberitahu pemautkan apa yang akan menjadi nama fail gambar output akhir yang akan dibakar / dimuatkan ke dalam peranti kami.
Berikut adalah versi baris perintah lengkap kami, yang diubah suai untuk keadaan khusus kami:
arm-none-eabi-gcc core.o -mcpu = cortex-m4 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./linker.script.ld -o main.elf
Kami memastikan bahawa fail skrip, dan fail core.o, berada dalam direktori yang sama, di mana kami akan menjalankan baris perintah di atas.
Dan ia berkait tanpa masalah.
Satu pemeriksaan
Kami kemudian menjalankan:
arm-none-eabi-nm main.elf
dan kami mendapat:
devchu @ chubox: ~ / Pembangunan / Atolik / 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
Nampak bagus. Perintah arm-none-eabi-nm adalah cara untuk menyenaraikan simbol dalam fail objek.
Langkah 10: Uji Sambungan ke STM32 Nucleo-64
Misi pertama anda, sekiranya anda memilih untuk menerimanya, adalah agar sistem anda dapat melihat papan pengembangan anda.
Menggunakan Windows
Untuk Windows, saya memutuskan untuk memasang TrueSTUDIO dari Atollic (versi percuma). Ini adalah pemasangan tanpa rasa sakit dan secara automatik memasang pemacu sehingga saya dapat menggunakan st-link untuk menguji sambungannya. Sebaik sahaja saya memasang TrueSTUDIO dan pengurus peranti melihat peranti tersebut, saya memuat turun alat texan / stlink yang disarankan oleh artikel Bare Metal yang telah kami ikuti. Saya sekali lagi meletakkan folder secara langsung di bawah "C: \", dan sekali lagi membuat beberapa pautan dari tong rumah cygwin tempatan saya ke perintah.
ln -s /c/STM32. MCU/stlink-1.3.0-win64/bin/st-info.exe ~ / bin / st-maklumat
Sebagai ujian awal untuk mengetahui sama ada kita benar-benar dapat berkomunikasi dengan peranti, saya berlari:
st-maklumat --probe
Dan kembali:
Terdapat 1 pengaturcara stlink
Oleh itu, sekarang kita tahu bahawa kita boleh bercakap / menanyakan papan pengembangan kita.
Menggunakan Linux
Untuk linux, anda tidak memerlukan pemandu. Tetapi untuk Debian, anda mesti membina alat pertama dari sumber.
git klon
Pastikan anda memasang libusb-1.0-0-dev.
senarai apt | grep -E "* libusb. * dev *"
Awak patut lihat:
libusb-1.0-0-dev / xenial, sekarang 2: 1.0.20-1 amd64 [dipasang]
atau seumpamanya.
Untuk memasangnya:
sudo apt-get install libusb-1.0-0-dev
Perhatikan bahawa perkara di atas tidak sama dengan:
sudo apt-get install libusb-dev
Libusb dev yang hilang yang betul boleh menyebabkan cmake mengalami masalah.
Ralat CMake: Pemboleh ubah berikut digunakan dalam projek ini, tetapi diset ke NOTFOUND. Sila tetapkan atau pastikan ia diset dan diuji dengan betul dalam fail CMake: LIBUSB_INCLUDE_DIR (TAMBAHAN)
Tukar ke direktori root projek (… blah / blah / stlink). Lakukan "buat pelepasan".
Setelah itu dibina, alat tersebut harus berada di bawah ".. / build / Release".
Anda kemudian boleh menjalankan "st-info --probe". Inilah output dengan Nucleo yang disambungkan, kemudian tidak.
devchu @ chubox: ~ / Development / stlink $./build/Release/st-info --probeFound 1 stlink programmer serial: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "denyar: 524288 (ukuran halaman: 2048) sram: 65536 chipid: 0x0446 descr: F303 peranti berkepadatan tinggi devchu @ chubox: ~ / Development / stlink $./build/Release/st- info --probe Dijumpai 0 pengaturcara stlink devchu @ chubox: ~ / Pembangunan / stlink $
Langkah 11: Mari Gunakan GDB Dengan Linux
Sekiranya anda telah mencuba semua ini, dan anda berjaya sejauh ini - hebat! Cemerlang. Mari bersenang-senang sekarang.
Apabila anda membeli papan pengembangan ARM ini, sama ada itu adalah MSP432 Launchpad dari Texas Instruments, atau yang sedang kita bincangkan sekarang, Nucleo-F303 (STM32 Nucleo-64), biasanya mereka sudah tiba dengan program yang sedang berjalan, biasanya beberapa program berkedip yang juga termasuk menekan suis untuk mengubah kadar LED berkelip.
Sebelum kita terlalu cepat menulisnya, mari kita lihat apa yang perlu dilihat dan dilakukan.
Dengan Linux, buka terminal, ubah direktori proyek stlink git yang baru kami buat, dan cari alat st-util.
devchu @ chubox: ~ / Pembangunan / stlink $ cari. -nama st-util
./build/Release/src/gdbserver/st-util
Jalankan alat itu. Oleh kerana sebelum ini kami telah menguji hubungan kami dengan st-info --probe, kami seharusnya mendapat beberapa output seperti ini:
devchu @ chubox: ~ / Pembangunan / stlink $./build/Release/src/gdbserver/st-util
st-util 1.4.0-50-g7fafee2 2018-10-20T18: 33: 23 INFO common.c: Memuatkan parameter peranti…. 2018-10-20T18: 33: 23 INFO common.c: Peranti yang disambungkan ialah: F303 high density device, id 0x10036446 2018-10-20T18: 33: 23 INFO common.c: SRAM size: 0x10000 byte (64 KiB), Flash: 0x80000 bait (512 KiB) dalam halaman 2048 bait 2018-10-20T18: 33: 23 INFO gdb-server.c: ID cip adalah 00000446, Core ID ialah 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: Mendengarkan di *: 4242…
Itulah pelayan GDB yang sedang berjalan sekarang, dan ia melihat papan pengembangan kami, dan yang lebih penting lagi, ia sedang mendengar di port 4242 (port lalai).
Sekarang kita bersedia untuk menjalankan klien GDB.
Di Linux, buka terminal lain, masukkan ini:
arm-none-eabi-gdb -tui
Itu sama dengan menjalankan baris perintah gdb dengan ketat, namun ia menghasilkan terminal berasaskan teks (saya rasa ia menggunakan kutukan).
Kami mempunyai klien GDB dan pelayan GDB berjalan. Walau bagaimanapun, pelanggan tidak disambungkan ke pelayan. Buat masa ini ia tidak mengetahui apa-apa mengenai Nucleo kami (atau lembaga pilihan anda). Kita mesti memberitahu. Di terminal, permintaan anda sekarang ialah "(gdb)". Masukkan:
menolong sasaran
Ini akan memberi anda senarai. Perhatikan bahawa yang kita mahukan adalah sasaran lanjutan - jauh - Gunakan komputer jauh melalui talian bersiri.
Tetapi kita juga harus memberikannya lokasi. Oleh itu, pada arahan (gdb), masukkan:
(gdb) sasaran localhost localhost: 4242
Anda harus mendapat respons seperti ini:
(gdb) sasaran localhost local-remote: 4242
Penyahpepijatan jauh menggunakan localhost: 4242 0x080028e4 in ?? ()
Sementara itu, di terminal yang menjalankan std util gdbserver, kami mendapat ini:
2018-10-20T18: 42: 30 INFO gdb-server.c: Menjumpai daftar titik putus 6 hw
2018-10-20T18: 42: 30 INFO gdb-server.c: GDB disambungkan.
Langkah 12: Mari Ulangi, Dengan Windows dan Flash Program Kami
Langkah-langkah menjalankan gdbserver st-util, dan klien arm-none-eabi-gdb pada dasarnya sama seperti yang kami lakukan semasa Langkah sebelumnya. Anda membuka dua terminal (cygwin, DOS cmd, atau Windows Powershell), cari lokasi st-util, jalankan. Di terminal lain, jalankan klien arm-none-eabi-gdb. Satu-satunya perbezaan ialah mod -tui (paparan teks berasaskan terminal) kemungkinan besar tidak disokong.
Sekiranya perkara di atas berfungsi di Windows, maka anda mungkin harus berhenti (hanya pelanggan). Pada ketika ini, entah bagaimana anda perlu menjalankan klien GDB di mana fail binaan anda berada ("core.out"), atau menambahkan keseluruhan jalan ke fail tersebut sebagai hujah kepada klien GDB.
Saya mempermudahkan kehidupan saya dengan menggunakan cygwin dan membuat pautan dari direktori bin $ HOME // tempatan saya ke tempat kedua-dua alat itu berada.
Ok, kami telah menyusun dan memautkan seperti sebelumnya, dan kami mempunyai fail main.elf siap untuk dimuat.
Kami menggunakan st-util dalam satu tetingkap. Kami memulakan semula klien GDB, kali ini kami melakukan:
arm-none-eabi-gdb main.elf
Kami membiarkannya dimulakan, tunggu arahan (gdb), lakukan perintah sambungan kami yang sama ke pelayan GDB (st-util), dan kami siap mem-flash yang dapat dieksekusi. Ia sangat anti-iklim:
(gdb) beban
Berjalan dengan terminal cygwin, ada masalah yang diketahui dengan perintah konsol kadang-kadang tidak dikeluarkan. Jadi dalam kes kami, tetingkap yang menjalankan pelayan benar-benar sunyi. Yang menjalankan klien, di mana kita menjalankan beban, menghasilkan ini:
Memuat bahagian.teks, ukuran 0x1c lma 0x8000000 Alamat permulaan 0x8000000, ukuran muatan 28 Kadar pemindahan: 1 KB / saat, 28 bait / tulis.
Langkah 13: Berkelip Dengan Linux - Lebih Bermanfaat: D
Langkah 14: Mari Menyelam Lebih Sedikit
Sekiranya anda sampai di sini, sangat baik. Mari teruskan.
Mengapa tidak melihat ke dalam fail main.elf, yang boleh dilaksanakan? Jalankan perkara berikut:
arm-none-eabi-objdump -d main.elf
Anda akan melihat output seperti ini:
main.elf: format fail elf32-littlearm
Pembongkaran bahagian. Teks:
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 menambah r0, # 1 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef
Nugget kecil apa yang dapat kita peroleh daripada output di atas?
Sekiranya anda masih ingat semasa kami membincangkan dan membuat fail linker.script.ld, kami menyatakan bahawa peranti ARM ini mempunyai RAM bermula pada 0x20000000, dan memori FLASH bermula pada 0x08000000.
Oleh itu, kita dapat melihat bahawa sesungguhnya program ini sedemikian rupa sehingga semuanya berada dalam memori FLASH.
Kemudian, di atas, tetapi Langkah kemudian, ketika kami membahas bahagian "Hello World", terdapat pernyataan di mana kami memuatkan nilai langsung, tetap, harfiah ("0xDEADBEEF") ke dalam daftar teras MCU ("R7").
Penyataan tersebut adalah:
LDR R7, = 0xDEADBEEF
Dalam kod kami, itu adalah satu-satunya tempat di mana kami menyebut DEADBEEF. Tidak ada tempat lain. Namun, jika anda melihat arahan yang dibongkar / disusun semula di atas, dan lain-lain, terdapat lebih banyak perkara yang berkaitan dengan DEADBEEF daripada yang kami sangka.
Oleh itu, penyusun / penghubung memutuskan untuk memasukkan nilai DEADBEEF secara kekal ke alamat FLASH, di lokasi 0x8000018. Kemudian, penyusun menukar arahan LDR kami di atas menjadi:
LDR R7, [PC, # 8]
Malah menghasilkan komen untuk kami. Bagusnya. Dan ini memberitahu kita untuk mengambil nilai penghitung program semasa (daftar PC), tambahkan 0x8 ke nilai itu, dan di situlah DEADBEEF telah dibakar, dan dapatkan nilai itu dan masukkan dalam R7.
Jadi itu juga bermaksud bahawa kaunter program (PC) menunjuk ke alamat 0x8000010, yang merupakan permulaan main_loop, dan bahawa nilai DEADBEEF berada pada dua alamat setelah akhir main_loop.
Langkah 15: Akhirnya, Tinjauan Ringkas Program yang Dijalankan
Walaupun anda keluar dari GDB, masukkan semula arahannya. Anda tidak perlu memberikan fail apa pun; kita tidak berkelip lagi, hanya menjalankannya.
Setelah anda menyambungkan semula klien GDB ke pelayan GDB, pada prompt arahan (gdb):
(gdb) daftar maklumat
Anda mesti melihat sesuatu seperti ini:
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 4290000000000000000000000000000000000000000
Tetapi kemudian, pada arahan (gdb), masukkan:
(gdb) teruskan
Dan dengan pantas tekan CTRL-C. Itu mesti menghentikan program. Masukkan arahan "daftar maklumat" sekali lagi.
Kali ini, ia kelihatan berbeza:
(gdb) daftar maklumat
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 0 r12 0x0 0r00000 0ff 000800f000000400f0000400f0000400f0000000000000000000000000000000000000000000000000000000000000000000000000000400400400400400400400400400400400 16777216
Apa yang berlaku? Tepat apa yang kita mahukan. DEADBEEF dimuat ke R7, dan R0 telah (sangat cepat) meningkat. Sekiranya anda mengulangi, anda akan melihat R0 lagi dengan nilai yang lain.
Langkah 16: Kami Ingin Membuat Array Hanya Baca dalam Flash
Salah satu cara untuk membuat setara dengan array menggunakan pemasangan dan arahan, adalah seperti berikut:
.taip myarray,% objek // nama atau label 'myarray' ditakrifkan sebagai jenis objek.
myarray: // ini adalah permulaan pengisytiharan 'myarray' // (yang akan terdiri daripada)..word 0x11111111 // ahli pertama atau nilai yang terdapat dalam 'myarray'..word 0x22222222 // nilai kedua (alamat bersebelahan)..word 0x33333333 // dan sebagainya..size myarray,.-myarray // penyusun / assembler sekarang tahu di mana akhir atau // batas 'myarray'.
Sekarang kita telah memasangnya dalam memori FLASH, kita dapat menggunakannya dalam program. Berikut adalah bahagian:
LDR R1, myarray // ini memuatkan data yang terdapat di lokasi pertama 'myarray'. ' // ini bukan yang kita mahukan.
LDR R1, = myarray // ini memuatkan nilai lokasi itu sendiri (alamat pertama), // bukan data.. // inilah yang kita mahukan.
MOV R2, # 0 // R2 akan terus menghitung untuk memastikan kita tidak berjalan
// akhir tatasusunan. LDR R3, = myarrsize // R3 akan sama dengan 'myarrsize'.
// R0 akan menyimpan data kami
main_loop:
LDR R0, [R1] // Muatkan data yang ditunjukkan oleh R1 ('myarray') ke R0. CMP R2, R3 // Adakah kita mempunyai had array? BEQ main_loop // Sekiranya kita berjaya, kita sudah selesai, jadi kita hanya akan berehat selama-lamanya.
TAMBAHKAN R2, # 1 // Jika tidak, kita boleh terus berulang melalui array.
TAMBAH R1, # 4 // Tambahkan 4 untuk mendaftarkan R1, sehingga menunjuk dengan betul ke sebelah
// alamat..
B main_loop // Gelung ke belakang.
Video ini melalui semua ini, dan terdapat pepijat di dalamnya. Ia bagus; ini menunjukkan bahawa kod run dan debug penting. Ini menunjukkan kes klasik berjalan di hujung array.
Disyorkan:
Rpibot - Mengenai Robotik Pembelajaran: 9 Langkah
Rpibot - Tentang Belajar Robotik: Saya seorang jurutera perisian tertanam di sebuah syarikat automotif Jerman. Saya memulakan projek ini sebagai platform pembelajaran untuk sistem terbenam. Projek ini dibatalkan lebih awal tetapi saya sangat menikmatinya sehingga saya meneruskan masa lapang. Inilah hasilnya … Saya
Arduino-Teensy4 untuk Teensy 4.0 - Perhimpunan Penuh: 10 Langkah
Arduino-Teensy4 untuk Teensy 4.0 - Perhimpunan Penuh: Arahan ini akan memandu anda melalui pemasangan papan pengembangan Arduino-Teensy4 untuk Teensy 4.0. Anda boleh membeli satu dari kedai Tindie saya di sini: https: //www.tindie.com/products/ cburgess129 / arduin … Anda boleh memesan Teensy 4 bersama dengan
Bahagian 3: GPIO: Pemasangan ARM: Pengikut Talian: TI-RSLK: 6 Langkah
Bahagian 3: GPIO: Pemasangan ARM: Pengikut Talian: TI-RSLK: Helo. Ini adalah ansuran seterusnya di mana kami terus menggunakan pemasangan ARM (bukannya bahasa peringkat tinggi). Inspirasi untuk Instructable ini adalah Makmal 6 Kit Pembelajaran Sistem Robotik Texas Instruments, atau TI-RSLK. Kami akan menggunakan mikrofon
CARA MENGUMPULKAN ARM ROBOT KAYU YANG PENTING (BAHAGIAN 3: ARM ROBOT) - BERDASARKAN MICRO: BITN: 8 Langkah
CARA MENGUMPULKAN ARM ROBOT KAYU YANG PENTING (BAHAGIAN 3: ARM ROBOT) - BERDASARKAN MIKRO: BITN: Proses pemasangan seterusnya adalah berdasarkan penyelesaian mod penghalang yang boleh dihindari. Proses pemasangan di bahagian sebelumnya sama dengan proses pemasangan dalam mod penjejakan garis. Kemudian mari kita lihat bentuk akhir A
PERSATUAN ARM GPIO - T.I. KIT PEMBELAJARAN SISTEM ROBOTIK - LAB 6: 3 Langkah
PERSATUAN ARM GPIO - T.I. KIT PEMBELAJARAN SISTEM ROBOTIK - LAB 6: Helo, Dalam instruksi sebelumnya mengenai pembelajaran pemasangan ARM menggunakan Texas Instruments TI-RSLK (menggunakan mikrokontroler MSP432), aka Lab 3 jika anda melakukan T.I. tentu saja, kami telah membaca beberapa arahan yang sangat asas seperti menulis ke daftar