Ringkasan kuliah pertama tentang pemrograman mikrokontroler modern menggunakan contoh STM32 dan sistem operasi RIOT. Ceramah disampaikan di Institut Teknologi Informasi MIREA pada hari Sabtu, mulai pukul 12:50 di auditorium lantai 4 Gedung D. Kelas memberi waktu 1,5 jam untuk kuliah itu sendiri dan 3 jam untuk kelas praktis di laboratorium IoT di Akademi Samsung mengenai topik kuliah.Halo Giktayms! Seperti yang kami janjikan, kami mulai menerbitkan catatan kuliah yang dikirim di MIREA IT Institute. Menurut hasil kuliah pengantar pertama, kami memutuskan untuk sedikit mengubah struktur kursus - alih-alih dua aliran yang direncanakan dari 5 pelajaran, akan ada satu aliran untuk 7 pelajaran. Ini akan memungkinkan untuk memilah sejumlah pertanyaan pendukung pada langkah yang lebih santai, serta artikel abstrak akan muncul di GT setiap minggu sepanjang Maret dan April, dan tidak dalam seminggu, seperti yang direncanakan sebelumnya.
Namun demikian, tidak mungkin untuk sepenuhnya membahas topik yang luas dalam tujuh kuliah, sehingga presentasi akan menjadi tesis di beberapa tempat - walaupun untuk mengimbangi ini, kami akan mencoba untuk menunjukkan ke arah mana mereka yang ingin memeriksa secara lebih mendalam secara lebih mendalam masalah ini atau itu akan terlihat.
Kursus ini dirancang untuk siswa tahun kedua dan ketiga yang akrab dengan bahasa C dan konsep dasar elektronik dan teknik listrik. Berkenalan dengan mikrokontroler sebelumnya tidak diperlukan.
Tujuan dari kursus ini adalah pengembangan keterampilan yang memungkinkan Anda untuk bekerja dengan bebas dengan mikrokontroler pada inti ARM Cortex-M di tingkat modern dan, jika ada keinginan seperti itu, bergeraklah untuk semakin memperdalam pengetahuan Anda.

Kuliah hari ini adalah yang pertama, sehingga akan memahami konsep umum: apa itu mikrokontroler secara umum dan mengapa diperlukan, apa firmware dan bagaimana cara mendapatkannya, mengapa kita memerlukan sistem operasi, dan akhirnya, bagaimana bekerja dengan git. Hasil dari pelajaran ini adalah repositori GitHub Anda sendiri dengan kode sumber OS, serta lingkungan build yang berhasil dikonfigurasikan di komputer lokal.
Mikrokontroler
Singkatnya, mikrokontroler adalah contoh klasik dari "sistem pada chip", yang mencakup inti prosesor dan satu set perangkat bantu dan periferal, yang memungkinkan mikrokontroler dalam banyak kasus sepenuhnya swasembada.

Dalam mikroprosesor yang khas, mirip dengan apa yang ada pada PC atau ponsel cerdas apa pun, hampir semua modul yang dapat dikaitkan dengan perangkat tambahan (daya, pencatatan jam kerja, bahkan perangkat periferal dasar) dipindahkan di luar chip itu sendiri, walaupun faktanya mikroprosesor bekerja tanpa mereka tidak bisa.
Dalam mikrokontroler, sebaliknya, pada chip yang sama dengan inti, tidak hanya subsistem yang diperlukan untuk operasinya diimplementasikan, tetapi juga sejumlah perangkat periferal yang mungkin diperlukan dalam berbagai tugas praktis. Selain itu, banyak produsen mikrokontroler bersaing satu sama lain bukan dalam kinerja inti atau kapasitas memori, tetapi dalam kelimpahan dan fungsi perangkat periferal.
Mikrokontroler telah berkembang secara paralel dengan mikroprosesor selama beberapa waktu - misalnya, arsitektur Intel 8051 yang masih ditemukan dalam produk industri dikembangkan pada tahun 1980. Di beberapa titik, garis pengembangan mereka mulai bersinggungan dengan mikroprosesor - misalnya, model mikrokontroler lama memiliki antarmuka untuk RAM eksternal, dan produsen mikroprosesor mengintegrasikan lebih banyak perangkat periferal ke dalam chip (cukup untuk mengingat bahwa pada awal “komputer pribadi” bahkan cache eksternal dipanggil) sirkuit mikro) - tetapi bagaimanapun juga, mereka tetap merupakan dua cabang pembangunan yang sangat berbeda.
Sebenarnya, tujuan menciptakan mikrokontroler adalah untuk mengurangi biaya dan miniaturisasi berbagai perangkat yang memerlukan daya komputasi kecil: penggunaan chip tunggal, yang cukup untuk memasok daya untuk operasinya, secara signifikan menyederhanakan desain dan pembuatan papan sirkuit cetak dibandingkan dengan set 4-5 chip terpisah .
Tentu saja, mikrokontroler memiliki keterbatasan sendiri - secara teknis tidak mungkin untuk mengemas dalam satu chip apa yang ada di PC besar menempati setengah papan yang agak besar.
- Frekuensi operasi jarang melebihi 200 MHz, dan lebih sering berada di wilayah puluhan megahertz.
- Jumlah RAM dalam megabita, dan lebih sering di wilayah puluhan kilobyte.
- Jumlah memori program dalam megabita, dan lebih sering di wilayah puluhan hingga ratusan kilobyte.
Sebagai bagian dari kursus, kami akan bekerja dengan mikrokontroler STM32L151CC yang memiliki 32 KB RAM, 256 KB ROM dan frekuensi operasi maksimum 32 MHz (chip yang sedikit lebih serius ada di papan Nucleo-L152RE - 80 KB RAM dan 512 KB ROM).
Memori
Secara umum, ada empat jenis memori di dalam mikrokontroler:
- Memori permanen ( memori flash) digunakan untuk menyimpan program pengguna dan, kadang-kadang, beberapa pengaturan mikrokontroler itu sendiri. Jika, ketika menentukan karakteristik mikrokontroler, mereka menulis jumlah memori tanpa menentukan yang mana - sebagai aturan, ini adalah tentang flash. Isi flash tidak diatur ulang ketika listrik mati, periode penyimpanan informasi di dalamnya dalam kondisi normal biasanya minimal 10 tahun.
- RAM digunakan untuk menjalankan program pengguna dan menyimpan data "sesaat". RAM selalu diatur ulang saat Anda reboot atau matikan, dan mungkin juga tidak disimpan ketika Anda memasuki beberapa mode tidur. Dalam mikrokontroler, seringkali tidak ada pemisahan yang jelas antara memori program dan memori data - sebagai hasilnya, istilah "eksekusi dari RAM" dapat ditemukan, yang berarti bahwa dalam RAM tidak hanya data, tetapi juga program itu sendiri; Namun, ini adalah kasus yang cukup eksotis.
- EEPROM . Ini juga mengacu pada memori hanya-baca, tetapi berbeda secara signifikan dari memori flash dalam karakteristiknya. Flash memiliki dua kelemahan besar yang membuatnya sangat tidak nyaman untuk menyimpan beberapa data saat ini dari program - pertama, flash memiliki jumlah overwrite yang terbatas dari sel yang sama, dan kedua, seringkali dimungkinkan untuk bekerja dengan flash hanya di seluruh halaman, yang berukuran ratusan byte, bahkan jika Anda perlu menimpa hanya satu byte. EEPROM tidak memiliki kekurangan ini - umur layanannya biasanya sepuluh kali lebih lama (dari 100 ribu hingga 1 juta ditimpa), dan Anda dapat bekerja dengannya secara individual dengan setiap byte. Karena alasan ini, EEPROM digunakan untuk penyimpanan data permanen yang dihasilkan oleh program itu sendiri (arsip pengukuran, pengaturan program, dll.), Volume tipinya adalah unit kilobyte, tetapi tidak di semua pengontrol.
- Memori sistem Area memori hanya baca, tidak dapat diakses oleh pengguna untuk direkam, tetapi direkam dalam produksi mikrokontroler. Biasanya mereka berisi kode yang dapat dieksekusi bootloader (tentangnya di bawah), tetapi beberapa konstanta kalibrasi, nomor seri, atau bahkan perpustakaan tambahan untuk bekerja dengan perangkat periferal juga dapat disimpan
Anda bisa melihat organisasi memori pengontrol tertentu dalam lembar datanya. Di sini, misalnya, adalah
lembar data pada STM32L151CC , di halaman 51 di mana kartu memori keluarga ini disajikan.
Sangat mudah untuk memperhatikan bahwa keempat jenis memori, yang kita bicarakan, menempati sepotong kartu yang sangat kecil - dan pada sebagian besar gambar ada daftar semua perangkat periferal yang tersedia di controller.
Daftar
Faktanya adalah segala sesuatu - secara umum semuanya - komunikasi dengan semua perangkat periferal mikrokontroler dan semua pengaturannya dilakukan hanya dengan menggunakan dua operasi:
- baca nilai di alamat yang diberikan
- tulis nilai ke alamat yang diberikan
Segala sesuatu yang ada di dalam mikrokontroler perlu dipetakan ke beberapa alamat. Alamat ini disebut
register (jangan bingung dengan register prosesor - register prosesor berisi data tempat prosesor melakukan operasi; register yang sedang kita bicarakan berisi beberapa data khusus yang secara khusus memetakan keadaan berbagai unit perangkat keras mikrokontroler).
Jadi, misalnya, jika kita ingin "1" muncul di kaki ketiga port A dari mikrokontroler (PA2, penomoran adalah dari awal), kita perlu menulis "1" di bit ketiga dari register yang terletak di 0x4002014. Dan jika leg ini dikonfigurasikan sebagai input dan, sebaliknya, kami ingin mengetahui nilai apa yang ada di dalamnya, kami perlu membaca bit ketiga dari register di alamat 0x40020010.
Ya, untuk menunjukkan ke controller, leg ini adalah input atau output - Anda harus menulis nilai yang sesuai ke bit terkait di alamat 0x40020000.
Ini adalah poin penting dalam memahami operasi mikrokontroler: benar-benar semua yang bukan operasi komputasi, yang bertanggung jawab atas inti prosesor, dilakukan dengan menulis atau membaca register ini atau itu. Apa pun perpustakaan yang ditipu ke dalam program Anda dari atas - pada akhirnya, semuanya tergantung pada register.
Tentu saja, bekerja dengan alamat numerik agak tidak nyaman, oleh karena itu untuk setiap mikrokontroler pada inti Cortex-M ada pustaka CMSIS (Standar Antarmuka Perangkat Lunak Mikrokontroler Cortex), komponen terpenting bagi kami adalah file header yang menggambarkan register yang tersedia di pengontrol tertentu dan memberikannya terbaca oleh manusia. nama.
Menggunakan CMSIS, operasi yang dijelaskan di atas dengan kaki PA akan terlihat seperti ini:
int pin_num = 2; /* PA2*/
GPIOA->MODER &= ~(0b11 << (pin_num*2)); /* PA2 */
GPIOA->MODER |= 0b01 << (pin_num*2); /* PA2 01 — */
GPIOA->ODR |= 1 << pin_num; /* PA2 1 */
GPIOA->MODER &= ~(0b11 << (pin_num*2)); /* PA2, */
uint32_t pa2_value = GPIOA->IDR & (1 << pin_num); /* PA2 */
, —
Reference Manual (, , , RM0038, STM32L1). , 900 RM0038 — , 1500-2000 . -, , — .
, — . , , «» .
, , — , - ( 1 , , , 1 , , ), .
STM32 Standard Peripherals Library, StdPeriphLib, SPL. , ST LL, — ,
LibOpenCM3. , STM32 .
, SPL , , , GPIO_Init GPIO_Write.
, , SPL — .
, SPL «» , ,
STM32 CubeMX. (, , ) STM32.
, , « , - » — « , ». SPL, , , , SPL , — SPL , . , .
, , , - , , , STM32L1 ATSAMD21 , SPL, .
SPL — , , , SPL.
, SPL — «» . , :
- . , (RTC), — - , ( ) (, ), . -, .
- . , . Arduino loop() , . loop() , , . ( , ).
- . , , — , : -, , , . - — , , , , . , API.
— — .
, ( 5-20 ), , 70 % .

, , SPL.
RIOT OS, STM32 — SPL .
: , , , , SPL . , SPL , , STM32, , .
, :

, RIOT OS - (IDE) — , , IDE, (, , Arduino IDE — ; , , ).
, , , , « , , ».
, , Arduino IDE, IDE, — .

, RIOT OS , : HAL cpu ( , , AVR PIC32), — boards, — drivers, — core, — sys, — examples.
, — , ( ) , , , , . — , , .
https://github.com/unwireddevices/RIOT/tree/mirea — RIOT OS, Unwired Devices STM32L1, , , , .
Github, «Clone/Download» «Download ZIP», . GitHub, «Fork» — , .
GitHub Git — , .
, , - , «Hello world» :
#include <stdio.h>
int main(void)
{
puts("Hello World!");
printf("You are running RIOT on a(n) %s board.\n", RIOT_BOARD);
printf("This board features a(n) %s MCU.\n", RIOT_MCU);
return 0;
}
example/hello-world main.c ( ).
, , , . - .
1. Windows 8 . , MinGW, .
. , Git/GitHub
Git for Windows, MinGW. MinGW, MinGW .
, Windows 7 Windows 8, , .
2. Windows 10. Microsoft Store, Ubuntu . Ubuntu Windows, « Windows», « Windows Linux» .
Ubuntu, , MinGW.
(: 64- Linux!), Ubuntu, :
cd /opt
sudo tar xf /mnt/c/Users/vasya/Downloads/gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2
export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/:$PATH
export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/bin/:$PATH
echo "export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/:\$PATH" >> ~/.bashrc
echo "export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/bin/:\$PATH" >> ~/.bashrc
.bashrc, Ubuntu. $ >> — , ( ) .bashrc.
arm-none-eabi-gcc --version , , — 7.2.1 ( ).
Git ssh-keygen, ( Ubuntu Windows cat ~/.ssh/id_rsa.pub, Enter — ) GitHub. GitHub git.
NB: Linux, : , Tab ( cd /opt/gcc- cd /opt/gcc-arm-none-eabi-7-2017-q4-major). , — , . , Tab .
NB: Windows , , Windows, Documents/git/RIOT. - MinGW /c/Users/vasya/Documents/git/RIOT, - Ubuntu — /mnt/c/Users/vasya/Documents/git/RIOT. , , , Windows, Notepad++.
3. Linux. Windows 10, , Microsoft Store . gcc-arm-none-eabi — .
, RIOT examples/hello-world,
make.
, , unzip ( Windows 10 ), make . Windows 10 ( ):
sudo apt-get install unzip make
make — , «
make clean && make»: , . , - , — , .
NB: RIOT hello-world native, , , x86. unwd-range-l1-r3, stm32,
Building application "mirea" for "unwd-range-l1-r3" with MCU "stm32l1".
- , make — . mirea.elf ( - ).
- :

, , , , , .
, GPIO, — , , — , .
P.S. — 360- ( : « » , , - ):
