Saya memiliki pengalaman bertahun-tahun dengan core 8-bit dari berbagai produsen - yaitu 8051, PIC, dan AVR - dan saya sekarang memiliki Cortex M0 untuk mencari tahu. Khususnya yang ini , tapi saya harap kita bisa lebih umum dari itu.
Ternyata sedikit lebih banyak daripada yang saya tawar-menawar, dengan beberapa dokumen yang menggambarkan berbagai bagian sistem dalam berbagai tingkat detail dan tidak ada yang benar-benar telah saya saksikan untuk menghubungkan semuanya. Ini dibandingkan dengan memiliki satu lembar data yang menjelaskan segalanya. Saya mengerti memiliki lebih banyak hal untuk didokumentasikan di tempat pertama, tetapi perubahan format melemparkan saya untuk satu putaran.
Situs web di atas memiliki satu dokumen yang merupakan ikhtisar yang baik dari masing-masing subsistem dan periferal secara terpisah, dan satu lagi yang menjelaskan setiap register secara terperinci, dan saya memiliki semua kode sumber untuk SDK mereka termasuk file header dan beberapa contoh kompleks, tetapi saya masih melihat tidak ada yang menggambarkan bagaimana semuanya terhubung bersama.
Apakah ada langkah singkat singkat dari arsitektur Cortex yang menjelaskan fungsi hal-hal yang tidak dimiliki oleh pengontrol yang lebih kecil - seperti beberapa lapisan bus dari CPU ke peripheral, masing-masing dengan pengawas waktu sendiri - dan bagaimana mereka semua terhubung bersama?
Jawaban:
Saya telah bekerja pada AVR dan MCU berbasis ARM Cortex-M3 / M4 / R4. Saya pikir saya dapat menawarkan beberapa saran umum. Ini akan menganggap Anda pemrograman dalam C, bukan perakitan.
CPU sebenarnya adalah bagian yang mudah. Tipe data C dasar akan memiliki ukuran yang berbeda, tetapi Anda tetap menggunakan uint8 / 16 / 32_t, kan? :-) Dan sekarang semua tipe integer harus cukup cepat, dengan 32-bit (int) menjadi yang tercepat. Anda mungkin tidak memiliki FPU, jadi terus menghindari pelampung dan ganda.
Pertama, kerjakan pemahaman Anda tentang arsitektur tingkat sistem. Ini berarti IO, clocking, memori, reset, dan interupsi. Juga, Anda harus terbiasa dengan gagasan peripheral yang dipetakan memori. Pada AVR Anda dapat menghindari memikirkannya karena register memiliki nama unik dengan variabel global unik yang ditentukan untuknya. Pada sistem yang lebih kompleks, biasanya merujuk ke register dengan alamat pangkalan dan offset. Semuanya bermuara pada pointer aritmatika. Jika Anda tidak nyaman dengan petunjuk, mulailah belajar sekarang.
Untuk IO, cari tahu bagaimana muxing periferal ditangani. Apakah ada kontrol mux pusat untuk memilih pin mana yang merupakan sinyal periferal dan yang GPIO? Atau apakah Anda mengatur pin ke mode periferal menggunakan register periferal? Dan tentu saja Anda harus tahu cara mengkonfigurasi GPIO sebagai input dan output, dan mengaktifkan mode open-drain dan pull-up / down. Interupsi eksternal biasanya termasuk dalam kategori ini juga. GPIO cukup generik, jadi pengalaman Anda seharusnya bisa membantu Anda dengan baik di sini.
Clocking bermuara pada beberapa hal. Anda mulai dengan sumber jam, biasanya osilator RC kristal atau internal. Ini digunakan untuk membuat satu atau beberapa domain clock level sistem. Chip berkecepatan lebih tinggi akan menggunakan PLL, yang dapat Anda anggap sebagai pengganda frekuensi. Akan ada juga pembagi jam di berbagai titik. Mereka hal-hal utama yang perlu dipertimbangkan adalah berapa frekuensi jam CPU Anda dan berapa bit rate yang Anda butuhkan untuk perangkat komunikasi Anda. Biasanya ini cukup fleksibel. Ketika Anda menjadi lebih maju, Anda dapat belajar tentang hal-hal seperti mode daya rendah, yang biasanya didasarkan pada clock gating.
Memori berarti flash dan RAM. Jika Anda memiliki RAM yang cukup, sering kali lebih cepat menyimpan program Anda di sana selama pengembangan awal sehingga Anda tidak harus memprogram flash berulang kali. Masalah besar di sini adalah manajemen memori. Vendor Anda harus menyediakan skrip tautan sampel, tetapi Anda mungkin perlu mengalokasikan lebih banyak memori untuk kode, konstanta, variabel global, atau tumpukan tergantung pada sifat program Anda. Topik lebih lanjut termasuk keamanan kode dan pemrograman flash run-time.
Pengaturan ulang cukup mudah. Biasanya Anda hanya perlu melihat timer pengawas, yang mungkin diaktifkan secara default. Reset lebih penting selama debugging ketika Anda menjalankan kode yang sama berulang-ulang. Sangat mudah untuk melewatkan bug karena masalah urutan.
Ada dua hal yang perlu Anda ketahui tentang interupsi - bagaimana Anda mengaktifkan dan menonaktifkannya, dan bagaimana Anda mengkonfigurasi vektor interupsi. AVR-GCC melakukan yang terakhir untuk Anda dengan makro ISR (), tetapi pada arsitektur lain Anda mungkin harus menulis alamat fungsi ke register secara manual.
Periferal mikrokontroler biasanya tidak tergantung satu sama lain, sehingga Anda dapat mempelajarinya satu per satu. Mungkin membantu untuk memilih satu perangkat dan menggunakannya untuk mempelajari bagian dari hal-hal tingkat sistem. Perangkat peripheral dan PWM baik untuk clocking dan IO, dan timer baik untuk interupsi.
Jangan terintimidasi oleh tingkat kerumitan. Mikrokontroler "dasar" itu telah mengajarkan Anda banyak hal yang perlu Anda ketahui. Tolong beri tahu saya jika Anda membutuhkan saya untuk mengklarifikasi sesuatu.
sumber
int
/int_leastN_T
jenis untuk variabel stack.int_fastN_t
tipe, bukanint_leastN_t
tipe.int16_t
sering akan sama cepatnya denganint32_t
nilai-nilai yang disimpan dalam memori, tetapi Standar mengharuskan pada platform di manaint
17 bit atau lebih besar,int16_t x=32767; x+=2;
harus ditetapkanx
ke -32767, sering membutuhkan instruksi perpanjangan tanda tangan bahkan jika kode akan jangan pernah menggunakan perilaku membungkus.x+=2
, akan sah untuk menggunakan instruksi untuk tipe 16-bit, karena kompiler dapat mengasumsikan bahwa nilai tidak akan membungkus, dan dengan demikian menggunakannya tidak akan mengubah perilaku yang dapat diamati. Tapi saya pikir ARM tidak memiliki instruksi ADD 16-bit yang memungkinkan ini terjadi. (Saya bisa saja salah, pengetahuan saya tentang set instruksi ARM tidak begitu baik.)Penting untuk diingat bahwa ARM memiliki properti intelektual untuk mikroprosesor, tetapi tidak benar-benar membuat bagian. Sebagai gantinya, pabrikan melisensikan berbagai versi prosesor ARM dan memproduksi komponen unik mereka sendiri dengan campuran fitur dan periferal tersendiri.
Dengan itu, jika Anda baru mengenal arsitektur, mungkin masuk akal untuk memulai dengan dokumentasi ARM yang pada dasarnya adalah dokumentasi dasar untuk semua mikroprosesor tersebut.
Sebagai contoh, Cortex-M0 dijelaskan di situs web ARM .
Ada juga daftar buku terkait ARM yang melayani berbagai kebutuhan dan minat.
Akhirnya, ada lembar data pabrikan tertentu. Untuk M0, Cypress, NXP, dan STMicroelectronics hanyalah tiga dari banyak produsen suku cadang nyata berdasarkan Cortex-M0.
(Dan tidak, saya tidak bekerja untuk ARM dan tidak pernah melakukannya.)
sumber
Satu perbedaan besar adalah penggunaan perpustakaan yang disediakan vendor. Untuk PIC, Atmels, dll, perpustakaan dasar (untuk gpio, timer, adc, dll) tidak banyak digunakan oleh sebagian besar pengembang. Dalam pengalaman saya, orang akan (paling banyak) menggunakannya sebagai panduan saat menulis kode mereka sendiri.
Namun, dengan ARM, perpustakaan hampir selalu digunakan. Ada standar, "CMSIS", yang direkomendasikan untuk diikuti oleh produsen. Kebanyakan melakukannya. Ini membantu dalam portabilitas kode (antara ARM yang berbeda dan antara produsen), dan memberikan metode "standar" untuk menyusun kode Anda. Orang-orang terbiasa melihat dan memahami fungsi perpustakaan.
Tentu ada beberapa pengembang yang mengakses register secara langsung, tetapi mereka outlier :)
Untuk menjawab pertanyaan Anda, saya merasa sangat membantu untuk membaca dokumentasi Perpustakaan. ST memiliki kode yang dikembangkan dengan baik, dengan file bantuan besar yang dibuat Doxygen. Anda dapat melihat semua opsi untuk setiap modul perangkat keras.
Untuk menggunakan GPIO sebagai contoh, fungsi inisialisasi menangani:
Dengan melihat opsi, Anda dapat melihat apa yang mungkin. Dan, tentu saja, Anda akan belajar cara meneruskan opsi-opsi ini ke fungsi Init!
OK, sekarang setelah saya katakan itu, saya melihat bahwa ARM spesifik Anda tidak memiliki perpustakaan yang sesuai dengan CMSIS. Sebagai gantinya, mereka memiliki SDK eksklusif yang tersedia untuk diunduh. Saya akan mulai mencari melalui dokumen SDK mereka.
Jika Anda belum menikah dengan produk spesifik ini, saya mungkin menyarankan Anda mencari vendor yang berbeda dengan perpustakaan yang lebih patuh. Anda akan naik kurva belajar, jadi Anda mungkin juga membuat investasi Anda lebih portabel ...
ARM itu menyenangkan! Saya belum melihat ke belakang.
sumber
Waktu yang baik untuk bergerak; 8-bit sekarat dengan cepat; ketika Anda dapat membeli papan $ 5 dengan (misalnya) STM32F103 yang merupakan mikrokontroler ARM 32-bit yang cukup mumpuni (bahkan dengan USB!), tidak ada keraguan waktu telah berubah.
Anda sudah memiliki beberapa jawaban yang luar biasa tetapi terutama saya akan mengatakan "lupa berkumpul" dan hampir "lupa peduli tentang bagaimana cpu bekerja pada tingkat rendah" - suatu hari akan ada kasing sudut di mana Anda perlu menggali ke dalamnya (optimasi khusus atau untuk debugging) tetapi core ARM menjalankan kode C dengan sangat baik (sesuai desain) dan Anda jarang perlu menjelajah jauh di dalam nyali.
Ini berarti Anda akan menghabiskan sejumlah waktu untuk membenturkan kepala Anda terhadap masalah dengan kompiler (dan terutama penghubung dan makefile) menampi kesalahan yang tidak jelas pada Anda, tetapi semuanya dapat diatasi.
Nyali bagaimana ARM bekerja (yaitu buku cpu ARM) padat dan tidak begitu menarik sampai Anda benar-benar perlu mengoptimalkan (dan Anda akan kagum betapa jarangnya ketika Anda memiliki register 32 bit dan PLL Anda ' d Jam CPU berada di wilayah 100mhz).
Set instruksi ARM "skool lama" jauh lebih mudah untuk membaca pembongkaran dari pada "Thumb2" yang jauh lebih baru - yang adalah apa yang Anda temukan pada ARM tingkat mikrokontroler modern (Cortex) - tetapi sekali lagi jeroan instruksi bahasa assembly sebagian besar menghilang ke latar belakang; jika Anda memiliki toolset yang tepat (terutama debugger tingkat sumber yang layak dengan breakpoints / langkah tunggal dll) Anda hanya tidak terlalu peduli tentang hal itu menjadi ARM sama sekali.
Setelah Anda berada di dunia register 32-bit dan lebar bus data 32-bit dan semua yang Anda inginkan tersedia dalam chip Anda tidak akan pernah ingin kembali ke CPU 8-bit lagi; pada dasarnya sering tidak ada penalti untuk "santai" dan menulis kode agar dapat dibaca lebih efisien
Namun ... peripheral ... aye dan ADA masalahnya.
Anda benar-benar mendapatkan banyak hal untuk dimainkan di MCU modern, dan banyak hal yang cukup mewah; Anda sering menemukan dunia kecanggihan jauh, jauh melampaui AVR, PIC, dan 8.051 peripheral on-chip.
Satu pengatur waktu yang bisa diprogram? Nah, sudah delapan! DMA? Bagaimana dengan 12 saluran dengan prioritas terprogram dan mode burst serta mode berantai dan auto-reload dan .. dan .. dan ...
I2C? I2S? Puluhan opsi pin muxing? Lima belas cara berbeda untuk memprogram ulang flash on-chip? Yakin!
Seringkali Anda merasa seperti beralih dari kelaparan ke pesta dengan periferal dan biasanya ada satu keping chip yang akan Anda kagumi tetapi jarang digunakan (karenanya; clock gating).
Jumlah perangkat keras on-chip (dan variasi pada hanya dalam satu garis chip vendor) saat ini cukup membingungkan. Salah satu vendor chip tentu saja akan cenderung menggunakan kembali blok IP sehingga setelah Anda terbiasa dengan merek tertentu itu menjadi lebih mudah tetapi "sial sudah mendapat craaaazy saat ini."
Jika apa pun periferal dan interaksinya (dan DMA serta interupsi dan alokasi bus dan dan dan ...) sangat kompleks (dan, kadang-kadang, tidak persis seperti yang dijelaskan dalam lembar data), insinyur sering kali memiliki rangkaian MCU ARM dan cenderung ingin tetap dengan itu hanya karena mereka terbiasa dengan perangkat dan alat pengembangan.
Pustaka dan alat pengembangan yang bagus (mis. Kompilasi cepat + siklus debug dengan debugger yang tepat) dan sekumpulan besar proyek kode contoh bekerja sangat penting untuk pilihan MCU ARM Anda saat ini. Tampaknya sebagian besar vendor sekarang memiliki papan evaluasi yang sangat murah (
Seperti yang saya yakin Anda perhatikan, setelah Anda melampaui level mikrokontroler dengan ARM dan masuk ke level SOC (mis. Raspberry Pi / style style SOCs) maka aturannya akan berubah sepenuhnya dan semua tentang jenis Linux yang Anda gunakan untuk menjalankan, karena - dengan sedikit pengecualian - Anda akan menggonggong gila untuk mencoba hal lain.
Pada dasarnya; terlepas dari CPU yang (mungkin) telah dipilih sebelumnya untuk Anda pada pertunjukan ini, beli sendiri segenggam papan evaluasi berbasis-korteks super murah dari beberapa vendor yang berbeda (TI, STM, Freescale dan banyak lagi yang terpikirkan) dan retas dengan kode sampel yang disediakan.
Saran terakhir; setelah Anda menemukan halaman-atau-tiga di lembar data yang menjelaskan opsi pin-muxing untuk chip nomor bagian persis yang Anda kerjakan, Anda mungkin ingin mencetaknya dan menempelkannya di dinding. Mencari tahu di akhir proyek bahwa kombinasi periferal tertentu tidak mungkin karena pin muxing tidak menyenangkan, dan terkadang info itu begitu terkubur sehingga Anda bersumpah mereka mencoba menyembunyikannya :-)
sumber
Saya juga berasal dari AVR dan sekarang biasanya menggunakan STM32 (Cortex-M). Inilah yang saya rekomendasikan untuk pemula, dan mencerminkan kesulitan saya sendiri ketika saya mulai:
Dapatkan papan dengan debugger, atau setidaknya konektor JTAG (dan kemudian beli debugger JTAG). Ada banyak yang murah di sekitar, dan Anda akan menghemat banyak waktu dengan menggunakannya.
Dapatkan IDE yang baik dengan semua yang disertakan. Saya dulu merekomendasikan CooCox CoIDE sejak dulu. Sejak itu telah berhenti dan memulai kembali pengembangan, jadi saya tidak yakin bagaimana sekarang. "IDE yang bagus" memungkinkan Anda untuk mendapatkan LED Hello World dasar yang berkedip dalam waktu singkat.
"IDE yang baik" harus mengatur header CMSIS pabrikan. Ini pada dasarnya adalah peta register yang memungkinkan penulisan program C / C ++ lebih mudah, dengan nama variabel dan bukan angka dan pointer biasa.
Cobalah untuk menggunakan perpustakaan periferal pabrikan, jika Anda tidak memerlukan kinerja terbaik mutlak. Anda sebenarnya tidak melakukannya untuk saat ini, karena Anda sedang belajar. Jika nanti Anda merasa perlu memeras lebih banyak, lihat ke kode perpustakaan untuk melihat bagaimana ia melakukan apa. Hal yang baik tentang perpustakaan adalah mereka biasanya memungkinkan Anda untuk menggunakan banyak chip berbeda dari pabrikan yang sama dengan kode yang sama.
Berbeda dari AVR, chip ARM mulai dengan periferal dinonaktifkan. Anda harus mengaktifkannya terlebih dahulu. Pustaka periferal yang baik akan memiliki contoh tentang cara menggunakan periferal dengan benar, dan Anda bisa mendapatkan lebih banyak info dari lembar data perangkat. Jadi, ingatlah untuk mengaktifkan jam dan periferal sebelum Anda menggunakannya. Ya, bahkan port I / O dianggap periferal.
Kode saat Anda belajar. Jangan mencoba melakukan grok semuanya sekaligus, karena ini benar-benar rumit. Saya akan mulai dengan mempelajari pohon jam (APB, AHB, bus dll) dan bagaimana jam dan pembagi jam berinteraksi. Lalu saya akan melihat di mana IDE menyimpan skrip linker dan kode startup untuk perangkat Anda. Script linker cukup banyak bagaimana Anda mengatur memori (di mana RAM, flash, tabel vektor ISR, dll). Skrip startup mengatur program Anda (hal-hal seperti menyalin inisialisasi variabel global dari flash ke RAM). Beberapa IDE memiliki skrip startup di ASM dan beberapa di C. Ada kalanya Anda bisa Google untuk yang lain, dalam bahasa yang Anda sukai.
Dapatkan debugger ASAP. Ini cukup umum untuk membuat kesalahan pada awalnya, dengan melakukan beberapa hal (biasanya inisialisasi perangkat keras) dalam urutan yang berbeda dari yang seharusnya. Ini terkadang memicu pengecualian ISR yang membuat Anda berada di
while(1);
infinite loop (implementasi default untuk ISR itu) yang menghentikan program Anda dan sulit dilacak bahkan dengan debugger. Bayangkan tanpa debugger.Berbicara tentang debugger, cobalah menjalankan UART juga, kemudian gunakan adaptor serial-USB untuk membacanya.
printf()
debugging selalu berguna :-)sumber
Saya belum banyak bekerja di 8.051, AVR, atau PIC. Tetapi baru-baru ini saya mulai melihat lini prosesor ARM Cortex MX. Oleh karena itu saya tidak dapat memberi tahu Anda banyak tentang transisi dari 8051, AVR atau PIC, tetapi kebanyakan dari sudut pandang seorang pemula.
Prosesor ARM®Cortex ™ -M4 berbasis pada arsitektur Harvard, sehingga memiliki bus data dan instruksi terpisah. Di bawah ini adalah gambar tingkat tinggi.
Minggu ini perwakilan NXP akan mengunjungi fasilitas kami. Saya akan memeriksa dengan mereka untuk setiap sumber daya NXP ARM-Cortex Mx dan mempostingnya di sini. Freescale memiliki Kinetis Low Power 32-bit Microcontroller (MCUs) berbasis ARM® Cortex®-M Cores , saya mengerti mereka juga memiliki panduan serupa untuk mempelajari prosesor ARM. Sayangnya saya belum meneliti mereka.
Referensi:
sumber