
Mikroelektronika adalah hobi modis beberapa tahun belakangan ini berkat Arduino yang ajaib. Tetapi masalahnya adalah: dengan minat yang memadai, DigitalWrite () dapat berkembang dengan cepat, tetapi apa yang harus dilakukan selanjutnya tidak sepenuhnya jelas. Pengembang Arduino melakukan banyak upaya untuk menurunkan ambang masuk ke ekosistem mereka, tetapi di luar itu masih ada hutan gelap sirkuit keras, tidak dapat diakses oleh seorang amatir.
Misalnya, lembar data. Tampaknya mereka memiliki segalanya, ambil dan gunakan. Tetapi hanya penulis mereka yang jelas tidak mengatur diri mereka sendiri tugas mempopulerkan mikrokontroler; kadang - kadang tampaknya mereka sengaja menyalahgunakan istilah dan singkatan yang tidak jelas ketika menjelaskan hal-hal sederhana untuk membingungkan sebanyak mungkin orang yang belum tahu. Tapi tidak semuanya begitu buruk, jika diinginkan, dada terbuka.
Pada artikel ini, saya akan berbagi pengalaman berkomunikasi humaniora dengan lembar data untuk tujuan hobi. Teks ini ditujukan untuk penggemar celana Arduino yang telah tumbuh dari celana Arduino. Ini memberikan beberapa wawasan tentang cara kerja mikrokontroler.
Saya akan mulai dengan yang tradisional
Flashing LED di Arduino
Dan segera kodenya:
void setup() { DDRB |= (1<<5); } void loop() { PINB = (1<<5); for (volatile uint32_t k=0; k<100000; k++); }
"Apa itu? - Tanyakan pembaca yang canggih. - Mengapa Anda menulis sesuatu di register input PINB? Dia hanya untuk membaca! " Memang, dokumentasi Arduino , seperti kebanyakan artikel pelatihan di Internet, mengklaim bahwa register ini hanya untuk dibaca. Saya sendiri berpikir begitu sampai saya membaca kembali datasheet untuk Atmega328p, mempersiapkan artikel ini. Dan disana:

Ini adalah fungsi yang relatif baru, bukan pada Atmega8, tidak semua orang tahu atau tidak menyebutkannya karena alasan kompatibilitas ke belakang. Tetapi sangat cocok untuk menunjukkan gagasan bahwa lembar data layak dibaca untuk menggunakan semua kemampuan chip, termasuk yang tidak banyak diketahui. Dan ini bukan satu-satunya alasan.
Kenapa lagi membaca lembar data
Biasanya driver Arduino, setelah bermain cukup dengan LED dan AnalogWrite'ami, mulai menghubungkan semua jenis modul dan chip ke papan, yang sudah ada perpustakaan tertulis. Cepat atau lambat, perpustakaan muncul yang tidak berfungsi sebagaimana mestinya. Kemudian amatir mulai mengambilnya untuk memperbaikinya, dan di sana ...
Dan ada sesuatu yang benar-benar tidak dapat dipahami terjadi, jadi Anda harus pergi ke Google, membaca banyak tutorial, menarik bagian-bagian kode yang cocok seseorang dan akhirnya mendapatkan jalan Anda sendiri. Ini memberikan rasa prestasi yang kuat, tetapi sebenarnya prosesnya mengingatkan pada penemuan sepeda dengan merekayasa balik sepeda motor. Apalagi, memahami cara kerja motor ini tidak meningkat. Saya tahu, karena saya sendiri telah melakukan ini selama beberapa waktu.
Jika alih-alih kegiatan yang menarik ini saya menghabiskan beberapa hari mempelajari dokumentasi untuk Atmega328, saya akan menghemat banyak waktu. Pada akhirnya, ini adalah mikrokontroler yang cukup sederhana.
Dengan demikian, perlu membaca lembar data setidaknya untuk membayangkan bagaimana mikrokontroler diatur secara umum dan apa yang dapat dilakukan. Dan juga:
- untuk memeriksa dan mengoptimalkan perpustakaan orang lain. Mereka sering ditulis oleh pecinta yang sama yang menemukan sepeda; atau, sebaliknya, penulis sengaja membuat mereka perlindungan berlebihan dari orang bodoh. Biarkan itu tiga kali lebih besar dan lebih lambat, tetapi pasti akan berhasil;
- untuk dapat menggunakan chip dalam proyek yang tidak ada yang menulis perpustakaan untuk;
- untuk memfasilitasi tugas migrasi dari satu jalur MK ke jalur MK lainnya;
- untuk akhirnya mengoptimalkan kode lama mereka, yang tidak sesuai dengan Arduin;
- untuk mempelajari cara mengelola chip apa pun secara langsung melalui registernya, tanpa repot-repot mempelajari perangkat pustaka, jika ada.
Mengapa menulis langsung ke register ketika ada HAL dan LL?
Kosakata
HAL, Hardware Abstraction Layer - perpustakaan untuk mengendalikan mikrokontroler dengan abstraksi tingkat tinggi. Jika Anda perlu menggunakan antarmuka SPI1, kami cukup mengkonfigurasi dan mengaktifkan SPI1 tanpa khawatir tentang register mana yang bertanggung jawab untuk apa.
LL, API Tingkat Rendah - perpustakaan yang berisi makro atau struktur dengan alamat register yang memungkinkan Anda untuk mengaksesnya dengan nama. DDRx, PORTx, PINx pada Atmega adalah LL.
Perselisihan pada subjek "HAL, LL atau register" secara teratur terjadi dalam komentar tentang Habrรฉ. Tanpa mengklaim akses ke pengetahuan astral, saya hanya akan berbagi pengalaman dan pemikiran amatir saya.
Kurang lebih memilah-milah dengan Atmega dan setelah membaca artikel tentang STM32 yang indah, saya membeli setengah lusin papan yang berbeda - dan Discovery, dan "Blue Tablet", dan bahkan hanya keripik untuk produk buatan saya. Mereka semua membersihkan kotak selama dua tahun. Terkadang saya berkata pada diri sendiri: "Saya menguasai STM akhir pekan ini," meluncurkan CubeMX, menghasilkan pengaturan untuk SPI, melihat pada dinding teks yang dihasilkan, kaya akan rasa dengan hak cipta STM, dan memutuskan bahwa itu entah bagaimana terlalu banyak.

Untuk memahami apa yang ditulis CubeMX di sini, tentu saja, Anda bisa. Tetapi pada saat yang sama, tidak realistis untuk mengingat semua formulasi, sehingga nanti Anda dapat menulisnya dengan tangan Anda. Dan debut, jika saya tidak sengaja lupa memberi tanda centang di Kuba, - hai.
Dua tahun berlalu, saya masih menjilat segala macam enak, tetapi tidak dapat diakses oleh pemahaman saya, keripik di ST MCU Finder , dan secara tidak sengaja menemukan artikel yang indah , meskipun tentang STM8. Dan tiba-tiba saya menyadari bahwa selama ini saya mengetuk pintu yang terbuka: register untuk STM diatur dengan cara yang sama seperti untuk MK lainnya, dan Cube adalah opsional untuk bekerja dengan mereka. Dan jadi itu mungkin? ..
HAL dan secara khusus STM32CubeMX adalah alat untuk insinyur profesional yang bekerja erat dengan chip STM32. Fitur utamanya adalah abstraksi tingkat tinggi, kemampuan untuk bermigrasi dengan cepat dari satu MK ke lainnya dan bahkan dari satu inti ke inti lainnya, sambil tetap berada dalam jalur STM32. Amatir jarang menghadapi tugas seperti itu - pilihan kami untuk MK biasanya terbatas pada kisaran AliExpress, dan kami sering bermigrasi di antara chip yang sangat berbeda - kami pindah dari Atmega ke STM, dari STM ke ESP, baik, atau apa yang baru bagi teman-teman Cina kami. HAL tidak akan membantu di sini, dan studinya akan memakan banyak waktu.
Masih ada LL - tetapi dari itu ke register setengah langkah. Secara pribadi, saya menemukan menulis makro saya dengan alamat register berguna: Saya mempelajari lembar data lebih hati-hati, saya pikir saya akan membutuhkannya di masa depan, dan yang jelas bukan, saya lebih baik menyusun program saya, dan secara umum mengatasi membantu mengingat.
Selain itu, ada nuansa dengan STM32F103 yang populer - untuk itu ada dua versi LL yang tidak kompatibel, satu resmi dari STM, yang kedua dari Leaf Labs yang digunakan dalam proyek STM32duino. Jika Anda menulis perpustakaan open-source (dan saya baru saja mengerjakan tugas itu ), Anda harus membuat dua versi, atau mengakses register secara langsung.
Akhirnya, penolakan LL, menurut pendapat saya, menyederhanakan migrasi, terutama jika Anda membaringkannya sejak awal bekerja pada proyek. Contoh berlebihan: tulis kedipan Arduin di Atmel Studio tanpa LL:
#include <stdint.h> #define _REG(addr) (*(volatile uint8_t*)(addr)) #define DDR_B 0x24 #define OUT_B 0x25 int main(void) { volatile uint32_t k; _REG(DDR_B) |= (1<<5); while(1) { _REG(OUT_B) |= (1<<5); for (k=0; k<50000; k++); _REG(OUT_B) &= ~(1<<5); for (k=0; k<50000; k++); } }
Agar kode ini berkedip LED pada syal Cina dengan STM8 (dari ST Visual Desktop), cukup untuk mengubah dua alamat di dalamnya:
#define DDR_B 0x5007 #define OUT_B 0x5005
Ya, saya menggunakan fitur menghubungkan LED pada papan tertentu, itu akan berkedip sangat lambat, tetapi akan!
Apa itu lembar data
Dalam artikel dan forum, baik bahasa Rusia dan bahasa Inggris, "lembar data" berarti dokumentasi teknis untuk chip, saya melakukan hal yang sama dalam teks ini. Secara formal, mereka hanyalah satu jenis dokumentasi seperti itu:
Lembar Data - TTX, secara taktik spesifikasi teknis. Pastikan memiliki komponen elektronik apa pun. Informasi referensi berguna untuk tetap ada, tetapi tidak ada yang perlu dibaca dengan cermat. Namun, chip yang lebih sederhana seringkali terbatas pada lembar data, agar tidak menghasilkan dokumen yang tidak perlu; dalam hal ini, Manual Referensi disertakan di sini.
Referensi Manual - manual yang sebenarnya, buku yang sehat dengan 1000+ halaman. Pekerjaan semua yang didorong ke dalam chip dicat secara detail. Dokumen utama untuk pengembangan mikrokontroler. Tidak seperti lembar data , instruksi ditulis untuk berbagai MK, mengandung banyak informasi tentang periferal yang tidak tersedia dalam model spesifik Anda.
Manual Pemrograman atau Manual Set Instruksi - instruksi untuk perintah unik mikrokontroler. Dirancang untuk mereka yang memprogram Assembler. Penulis kompiler secara aktif menggunakannya untuk mengoptimalkan kode, jadi secara umum kita tidak memerlukannya. Tapi mengintip di sini berguna untuk pemahaman umum, di balik beberapa perintah khusus seperti keluar dari interupsi, serta dengan penggunaan aktif dari debugger.
Catatan Aplikasi - Kiat berguna untuk memecahkan masalah tertentu, sering kali dengan contoh kode.
Lembar Errata - deskripsi kasus perilaku chip non-standar dengan opsi pintas, jika ada.
Apa yang ada di lembar data
Langsung di Lembar Data, kita mungkin memerlukan bagian berikut:
Ringkasan Perangkat - Halaman pertama lembar data secara singkat berbicara tentang perangkat. Ini sangat berguna dalam situasi di mana Anda menemukan chip (melihat di toko, vypayali, bertemu menyebutkan) dan ingin memahami apa itu.
Deskripsi Umum - deskripsi yang lebih rinci tentang kemampuan chip dari saluran.
Pinout - skema pinout untuk semua kasus chip yang mungkin (kaki yang memiliki pin).
Deskripsi Pin - Deskripsi tujuan dan kemampuan masing-masing pin.
Memory Map - kita hampir tidak membutuhkan peta alamat dalam memori, tetapi kadang-kadang juga termasuk daftar alamat blok register.
Register Map - tabel alamat dari blok register, sebagai aturan, terletak di lembar data, dan dalam Manual Ref - hanya offset alamat .
Karakteristik Listrik - di bagian ini, kami terutama tertarik pada peringkat maksimum absolut , daftar beban maksimum pada chip. Berbeda dengan Atmega328p yang tidak bisa diraih, sebagian besar MK tidak memungkinkan Anda menghubungkan beban serius ke pin, yang menjadi kejutan yang tidak menyenangkan bagi pemain Arduino.
Informasi Paket - Gambar selungkup terjangkau yang berguna dalam mendesain paket rangkaian Anda.
Manual Referensi secara struktural terdiri dari bagian-bagian pada pinggiran khusus yang ditunjukkan dalam posnya. Setiap bab dapat dibagi menjadi tiga bagian:
Gambaran Umum , Pendahuluan , Fitur - ikhtisar kemampuan periferal;
Deskripsi Fungsional , Panduan Penggunaan atau hanya blok bagian utama - deskripsi tekstual terperinci tentang prinsip-prinsip perangkat periferal dan cara menggunakannya;
Register - deskripsi register kontrol. Dalam kasus sederhana seperti GPIO atau SPI, ini mungkin cukup untuk mulai menggunakan periferal, tetapi seringkali Anda masih harus membaca bagian sebelumnya.
Cara membaca lembar data
Datashites dari kebiasaan takut dengan volume mereka dan banyak kata-kata yang tidak bisa dimengerti. Faktanya, semuanya tidak begitu menakutkan jika Anda tahu beberapa peretas kehidupan.
Instal pembaca PDF yang baik . Datashits ditulis dalam tradisi mulia instruksi kertas, sangat bagus untuk mencetaknya, meletakkannya dengan penanda plastik dan menjahitnya. Hiperteks di dalamnya diamati dalam jumlah jejak. Untungnya, setidaknya struktur dokumen di-bookmark, jadi pembaca yang baik dengan navigasi yang nyaman sangat diperlukan.
Datashit bukan buku teks Straustrup, Anda tidak perlu membaca semua yang ada di dalamnya . Jika Anda menggunakan tip sebelumnya, cari saja bagian di bilah bookmark.
Lembar data, terutama Referensi Manual , mungkin tidak menggambarkan kemampuan chip tertentu, tetapi seluruh baris . Ini berarti bahwa setengah, atau bahkan dua pertiga dari informasi tersebut tidak terkait dengan chip Anda. Sebelum mempelajari register TIM7, periksa di Deskripsi Umum jika Anda memilikinya.
Cukup mengenal bahasa Inggris di tingkat dasar . Datashits sebagian terdiri dari istilah yang tidak dikenal oleh penutur asli rata-rata, dan setengahnya terdiri dari struktur penghubung yang sederhana. Masih ada lembar data bahasa Cina yang indah dalam bahasa Inggris Cina, di mana setengahnya juga istilah, dan bagian kedua adalah serangkaian kata acak.
Jika Anda menemukan kata yang tidak dikenal , jangan coba menerjemahkannya menggunakan kamus Bahasa Inggris-Bahasa Indonesia. Jika histeresis membuat Anda bingung , menerjemahkan โhisteresisโ tidak akan membuat Anda lebih hangat. Gunakan Google, Stack Overflow, Wikipedia, forum, di mana konsep yang diperlukan akan dijelaskan dalam kata-kata sederhana dengan contoh .
Cara terbaik untuk memahami apa yang Anda baca adalah dengan check in action . Karena itu, pertahankan papan debug yang Anda kenal, dan lebih baik dua, jika Anda masih salah mengerti sesuatu dan melihat asap ajaib.
Merupakan kebiasaan yang baik untuk menyimpan lembar data saat Anda membaca tutorial seseorang atau mempelajari perpustakaan orang lain. Mungkin saja, di dalamnya Anda akan menemukan solusi yang lebih optimal untuk masalah Anda. Dan sebaliknya - jika Anda tidak dapat memahami dari lembar data cara kerja register, cari di google: kemungkinan besar, seseorang sudah menggambarkan semuanya dengan kata-kata sederhana atau meninggalkan kode yang dapat dimengerti di github.
Kosakata
Beberapa kata dan notasi yang berguna yang membantu Anda terbiasa dengan lembar data lebih cepat. Apa yang diingat dalam beberapa hari terakhir, tambahan dan koreksi dipersilahkan.
Listrik
Vcc , Vdd - Plus, Power
Vss , Vee - "minus", ground
saat ini - saat ini
tegangan - tegangan
untuk tenggelam saat ini - bekerja "tanah" untuk beban eksternal
ke sumber arus - memasok beban eksternal
pin wastafel / sumber tinggi - pin dengan toleransi beban meningkat
IO
H, Tinggi - pada pin Vcc
L, Rendah - pada pin Vss
Impedansi Tinggi , Hi-Z , mengambang - tidak ada apa-apa di pin, "resistensi tinggi", sebenarnya tidak terlihat oleh dunia luar.
lemah tarik ke atas , lemah tarik ke bawah - built-in pull-up / pull-down resistor, analog sekitar 50 kOhm (lihat lembar data). Ini digunakan, misalnya, untuk mencegah pin input menggantung di udara, yang menyebabkan false positive. Lemah - karena mudah untuk "membunuhnya".
mode keluaran tarik - pin, di mana ia beralih antara OUTPUT Tinggi dan Rendah - normal dengan Arduino.
drain terbuka - penunjukan mode keluaran, di mana pin dapat berupa Impedansi Rendah atau Tinggi / Mengambang . Selain itu, hampir selalu ini bukan drain terbuka "nyata", ada dioda pelindung, resistor, dan sebagainya. Ini hanyalah penunjukan mode ground / nothing.
tiriskan terbuka benar - tetapi ini sudah benar-benar tiriskan terbuka: pin langsung mengarah ke tanah jika terbuka, atau dalam limbo jika ditutup. Ini berarti bahwa, jika perlu, tegangan yang lebih besar dari Vcc dapat diizinkan melaluinya, tetapi maksimum masih ditentukan dalam lembar data di bagian Absolute Maximum Ratings / Voltage .
Antarmuka
dalam seri - terhubung secara seri
untuk berantai - kumpulkan chip dalam suatu rantai dengan koneksi serial, meningkatkan jumlah output.
shift - shift, biasanya menunjukkan pergeseran bit. Dengan demikian, untuk menggeser dan memindahkan - menerima dan mengirimkan data sedikit demi sedikit.
kait - katup yang menutupi buffer sementara bit digeser melaluinya. Ketika transfer selesai, katup terbuka, bit mulai bekerja.
untuk memasukkan jam - melakukan transfer bitwise, geser semua bit ke tempat yang diinginkan.
double buffer , shadow register , preload register - sebutan sejarah ketika register harus dapat menerima data baru, tetapi tahan sampai beberapa titik. Misalnya, agar PWM berfungsi dengan benar, parameternya (siklus tugas, frekuensi) tidak boleh berubah hingga siklus saat ini berakhir, tetapi parameter baru sudah dapat ditransfer. Dengan demikian, yang saat ini disimpan dalam register bayangan , dan yang baru jatuh ke dalam register preload , dicatat dalam register chip yang sesuai.
Setiap
prescaler - pembagi frekuensi
untuk mengatur bit - atur bit ke 1
untuk menghapus / mengatur ulang bit - reset bit ke 0 ( reset - STM datasheet chip)
untuk beralih sedikit - ubah nilai bit ke kebalikan (lihat contoh di awal artikel)
Apa selanjutnya
Secara umum, bagian praktis direncanakan di sini dengan demonstrasi tiga proyek pada STM32 dan STM8, dibuat khusus untuk artikel ini menggunakan lembar data, dengan umbi, SPI, timer, PWM dan interupsi:

Tetapi teks terlalu banyak, sehingga proyek dikirim ke bagian kedua.
Keahlian membaca lembar data akan membantu Anda dengan hobi Anda, tetapi tidak mungkin untuk mengganti komunikasi langsung dengan sesama penggemar di forum dan ruang obrolan. Baginya, pertama-tama adalah memperketat bahasa Inggris. Itu sebabnya saya selesai membacanya - hadiah khusus: dua pelajaran gratis di Skyeng pada pembayaran pertama menggunakan kode HABR2
.