
0. Sebelum membaca artikel
Artikel ini memiliki tujuan sebagai berikut:
- perlihatkan cara bekerja secara khusus dengan dewan ini;
- tunjukkan pendekatan yang dengannya Anda dapat menulis program LED yang berkedip, hanya mengandalkan dokumentasi dan logika;
- menyajikan materi dalam bahasa yang bisa dimengerti oleh orang yang kurang akrab dengan mikrokontroler.
Kode ini akan berubah menjadi minimalis dalam hal menggunakan file tambahan - kami tidak akan menyertakan satu file, kecuali untuk file yang diperlukan untuk membuat firmware yang kosong namun valid. Yaitu berdasarkan pada kode firmware, yang berfungsi, tetapi tidak ada gunanya.
Kami membutuhkan dokumentasi berikut:
- Datasheet STM32F030x4 (Saya menggunakan dokumen dari Januari 2017 DocID024849 Rev 3);
- RM0360 Manual referensi STM32F030x4 / x6 / x8 / xC (Saya menggunakan dokumen dari April 2017 DocID025023 Rev 4);
- papan sirkuit.
Anda dapat mengunduh dokumen-dokumen ini dari
cloud .
Penghitung waktu dalam artikel
tidak akan dipertimbangkan dan
tidak akan terlibat dalam kode.
Programmer ST-LINK
tidak digunakan. Untuk bekerja dengan papan, adaptor USB-COM (RS232 berdasarkan PL2303HX) digunakan, yang mengemulasi port COM.
Semuanya dikumpulkan pada mesin virtual Windows XP Professional 2002 SP3 yang berjalan melalui VirtualBox versi 5.2.22r126460 pada host Windows X.
1. Menginstal driver untuk adaptor USB-COM
Windows tidak membantu, unduh dari situs resmi
Prolific (tautan pertama ke permintaan "driver produktif" di Google) driver USB ke UART / Serial / Printer
PL2303 Windows Driver (Anda memerlukan yang
Driver Standar ). Atau Anda dapat mengunduh dari
cloud saya.
Instal driver, reboot dan lihat port COM baru.
Cuplikan layar dengan nama penginstal dan port COM yang baru Pengaturan port dibiarkan standar. Anda dapat mengubah nomor port COM atas kebijakan Anda. Dalam pengalaman saya, hanya sekali dalam hidup saya saya melihat sebuah program hanya melihat 4 COM port pertama, jika saya tidak salah itu adalah semacam terminal Bluetooth di Windows.
2. Mengisi firmware dan mematikan board
2.0 Utilitas pengunduhan untuk bekerja dengan board
Kami mengunduh utilitas
FLASHER-STM32 dari situs web
STM (dalam uraian itu disebut STM32 Flash loader demonstrator (UM0462)), Anda harus mendaftar untuk ini, tetapi ini tidak menakutkan - pada akhirnya kami akan meninggalkan arsip zip dengan installer; Next-> Next-> Next ... dan semuanya sudah diinstal. Untuk kenyamanan, saya membuat pintasan ke aplikasi ini di folder yang berfungsi.
Inilah utilitasnya (tangkapan layar situs) Secara default, jalur ke utilitas
C: Program Files \ STMicroelectronics \ Software \ Flash Loader Demo \ STMFlashLoader Demo.exe .
2.1 Nuansa BOOT
Ada jumper BOOT di papan tulis.
- Ketika jumper ditutup , mikrokontroler akan memuat instruksi dari memorinya (mis., Program yang ditulis oleh seorang programmer).
- Ketika jumper terbuka , mikrokontroler akan menerima informasi tentang jalur RX dan TX, mis. Ini akan di-flash dari port COM (dari adaptor dalam kasus saya).
2.2 Mengkonfigurasi utilitas

Jalankan aplikasi ini, sebenarnya yang paling sederhana (berisi pengaturan minimum). Di jendela pertama, pilih:
- antarmuka (saya punya COM-3);
- kecepatan komputer dan mikrokontroler akan berkomunikasi (IMHO, nilai normal 9600);
- jumlah bit data (untuk beberapa alasan jendela ini tidak tersedia untuk saya, tetapi sejauh ini ini tidak penting);
- parity (Saya tidak memiliki paritas, mis. Tidak ada);
- gema (saya punya OFF);
- waktu tunggu (saya punya 10 detik).
Klik Berikutnya, dan jika semuanya beres, maka kita akan melihat lampu hijau dan "Target dapat dibaca"; jika kita melihat lampu merah, komputer tidak dapat terhubung.
Target dapat dibaca jika mikrokontroler berhasil terdeteksi Urutan langkah-langkah yang selalu membantu:
- Pertama, Anda perlu memeriksa apakah jumper BOOT di papan ditutup.
- Kedua, dalam hal apa pun, matikan daya mikrokontroler dan lebih disukai jalur TX dan RX yang datang dari adaptor ke papan (Anda tidak dapat melepaskan koneksi ke tanah).
- Ketiga, dalam program, tekan Kembali ke akhir, mis. ke halaman pertama, atau bahkan menutupnya dan memulai kembali (secara umum, terkadang macet). Penting untuk selalu memulai dari halaman pertama sebelum setiap koneksi ke papan melalui program ini.
- Keempat, angkat kabel dari adaptor ke papan dan coba sambungkan lagi di program (pastikan dari halaman pertama!).
Jika semuanya gagal, Anda dapat mencoba mematikan semuanya, nyalakan kembali komputer, dan coba sambungkan kembali ke papan tulis.
Karena Saya bekerja melalui mesin virtual, saya harus menghubungkan kembali adaptor USB-COM beberapa kali sehingga terdeteksi oleh mesin virtual, dan mesin host tidak punya waktu untuk menginstal driver yang rusak.
Pilihan lain yang saya temukan bekerja saat menulis artikel ini adalah dengan menekan tombol di papan daripada terus-menerus menarik kabel. Namun, Anda harus menutup dan membuka jumper BOOT dalam hal apa pun. Opsi ini berfungsi karena tombol ini dibawa ke kaki reset
NRST eksternal.
Di jendela berikutnya, pilih Target perangkat Target. By the way, kadang-kadang di sini Anda dapat melihat (mungkin bug) perangkat kiri secara umum, misalnya, bukannya STM32 lihat STM8 - di suatu tempat ada semacam kegagalan, prosedur perawatan dijelaskan di atas. Oleh karena itu, pada langkah ini Anda tidak dapat terburu-buru mengklik Berikutnya, tetapi selalu perhatikan fakta bahwa perangkat yang diinginkan dipilih di Target.
Pemilihan Perangkat Target Bagaimana cara menentukan perangkat yang kita miliki? - kita melihat chip dan menulis ulang semua yang tertulis di dalamnya. Kami membuka
Lembar Data pada chip kami, bagian
Informasi pemesanan menjelaskan surat mana yang bertanggung jawab untuk apa. Dalam kasus saya itu adalah:


Saya memilih chip saya (16K) di Target dan melanjutkan. Pilihan 4 tindakan dengan chip ditawarkan:
- hapus memori (seluruh atau pilih area tertentu);
- tulis firmware ke perangkat;
- baca firmware dari perangkat;
- aktifkan / nonaktifkan perlindungan baca atau baca.
2.3. Baca firmware dari board
Ketika saya menghubungkan papan untuk pertama kalinya, saya memutuskan untuk menyimpan firmware asli, semacam cadangan - kami akan melakukannya sekarang. Penting untuk menunjukkan di mana harus menyimpan firmware ini dan halaman memori mana yang akan disimpan, juga diusulkan untuk menggunakan format file
hex ,
bin atau
s19 untuk
dipilih .
Pilih halaman memori untuk dibaca Jika Anda hanya mengunggah firmware ke papan tulis atau membaca firmware dari papan tulis, maka tidak ada perbedaan antara format file ini. Berikut ini adalah halaman kemajuan, di mana kadang-kadang proses membeku 99% untuk waktu yang lama (tidak harus 99), tetapi setelah beberapa detik seharusnya berhasil - pada kenyataannya, setelah itu dewan tidak memberikan perilaku yang sesuai dengan firmware yang dimuat. Sederhananya, Anda perlu menyambung kembali semuanya dan mengisi ulang firmware, tidak ada yang penting tentang ini.
File firmware telah disimpan, dan di masa depan dapat diunggah ke papan.
Namun, jika proteksi baca diinstal, firmware tidak dapat dibaca.
2.4 Memasang papan
Sekarang isi file firmware, penulisan kode sumber yang diberikan di bawah ini. Ke depan, saya akan mengatakan bahwa kami akan mengunggah file
bin dan
hex , karena lingkungan pengembangan akan mengeluarkannya. Pengaturan tambahan untuk file
s19 dan
hex adalah identik; tidak seperti mereka, dalam file
bin , Anda dapat memilih alamat dari mana firmware akan direkam, secara default di utilitas itu adalah 8000000 (cocok untuk kami).
Sebelum merekam, Anda dapat menghapus memori flash mikrokontroler dengan memilih satu dari tiga opsi:
- Hapus halaman yang diperlukan (kosongkan bagian memori yang diperlukan);
- No Erase (tanpa pemurnian);
- Global Erase (pembersihan penuh).
Padahal, pembersihan adalah proses penulisan nol ke memori.
Masih ada byte opsional, tetapi sejauh ini Anda tidak dapat menyentuhnya. Klik Berikutnya, tunggu prosesnya selesai, dan Anda selesai.
Jika Anda ingin merekam firmware saya, Anda dapat menemukannya di cloud, file
blink.bin . Saat menggunakan firmware ini, LED bawaan berkedip dari kaki PA4 akan berkedip.
3. Penulisan kode
3.0 Menginstal Lingkungan Pengembangan CooCox CoIDE
Anda dapat mengunduh IDE dari
SoftPedia.com , sebelumnya Anda dapat mengunduh dari situs web STM dan dari situs IDE itu sendiri, tetapi karena IDE tidak lagi didukung, itu menjadi tidak mungkin. Tidak ada yang penting bahwa IDE tidak lagi didukung, tidak, karena untuk menulis kode, yang utama adalah kompiler. Saya mengunduh kedua versi, tetapi saya menggunakan versi 1.7.8.
Peluncuran pertama dari lingkungan dijelaskan dengan baik di
sini , Next-> Next-> Next ... dan tidak ada yang rumit. Saya hanya akan menambahkan yang pertama itu lebih baik untuk membuat proyek, dan kemudian yang lainnya.
Namun, jika Anda kehilangan tab Repositori, Anda dapat menemukannya di menu
View -> Repository .
Anda dapat mengunduh alat (kompiler) untuk lingkungan di
sini atau meminta Google "alat gnu untuk lengan"; Saya mengunduh opsi yang memiliki sha1.exe di bagian akhir.
3.1 Kerangka Sumber
Jadi, proyek telah dibuat, chip telah dipilih, sekarang kami akan menambahkan set minimum sumber ke proyek, yang tanpanya tidak akan bisa hidup sama sekali.
Ini adalah bagaimana proyek seharusnya terlihat ketika baru saja dibuat, yaitu hanya ada file main.c utama dan tidak lebih Pilih CMSIS BOOT dan lingkungan akan secara otomatis
memilih M0 Cmsis Core , karena dependensi membutuhkan ini.
Sekarang kita mendapatkan set sumber minimum Pasang proyek (ikon Bangun, atau tombol F7). Untuk alasan yang tidak saya ketahui, file hex tidak dikumpulkan (ada peringatan di konsol); Saya menginstal ulang IDE dan kompiler beberapa kali, menciptakan kembali proyek, tetapi untuk beberapa alasan hasilnya seperti pada mesin virtual; di komputer lain (bukan virtual, tapi nyata) semuanya satu-satu dan outputnya berfungsi hex. Untungnya ada bin.
Proyek ini berhasil dirakit Saya menyarankan Anda untuk memperhatikan ukuran file, itu dapat dilihat pada akhir output di konsol, atau Anda dapat melihatnya dengan cara standar (di sini, omong-omong, Anda dapat melihat bahwa hex kosong); Pada saat yang sama, tangkapan layar ini menunjukkan bahwa file firmware ada di folder proyek, kemudian Debug / bin / Meskipun kode tidak melakukan apa pun, saya mengunggahnya ke papan untuk memastikan bahwa Anda dapat mengunggahnya (yang, misalnya, utilitas tidak menolaknya). Saya menyarankan pembaca untuk melakukan ini. Jika tidak berhasil, coba lagi dan lagi, dan tulis komentar.
3.2 Algoritma Jari
Untuk mulai dengan, kami membuat sketsa algoritma bagaimana, dari sudut pandang manusia, mikrokontroler akan berkedip LED. Dan untuk alasan ini sedikit.
Setiap peralatan bekerja karena energi yang tersimpan, misalnya, beberapa mesin dapat berjalan pada jenis bahan bakar yang berbeda, tetapi untuk ini mesin perlu disesuaikan dengan jenis bahan bakar yang akan kita makan dengan itu. Demikian pula, mikrokontroler perlu disesuaikan (dicari) untuk sumber energi - ini akan menjadi
blok pertama dari algoritma.
Kami beralasan lebih lanjut. Komputer desktop memiliki monitor, pengeras suara, keyboard, mouse ... dan Anda dapat melihat bahwa beberapa perangkat memberikan informasi kepada kami, dan dengan bantuan orang lain, kami memberikan informasi ke komputer, tetapi semuanya terhubung ke kotak yang sama dengan semuanya (unit sistem). Anda dapat menebak bahwa mikrokontroler dapat menerima dan memberikan informasi, yang berarti kakinya dapat menerima sinyal atau memberikan sinyal - ini akan menjadi
blok algoritma berikutnya.
Selanjutnya, mikrokontroler harus menyalakan LED, tunggu sebentar, matikan LED, tunggu sebentar dan nyalakan-tunggu-matikan ...
Hasilnya, algoritme akan terlihat seperti ini

Tujuan dari diagram alur ini adalah untuk menunjukkan dengan jelas apa yang dilakukan oleh algoritma; Pertama-tama, skema ini ditulis untuk Anda sendiri, sehingga semua orang bebas untuk menulis / menggambar sesuai keinginannya (untuk dirinya sendiri). Saya percaya bahwa skema harus bertujuan sesederhana, mudah dibaca, dan seintuitif mungkin, untuk memiliki tingkat abstraksi yang tinggi.
Sesuai dengan algoritma ini, kami akan menulis kode.
3.3 Bekerja dengan dokumentasi
Saya sarankan membaca bagian artikel ini dengan
stm32f0xx.h file yang terbuka, yang terletak di folder
cmsis_boot proyek kami, dan dokumentasi terbuka.
3.3.1 Memilih sumber jam
Pertama, Anda perlu memberikan daya ke mikrokontroler. Mikrokontroler menerima 5 Volts dari adaptor (diukur dengan multimeter), tetapi muncul pertanyaan "frekuensi apa yang digunakan mikrokontroler", karena diketahui bahwa elektronik beroperasi pada frekuensi yang berbeda. Pertama, buka
datasheet , dalam konten Anda dapat melihat dua bagian yang relevan dengan artinya:
Manajemen daya ,
Jam dan startup . Yang pertama adalah tentang mode tegangan dan daya rendah. Bagian kedua menyembunyikan apa yang kami minati saat ini. Sudah dalam kalimat pertama ia mengatakan "osilator RC 8 MHz internal dipilih sebagai jam CPU default pada reset", yang berarti bahwa
secara default setelah mengatur ulang MC, rantai RC 8 MHz internal dipilih sebagai
sumber jam utama .
Berikutnya adalah beberapa skema pohon Jam yang tidak dapat dipahami, yang akan kita bahas nanti.
Sebenarnya, Anda dapat mengandalkan frasa "secara default setelah mengatur ulang MK ..." dan membaca bagian artikel ini secara diagonal.
Sekarang Anda perlu terganggu oleh papan dan mencari LED internal. Saya tahu bahwa dioda dalam rangkaian dilambangkan dengan
D1 ,
D2 ..., yaitu.
D == dioda , di papan saya dekat resistor
R7 adalah dioda
D1 .
Mungkin, setelah memeriksa papan dengan hati-hati, Anda dapat melacak ke kaki mana dioda terhubung, tetapi saya akan beralih ke papan sirkuit. Sayangnya, elemen papan tidak sama persis dengan elemen di sirkuit di lokasi mereka; tetapi saya senang bahwa saya menemukan skema seperti itu di Internet (kalau tidak saya tidak bisa menemukan apa pun untuk waktu yang lama).

Dalam diagram kita melihat bahwa katoda dioda terhubung ke ground melalui jumper
J2 , dan anoda terhubung ke pin
PA4 melalui resistor.
PA4 berarti output port
A ke-4, yang berarti bahwa untuk menyalakan dan mematikan LED, perlu untuk memasok tegangan ke output
PA4 .
Selanjutnya, Anda perlu menentukan bagaimana menerapkan tegangan ke output ini. Ini sama sekali tidak intuitif bagi saya, dan untuk waktu yang lama saya menjelajahi dokumentasi memanjang dan sampai saya menemukan
diagram Blok di bagian
Deskripsi di bagian paling awal lembar data. Dan di dalamnya saya melihat trek berharga
PA [15: 0] <=> Port GPIO A <=> AHB decoder <=> Matriks bus <=> Cortex-M0 , i.e. Port
A adalah port I / O untuk tujuan umum dan terhubung ke bus
AHB .
Diagram blok(Gambar dapat diklik)

Saya perhatikan bahwa dalam elektronik sudah biasa untuk memecah output mikrokontroler ke dalam port, dan biasanya port tersebut memiliki 16 output. Diagram menunjukkan bahwa port
A ,
B dan
C hanya memiliki 16, tetapi port
D dan
F memiliki lebih sedikit (mungkin kurang dari 16 pin, lebih - tidak).
Mari kita kembali ke skema
pohon Jam dan menemukan output ditandatangani oleh
AHB . Kami akan mencari tahu pada frekuensi apa output ini bekerja. Ke
AHB adalah sinyal
HCLK , yang meninggalkan pembagi
HPRE . Pembagi ini menerima sinyal
SYSCLK dari sakelar
SW . Manakah dari sinyal pada input
SW yang akan digunakan sebagai
SYSCLK secara
terprogram diatur - maka kita akan mengatur ini dalam kode. Pilihan yang ditawarkan:
- HSI - sinyal dari generator frekuensi tinggi internal, diproduksi oleh resonator kuarsa 8 MHz, yang saya solder sebelum bekerja dengan board ini;
- PLLCLK - sinyal dari pengganda frekuensi PLLMUL ;
- HSE - sinyal dari generator frekuensi tinggi eksternal.
Opsi apa pun cocok untuk tugas kami, saya sarankan memilih yang paling sederhana dan paling terjangkau -
HSI .
Kami akan masuk ke
manual Referensi dan membuka bagian
7 Reset dan clock control (RCC) , khususnya
7.2.6 Pemilihan jam sistem , di mana sekali lagi kami menemukan kata-kata yang sama yang ditemukan dalam lembar data: βsetelah reset sistem, osilator
HSI dipilih sebagai sistem jam "- mis. kami bahkan tidak perlu melakukan apa pun, MK akan mulai pada
HSI .
Untuk memastikan bahwa MK akan benar-benar bekerja dari sumber ini, saya akan menulis ini secara eksplisit di program; Gulir ke register yang bertanggung jawab untuk mengatur ulang dan mencatat waktu (bagian
7.4 register RCC ). Register pertama yang dijelaskan dalam dokumentasi adalah
Clock control register (RCC_CR) ; Di bawah ini adalah deskripsi dari bit, yang bertanggung jawab untuk apa.
Kami tertarik pada bit nol
HSION , yang bertanggung jawab untuk menyalakan resonator (
0 - off,
1 - on).
Oleh karena itu, perlu untuk menulis satu ke register
RCC_CR . (nol bit adalah satu, atau 2
0 = 1).
Sekarang kita temukan di file
stm32f0xx.h definisi
RCC (
#define RCC ).
Seperti yang Anda lihat, ini adalah struktur yang terletak di
RCC_BASE ; alamat
0x40021000 , jika Anda memperluas semua
definisi , alamat yang sama dapat dilihat di
manual Referensi di bagian
2.2.2 Peta memori dan daftarkan alamat batas dan dalam lembar data di bagian
5 Pemetaan memori (area
AHB ).
Untuk menulis sebuah unit untuk mengaktifkan
HSI dalam register
CR blok
RCC , Anda memerlukan satu baris kode
RCC->CR |= 0x1;
3.3.2 Mengatur kaki
Mengirim sinyal ke kaki mikrokontroler untuk menyalakan LED dan menghentikan sinyal sehingga LED padam adalah tindakan sederhana, dan karenanya ini merujuk pada fungsi
GPIO (port input-output tujuan umum).
Secara default, kaki-kaki MK tidak terhubung, mis. outputnya tidak pasti. Hal ini diperlukan untuk menghubungkan port, kaki yang akan memberi daya pada LED. Sebelumnya, kami menentukan bahwa port
GPIO terhubung ke bus
AHB - Anda harus mengaktifkan bus ini. Melanjutkan membolak-balik bagian
7.4 register RCC (mengontrol dan mengatur ulang register kontrol), kami menemukan bagian
7.4.6 AHB jam periferal mengaktifkan register (
RCC_AHBENR ,
jam bus
AHB mengaktifkan register ). Sebelumnya, saya memutuskan bahwa LED saya terhubung ke kaki
PA4 - karena itu, saya perlu menulis unit ke bit ke-17 dari register untuk memasang port
A.Jam periferal AHB memungkinkan register Dengan demikian, kodenya harus
RCC->AHBENR |= (1 << 17);
atau, yang merupakan hal yang sama
RCC->AHBENR |= 0x20000;
baik menggunakan file
#define stm32f0xx.h tulis
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
Kami telah memberdayakan port
A , sekarang kami perlu memberi tahu MK bahwa
PA4 akan berfungsi saat
keluar - kami akan membaca bagian
8 I / Os Tujuan Umum (GPIO) ; pengantar bagian ini sudah mengatakan "Setiap port I / O tujuan umum memiliki empat register konfigurasi 32-bit (
GPIOx_MODER ,
GPIOx_OTYPER ,
GPIOx_OSPEEDR dan
GPIOx_PUPDR ), dua register data 32-bit (
GPIOx_IDR dan
GPIOx_ODR ) ..." -
untuk masing-masing GPIO Port memiliki 4 register tuning dan 2 register data - inilah yang kami butuhkan (konfigurasikan port
A , atau lebih tepatnya output
PA4 , dan secara berkala kirim
0 dan
1 ke sana ). Untuk pemahaman yang lebih baik (teori) tentang apa yang terjadi, Anda dapat membaca bagian ini, tetapi saya gulir ke bawah ke bagian
8.4 GPIO mendaftar dan mengkonfigurasi port sesuai dengan deskripsi.
- mode port - keluar. Sesuai dengan dokumentasi, perlu untuk menulis 01 di area yang sesuai ( MODER4 ) dari register yang sesuai ( GPIOA_MODER ), yaitu bit 9 dan 8 : di bit ke-9 harus nol, di unit ke-8:
GPIOA->MODER |= (1 << 8); //
GPIOA->MODER |= 0x100; //
GPIOA->MODER |= GPIO_MODER_MODER4_0;
- jenis output. Jujur, saya masih belum sepenuhnya mengetahui sirkuit dari kasus ini (saya akan mengerti, membaca kembali forum lagi, dll.), Tetapi mempelajari sumber daya lain tentang konfigurasi output MK, serta logika dan intuisi, menunjukkan bahwa harus ada dorongan -menarik dan sesudahnya harus pull-up . Bagaimanapun, kodenya ditulis, semuanya berfungsi dan tidak ada yang habis. Ada risiko nyata terbakar jika Anda memilih jenis saluran terbuka dan korsleting output ini dengan perangkat lain, seperti Ini adalah jalan keluar terbuka dan tidak dilindungi oleh apa pun. Selain itu, kami memiliki resistor pembatas arus di depan dioda - itu pasti tidak akan terbakar di sini.
Setelah dokumentasi, perlu untuk menulis nol di bit ke-4; Dokumentasi juga menyatakan bahwa setelah reset akan ada nol.
GPIOA->OTYPER &= ~(1 << 4); //
GPIOA->OTYPER &= ~0x10; //
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_4;
Register tipe keluaran port GPIO
- kecepatan output. Dalam kasus kami, itu tidak masalah, tetapi demi kesetiaan saya akan menulis di sini nol.
GPIOA->OSPEEDR &= ~(1 << 8); //
GPIOA->OSPEEDR &= ~0x100; //
GPIOA->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4_0;
Register kecepatan keluaran port GPIO
- tumpangan . Karena output akan memberi daya pada LED, Anda harus menariknya ke daya, mis. pull-up .
Diperlukan untuk mengencangkan pin ke 4 port A ; dokumentasi mengatakan bahwa untuk ini perlu untuk menulis masing-masing nol dan satu dalam 9 dan 8 bit.
GPIOA->PUPDR |= (1 << 8); //
GPIOA->PUPDR |= 0x100; //
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR4_0;
Register pull-up / pull-down port GPIO
3.3.3 LED on / off dan tunda
Sebelumnya kita membaca bahwa masing-masing port memiliki register, termasuk register data
IDR dan
ODR - register input dan output data, masing-masing. Angka nol logis dan angka pada kaki MK - apakah ini data? - ya, data. Data dapat berasal dari luar mikrokontroler (menjadi
input ) dan keluar dari mikrokontroler dan pergi ke perangkat lain (menjadi
output ). Unit pada kaki MK adalah adanya level tegangan tinggi, mis. jika Anda membawa satu ke output, maka akan ada tegangan, dan LED ini dapat menyalakan LED kami. Output dari sebuah unit ke kaki mikrokontroler adalah sesuatu yang lain daripada menulis unit ini ke register output
ODR .
Register data keluaran port GPIO Menurut dokumentasi, kita melihat bahwa untuk setiap port (
A ,
B ,
C ,
D ,
F ) ada register 32-bit. port tidak dapat memiliki lebih dari 16 pin, maka hanya 16 bit pertama dari register yang digunakan. Setiap bit sesuai dengan nomor port (pin). Untuk mengeluarkan unit ke leg
PA4 , seseorang harus menulis unit ke bit ke-4, untuk menghasilkan nol - tulis nol ke bit ke-4, mis. lepaskan tegangan dari output.

Kode untuk menyalakan LED akan terlihat seperti ini
GPIOA->ODR |= (1 << 4); //
GPIOA->ODR |= 0x10; //
GPIOA->ODR |= GPIO_ODR_4;
Kode untuk mematikan LED
GPIOA->ODR &= ~(1 << 4); //
GPIOA->ODR &= ~0x10; //
GPIOA->ODR &= ~GPIO_ODR_4;
Tetapi jika Anda menulis baris untuk mematikan LED setelah baris untuk menyalakan, LED tidak akan berkedip (jika Anda tertarik pada apa yang terjadi - Anda dapat mencoba; tidak ada yang akan terbakar, ini sudah dibahas di atas) - maka Anda perlu menunda. Pengatur waktu digunakan untuk penundaan, tetapi pengukur waktu layak untuk artikel terpisah (karena kerumitannya), jadi kami akan membuat penundaan penopang: kami akan menggerakkan siklus idle. Ada satu poin:
jika optimasi kompiler diaktifkan ,
kompiler akan memotong siklus idle kami dan tidak akan ada penundaan. Pastikan optimasi tidak diaktifkan. Untuk melakukan ini, mari kita masuk ke konfigurasi proyek (klik kanan pada nama proyek di pohon proyek) dan periksa baris
Compile Control String di tab
Compile : itu harus memiliki argumen
-O0 ("tentang nol" berarti optimasi dinonaktifkan). Jika Anda mengumpulkan semuanya sesuai dengan instruksi saya, maka kemungkinan besar Anda juga akan memiliki
-O0 , karena secara default dan saya tidak menyentuh apa pun di sini. Argumen
-O1 -O2 -O3 berarti optimasi level yang sesuai diaktifkan.
Periksa Optimalisasi Kompiler Siklus idle dapat ditulis seperti ini:
int t = 4000000; while(t > 0) t--;
Saya tidak menetapkan nilai
t seperti itu, saya beralasan seperti ini: jika mikrokontroler berjalan pada 8MHz, maka itu akan mengeksekusi sekitar 8.000.000 instruksi dalam satu detik, jika Anda membesar-besarkan secara dalam, maka untuk penundaan setengah detik Anda harus menjalankan siklus 4.000.000 kali.
Siklus idle perlu dijalankan setelah menyalakan LED, dan setelah mematikannya, dan semua ini bersamaan.
3.4 Menulis Kode dan Menjalankan
Mari kita kumpulkan semua baris kode yang kita tulis sebelumnya. Anda juga perlu memasukkan file header
stm32f0xx.h , sebagai kami mengandalkannya dan mengambil darinya definisi struktur, alamat, dan nilai. Hasilnya harus:
#include "stm32f0xx.h" int main(void) { int t; // '' RCC->CR |= 0x1; // HSI RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // A GPIOA->MODER |= GPIO_MODER_MODER4_0; // PA4 GPIOA->OTYPER &= ~GPIO_OTYPER_OT_4; // push-pull PA4 GPIOA->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4_0; // PA4 GPIOA->PUPDR |= GPIO_PUPDR_PUPDR4_0; // pull-up PA4 while(1) { GPIOA->ODR |= GPIO_ODR_4; // PA4 t = 4000000; while(t > 0) t--; // GPIOA->ODR &= ~GPIO_ODR_4; // PA4 t = 4000000; while(t > 0) t--; // } }
Klik Rebuild dan isi kode di papan tulis melalui utilitas.

Agar board meluncurkan firmware baru, jangan lupa untuk menutup jumper BOOT dan melakukan reset (RESET).
4. Kesimpulan
Kode ditulis, semuanya berfungsi. Pasukan dikeluarkan tidak terukur. Saya senang bahwa berdasarkan dokumentasi, ternyata menulis kode kerja, sebagian besar karena fakta bahwa STM memiliki dokumentasi berkualitas tinggi.
Rencananya adalah menulis artikel tentang cara mengumpulkan semuanya dengan tangan, tanpa IDE, melalui konsol,
old old school , idealnya sehingga semua ini dapat dilakukan dari bawah Linux. Sekarang saya sedang mengerjakan PWM dan ADC (juga di forum ini) - Saya juga akan menulis artikel tentang itu.