Penyimpangan kecil ...
Dalam pelajaran terakhir, kami melihat dari mana harus memulai jika Anda memutuskan untuk mempelajari mikrokontroler STM32: cara mengatur IDE, cara membuat proyek sederhana, cara menyusun program, dan cara menjalankan program untuk dieksekusi. Setelah mengagumi LED yang berkedip pada papan Discovery)
Memulai artikel baru, saya berencana untuk segera pergi ke analisis rinci daftar program, yang membuat LED kami berkedip, tetapi ketika saya mulai menulis, saya tiba-tiba menyadari untuk diri saya sendiri bahwa ada sejumlah besar pertanyaan tanpa jawaban yang perlu dilanjutkan untuk mempertimbangkan program. sebelum waktunya. Dan bagi saya sendiri, saya telah mengidentifikasi seluruh daftar masalah seperti itu :
- Apa operasi bitwise ? Bagaimana cara menggunakannya?
- Apa itu register dan bagaimana kaitannya dengan operasi bit?
- Terdiri dari apa mikrokontroler STM32F0xx-series, bagaimana clocking dilakukan dan apa yang memberi kehidupan di dalam MK?
- Bagaimana inisialisasi MK terjadi, mengapa saya memerlukan file startup , apa fungsi SystemInit ? Penjelasan di jari.
- Terdiri dari apa perpustakaan CMSIS ? Bagaimana cara menavigasinya? Apa yang bisa dipelajari darinya dan bagaimana menggunakannya?
Dari pertimbangan masalah-masalah inilah saya ingin melanjutkan kisah tentang pemrograman STM32.
Daftar artikel:
- Memulai Mempelajari STM32 atau Mengelola Cahaya dengan Cerdas
- Memulai STM32: Operasi Bit
- Memulai STM32: Apa itu Register? Bagaimana cara bekerja dengan mereka?
Operasi logika dasar
Baru mulai mempelajari mikrokontroler, kata-kata "register" dan "operasi bit" tampak misterius bagi saya dan untuk waktu yang lama saya tidak ingin beralih ke topik ini. Tetapi ketika saya kurang lebih memahami apa itu, saya menyadari bahwa saya sia-sia menunda mempelajari topik yang begitu penting dalam kotak yang jauh. Operasi bit mungkin adalah operasi yang paling umum dalam mikrokontroler dan mengetahui bagaimana dan mengapa mereka dapat digunakan dalam pekerjaan kita akan membuka potensi besar bagi kita untuk mengendalikan segala sesuatu di MK kita!
Kita semua, pada pelajaran ilmu komputer di sekolah, berkenalan dengan apa itu teknologi digital, mengapa disebut demikian, operasi logika dasar apa yang ada.Semua teknologi digital modern didasarkan pada matematika biner dan sirkuit logika.
Mikrokontroler selalu beroperasi dengan hanya dua status: "nol" - tanpa tegangan, "satu" - tegangan. Mari kita menyegarkan sedikit pengetahuan kita tentang operasi logis dasar. mereka membentuk dasar dari semua teknologi digital.
- Konjungsi - ditetapkan sebagai "Logis DAN" atau "Perkalian Logis" . Faktanya, hasil dari melakukan operasi logis dua untuk ekspresi A dan B ini mirip dengan perkaliannya. Artinya, ekspresi akan mengambil nilai "1" hanya jika A dan B memiliki nilai "1". Dalam semua kasus lain, nilainya akan "0". Dapat dilambangkan dengan AND, &&, AND, &
- Disjungsi - ditetapkan sebagai “Logical OR” atau “Tambahan logis” . Hasil dari melakukan dua operasi logis ini untuk ekspresi A dan B mirip dengan penambahan mereka. Artinya, ekspresi akan mengambil nilai "1" jika setidaknya salah satu ekspresi A dan B memiliki nilai "1". Dapat ditunjuk sebagai OR, ||, OR, |.
- Inversi - ditetapkan sebagai “TIDAK Logis” atau “Penolakan” . Hasil dari melakukan operasi logis dua ini untuk ekspresi A adalah kebalikannya. Artinya, ekspresi akan mengambil nilai 1 jika ekspresi A adalah 0 dan sebaliknya. Dapat ditunjuk sebagai TIDAK,!, TIDAK, ~.
- Disjunction Ketat - Ditunjuk sebagai "Exclusive OR" atau "Logical Addition Exclusive OR" . Hasil dari melakukan operasi logis ini dua untuk ekspresi A dan B akan mengambil nilai 1 jika A dan B memiliki nilai yang berbeda. Dapat ditetapkan sebagai Tidak . ATAU, XOR, ^.
Operasi bit
Operasi bit hampir sama dengan operasi logis, dengan satu-satunya perbedaan adalah bahwa mereka berlaku untuk bit dan angka biner.
By the way, untuk kesederhanaan mempelajari operasi bit, saya menggunakan program ASM Calculator 32-bit dari ManHunter . Menggunakan program ini, Anda dapat memeriksa hasil operasi bit, mentransfer nomor dari satu sistem nomor ke yang lain. Program ini memiliki antarmuka yang intuitif dan setelah bertemu, program ini telah menjadi salah satu alat utama dalam pekerjaan saya dengan mikrokontroler. Penjelasan kecil tentang antarmuka program diberikan pada gambar di bawah ini:
Operasi bit "TIDAK" - "~"
Jika bitnya "1", maka setelah melakukan operasi "TIDAK" itu akan sama dengan "0", dan sebaliknya. Operasi segera dilakukan pada semua bit dari nomor biner. Misalnya, balikkan nomor FF:
Operasi bit "AND" - "&"
Jika kedua bit dalam bit sama dengan "1", maka setelah operasi "AND" dilakukan, hasil dalam bit akan sama dengan "1", tetapi jika setidaknya salah satu bit adalah "0" maka hasilnya akan sama dengan "0". Operasi juga dilakukan bitwise. Sebagai contoh, “gandakan” dua angka 0xFF0 dan 0xF0F:
Sebagai hasilnya, kita akan melihat bahwa dalam kategori-kategori tersebut di mana terdapat unit di kedua bilangan, hasilnya adalah unit, dalam semua kasus lainnya - nol.
Pertimbangkan opsi untuk aplikasi praktis:
- Dalam situasi di mana kita perlu mereset bit atau kelompok bit tertentu ke nol, kita bisa menggunakan mask. Saya pikir akan lebih jelas untuk menunjukkan ini dengan sebuah contoh. Misalkan kita mengambil angka dan 0xF8F dan kita membutuhkan bit ke-7 menjadi nol alih-alih satu. Tidak masalah, kenakan topeng dan hapus centang bit yang diinginkan. Lipat gandakan angka dan dapatkan hasilnya:
- Jika kita perlu memeriksa bit tertentu dalam angka 0 atau 1 - kita juga menggunakan mask untuk menggandakan. Dalam topeng, kami mengatur bit yang ingin kami periksa. Jika bit yang diperlukan adalah "0", maka hasil perhitungannya adalah "0", jika "1" maka, masing-masing, "1". Jika kita ingin mengetahui apakah bit ke-7 sama dengan satu, kita membuat topeng yang sesuai dan mengalikan nomor kita dengan topeng. Semuanya sederhana:
Jika kita perlu memeriksa paritas angka (artinya kemampuan angka untuk dapat dibagi dua), maka kita memeriksa bit 1 dengan cara yang sama, jika itu adalah "1", maka angkanya ganjil, jika ada "0" maka angkanya genap. Cobalah sendiri, untuk melatih dan membangun keterampilan, lakukan tes ini.
Operasi bitwise "OR" - "|"
Jika satu atau kedua pasangan bit adalah "1" maka hasilnya akan "1", sebaliknya jika kedua bit sama dengan "0" maka hasilnya adalah "0". Artinya, secara kasar, penambahan semua unit dalam digit dilakukan. Misalnya, jika kita menambahkan dua angka 0xF8F dan 0x7F, maka kita mendapatkan hasil berikut:
Pertimbangkan aplikasi praktis:
- Jika kita perlu mengatur bit tertentu dalam angka menjadi 1 , kita juga menggunakan mask untuk melakukan penambahan. Misalnya, untuk mengatur bit ke-15 di angka 0xFF0, Anda perlu melakukan operasi penambahan logis dan kami akan mendapatkan hasil yang diinginkan:
Cobalah untuk bermain dengan nomor yang berbeda sendiri dan lihat hasilnya.
Operasi EKSKLUSIF ATAU bitwise adalah "^"
Jika bit dalam bit berbeda dan tidak sama maka hasilnya akan "1", jika tidak "0". Misalnya, jika kita melakukan angka XOR 0xF8F dan 0x7F, maka kita akan melihat bahwa dalam bit di mana ada bit yang sangat baik, maka hasilnya adalah "1" dan di tempat-tempat di mana bitnya sama, apakah itu "0" atau "1", ternyata "0" ", Pada akhirnya kami mendapatkan hasil sebagai berikut:
Pertimbangkan opsi untuk aplikasi praktis:
- Jika kita perlu membalikkan bit dalam suatu angka , kita dapat menggunakan mask untuk dengan mudah melakukan ini menggunakan operasi XOR. Mari kita lakukan inversi dari angka 6 dan 7 di angka 0xF8 menggunakan mask 0xC0. Anda dapat melihat hasilnya di gambar:
- Ada situasi di mana perlu untuk membandingkan dua register dan menentukan apakah mereka sama atau tidak . Dalam hal ini, kita perlu mendaftarkan nilai ke operasi XOR. Jika hasilnya "0", maka registernya sama, kalau tidak mereka tidak sama:
Operasi pergeseran bit
Ada sejumlah operasi bit yang menarik dan terkadang sangat berguna yang disebut operasi shift . Anda dapat memindahkan muatan baik ke kanan maupun ke kiri. Selama operasi ini, semua bit dari angka biner digeser oleh jumlah posisi yang ditentukan, dalam hal ini, jika shift mengarah ke kiri , bit paling signifikan (paling kiri) hilang, dan "0" ditulis ke yang paling tidak signifikan (paling kanan). Dengan pergeseran logis ke kanan, situasi sebaliknya terjadi - bit paling tidak signifikan (paling kanan) hilang, dan "0" ditulis ke yang tertinggi. Selain itu, saya ingin mencatat bahwa dalam kasus kata 32-bit, semua 32 bit digeser secara keseluruhan. Pertimbangkan operasi shift secara lebih detail.
Shift Kiri - "<<"
Anda dapat melihat bagaimana pergeseran terjadi pada gambar di bawah ini. Saya pikir semuanya sangat jelas:
Dengan shift biner, Anda dapat melihat satu fitur menarik. Pergeseran satu digit mengalikan angka kita dengan 2. Jika kita menggeser angka kita x dengan n digit, maka kita mendapat x * (2 * n). Coba lacak pola ini secara mandiri melalui utilitas kami untuk berhitung. =)
Beralih ke kanan - ">>"
Apa yang dihasilkan dari pergeseran ke kanan cukup jelas tercermin dalam gambar:
Dengan pergeseran biner ke kanan, Anda dapat melihat bahwa situasinya adalah kebalikan dari pergeseran ke kiri - angkanya dibagi 2 detik pada pergeseran 1 digit dan setelah 2 * n, di mana n adalah jumlah bit yang digunakan untuk mengubah pergeseran tersebut. Coba juga bermain-main dengan angka sendiri, yang jelas dibagi menjadi 2 sepenuhnya. Dan pertanyaan tentang pengisian ulang - apa hasilnya jika Anda membagi angka ganjil dengan cara ini?
Catatan penting . Jika Anda membuat perubahan untuk variabel dengan tanda negatif (ditandatangani), posisi yang dikosongkan akan diisi dengan yang.
Kesimpulannya ...
Bagi banyak pemula, topik ini mungkin tampak sangat membosankan dan sepertinya sama sekali tidak jelas di mana dan bagaimana menerapkan pengetahuan ini. Saya segera meyakinkan Anda, dalam situasi di mana Anda perlu menaikkan satu atau beberapa kaki dari MK atau menulis parameter ke utas di blok atau modul periferal - di sana, pengetahuan tentang operasi bit akan diperlukan di sekitar. Karena artikel ini ternyata sangat produktif, kami akan mentransfer pertimbangan register ke pelajaran selanjutnya. Nah, di masa depan Anda dapat menggunakan artikel ini sebagai lembar contekan.
Sebagai pekerjaan rumah Anda , coba parsing kode program kami sendiri di blok sementara (1) {...} dan pahami bagaimana kami menghidupkan dan mematikan LED kami dengan operasi bitwise . Nah, dalam pelajaran selanjutnya saya akan memberi tahu Anda bagaimana itu benar-benar terjadi!
Daftar artikel:
- Memulai Mempelajari STM32 atau Mengelola Cahaya dengan Cerdas
- Memulai STM32: Operasi Bit
- Memulai STM32: Apa itu Register? Bagaimana cara bekerja dengan mereka?