LENGAN. STM32 mula pantas. Penguasaan pantas mikropengawal STM32. Interaksi teras dengan unit persisian

DALAM tahun lepas Pengawal mikro 32-bit (MCU) berasaskan pemproses ARM dengan pantas menakluki dunia elektronik. Kejayaan ini disebabkan oleh prestasi tinggi, seni bina termaju, penggunaan tenaga yang rendah, kos rendah dan alat pengaturcaraan lanjutan.

CERITA PENDEK
Nama ARM ialah akronim untuk Advanced RISC Machines, di mana RISC (Reduced Instruction Set Computer) bermaksud seni bina pemproses set arahan yang dikurangkan. Jumlah MK yang popular, dan contoh keluarga PIC dan AVR, juga ada seni bina RISC, yang memungkinkan untuk meningkatkan prestasi dengan memudahkan penyahkodan arahan dan mempercepatkan pelaksanaannya. Kemunculan mikropengawal ARM 32-bit yang canggih dan produktif membolehkan kami meneruskan untuk menyelesaikan masalah yang lebih kompleks yang tidak dapat diatasi oleh MCU 8 dan 16-bit lagi. Seni bina mikropemproses ARM dengan teras 32-bit dan set arahan RISC telah dibangunkan oleh syarikat British ARM Ltd, yang secara eksklusif membangunkan kernel, penyusun dan alat penyahpepijatan. Syarikat itu tidak mengeluarkan MK, tetapi menjual lesen untuk pengeluaran mereka. MK ARM ialah salah satu segmen pasaran MK yang paling pesat berkembang. Peranti ini menggunakan teknologi penjimatan tenaga, oleh itu ia digunakan secara meluas dalam sistem terbenam dan menguasai pasaran peranti mudah alih, untuk siapa ia penting penggunaan kuasa yang rendah. Di samping itu, mikropengawal ARM digunakan secara aktif dalam komunikasi, peranti mudah alih dan terbenam di mana prestasi tinggi diperlukan. Satu ciri seni bina ARM ialah teras pengkomputeran pemproses, yang tidak dilengkapi dengan sebarang elemen tambahan. Setiap pembangun pemproses mesti melengkapkan teras ini secara bebas blok yang diperlukan untuk anda sendiri tugasan tertentu. Pendekatan ini telah berfungsi dengan baik untuk pengeluar cip besar, walaupun ia pada mulanya tertumpu pada penyelesaian pemproses klasik. Pemproses ARM telah pun melalui beberapa peringkat pembangunan dan terkenal dengan keluarga ARM7, ARM9, ARM11 dan Cortex. Yang terakhir ini dibahagikan kepada subfamili pemproses CortexA klasik, pemproses masa nyata CortexR dan teras mikropemproses CortexM. Teras CortexMlah yang menjadi asas untuk pembangunan kelas besar MCU 32-bit. Ia berbeza daripada varian lain seni bina Cortex terutamanya dalam penggunaan set arahan Thumb2 16-bit. Set ini menggabungkan prestasi dan kekompakan arahan ARM dan Thumb "klasik" dan dibangunkan khusus untuk bekerja dengan bahasa C dan C++, yang meningkatkan kualiti kod dengan ketara. Dengan bermaruah tinggi MK yang dibina pada teras CortexM adalah serasi perisian, yang secara teorinya membenarkan penggunaan kod program dalam bahasa tahap tinggi dalam model dari pengeluar yang berbeza. Selain menunjukkan kawasan aplikasi teras, pembangun MK menunjukkan prestasi teras CortexM pada skala sepuluh mata. Hari ini, pilihan yang paling popular ialah CortexM3 dan CortexM4. MK dengan seni bina ARM dihasilkan oleh syarikat seperti Peranti Analog, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Milander, HiSilicon dan lain-lain.
Terima kasih kepada seni bina yang dioptimumkan, kos MCU berdasarkan teras CortexM dalam beberapa kes adalah lebih rendah daripada kebanyakan peranti 8-bit. Model "lebih muda" kini boleh dibeli dengan harga 30 rubel. untuk badan, yang mewujudkan persaingan untuk generasi terdahulu MK. PENGAWAL MIKRO STM32 Mari kita pertimbangkan MCU yang paling berpatutan dan meluas bagi keluarga STM32F100 daripada STMicroelectronics, yang merupakan salah satu pengeluar MCU terkemuka di dunia. Syarikat itu baru-baru ini mengumumkan permulaan pengeluaran MK 32-bit yang mengambil kesempatan daripada industri
Teras STM32 dalam aplikasi kos rendah. MCU daripada keluarga talian STM32F100 Value direka untuk peranti yang prestasi MCU 16-bit tidak mencukupi, dan kefungsian kaya peranti 32-bit "biasa" adalah berlebihan. Barisan MCU STM32F100 adalah berdasarkan teras ARM CortexM3 moden dengan persisian yang dioptimumkan untuk digunakan dalam aplikasi biasa di mana MCU 16-bit digunakan. Prestasi MCU STM32F100 pada 24 MHz adalah lebih baik daripada kebanyakan MCU 16-bit. Barisan ini termasuk peranti dengan pelbagai parameter:
● dari 16 hingga 128 kbait memori kilat program;
● dari 4 hingga 8 kbait memori capaian rawak;
● sehingga 80 port input/output GPIO;
● sehingga sembilan pemasa 16-bit dengan fungsi lanjutan;
● dua pemasa pengawas;
● ADC 12-bit berkelajuan tinggi 16 saluran;
● dua DAC 12-bit dengan penjana isyarat terbina dalam;
● sehingga tiga antara muka UART yang menyokong mod IrDA, LIN dan ISO7816;
● sehingga dua antara muka SPI;
● sehingga dua antara muka I2C yang menyokong mod SMBus dan PMBus;
● Akses ingatan terus (DMA) 7 saluran;
● Antara muka CEC (Kawalan Elektronik Pengguna) disertakan dalam standard HDMI;
● jam masa nyata (RTC);
● Pengawal gangguan bersarang NVIC.

Rajah berfungsi STM32F100 ditunjukkan dalam Rajah 1.

nasi. 1. Seni bina garisan MK STM32F100

Kemudahan tambahan ialah keserasian pin peranti, yang membolehkan, jika perlu, menggunakan mana-mana MK keluarga dengan fungsi dan memori yang lebih besar tanpa mengolah semula papan litar bercetak. Barisan pengawal STM32F100 dihasilkan dalam tiga jenis Pakej LQFP48, LQFP64 dan LQFP100, masing-masing mempunyai 48, 64 dan 100 pin. Tugasan pin dibentangkan dalam Rajah 2, 3 dan 4. Kes sedemikian boleh dipasang pada papan litar bercetak tanpa menggunakan peralatan khas, yang merupakan faktor penting dalam pengeluaran berskala kecil.


nasi. 2. STM32 MCU dalam pakej LQFP48 Rajah. 3. STM32 MCU dalam pakej LQFP64


nasi. 4. STM32 MCU dalam pakej LQFP100

STM32F100 ialah peranti mampu milik dan dioptimumkan berdasarkan teras CortexM3, disokong oleh persekitaran pembangunan lanjutan untuk keluarga mikropengawal STM32, yang mengandungi
Perpustakaan percuma untuk semua peranti, termasuk kawalan motor dan papan kekunci sentuh.

RAJAH SAMBUNGAN STM32F100C4
Mari kita pertimbangkan penggunaan praktikal MK menggunakan contoh peranti STM32F100C4 yang paling mudah, yang, bagaimanapun, mengandungi semua blok utama barisan STM32F100. Asas gambarajah elektrik kemasukan STM32F100C4 ditunjukkan dalam Rajah 5.


nasi. 5. Gambar rajah sambungan untuk MK STM32F100C4

Kapasitor C1 memastikan bahawa MK ditetapkan semula apabila kuasa dihidupkan, dan kapasitor C2-C6 menapis voltan bekalan. Perintang R1 dan R2 mengehadkan arus isyarat pin MK. Pengayun dalaman digunakan sebagai sumber jam, jadi tidak perlu menggunakan kristal luaran.


Input BOOT0 dan BOOT1 membolehkan anda memilih kaedah memuatkan MK apabila menghidupkan kuasa mengikut jadual. Input BOOT0 disambungkan kepada bas berpotensi sifar melalui perintang R2, yang melindungi pin BOOT0 daripada litar pintas apabila digunakan sebagai port keluaran PB2. Menggunakan penyambung J1 dan satu pelompat, anda boleh menukar potensi pada input BOOT0, dengan itu menentukan cara MK dimuatkan - daripada memori denyar atau daripada pemuat but terbina dalam. Jika anda perlu memuatkan MK dari RAM, penyambung serupa dengan pelompat boleh disambungkan ke input BOOT1.
Pengaturcaraan MK dijalankan melalui port bersiri UART1 atau melalui pengaturcara khas - penyahpepijat JTAG atau STLink. Yang terakhir adalah sebahagian daripada peranti penyahpepijatan popular STM32VLDISCOVERY, ditunjukkan dalam Rajah 6. Pada papan STM32VLDIS COVERY, penyambung 4-pin pengaturcara - penyahpepijat STLink - ditetapkan SWD. Pengarang artikel mencadangkan pengaturcaraan MK melalui port bersiri UART1, kerana ia lebih mudah, tidak memerlukan peralatan khas dan tidak lebih rendah daripada kelajuan JTAG atau ST Link. Sebagai peranti kawalan yang mampu menjana arahan dan memaparkan hasil program MK, serta sebagai pengaturcara, anda boleh menggunakan mana-mana Komputer peribadi(PC) dengan port COM bersiri atau port USB dengan penukar USBRS232.

Untuk memasangkan port COM PC dengan MK Mana-mana akan lakukan penukar isyarat RS232 ke tahap isyarat logik dari 0 hingga 3.3 V, contohnya, litar mikro ADM3232. talian penghantaran TXD port bersiri komputer, selepas penukar tahap, harus disambungkan ke input PA10 mikropengawal, dan talian penerima RXD, melalui penukar yang serupa, ke output PA9.

Jika anda perlu menggunakan jam MK yang tidak meruap, anda harus menyambungkan bateri CR2032 dengan voltan 3 V dan resonator kuarza dengan frekuensi 32768 Hz kepadanya. Untuk tujuan ini, MK dilengkapi dengan pin Vbat/GND dan OSC32_IN/OSC32_OUT. Pin Vbat mesti diputuskan dahulu daripada bas kuasa 3.3 V.

Baki terminal percuma MK boleh digunakan mengikut keperluan. Untuk melakukan ini, ia harus disambungkan ke penyambung yang terletak di sekeliling perimeter papan litar bercetak untuk MK, dengan analogi dengan popular Peranti Arduino dan papan pembangunan STM32VLDISCOVERY.


nasi. 6. Nyahpepijat peranti STM32VLDISCOVERY


Gambar rajah litar elektrik STM32VLDDISCOVERY.

Oleh itu, bergantung pada tujuan dan kaedah menggunakan MK, anda boleh menyambungkan elemen yang diperlukan kepadanya untuk menggunakan blok dan port berfungsi lain, contohnya, ADC, DAC, SPI, I2C, dll. Pada masa akan datang, peranti ini akan dipertimbangkan dengan lebih terperinci.

PENGATURCARAAN
Hari ini, banyak syarikat menawarkan alat untuk mencipta dan menyahpepijat program untuk mikropengawal STM32. Ini termasuk Keil daripada ARM Ltd, IAR Embedded Workbench untuk ARM, Atol lic TrueStudio, CooCox IDE, GCC dan Eclipse IDE. Pembangun boleh memilih perisian mengikut keutamaannya. Di bawah ini kami akan menerangkan kit alat Keil uVision 4 dari syarikat Keil, yang menyokong sejumlah besar jenis mikropengawal, mempunyai sistem alat penyahpepijatan yang dibangunkan dan boleh digunakan secara percuma dengan sekatan pada saiz kod yang dihasilkan sebanyak 32 kbait ( yang, sebenarnya, adalah maksimum untuk mikropengawal yang sedang dipertimbangkan).

Permulaan yang mudah dan cepat dengan CooCox CoIDE.

Jadi mari kita mulakan. Pergi ke laman web rasmi CooCox dan muat turun versi terkini CooCox CoIDE. Untuk memuat turun anda perlu mendaftar, pendaftaran adalah mudah dan percuma. Kemudian pasang fail yang dimuat turun dan jalankannya.

CooCox CoIDE- persekitaran pembangunan berdasarkan Eclipse, yang, sebagai tambahan kepada STM32, menyokong sekumpulan keluarga mikropengawal lain: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro, dll. Dengan setiap versi baharu CoIDE, senarai mikropengawal sentiasa dikemas kini. Selepas berjaya memasang CoIDE, jalankan:

Tetingkap permulaan Langkah 1 akan muncul, di mana anda perlu memilih pengeluar mikropengawal kami. Tekan ST dan pergi ke Langkah 2 (memilih mikropengawal), di mana anda perlu memilih model tertentu. Kami mempunyai STM32F100RBT6B, jadi klik pada model yang sepadan:

Di sebelah kanan, tetingkap Bantuan dipaparkan ciri-ciri ringkas setiap cip. Selepas memilih mikropengawal yang kami perlukan, kami meneruskan ke langkah ketiga, Langkah 3 - untuk memilih perpustakaan yang diperlukan untuk kerja:

Mari buat projek mudah untuk berkelip LED, seperti kebiasaan untuk mempelajari mikropengawal.

Untuk melakukan ini, kami memerlukan perpustakaan GPIO, apabila didayakan, CoIDE akan meminta anda membuat projek baru. Klik Ya pada cadangan ini, nyatakan folder tempat projek kami akan disimpan dan namanya. Pada masa yang sama, CoIDE akan menyambung kepada projek 3 yang lain yang diperlukan untuk perpustakaan berfungsi, dan juga akan mencipta semua struktur projek yang diperlukan:

Satu lagi perkara yang baik tentang CoIDE ialah ia mempunyai keupayaan untuk memuatkan contoh terus ke dalam persekitaran pembangunan. Dalam tab Komponen anda boleh melihat bahawa terdapat contoh untuk hampir setiap perpustakaan, klik pada GPIO (dengan 4 contoh) dan lihatnya:

Anda boleh menambah contoh anda sendiri di sana. Seperti yang anda boleh lihat dalam tangkapan skrin di atas, contoh sudah mengandungi kod untuk berkelip LED GPIO_Blink. Anda boleh mengklik butang tambah dan ia akan ditambahkan pada projek, tetapi sebagai fail yang disertakan, jadi kami akan melakukannya secara berbeza dan hanya menyalin keseluruhan kod contoh ke dalam fail main.c. Satu-satunya perkara ialah menggantikan baris GPIO_Blink(void) void dengan int main(void). Jadi, tekan F7 (atau pilih Projek->Bina daripada menu) untuk menyusun projek dan... tidak berjaya!

Persekitaran memerlukan Penyusun GCC, tetapi kami tidak memilikinya. Oleh itu, pergi ke halaman Alat GNU untuk ARM Embedded Processors, pilih jenis OS anda di sebelah kanan dan muat turun versi terkini rantaian alat. Kemudian kami menjalankan fail dan memasang gcc toolchain. Seterusnya, dalam tetapan CoIDE kami akan menunjukkan laluan yang betul ke rantai alat:

Tekan F7 sekali lagi (Project->Build) dan lihat bahawa kompilasi berjaya:

Apa yang tinggal adalah untuk menyalakan mikropengawal. Untuk melakukan ini, apabila bantuan USB Kami menyambungkan papan kami ke komputer. Kemudian, dalam tetapan penyahpepijat anda perlu memasang ST-Link; untuk melakukan ini, pilih Project->Configuration dalam menu dan buka tab Debugger. Pilih ST-Link daripada senarai juntai bawah dan tutup tetingkap:

Mari cuba flash MK. Dalam menu, pilih Flash->Program Download (atau klik pada ikon yang sepadan pada bar alat) dan lihat bahawa MK telah berjaya dipancarkan:

Kami melihat LED berkelip pada papan, saya rasa tidak masuk akal untuk menyediakan video atau foto, kerana... semua orang melihatnya.

Juga, dalam CoIDE mereka berfungsi pelbagai mod debugging, untuk melakukan ini tekan CTRL+F5 (atau dalam menu Debug->Debug):

Itu sahaja. Seperti yang anda lihat, menyediakan dan bekerja dengan CoIDE adalah sangat mudah. Saya harap artikel ini akan menggalakkan anda untuk mengkaji mikropengawal STM32 yang sangat menjanjikan dan murah.

Diterbitkan 08/09/2016

Pengawal mikro STM32 menjadi semakin popular kerana kuasa mereka, peranti yang agak pelbagai dan fleksibiliti. Kami akan mula belajar menggunakan papan ujian bajet, yang kosnya tidak melebihi $2 (daripada bahasa Cina). Kami juga akan memerlukan ST-Link pengaturcara, kosnya adalah kira-kira $2.5 (daripada bahasa Cina). Jumlah perbelanjaan sedemikian adalah berpatutan untuk kedua-dua pelajar dan pelajar sekolah, jadi saya mencadangkan untuk memulakan dengan pilihan belanjawan ini.


Mikropengawal ini bukanlah yang paling berkuasa di kalangan STM32, tetapi bukan juga yang paling lemah. wujud pelbagai papan Dengan STM32, termasuk Penemuan yang berharga kira-kira $20. Pada papan sedemikian, hampir semuanya sama seperti di papan kami, ditambah dengan pengaturcara. Dalam kes kami, kami akan menggunakan pengaturcara secara berasingan.

Pengawal mikro STM32F103C8. Ciri-ciri

  • Teras Cortex-M3 ARM 32-bit
  • Kekerapan maksimum 72MHz
  • 64Kb Memori denyar untuk program
  • Memori SRAM 20Kb
  • Bekalan kuasa 2.0 … 3.3V
  • 2 x 12-bit ADC (0 ... 3.6V)
  • Pengawal DMA
  • 37 input/output bertolak ansur 5V
  • 4 pemasa 16-bit
  • 2 pemasa pengawas
  • I2C – 2 bas
  • USART – 3 bas
  • SPI – 2 bas
  • Antara muka berkelajuan penuh USB 2.0
  • RTC – jam terbina dalam

Tersedia pada papan STM32F103C8

  • Port output A0-A12, B0-B1, B3-B15, C13-C15
  • Mikro-USB melalui mana anda boleh kuasakan papan. Papan mempunyai penstabil voltan 3.3V. Kuasa 3.3V atau 5V boleh dibekalkan kepada pin yang sepadan pada papan.
  • Butang Tetapkan semula
  • Dua penerjun BOOT0 Dan BOOT1. Kami akan menggunakannya semasa berkelip melalui UART.
  • Dua kuarza 8 MHz dan 32768 Hz. Pengawal mikro mempunyai pengganda frekuensi, jadi pada 8 MHz kuarza kita boleh capai kekerapan maksimum pengawal 72MHz.
  • Dua LED. PWR– isyarat bahawa kuasa dibekalkan. PC13– disambungkan kepada output C13.
  • Penyambung untuk pengaturcara ST-Link.

Jadi, mari kita mulakan dengan cuba menghidupkan mikropengawal. Ini boleh dilakukan melalui USART, atau menggunakan pengaturcara ST-Link.

Anda boleh memuat turun fail ujian untuk perisian tegar. Program ini memancarkan LED pada papan.

Perisian tegar STM32 menggunakan penyesuai USB-Uart untuk Windows

Dalam ingatan sistem STM32 Terdapat Pemuat but. Pemuat but direkodkan pada peringkat pengeluaran dan mana-mana mikropengawal STM32 boleh diprogramkan melalui antara muka USART menggunakan penyesuai USART-USB. Penyesuai sedemikian paling kerap dibuat berdasarkan litar mikro yang popular FT232RL. Pertama sekali, sambungkan penyesuai ke komputer dan pasang pemacu (jika perlu). Anda boleh memuat turun pemacu dari tapak web pengilang FT232RL– ftdicip.com. Anda perlu memuat turun pemacu VCP(port com maya). Selepas memasang pemacu, port bersiri maya akan muncul pada komputer anda.


Menyambung RX Dan TX output ke pin yang sepadan USART1 pengawal mikro. RX sambungkan penyesuai ke TX mikropengawal (A9). TX sambungkan penyesuai ke RX mikropengawal (A10). Memandangkan USART-USB mempunyai output kuasa 3.3V, kami akan membekalkan kuasa kepada papan daripadanya.

Untuk meletakkan mikropengawal ke dalam mod pengaturcaraan, anda perlu menetapkan pin BOOT0 Dan BOOT1 V keadaan yang dikehendaki dan but semula dengan butang Tetapkan semula atau matikan dan hidupkan kuasa mikropengawal. Untuk ini kami mempunyai pelompat. Kombinasi yang berbeza memaksa mikropengawal ke dalam mod yang berbeza. Kami hanya berminat dalam satu mod. Untuk melakukan ini, mikropengawal mempunyai BOOT0 mesti ada yang logik, dan outputnya BOOT1– sifar logik. Di papan ini adalah kedudukan pelompat berikut:

Selepas menekan butang Tetapkan semula atau memutuskan sambungan dan menyambung kuasa, mikropengawal mesti memasuki mod pengaturcaraan.

Perisian perisian tegar

Jika kita menggunakan penyesuai USB-UART, nama port akan menjadi seperti ini /dev/ttyUSB0

Dapatkan maklumat cip

Keputusan:

Kami membaca dari cip ke dalam dump.bin fail

sudo stm32flash -r dump.bin /dev/ttyUSB0

Tulis pada cip

sudo stm32flash -w dump.bin -v -g 0x0 /dev/ttyUSB0

Keputusan:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Menggunakan Penghurai: Antara Muka BINARI Mentah serial_posix: 57600 8E1 Versi: 0x22 Pilihan 1: 0x00 Pilihan 2: 0x00 ID Peranti: 0x0410 (Ketumpatan Sederhana 120KiB: RAM:d120KiB: pemuat but) - Denyar: 128KiB (saiz sektor: 4x1024) - RAM Pilihan: 16b - RAM Sistem: 2KiB Tulis pada memori Memadam memori Alamat yang ditulis dan disahkan 0x08012900 (100.00%) Selesai. Memulakan pelaksanaan di alamat 0x08000000... selesai.

Perisian tegar STM32 menggunakan pengaturcara ST-Link untuk Windows

Apabila menggunakan pengaturcara ST-Link kesimpulan BOOT0 Dan BOOT1 tidak digunakan dan mesti disimpan kedudukan standard Untuk Operasi biasa pengawal.

(Buku dalam bahasa Rusia)

Penandaan STM32

Keluarga perantiJenis produkSubkeluarga perantiKiraan pinSaiz memori kilatPakejKadar suhu
STM32 =
Pengawal mikro 32-bit berasaskan ARM
F = Tujuan am
L = Kuasa ultra-rendah
TS = Skrin Sentuh
W = sistem tanpa wayar pada cip
60 = rintangan berbilang sentuh
103 = garis prestasi
F = 20 pin
G = 28 pin
K = 32 pin
T = 36 pin
H = 40 pin
C = 48/49 pin
R = 64 pin
O=90 pin
V = 100 pin
Z = 144 pin
I = 176 pin
B = 208 pin
N = 216 pin
4 = 16 Kbait memori Flash
6 = 32 Kbait memori Flash
8 = 64 Kbait memori Flash
B = 128 Kbait memori Flash
Z = 192 Kbait memori Flash
C = 256 Kbait memori Flash
D = 384 Kbait memori Flash
E = 512 Kbait memori Flash
F = 768 Kbait memori Flash
G = 1024 Kbait memori Flash
I = 2048 Kbait memori Flash
H = UFBGA
N=TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Julat suhu industri, –40…+85 °C.
7 = Julat suhu industri, -40…+ 105 °C.
STM32F103 C8 T6

Bagaimana untuk mengalih keluar perlindungan tulis/baca?

Jika anda menerima papan dengan STM32F103, tetapi pengaturcara tidak melihatnya, ini bermakna orang Cina telah melindungi memori Flash mikropengawal. Soalan "mengapa?" mari kita abaikan. Untuk mengalih keluar penyekatan, kami akan menyambungkan penyesuai UART dan program melaluinya. Kami menetapkan pelompat untuk pengaturcaraan dan kami pergi:

Saya akan melakukan ini dari Ubuntu menggunakan utiliti stm32flash.

1. Periksa sama ada mikropengawal kelihatan:

Sudo stm32flash /dev/ttyUSB0

Anda sepatutnya mendapat sesuatu seperti ini:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Antara muka serial_posix: 57600 8E1 Versi: 0x22 Pilihan 1: 0x00 Pilihan 2: 0x00 ID Peranti: 0x0410 (Ketumpatan Sederhana) - RAM: 20KiB (dimuatkan oleh Buta Denyar 51) 128KiB (saiz sektor: 4x1024) - RAM Pilihan: 16b - RAM Sistem: 2KiB

2. Alih keluar perlindungan baca dan kemudian tulis perlindungan:

Sudo stm32flash -k /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Antara muka serial_posix: 57600 8E1 Versi: 0x22 Pilihan 1: 0x00 Pilihan 2: 0x00 ID Peranti: 0x0410 Kid (0x0410) 512b dikhaskan oleh pemuat but) - Denyar: 128KiB (saiz sektor: 4x1024) - RAM Pilihan: 16b - RAM Sistem: Denyar Baca-Tanpa Lindung 2KiB Selesai. sudo stm32flash -u /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Antara muka serial_posix: 57600 8E1 Versi: 0x22 Pilihan 1: 0x00 Pilihan 2: 0x00 ID Peranti: (0x0410 Peranti Sederhana: 0x0410) 512b dikhaskan oleh pemuat but) - Denyar: 128KiB (saiz sektor: 4x1024) - RAM Pilihan: 16b - RAM Sistem: 2KiB Denyar tanpa perlindungan Tulis Selesai.

Kini anda boleh bekerja secara normal dengan mikropengawal.

Pengawal mikro untuk anak kucing

Meow semua, kucing :)

Pada suatu hari, seekor kucing meninggalkan saya: (Nah, mengapa makan valerian, saya memutuskan untuk turun ke perniagaan, boleh dikatakan, "untuk kebaikan Tanah Air." Saya telah lama ingin bekerja pada peranti digital, tetapi saya tidak tiada masa (anda tahu, sama ada tidur atau dengan kucing berjalan di atas bumbung), dan kemudian masanya baru sahaja muncul. Baiklah, mari mulakan..)

Seperti biasa, segalanya bermula dengan pilihan. Nah, nampaknya pilihannya ialah PIC kecil atau AVR. Saya entah bagaimana lebih menyukai yang terakhir. Saya juga memerlukan pengaturcara USB kerana kekurangan port lain pada komputer, harga yang hampir membuat ekor saya jatuh. Terdapat juga Arduino - binatang seperti itu. Ia juga boleh diprogramkan melalui USB. Nah, saya fikir, "apa yang diperintahkan oleh doktor." Di kampung kami anda hanya boleh mendapatkannya melalui kedai dalam talian. Saya menemui tawaran yang lebih baik, hampir membelinya dan... OOP! Saya sedang mencari - STM32VL-Discovery. Apakah jenis haiwan ini? Hmm, STM32.. Aku terdengar sesuatu dari sudut telinga.. Dan ciri-cirinya membuatkan misai aku berdiri, jujur!

Dan dia mempunyai banyak cakar!

Jadi, mengikut urutan:

  • Arduino mempunyai 14 port I/O digital dan 6 input analog. STM32VL-Discovery mempunyai 45 input/output digital, 10 daripadanya boleh ditukar secara pilihan kepada input analog.
  • Arduino mempunyai 32 KB storan program dan 2 KB RAM. STM32VL-Discovery mempunyai 64 KB storan program dan 8 KB RAM.
  • Daripada Arduino kekerapan jam STM32VL-Discovery mempunyai 16 MHz dan 24 MHz.
  • Mana-mana mikropengawal STM32 boleh digantikan dengan STM32 yang lain, tetapi dengan ciri terbaik, tanpa mengubah skema
  • STM32 boleh diprogramkan tanpa pengaturcara menggunakan port COM(lebih lanjut mengenai ini sedikit kemudian)
  • Harga Arduino pada masa penulisan ialah ~1300 rubel, STM32VL-Discovery ~600 rubel. Ini lebih daripada 2 kali lebih murah!

Apa yang akan datang? STM32VL-Discovery mempunyai pengaturcara/penyahpepijat terbina dalam, yang dengan sedikit pergerakan kaki (mengeluarkan pelompat) boleh memprogram dan nyahpepijat (menyahpepijat adalah perkara yang sangat berguna, tetapi lebih lanjut mengenainya kemudian) mikropengawal STM32 di luar papan. Ini tidak akan berfungsi dengan Arduino. Iaitu, menggunakan STM32VL-Discovery kita menjimatkan wang dan mendapat produktiviti yang lebih besar dan kebebasan kreatif :)

Dan mikropengawal STM32 sendiri kelihatan lebih menarik daripada yang lain:

STM32F100C4T6B ATtiny24A-SSU PIC16F688-I/SL STM32F103RET6 ATmega1284P-PU PIC18F4550-I/PT
Harga purata, gosok 60 65 60 240 330 220
Kekerapan jam, MHz 24 20 20 72 20 48
Memori kilat, KB 16 2 4 512 128 16
RAM, Byte 4096 128 256 65536 16384 2048
USART, pcs. 2 0 0 5 2 0
SPI, pcs. 1 1 0 3 1 1
ADC, pcs. 16x12Bit 8x10Bit 8x10Bit 16x12Bit 8x10Bit 13x10Bit
DAC, pcs. 1x12Bit 0 0 2x12Bit 0 0
Bilangan baris input/output, pcs. 37 12 12 51 32 35

Dan STM32 ialah 32-bit, yang bermaksud ia boleh berfungsi dengan data 32-bit dalam satu kitaran jam. AVR dan PIC tidak boleh berbangga dengan ini.

Nah, kucing, adakah anda yakin? Kemudian mari kita mulakan perjalanan seorang pahlawan digital muda!)

Bagaimanakah ia berfungsi? Apakah kandungannya? Apa yang dia boleh lakukan?

Seperti yang anda tahu, semua kucing sangat ingin tahu, dan kucing radio terutamanya!

Mikropengawal ialah litar mikro yang menggabungkan fungsi pemproses, persisian, RAM, dan memori kilat. Seperti komputer, hanya lebih kecil!

Mari kita buat analogi: komputer dikawal oleh sistem operasi, dan mikropengawal ialah "perisian tegar" yang anda tulis; sistem pengendalian komputer disimpan pada cakera keras, "perisian tegar" mikropengawal disimpan dalam memori denyarnya; Fungsi RAM adalah serupa - menyimpan data yang berubah semasa pelaksanaan program. Dan MK juga mempunyai pelbagai peranti persisian, seperti ADC dan DAC sebagai contoh.

MK berkomunikasi dengan dunia luar menggunakan cakar di badannya (tidak seperti kucing, sudah tentu, tetapi yang logam). Tetapi tidak semua daripada mereka dikawal oleh program ini, terdapat pin kuasa, pin set semula, pin kuasa persisian, kuasa sandaran. Dan mereka yang dikawal oleh program dibahagikan kepada kumpulan yang dipanggil "pelabuhan". Semua output terkawal ini dinamakan dengan 2 huruf dan nombor. Contohnya PA1: P - port, A - port "A", 1 - nombor pin port ini.

Dalam program ini, port dikonfigurasikan sama ada sebagai input atau output, seperti yang anda mahu.

Pin port yang dikonfigurasikan untuk input boleh dimasukkan mod yang berbeza, untuk setiap output ia boleh berbeza:

  • Input digital ialah input yang nilainya (logik 1 atau 0) boleh dibaca oleh program. Jika voltan pada input ialah 0, maka nilainya ialah 0, jika voltan pada input adalah sama dengan voltan bekalan, maka nilai input ialah 1. Yang ketiga tidak diberikan. Boleh dilakukan dengan perintang tarik naik sama ada ke kuasa atau ke tanah
  • Input analog - input yang nilainya boleh dibaca oleh program, tetapi boleh terdapat banyak nilai - sebanyak 4096. Lebih tepat lagi, dari 0 jika voltan input adalah 0 berbanding dengan bekalan kuasa tolak mikropengawal kepada 4095 jika voltan masukan adalah sama dengan voltan bekalan. Semua transformasi ini dibuat oleh ADC - penukar analog-ke-digital, dengan bantuannya anda boleh, sebagai contoh, mengukur voltan pada termistor dan mengetahui suhu, atau mengukur voltan pada photoresistor dan mengetahui kecerahan cahaya yang jatuh padanya... Nah, anda boleh menghasilkan banyak perkara jika anda mempunyai imaginasi :) Jika kuasa mikropengawal daripada 3V, maka 0V = 0, dan 3V = 4096, yang bermaksud 3/4096 = 0.000732421 , iaitu apabila voltan input berubah sebanyak 0.000732421V, nilai input dalam atur cara berubah kepada 1. Ia tidak begitu rumit, bukan? Teruskan
  • Input digital dalam mod fungsi alternatif - input untuk bekerja dengan persisian. Contohnya, input untuk pemasa atau input untuk beberapa antara muka. Nilai input ini tidak boleh dibaca daripada program. Dalam program, sebagai contoh, anda boleh membaca data yang diterima daripada output ini dengan beberapa antara muka.

Dan port yang dikonfigurasikan untuk output boleh mempunyai pin dalam mod berikut:

  • Keluar. Hanya jalan keluar. Keluaran digital biasa. Terdapat sama ada voltan bekalan pada pin (logik 1) atau tiada voltan pada pin (logik 0). Mudah sahaja.
  • Output dalam mod fungsi alternatif - output dikawal oleh peranti. Output ini tidak boleh dikawal daripada program, tetapi program boleh dipaksa untuk mengawal output ini, contohnya antara muka.

Tetapi tidak semua kesimpulan boleh diberikan "seperti yang anda suka." Untuk mengetahui apa yang mungkin dan apa yang tidak, anda perlu melihat dokumentasi (Jadual 4) atau menggunakan program MicroXplorer.

Sebelum menggunakan port, anda mesti jamkannya dahulu - hantar denyutan jam kepadanya, kerana pada mulanya ia tidak dibekalkan untuk menjimatkan tenaga. Anda boleh memilih frekuensi jam yang berbeza - semakin tinggi frekuensi, semakin cepat input atau output port ini berfungsi, tetapi juga semakin tinggi penggunaan tenaga.

Terdapat juga kesimpulan BOOT 0 Dan BOOT 1. Pin ini bukan milik port; ia digunakan untuk mengawal pemuatan mikropengawal. Jika semasa bekalan kuasa terdapat sifar logik pada pin BOOT 0 (pin disambungkan ke titik biasa), maka mikropengawal melaksanakan program yang dimuatkan ke dalam memori kilat, i.e. Perisian tegar anda. Jika, apabila kuasa dibekalkan, pin BOOT 0 adalah logik (pin disambungkan kepada bekalan kuasa mikropengawal), dan pin BOOT 1 adalah sifar logik, maka mikropengawal tidak melaksanakan perisian tegar anda, tetapi pemuat but yang direkodkan kilang . Ingat ini! Anda akan banyak menggunakan ini apabila bekerja dengan mikropengawal STM32! Kadangkala memuatkan pemuat but yang direkodkan kilang - satu-satunya cara tulis/tukar perisian tegar mikropengawal. Ini berlaku, sebagai contoh, apabila mengkonfigurasi dalam perisian tegar pin yang disambungkan oleh pengaturcara atau apabila memancarkan perisian tegar mikropengawal tanpa menggunakan pengaturcara. Jadi sangat mengesyorkan Apabila mereka bentuk papan litar bercetak, pin ini (atau sekurang-kurangnya BOOT 0) harus diletakkan di tempat yang mudah.

Oleh itu, kami mengetahuinya :) Sekarang kami tahu apa itu mikropengawal dan apa yang terdiri daripadanya. Sekarang kita akan belajar tentang beberapa lagi kebijaksanaan dan beralih kepada perkara yang paling menarik - berlatih!

Program dalam mikropengawal dilaksanakan langkah demi langkah. Satu kitaran pemproses ialah satu langkah program.

Contohnya, biarkan lampu merah dan hijau berkelip sehingga butang ditekan. Tempoh setiap lampu ialah 5 saat. Inilah algoritmanya:

  1. Mari kita periksa sama ada terdapat voltan pada input dengan butang? (butang menutup output mikropengawal kepada + bekalan kuasa)
  2. Jika tiada voltan, maka lampu merah menyala selama 5 saat, lampu hijau padam, jika ada voltan, maka kita mula semula.
  3. Menyemak semula
  4. Jika tiada voltan, maka lampu hijau menyala selama 5 saat, lampu merah padam, jika ada voltan, maka kita mula semula.
  5. Mari kita mulakan semula

BERHENTI! Bagaimana jika saya menekan butang semasa lampu menyala? Tiada apa yang akan berlaku! Kerana program ini dilaksanakan langkah demi langkah, dan langkah dengan menyemak butang tekan adalah pada masa menukar mentol lampu.
Ia adalah tepat untuk kes sedemikian bahawa terdapat perkara seperti itu menyampuk

Gangguan memungkinkan untuk mengganggu pelaksanaan program utama. Ini boleh dilakukan sama ada dengan peristiwa luaran (menekan butang, melepaskan butang, menerima data, dll.) atau dalaman (oleh pemasa atau masa untuk memberi makan kucing, contohnya). Apabila gangguan ini berlaku, subrutin mula dilaksanakan. Subrutin boleh berbeza untuk pelbagai jenis gangguan, subrutin ini dipanggil penangan sampuk.

Apabila pengendali gangguan yang sama ini menyelesaikan kerjanya, atur cara utama mula dilaksanakan dari tempat ia diganggu.

Jom bangkit!

Nah, anak kucing, sudah tiba masanya untuk bangun! Saya harap anda sudah mempunyai papan nyahpepijat? Atau sekurang-kurangnya mikropengawal? Saya harap ada :) Dan jika tidak, maka mari kita lari ke kedai! (dan sebaik-baiknya bukan untuk sosej. Walaupun...) Apakah ajaran tanpa amalan ini?

Adalah bagus untuk mempunyai papan penyahpepijatan pada mulanya, contohnya STM32VL-Discovery, tetapi jika katak itu mencekik atau anda masih tidak mempunyai cukup untuk sosej, maka anda boleh bertahan dengan satu mikropengawal dan antara muka RS-232 -> UART penukar (contohnya MAX3232) atau USB -> UART (cth FT232RL). Dalam kes ini, 100 rubel boleh dilakukan sepenuhnya, tetapi anda perlu membuat papan litar bercetak dan pateri sekurang-kurangnya 48 pin 0.3 mm lebar dengan jurang 0.2 mm. Saya memberi amaran.

Mula-mula anda perlu melampirkan papan nyahpepijat atau pengawal secara semula jadi pada komputer.

Jika anda mempunyai papan pembangunan:

Dengan papan nyahpepijat, sudah tentu, ia lebih mudah. Kami mengambil kord Mini-USB dan menyambungkan papan ke komputer, semua pemacu harus dipasang secara automatik. Lihat dongle STMicroelectronics STLink dalam pengurus peranti - petanda baik! Nah, jika berlaku masalah dan tiada apa-apa yang berjaya, anda tidak perlu menggaru sofa, anda hanya perlu datang ke sini dan memasang Utiliti STM32 ST-LINK.

Nah, jika anda adalah pemilik gembira komputer yang menjalankan Windows 8, maka sebelum melaksanakan langkah-langkah di atas anda perlu melakukan perkara berikut: Pilihan -> Tukar tetapan komputer -> Adalah biasa -> Pilihan muat turun khas dan pilih satu pilihan Melumpuhkan pengesahan tandatangan pemandu.

Jika anda mempunyai mikropengawal:

Jika anda mempunyai satu mikropengawal, maka anda mesti mempunyai kaki lurus. Tetapi saya tidak meragui anda!

Sebelum menyambungkan mikropengawal ke komputer, ia mesti dipateri ke papan litar bercetak. Untuk ini, sebagai tambahan kepada mikropengawal dan kaki lurus, anda memerlukan sekurang-kurangnya papan litar bercetak. Dan kemudian ada kreativiti anda.

Minimum kerja dalam rajah di bawah:

Tetapi ini adalah minimum yang tidak menarik.

Tambah LED dan butang (jangan lupa pin BOOT), seperti ini

Tetapi mungkin ada masalah dengan pematerian kutu ini. Tetapi saya harap mereka tidak akan timbul. Saya cuba mematerikannya dengan besi pematerian Soviet 25 W kegemaran saya dengan lebar hujung 3/4 daripada lebar pengawal. saya ada lebih banyak masalah dengan pembuatan papan litar bercetak... yelah, setiap orang ada teknologi masing-masing.

Dan penyesuai perlu dibuat kepada UART mengikut dokumentasi untuk litar mikro yang anda beli.

Kami menyambungkan pin TxD dan RxD pada papan litar bercetak dengan pin RxD dan TxD, masing-masing, penyesuai. Jangan lupa tentang perkara biasa dan pemakanan semua itu.

Pemilihan dan pemasangan perisian

Kami akan menggunakan persekitaran pembangunan IDE CooCox, tetapi ini bukan sahaja seperti itu, tetapi atas beberapa sebab:

  • Pertama, ia adalah perisian yang diedarkan secara bebas. Ini bermakna karma anda akan bersih
  • Pada pendapat saya (dan bukan sahaja saya), persekitaran pembangunan ini lebih mudah daripada yang lain
  • Membenarkan penggunaan nyahpepijat
  • Banyak contoh yang boleh dimuatkan ke dalam persekitaran pembangunan (berguna untuk anak kucing dan banyak lagi)

Persekitaran pembangunan ialah program pengekodan, pengkompil, dan penyahpepijat semuanya dalam satu. Mudah :) Tetapi jika beberapa kucing Chelyabinsk yang keras lebih selesa menulis kod (dalam notepad, sebagai contoh), menyusun dan berkelip dengan program yang berbeza - Saya tidak keberatan, maka anda memerlukan utilit STM32 ST-LINK untuk memuatkan perisian tegar ke dalam mikropengawal. Pemiliknya adalah seorang yang budiman, seperti yang mereka katakan.

Persekitaran pembangunan ini adalah berdasarkan Eclipse yang terkenal.

  1. Jom ke sini
  2. Mencucuk Muat turun melalui CoCenter (Cadangkan)
  3. Masukkan alamat e-mel anda (tidak mengapa, ia ada "untuk persembahan")
  4. Selepas memuat turun, pasang yang ini CoCenter
  5. Dalam baris pertama di mana ia berkata CooCox CoIDE mencucuk Muat turun
  6. Selepas muat turun selesai, bukannya Muat turun kehendak Pasang. Tekan di sini
  7. Jom ke sini
  8. Betul-betul dalam lajur Muat turun muat turun fail yang .exe. Jom pasang.
  9. Kami buka sendiri CooCox CoIDE, tab Projek, Pilih Laluan Rangkaian Alat.
  10. Kami menunjukkan laluan ke fail arm-none-eabi-gcc.exe (kami memasang ini dalam langkah 8, laluannya lebih kurang seperti ini: D: Program Files (x86) GNU Tools ARM Embedded4.7 2013q1bin)
  11. Dibuka semula CoIDE, tekan Lihat -> Konfigurasi, buka tab Penyahpepijat dan kami melakukan ini [foto]
  12. Kami gembira kerana kini kami boleh menulis program dan memancarkannya ke dalam mikropengawal! Itulah yang akan kita lakukan.

Jika anda mempunyai pilihan tanpa papan nyahpepijat/pengaturcara, maka anda memerlukan program untuk memuatkan atur cara ke dalam MK Demonstrasi Pemuat Kilat yang terletak

Kita dapati bahasa bersama

Sebelum anda menulis program pertama anda, anda perlu mencari bahasa yang sama dengan MK. Tidak mungkin dia akan belajar bahasa kita, jadi kita perlu belajar (atau mungkin hanya ingat) bahasa di mana kita akan berkomunikasi dengan MK, ini adalah C. Kami hanya memerlukan asas (komposisi program, fungsi, pengendali). Jika anda tahu bahasa ini, maka anda boleh segera pergi ke item "Program pertama", tetapi saya akan membawa mereka yang tidak tahu terkini.

Projek ini terdiri daripada fail dengan sambungan .c Dan .h. Yang pertama mengandungi fungsi, yang kedua mengandungi nama fungsi yang digunakan dan pemalar, sebagai contoh. Begitulah keadaannya. Fail paling penting yang mengandungi kod program utama.c. Untuk kegunaan pelbagai fungsi anda perlu memasukkan perpustakaan dengan fungsi ini. Mereka berhubung dengan rakaman #include "library_name" Nah, perpustakaan semestinya ada dalam projek itu. Mereka disertakan pada awal fail.

Fungsi adalah bahagian unik program. Secara umum, program terdiri daripada satu atau lebih fungsi. Fungsinya kelihatan seperti:

return_variable_type function_name (variable_type)
{
Badan berfungsi
}

Anda boleh menghantar beberapa pembolehubah ke fungsi, fungsi akan memprosesnya dan mengembalikan beberapa nilai. Sangat mudah untuk menggunakan fungsi untuk tindakan berulang daripada terus menulis sekeping kod yang sama; anda hanya boleh menghantar pembolehubah ke fungsi dan menerima semula nilai yang diproses.

Sebelum anda boleh menggunakan fungsi, ia mesti diisytiharkan pada awal fail. Mereka melakukannya seperti ini:

return_variable_type function_name (variable_type);

Oh ya, saya terlupa perkara yang paling penting! Mesti ada koma bertitik di hujung setiap baris!

Jika fungsi tidak mengembalikan apa-apa (contohnya, kelewatan masa, ia hanya menarik ekor kucing tepat pada masanya), maka jenisnya ditunjukkan batal.

Apabila bermula, fungsi sentiasa dilaksanakan terlebih dahulu utama().

Nah, kita nampaknya telah mengetahui fungsinya, pemahaman hanya akan datang dengan amalan.

Saya sebutkan di atas jenis berubah-ubah. Semua pembolehubah boleh terdiri daripada jenis yang berbeza, berikut adalah yang utama:

  • INT - pembolehubah jenis ini hanya boleh menjadi integer dari -2147483648 hingga 2147483647
  • FLOAT - pembolehubah jenis ini ialah nombor dengan ketepatan sehingga 7 digit daripada ±1.5*10-45 hingga ±3.4*1033
  • DOUBLE - nombor dengan ketepatan sehingga 16 digit dari ±5*10-324 hingga ±1.7*10306
  • ULONG juga adalah integer, tetapi dari 0 hingga 18446744073709551615
  • PANJANG - integer daripada -9223372036854775808 hingga 9223372036854775807
  • CHAR - satu watak
  • BOOL ialah pembolehubah logik. Ia hanya boleh mempunyai 2 nilai: benar atau salah.

Rentetan (perkataan, ayat) boleh diwakili sebagai tatasusunan aksara taip char. Sebagai contoh:

char string = "Perkataan";

Di sini, kurungan segi empat sama ialah bilangan aksara dalam baris, "stroka" ialah nama tatasusunan.

Sebelum menggunakan pembolehubah, ia mesti diisytiharkan. (hanya nyatakan jenis dan nama pembolehubah)

  • + - tambahan.
  • - - penolakan.
  • * - pendaraban.
  • / - pembahagian.
  • = - memberikan nilai kepada pembolehubah.

Contohnya ungkapan a=b+c bermakna berikan kepada pembolehubah a nilai hasil tambah nilai pembolehubah b Dan c.

  • ++ - kenaikan. Meningkatkan nilai pembolehubah sebanyak 1
  • -- - penurunan. Menurunkan nilai pembolehubah sebanyak 1

Contohnya ungkapan a++ bermakna meningkatkan nilai pembolehubah a oleh 1 (sama seperti a=a+1)

  • == - perbandingan, tanda sama. (JANGAN KELIRU DENGAN TUGASAN)
  • != - perbandingan, tanda "tidak sama".
  • < - perbandingan, tanda "kurang daripada".
  • <= - perbandingan, tanda "kurang daripada atau sama".
  • > - perbandingan, tanda "lebih".
  • >= - perbandingan, tanda "lebih besar daripada atau sama".

Contohnya ungkapan a menjadi benar jika nilai pembolehubah a kurang daripada nilai pembolehubah b dan palsu jika nilainya sama atau a lebih b. Ungkapan a==b benar jika a sama b dan palsu jika a tidak sama b, TETAPI ungkapan a=b benar Sentiasa kerana ia bukan perbandingan, ia adalah tugasan kepada pembolehubah a nilai pembolehubah b.

  • % - baki bahagian

Contohnya jika a=5,b=3, kemudian nilai ungkapan a%b akan sama dengan 2 (sejak 5/3=1 (baki 2))

  • << - tukar bitwise ke kiri. Tanpa memperincikan maksud ungkapan tersebut a< dalam bahasa C ia akan sama dengan ungkapan a*2 b
  • >> - anjakan sedikit ke kanan. Ungkapan a>>b dalam program adalah bersamaan dengan ungkapan a/2 b
  • & - logik DAN.
  • | - logik ATAU.
  • ~ - penyongsangan.

Saya hampir terlupa untuk memberitahu anda tentang kitaran. asas:

sementara(syarat) (

badan gelung

Badan gelung (semuanya dalam pendakap kerinting) dilaksanakan apabila keadaan adalah benar (sehingga keadaan menjadi palsu).

untuk (nilai_awal; gelung_dilaksanakan_sehingga, langkah) (

badan gelung

Nilai_awal- nilai pembilang awal

Gelung_melaksanakan_sehingga - Sehingga nilai yang dicapai gelung berjalan

Langkah - dalam langkah apakah pembilang dikira?

Sebagai contoh

untuk (i=0; i<10, i++) {

badan gelung

Berikut ialah nilai awal pembolehubah i sama dengan 0, gelung berjalan sehingga nilai pembolehubah i kurang daripada 10, setiap kali gelung dilaksanakan kepada pembolehubah i 1 ditambah. Anda juga boleh menukar nilai pembolehubah terus dalam gelung.

jika (syarat)(

badan 1

) lain (

badan 2

Dalam peralihan bersyarat, "body 1" dilaksanakan jika syarat adalah benar dan "body 2" dilaksanakan jika syarat adalah palsu. Terdapat juga pilihan ini:

jika (syarat 1)(

) lain jika (syarat 2) (

Dalam kes ini, "badan 1" dilaksanakan jika "syarat 1" adalah benar, "badan 2" dilaksanakan jika "syarat 2" adalah benar. Terdapat beberapa syarat sedemikian, dan boleh juga ada satu lagi.

Keadaan boleh menjadi mudah dan majmuk: mudah - satu ungkapan logik, dan majmuk - beberapa ungkapan logik yang disambungkan oleh tanda & (syarat adalah benar apabila semua keadaan yang disambungkan oleh tanda ini adalah benar) atau | (sesuatu keadaan adalah benar jika sekurang-kurangnya satu syarat yang disambungkan oleh tanda ini adalah benar).

Satu lagi perkara yang berguna ialah komen. Mereka akan membantu anda memikirkan projek yang terlupa :) atau hanya supaya anda tidak melupakan sesuatu. Anda boleh mengulas sama ada selepas tanda-tanda // dan ke penghujung baris atau bermula dengan watak /* dan berakhir */ , dalam kes ini ulasan boleh terdiri daripada sebarang bilangan baris. Komen tidak menjejaskan saiz program.

Nah, itu nampaknya mengenai asasnya. Cukup untuk kali pertama (sehingga menulis bahagian seterusnya artikel)

Program pertama

Jangan menyimpang daripada tradisi (jika tidak anda tidak pernah tahu) dan mulakan dengan Hello World. Dan sepanjang perjalanan kami akan terus berkenalan dengan mikropengawal dan memperoleh pengalaman, boleh dikatakan.

Buka persekitaran pembangunan:

klik Semak imbas dalam Repositori

pilih ST

Kemudian kita akan melihat senarai perpustakaan yang disambungkan.

Untuk program mudah kami, kami memerlukan: teras CMSIS, But CMSIS, RCC, GPIO.

Perpustakaan teras CMSIS Dan But CMSIS - sistem, mereka mesti disambungkan

Perpustakaan RCC untuk bekerja dengan sistem pemasaan

Perpustakaan GPIO untuk bekerja dengan port I/O

Sekarang di sebelah kiri di tingkap Projek buka fail utama.c.

Mula-mula kita perlu menyambungkan perpustakaan kita (CMSIS tidak perlu disambungkan).

Kami pergi ke permulaan program dan menambah baris:

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

batal Kelewatan(int i) (
untuk (; i != 0; i--);
}

Jadi. Di sini dalam susunan, fungsi tidak mengembalikan apa-apa, jadi batal, nama fungsi kelewatan, serta-merta mengisytiharkan pembolehubah i menaip int. Dalam pendakap kerinting badan fungsi adalah gelung untuk. Ini adalah entri baris beliau. Nilai awal i kita tidak berubah, gelung berjalan sehingga i tidak sama dengan sifar (seperti i menjadi sama dengan sifar, kitaran berhenti, fungsi "dimatikan"). Dengan setiap pelaksanaan badan gelung (kitaran), pembolehubah i berkurangan sebanyak 1. Iaitu Intipati kitaran adalah untuk hanya mengulangi sendiri bilangan kali yang sama i. Semasa gelung berjalan, masa berlalu, kelewatan berlaku.

Port mana yang bertanggungjawab untuk output yang boleh didapati dalam dokumentasi untuk MK:

Untuk jam port C, tambah baris:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , DAYAKAN);

Tambahkan baris pada program:

GPIO_InitTypeDef GPIO_Init1;

Dengan baris ini kami mengisytiharkan struktur GPIO_InitTypeDef- memberinya nama GPIO_Init untuk digunakan dalam program kami selanjutnya.

Parameter apa yang boleh dikonfigurasikan dalam struktur ini dan bentuk apa yang mereka ada, kami melihat semuanya dalam keadaan yang sama stm32f10x_gpio.h:

Sekarang, untuk mengkonfigurasi parameter pin menggunakan struktur, anda perlu menulis namanya, letakkan titik dan tetingkap akan muncul di mana parameter ini ditunjukkan

Klik dua kali pada salah satu daripadanya, dan ia muncul dalam baris, kemudian letakkan = (tugaskan) dan tulis nilai daripada stm32f10x_gpio.h

Kami melakukan perkara yang sama dengan semua parameter. Jangan lupa koma bertitik di hujung setiap baris!

GPIO_Init(GPIOC , &GPIO_Init);

Sekarang kita akan berkelip! Kami akan berkelip secara kitaran, kami akan gelung dalam gelung sementara. Keadaan kitaran ialah 1. Satu sentiasa benar, sifar sentiasa salah... itu sahaja c'est la vie...

Untuk menggunakan arus pada output, anda perlu menetapkan bit; untuk mematikan output, anda perlu menetapkan semula bit. Bagaimana untuk melakukannya - semuanya adalah sama stm32f10x_gpio.h:

Kami melakukan ini:

manakala (1)(

GPIO_SetBits(GPIOC, GPIO_Pin_9);

Kelewatan (200000);

GPIO_ResetBits(GPIOC, GPIO_Pin_9);

Kelewatan (200000);

1 sentiasa benar, yang bermaksud gelung akan bergelung.

GPIO_SetBits - fungsi tetapan bit

GPIO_ResetBits - fungsi set semula bit

Kelewatan (200000) - pada baris ini pelaksanaan program masuk ke dalam fungsi kelewatan, yang sama di mana kitaran untuk. Nombor 200000 dalam kurungan dihantar ke fungsi ini sebagai pembolehubah i. (ingat baris batal kelewatan(int i)?) dan gelung yang sama dilaksanakan dalam fungsi ini, semuanya 200,000 kali. Ia cepat :) selepas kitaran selesai untuk fungsi Delay selesai kerjanya kerana dia batal, maka ia tidak mengembalikan apa-apa dan program terus dilaksanakan.

Kerana sementara digelung, kemudian LED dihidupkan, kelewatan, LED dimatikan, kelewatan akan dilakukan dalam gelung tidak berkesudahan. Sehingga kuasa terputus atau gangguan berlaku (lebih lanjut mengenainya dalam artikel seterusnya).

Nah, program pertama sudah siap. Sekarang tekan F7, atur cara menyusun.

Sekarang jika anda mempunyai papan nyahpepijat, kemudian sambungkannya menggunakan kord USB dan tekan Muat turun Kod Ke Flash. Kami gembira dengan kerja yang dilakukan dan ilmu yang diperoleh :)

Dan jika anda tidak mempunyai papan nyahpepijat, kemudian sambungkan penyesuai yang dibuat sebelum ini ke papan anda, dan penyesuai ke port COM komputer. Seterusnya, sambungkan output BOOT 0 dengan bekalan kuasa positif mikropengawal dan hidupkan kuasa mikropengawal. Ini akan menyebabkan mikropengawal memasuki mod perisian tegar. Secara umum, prosedur perisian tegar tidak rumit. Anda hanya perlu mengikut arahan aplikasi Demonstrasi Pemuat Kilat. Pertama, nyatakan nombor port COM yang melaluinya mikropengawal anda disambungkan dan kelajuannya. Untuk mengelakkan kegagalan, lebih baik memilih kelajuan yang lebih rendah

Jika program melihat mikropengawal anda, tetingkap akan muncul di mana ia akan ditulis berapa banyak memori yang ada.

Selepas mengklik "Seterusnya", anda akan melihat halaman pengalamatan memori. Kami tidak akan memerlukannya.

Langkah seterusnya adalah yang paling penting. Anda boleh memilih pembersihan memori atau perisian tegar

Untuk firmware pilih Muat turun ke peranti dan di padang Muat turun daripada fail pilih fail .hex yang disusun, yang terletak dalam folder CooCox -> CooIDE -> ruang kerja -> nama_projek -> nama_projek -> Nyahpepijat -> Tong sampah. Kemudian klik "Seterusnya" sekali lagi.

Selepas kita melihat tetingkap ini:

Matikan kuasa kepada mikropengawal dan tutup Demonstrasi Pemuat Kilat, putuskan sambungan penyesuai dan hidupkan mikropengawal masuk mod biasa(Bila apabila dihidupkan pin BOOT 0 disambungkan kepada bekalan kuasa tolak mikropengawal). Kami bergembira!

Jadi, sekarang kita tahu mengapa mikropengawal STM lebih baik daripada yang lain, kita tahu bagaimana mikropengawal berfungsi, kita tahu cara menyalakan mikropengawal dalam papan nyahpepijat dan dalam papan kita, kita tahu asas-asas bahasa C yang diperlukan untuk memprogramkan STM32, kami telah mendapat pengalaman bekerja dengan mikropengawal (semoga positif) dan yang paling penting ialah kini anda boleh merealisasikan idea anda peranti digital ke dalam kehidupan (dan ceritakan tentang mereka di RadioKot tercinta)! Mereka mungkin masih mudah, tetapi semuanya dibuat dengan pengalaman. Dan dalam artikel berikut saya akan cuba bercakap tentang ADC, DAC, gangguan, penggunaan debugging dan perkara berguna lain.

Apa pendapat anda tentang artikel ini?

ST-Link/V2 peranti khas dibangunkan oleh ST untuk penyahpepijatan dan pengaturcaraan mikropengawal siri STM8 dan STM32. Anda boleh membaca tentang peranti itu sendiri di laman web syarikat ST.

Ciri-ciri utamanya:

    Output 5V untuk kuasa peranti

    Antara muka berkelajuan tinggi USB 2.0

    SWIM, antara muka penyahpepijatan wayar JTAG/siri (SWD).

    Sokongan SWIM untuk mod kelajuan rendah dan tinggi

    SWD dan pemapar wayar bersiri (SWV)

    Kemas kini perisian tegar kemungkinan

Memandangkan mikropengawal STM32 dibina pada teras ARM Cortex, yang mempunyai antara muka penyahpepijatan SWD, ST-Link membenarkan anda memprogram dan menyahpepijat mikropengawal 32-bit lain berdasarkan ARM-Cortex.

Ini boleh dikatakan sebagai satu-satunya pengaturcara mikropengawal STM8. Terdapat pengaturcara universal lain untuk pengaturcaraan STM32.

Di mana saya boleh membeli pengaturcara STM8 STM32 ST-Link

hidup masa ini Terdapat banyak minat terhadap mikropengawal ST. Oleh itu, pengaturcara pautan ST agak meluas di pasaran. Terdapat beberapa versi yang berbeza dari segi harga.

Pautan ST asal daripada ST adalah, seperti biasa, pilihan yang paling mahal. Kos lebih daripada 2,000 rubel.

Pautan Mini ST (sangat serupa dengan versi programmer kami) berharga kira-kira 600 rubel. Anda boleh membelinya daripada pembekal elektronik utama - Compel, Terra Electronics dan lain-lain.

Ali express (China) - di sini mereka menawarkan sejumlah besar versi Pengaturcara yang paling mudah, tetapi secara umum, semuanya berfungsi, mereka boleh digunakan di lapangan. Sebagai peraturan, ia sesuai untuk pengaturcaraan STM8 dan STM32. Satu-satunya perkara ialah mereka tidak mempunyai output SWO, tetapi ia tidak diperlukan begitu kerap. Mungkin satu-satunya negatif di sini ialah menunggu untuk pembelian. Kosnya adalah kira-kira 150-200 rubel.

Jika anda tidak memerlukan pengaturcara STM8, tetapi hanya memerlukan siri STM32, maka papan Discovery daripada ST ialah pilihan yang baik; mereka juga mempunyai pengaturcara pautan ST pada papan. Walau bagaimanapun, sebagai peraturan, penyambung pengaturcaraan STM8 tidak disalurkan ke sana.

Dan sudah tentu, anda hanya boleh membeli bahagian dan membuat peranti ini atas diri sendiri. Ia tidak berdasarkan mikropengawal STM32 termurah, dan tidak begitu mudah untuk membeli alat ganti dengan murah, jadi kosnya adalah dari 300 hingga 400 rubel. Dalam artikel ini kami akan memberitahu anda cara memasang sendiri peranti ini daripada satu set komponen SMD yang diperlukan. Sudah tentu kami mengesyorkan pergi ke laluan ini. Ini adalah satu-satunya cara anda boleh belajar cara mengesan papan, membuatnya dan mematerinya.

Cara membuat pengaturcara ST-LINK V2

2. Sediakan atau beli alat yang diperlukan: segala-galanya untuk pematerian, penyesuai USB UART (akan diperlukan untuk pengaturcaraan MK)

4. Muat turun fail yang diperlukan untuk peranti ini daripada github.

5. Buat papan untuk peranti itu sendiri (ini sama sekali tidak sukar, semuanya diterangkan secara terperinci dalam arahan kami).

6. Anda boleh membeli semua komponen yang diperlukan di kedai kami untuk 300 gosok.

7. Pateri semua komponen pada papan, lihat kami video.

PERANTI SUDAH SEDIA, anda boleh menggunakannya!

Cari litar untuk pengaturcara ST Link, penyahpepijat

Syarikat ST sendiri tidak memberikan kami gambar rajah peranti ini, walau bagaimanapun, terdapat gambar rajah papan penilaiannya bagi siri DISCOVERY, yang juga mengandungi gambar rajah penyahpepijat. Contohnya dokumen UM0919. Tetapi ia tidak lengkap, hanya ada antara muka SWD. Ia berasaskan mikropengawal STM32F103C8T6.


Litar kedua, yang terdapat dalam dokumen UM1670, mengandungi pin output SWIM, tetapi ini sudah pun versi V2.2 pada mikropengawal STM32F103CBT6 yang lain.


Kami juga berjaya mencari litar ST-LINK v2 di Internet, dipulihkan daripada peranti asal:

Daripada tiga litar ini kita perlu membangunkan litar untuk peranti kita. Tetapi pertama-tama, mari kita sediakan keperluan asas untuk peranti yang akan kami buat.

Keperluan untuk ST-LINK kami

Kami akan membuat peranti berdasarkan STM8, serta pemproses STM32, NUVOTON Cortex-M0, ATMEL. Kesemuanya akan dikuasakan oleh 3.3V atau 5V. Jadi, kita tidak memerlukan keupayaan untuk bekerja dengan mikropengawal pada 1.8V. Tetapi keupayaan untuk memprogramkan STM8 itu sendiri sangat diperlukan.

Kami membuat peranti untuk tujuan kami, jadi kami tidak memerlukan penyambung SWIM dan JTAG standard. Akan membuat penyambung yang lebih mudah untuk mengesan papan.

Versi 2.2 pada mikropengawal STM32F103CBT6 menambah satu saat peranti USB- COM port UART, tetapi kita sudah ada, jadi tidak ada gunanya membayar lebih, mikrokontroler lebih mahal di sana. Memang betul dia ada peluang yang baik- perisian tegar melalui antara muka DFU, iaitu, mikropengawal dilihat sebagai pemacu kilat apabila disambungkan melalui USB, dan perisian tegar hanya perlu disalin ke cakera. Tetapi anda perlu menyalakannya sekali, dan untuk ini kami mempunyai penyesuai USB UART, kali pertama anda akan memancarkannya melaluinya. Kemas kini perisian tegar selanjutnya dilakukan melalui program dari ST melalui USB. Kami akan membuat versi 2.0 berdasarkan STM32F103C8T6.

Versi asal ST-Link mengandungi cip penukaran tahap, yang mudah untuk nyahpepijat dan perisian tegar peranti siap, dan diperlukan untuk bekerja dengan voltan di bawah 3.3V. Kami tidak akan mempunyai ini, dan untuk bekerja dengan 5V dan 3.3V, penukaran tahap tidak diperlukan.

Kami akan membuat peranti dalam format dongle USB; oleh itu, penyambung lelaki USB-A akan digunakan.

Anda boleh menjimatkan perlindungan output, jadi kami tidak akan menggunakan diod pelindung. Akan ada rintangan yang mencukupi pada semua output penyambung sekiranya kita tiba-tiba menyambungkannya ke 5V atau tanah. Adalah penting untuk diingat bahawa anda mesti menggunakan peranti ini dengan berhati-hati! Semak semua output beberapa kali apabila menyambung! Output 3.3V lebih dilindungi; ia melalui pengawal selia voltan yang melindungi daripada litar pintas. Jadi, adalah lebih baik untuk menghidupkan litar ujian daripadanya!

Sekarang kita boleh membuat gambar rajah akhir ST-Link kami.

Terdapat banyak papan dan litar siap sedia untuk peranti ini ditawarkan di Internet, tetapi untuk tujuan latihan, kami secara khusus membina litar dan membuat papan itu sendiri, berdasarkan HELAIAN DATA yang disiarkan oleh pengeluar. Jika anda menyalin gambar rajah dari mana-mana tapak lain, anda mesti memikirkannya, apa yang telah dilakukan di sana dan bagaimana, mengapa anda membuang atau menambah beberapa elemen.

Skim akhir

Anda boleh melihat gambar rajah itu sendiri dalam fail peranti ini. Kami membentangkannya di sini untuk mengulas tentang nod utama.

Bahagian utama:


Kuasa dan penyambung:

Komen kecil.

Sebagai pengawal selia kuasa 3.3V kami menggunakan NCP603 - LDO yang sangat baik, menghasilkan arus sehingga 300mA dengan penurunan 300mv dan ketepatan +-3%. LED Petunjuk ialah LED SMD biasa dengan dua warna. Untuk memprogram melalui UART, anda perlu menyambungkan pin BOOT0 ke +3V; untuk melakukan ini, kami akan menyambungkannya ke penyambung. Ia juga perlu untuk mengeluarkan UART itu sendiri - kaki RX TX. Semua pin lain tanpa perlindungan akan disambungkan ke penyambung. Saya telah menggunakan pengaturcara ini selama lebih setahun sekarang, dan terdapat litar pintas dan gangguan - tiada yang pernah terbakar.

Sesetengah reka bentuk meletakkan fius penetapan semula kendiri pada bekalan kuasa USB untuk melindungi port itu sendiri. Komputer moden mempunyai perlindungan pada Port USB, termasuk fius dan suis pengehad arus, jadi ia tidak diperlukan. Tetapi lebih baik, sudah tentu, tidak menyemak ini, dan jangan tersilap! Voltan 3.3V datang daripada LDO kami, yang mempunyai perlindungan terhadap litar pintas dan terlalu panas, dan tidak mengeluarkan lebih daripada 600mA, tiada apa yang perlu dilindungi di sana juga.

Ia sangat mudah untuk menyambungkan STM8 untuk pengaturcaraan menggunakan ST-Link, anda hanya memerlukan 3 wayar - output kuasa, tanah dan SWIM. Ini juga mudah semasa pendawaian papan; anda hanya boleh wayar keluaran SWIM; tanah dan kuasa sentiasa boleh didapati di papan.

Menghalakan papan dalam Kicad menggunakan autorouter Topor

Dalam penyesuai USB UART, kami telah pun berlatih mengesan papan dalam Kicad secara manual. Peranti ini sedikit lebih rumit. Di sini anda boleh belajar cara untuk mengarahkan papan masuk TOPOR autorouter. Adalah lebih baik untuk menonton keseluruhan proses pada video pada akhir artikel; hanya akan ada ulasan kecil pada video.

Menyediakan papan untuk autorouting

Untuk bekerja dengan Topor, anda mesti terlebih dahulu menyediakan papan dalam Kicad. Anda perlu menentukan sempadan papan, mengimport semua komponen dan meletakkannya terlebih dahulu. Kami tidak mempunyai keperluan untuk penyambung, jadi pada peringkat pertama adalah lebih baik untuk mengeluarkan penyambung itu sendiri dari papan. Oleh kerana setiap pin penyambung disambungkan melalui perintang, perintang akan menjadi titik rujukan untuk pin penyambung. Juga, untuk menyusun komponen, anda boleh mengeluarkan semua kapasitor kuasa, kuarza, litar mikro kuasa (lebih baik meletakkannya pada bahagian belakang- biasanya terdapat banyak ruang di sana) - semua ini boleh diatur kemudian.

Sekarang anda perlu menentukan sisi setiap komponen. Dan letakkan secara kasarnya mengikut keperluan, letakkan penyambung di tepi. Dan pada peringkat ini, anda boleh memindahkan semua ini ke Topor dan terus meletakkan komponen di sana. Penyambung USB, LED segera diletakkan di bahagian belakang, semua yang lain berada di bahagian hadapan.

Meletakkan Komponen Menggunakan Topor

Sekarang kami memindahkan semua ini ke Topor dan terus ke sana. Apa yang bagus tentang Topor? Hakikatnya ialah setiap kali anda memindahkan komponen, anda boleh menghala semula semua laluan secara automatik dan melihat sama ada ia telah menjadi lebih baik atau lebih teruk. Topor juga boleh membalikkan komponen mudah - perintang, kapasitor. Adalah penting untuk kita memahami cara menyusun pin penyambung dan komponen utama dengan lebih mudah.

Selepas memutar dan menggerakkan komponen dalam Topor, kami sampai kepada susunan ini:


Sekarang anda perlu memindahkan hasil ini kembali ke Kicad dan menambah komponen yang tinggal. Sebelum pengesanan akhir anda mesti:

    susun cip kuasa

    sambungkan litar bekalan kuasa secara manual

    susun dan sambungkan kapasitor kuarza dan kuasa

    takrifkan semula pin penyambung pada rajah.

Autoroute

Kami memindahkan separuh jejak kami ke Topor.

Ia adalah perlu untuk segera mewujudkan peraturan penghalaan - lebar jurang, trek, dimensi vias. Apabila mengimport daripada Kicad buat kali pertama, kami perlu memilih semua komponen dan membetulkannya supaya kami boleh memadamkannya dengan mudah dengan butang del dan penghalaan semula, meninggalkan pilihan separa manual kami. Dalam parameter penghalaan automatik, adalah perlu untuk menyemak kotak semak "Gunakan penghalaan sedia ada sebagai pilihan awal", jika tidak, penghalaan manual kami akan dihalakan semula (lihat video untuk proses bekerja di Topor).

Selepas penghalaan automatik, kami memindahkan semuanya kembali dan membawanya ke versi terakhir - tambah poligon tanah, sejajarkan laluan di mana perlu. Papan sudah siap.

Versi akhir papan

Bahagian depan


bahagian belakang

Perisian tegar ST Link, pemasangan pemacu

Papan sudah siap, kami membuatnya menggunakan kaedah pemindahan toner sejuk dengan aseton (atau mana-mana yang lain), goreskannya, dan pasang peranti. Sebelum menghidupkannya buat kali pertama, pastikan anda menyemak dengan mana-mana multimeter bahawa tiada rintangan antara 5V dan GND (tinggi tak terhingga) - ini akan memastikan tiada litar pintas. Anda juga perlu menyemak rintangan antara 3.3V dan GND.

Untuk bekerja dengan peranti kami, anda perlu memasang pemacu, kilatkannya buat kali pertama melalui UART dengan perisian tegar permulaan dan kemudian kemas kini perisian tegar kepada versi terkini program khas daripada ST.

Semua mikropengawal STM32 mempunyai pemuat but dan dipancarkan melalui UART. Untuk firmware yang anda perlukan:

Sekarang kami mempunyai ST LINK, tetapi dengan firmware lama. Kami mengeluarkan semua wayar. Muat turun program kemas kini perisian tegar STSW-LINK007 dan program kemas kini pemacu STSW-LINK009 untuk Windows daripada tapak web ST. Kami memasukkan ST-Link yang baru dibuat ke dalam Port USB komputer, dan lancarkan program kemas kini perisian tegar, klik CONNECT di dalamnya dan kemudian kemas kini perisian tegar kepada versi terkini. Peranti sudah SEDIA! Kini anda mempunyai penyahpepijat pengaturcara dan anda boleh beralih kepada pengaturcaraan.

Peranti siap

Kerja bebas

Berlatih pendawaian papan. Lakukan secara manual, dengan atau tanpa program Topor. Anda sepatutnya boleh membuat sebarang papan mudah dengan cepat.

Artikel ini adalah yang pertama dalam siri rencana rencana tentang mengkaji pengaturcaraan mikropengawal. Semasa mengkaji pelbagai bahan, saya perhatikan bahawa hampir kesemuanya bermula dengan fakta bahawa seorang pemula diminta memuat turun (atau menggunakan perpustakaan yang disertakan dengan persekitaran pembangunan) untuk bekerja dengan peranti persisian dan menggunakannya untuk menulis program pertamanya (biasanya berkelip LED).

Ini sangat mengejutkan saya. Jika anda percaya artikel ini, anda tidak perlu membaca dokumentasi untuk pengawal boleh atur cara untuk memprogramkan. Saya diajar hikmah "pengaturcaraan perkakasan" berbeza sama sekali.

Dalam artikel ini, laluan daripada frasa "Ya, saya mahu mencuba!" sehingga kejap gembira LED akan menjadi lebih lama daripada pengarang lain. Saya akan cuba mendedahkan aspek pengaturcaraan mikropengawal yang tersembunyi di sebalik penggunaan fungsi perpustakaan dan contoh sedia dibuat.
Jika anda berhasrat untuk serius mengkaji pengaturcaraan mikropengawal, artikel ini adalah untuk anda. Mungkin ia juga menarik minat mereka yang telah cukup bermain dengan Arduino dan ingin mendapatkan semua keupayaan perkakasan perkakasan itu.

Memilih mikropengawal

Mungkin ramai yang mengatakan bahawa adalah lebih baik untuk memulakan pembelajaran mikropengawal dengan AVR, PIC, 8051 atau sesuatu yang lain. Isu ini pelbagai rupa dan kontroversi. Saya tahu cukup contoh di mana orang, setelah mempelajari Cortex-M, memprogramkan AVR, ARM7, dsb. Saya sendiri bermula dengan Cortex-M3. Jika anda berhadapan dengan tugas tertentu, terdapat banyak maklumat di Internet yang membandingkan pelbagai jenis mikropengawal dan tugasan yang boleh diselesaikannya. Soalan ini juga dibangkitkan pada Habré, sebagai contoh.

Kami akan menganggap bahawa kami telah mengetahui jenis pengawal mikro. Tetapi pasaran menawarkan pelbagai pengubahsuaian yang berbeza daripada pengeluar yang berbeza. Mereka berbeza dalam banyak parameter - dari saiz memori kilat kepada bilangan input analog. Untuk setiap tugas, pilihan harus dibuat secara individu. tiada cadangan am Ia tidak dan tidak boleh berada di sini. Saya hanya akan ambil perhatian bahawa ia patut memulakan kajian anda dengan pengeluar MK yang mempunyai julat terbesar yang mungkin. Kemudian, apabila memilih MK untuk tugas tertentu, terdapat kemungkinan yang agak tinggi bahawa sesuatu daripada julat yang dibentangkan akan sesuai dengan anda.

saya telah memilih STM32(walaupun saya fikir lebih baik untuk mula belajar dengan MK dari TexasInstruments - dokumentasi disusun dengan sangat baik), kerana ia tersebar luas di kalangan pemaju elektronik Rusia. Jika anda mempunyai sebarang masalah atau soalan, anda boleh mencari penyelesaian dengan mudah di forum. Kelebihan lain ialah pelbagai pilihan papan demo daripada kedua-dua pengilang dan organisasi pihak ketiga.

Apa yang anda perlu belajar?

Malangnya, untuk memulakan pengaturcaraan MK, hanya PC tidak mencukupi. Anda perlu mendapatkan papan demo dan pengaturcara di suatu tempat. Walaupun ini mengurangkan persaingan dalam pasaran buruh.

Saya sendiri menggunakan papan demo. STM3220G-EVAL dan pengaturcara J-Link PRO. Tetapi sebagai permulaan, ia akan cukup STM32F4PENEMUAN, yang boleh dibeli tanpa sebarang masalah dengan jumlah yang kecil.

Semua contoh adalah khusus untuk papan nyahpepijat STM32F4PENEMUAN. Pada peringkat ini, sama sekali tidak penting bagi kami bahawa papan ini mempunyai MCU berdasarkan teras Cortex-M4. Kami tidak akan menggunakan ciri dan kelebihannya berbanding Cortex-M3 dalam masa terdekat. Kita lihat apa yang berlaku seterusnya.

Jika anda mempunyai papan lain berdasarkan STM32F2xx/STM32F4xx, anda boleh bekerja dengannya. Dalam membentangkan bahan, saya akan cuba menerangkan dengan terperinci yang mungkin. kenapa kami melakukannya dengan cara ini dan bukan sebaliknya. Saya harap tiada siapa yang akan menghadapi masalah memindahkan contoh ke perkakasan lain.

Persekitaran pembangunan

Seperti yang telah disebutkan berkali-kali, untuk Pengawal mikro ARM Terdapat bilangan persekitaran pembangunan yang mencukupi, kedua-duanya berbayar dan tidak begitu banyak. Dan sekali lagi saya ingin mengetepikan kontroversi mengenai perkara ini. Saya menggunakan IAR Embedded Workbench untuk ARM 6.60. Semua contoh akan berada dalam persekitaran ini. Jika anda suka (atau organisasi anda menggunakan) sesuatu yang lain (Keil, Eclipse, CCS, CooCoc, dll.) maka ini tidak akan merugikan anda juga. Saya akan memberi perhatian khusus kepada ciri-ciri yang berkaitan khusus dengan persekitaran pembangunan.

Mengapa persekitaran pembangunan berbayar?

Mungkin seseorang tidak akan gembira sepenuhnya dengan fakta bahawa saya mencadangkan menggunakan persekitaran pembangunan berbayar, tetapi dalam IAR adalah mungkin untuk mendapatkan lesen sementara tanpa sekatan fungsi, atau lesen tanpa had dengan had saiz kod (32KB untuk MK adalah banyak. ).
Di samping itu, saya akan segera ambil perhatian bahawa untuk beberapa MK tidak wujud persekitaran bebas pembangunan. Dan malangnya, MK ini tidak boleh ditukar ganti di beberapa kawasan.


Saya tidak akan menerangkan proses pemasangan.

Di mana untuk bermula?

Mencipta Projek
Mula-mula, mari buat projek kosong. IAR membolehkan anda membuat projek dalam ASM, C dan C++. Kami akan menggunakan C.

Projek kosong dengan fail utama akan muncul di hadapan kita.

Kini anda perlu mengkonfigurasi projek untuk mula bekerja dengan MK dan penyahpepijat "kami". MK dipasang pada papan STM32F4DISCOVERY STM32F407VG. Ia mesti dipilih dalam sifat projek (Pilihan Umum->Sasaran->Peranti):

Apabila anda memilih pemproses boleh atur cara sasaran, penerangannya dimuatkan, yang memberikan peluang yang mencukupi untuk penyahpepijatan (ini akan dibincangkan di bawah). Di samping itu, fail konfigurasi yang menerangkan ruang alamat yang tersedia untuk pemaut dilampirkan secara automatik. Jika perlu, kami akan menyentuh topik tersebut fail konfigurasi penghubung dalam artikel berikut.

Selepas ini, anda perlu mengkonfigurasi penyahpepijat. Penyahpepijatan program berlaku secara langsung "dalam perkakasan". Ini dilakukan menggunakan penyahpepijat JTAG. Anda boleh mengetahui lebih lanjut tentang cara ini berlaku di Wikipedia. Penyahpepijat ST-LINK/V2 disepadukan pada papan STM32F4DISCOVERY. Untuk bekerja dengan penyahpepijat, anda mesti memilih pemacunya dalam menu Penyahpepijat->Persediaan->Pemandu. Ia juga perlu untuk menunjukkan bahawa penyahpepijatan harus dijalankan secara langsung dalam perkakasan. Untuk melakukan ini, anda perlu menetapkan bendera Debugger->Muat turun->Gunakan pemuat kilat


Bagi mereka yang melihat perkataan Simulator

Secara teorinya, IAR membenarkan anda menyahpepijat program menggunakan simulator. Tetapi saya tidak pernah melihat ia digunakan dalam amalan.

Kini projek itu sedia untuk berfungsi (pengaturcaraan, pengisian dan penyahpepijatan).

"TZ" untuk projek pertama
Mari kita ringkaskan: MK dan papan nyahpepijat telah dipilih, projek telah disediakan. Sudah tiba masanya untuk membuat keputusan mengenai tugas.

Jangan kita menyimpang dari klasik. Projek pertama akan menjadi LED berkelip. Nasib baik, terdapat banyak daripada mereka di papan tulis. Apakah maksud ini dari sudut pengaturcaraan? Pertama sekali, anda perlu belajar gambarajah skematik papan tunjuk cara dan fahami bagaimana LED "dimulakan".
tersedia di laman web pengeluar. DALAM penerangan ini malah terdapat bahagian berasingan tentang LED pada papan - 4.4 LED. Sebagai contoh, kita akan gunakan Pengguna LD3. Mari cari dalam rajah:

Analisis litar yang paling mudah menunjukkan bahawa untuk "menyalakan" LED, anda perlu menggunakan "1" pada pin MK (yang untuk MK ini sepadan dengan 3.3V). Mematikan dilakukan dengan menggunakan "0" pada pin ini. Dalam rajah pin ini ditetapkan PD13(ini mungkin maklumat yang paling penting daripada dokumen ini).

Hasilnya, kami boleh menulis "TK" untuk program pertama kami:
Program untuk MK mesti memindahkan keadaan pin MK PD13 dari keadaan "0" kepada keadaan "1" dan kembali dengan periodicity tertentu yang dapat dilihat oleh mata manusia (nota penting, jika LED berkelip terlalu kerap mata mungkin tidak dapat membezakan ini).

Sebelum anda memulakan pengaturcaraan, atau sedikit teori
Sebelum kita mula melaksanakan spesifikasi teknikal kita, adalah perlu untuk memahami bagaimana MK diuruskan.

Mari kita mulakan dengan fakta bahawa mana-mana MK termasuk teras, memori dan unit persisian. Saya fikir dengan ingatan semuanya jelas buat masa ini. Izinkan saya nyatakan bahawa STM32 mempunyai memori kilat di mana program MK disimpan (secara umum, ini bukan pernyataan yang benar, program ini boleh disimpan dalam memori tidak meruap luaran, tetapi kami akan mengabaikannya buat masa ini) dan data lain, termasuk data pengguna. Terdapat juga SRAM - memori akses rawak.

Teras ialah bahagian mikropengawal yang melaksanakan satu aliran arahan. Dalam MK kami jenis teras ialah Cortex-M4. Teras MK boleh dibandingkan dengan pemproses dalam PC. Ia hanya boleh melaksanakan arahan dan memindahkan data ke unit lain (pemproses dengan pemecut grafik bersepadu tidak diambil kira dalam perbandingan ini).
Pada masa yang sama, pengilang MK tidak membangunkan teras. Teras dibeli daripada ARM Limited. Perbezaan utama antara MK yang berbeza adalah di pinggir.

Blok persisian ialah blok yang berinteraksi dengan "dunia luar" atau melaksanakan fungsi tertentu yang tidak boleh diakses oleh teras MK. MCU moden (termasuk STM32) mengandungi rangkaian besar unit persisian. Unit persisian direka untuk menyelesaikan pelbagai tugas, daripada membaca nilai voltan daripada input analog MK kepada penghantaran data ke peranti luaran melalui bas SPI.
Tidak seperti teras MK, unit persisian tidak melaksanakan arahan. Mereka hanya melaksanakan arahan kernel. Dalam kes ini, penyertaan kernel semasa melaksanakan arahan tidak diperlukan.

Contoh

Contohnya ialah blok UART, yang direka untuk menerima dan menghantar data dari MK ke peranti luaran. Kernel hanya perlu mengkonfigurasi blok dan memberikannya data untuk penghantaran. Selepas ini, kernel boleh terus melaksanakan arahan. Unit persisian bertanggungjawab untuk mengawal output MK yang sepadan untuk penghantaran data mengikut protokol. Unit persisian itu sendiri memindahkan output MK ke keadaan yang diperlukan "0" atau "1" dalam saat yang tepat masa semasa membuat pemindahan.

Interaksi teras dengan unit persisian
Interaksi teras MK dengan unit persisian dijalankan menggunakan daftar khas (terdapat juga interaksi melalui mekanisme gangguan dan DMA, tetapi lebih lanjut mengenainya dalam jawatan berikut). Dari sudut pandangan kernel, ini hanyalah secebis memori dengan alamat tertentu, itu tidak benar. Menulis data ke daftar khas adalah sama dengan menghantar arahan atau data ke unit persisian. Membaca - menerima data daripada blok atau membaca keadaannya. Perihalan blok persisian dan daftar khasnya mengambil bahagian besar dalam perihalan MK.

PENTING: Selepas menulis data ke daftar khas dan kemudian membacanya, anda boleh mendapatkan data yang sama sekali berbeza. Contohnya, menghantar data ke blok UART untuk dihantar dan membaca data yang diterima oleh blok daripada peranti luaran, dijalankan menggunakan daftar yang sama.

Daftar khas biasanya dibahagikan kepada medan bit. Satu (atau lebih) bit mengawal parameter blok persisian tertentu, biasanya secara bebas. Sebagai contoh, bit yang berbeza dari daftar yang sama mengawal keadaan jalan keluar yang berbeza MK.

Ingat C
Jika anda seorang guru bahasa C, anda boleh melangkau bahagian ini dengan selamat. Ia bertujuan terutamanya untuk mereka yang telah diajar (atau yang belajar sendiri) untuk memprogram untuk PC. Pengalaman menunjukkan bahawa orang sering tidak mengingati arahan penting. Di sini saya akan mengingatkan anda secara ringkas tentang operasi bitwise dan bekerja secara langsung dengan memori di alamatnya.

Menulis data ke alamat memori

Mari kita anggap bahawa dengan membaca perihalan unit persisian, kita menyedari bahawa untuknya operasi yang betul anda perlu menulis nombor 0x3B ke dalamnya. Alamat daftar khas ialah 0x60004012. Daftar adalah 32-bit.
Jika anda tidak segera mengetahui cara melakukan ini, saya akan cuba menerangkan rantaian penaakulan untuk mendapatkan arahan yang betul.

Nilai 0x60004012 tidak lebih daripada nilai penuding ke lokasi memori. Inilah yang perlu kami nyatakan dalam program kami, iaitu, untuk membuat penukaran jenis mengikut sintaks bahasa C:

(panjang tidak ditandatangani*)(0x60004012)

Jadi kita mempunyai penunjuk kepada elemen. Sekarang anda perlu menulis nilai yang diperlukan ke dalam elemen ini. Ini dilakukan dengan membatalkan rujukan penunjuk. Oleh itu kita mendapat arahan yang betul:

*(panjang tidak ditandatangani*)(0x60004012) = 0x3B;

Menetapkan bit sewenang-wenangnya kepada 1

Katakan anda ingin menetapkan bit 7 dan 1 pada alamat 0x60004012 kepada "1" tanpa mengubah nilai semua bit lain dalam daftar. Untuk melakukan ini, anda perlu menggunakan operasi binari |. Saya akan memberikan anda jawapan yang betul dengan segera:

*(panjang tidak ditandatangani*)(0x60004012) |= 0x82;

Perhatikan 2 fakta. Bit dikira dari sifar, bukan dari yang pertama. Operasi ini sebenarnya mengambil sekurang-kurangnya 3 kitaran jam - membaca nilai, mengubah suainya, menulisnya. Kadang-kadang ini tidak boleh diterima kerana antara baca dan tulis, nilai salah satu bit yang tidak dibenarkan kita ubah mungkin telah diubah oleh unit persisian. Jangan lupa tentang ciri ini, jika tidak, pepijat mungkin muncul yang amat sukar untuk ditangkap.

Menetapkan bit sewenang-wenangnya kepada 0

Mari kita anggap bahawa kita ingin menetapkan bit 7 dan 1 pada alamat 0x60004012 kepada "0" tanpa mengubah nilai semua bit lain dalam daftar. Untuk melakukan ini, anda perlu menggunakan binari & operator. Saya akan memberikan anda jawapan yang betul dengan segera:

*(panjang tidak ditandatangani*)(0x60004012) &= 0xFFFFFF7D;

Atau notasinya yang lebih mudah (jangan risau tentang operasi tambahan, pengkompil akan mengira semuanya terlebih dahulu walaupun dengan pengoptimuman minimum):

*(panjang tidak ditandatangani*)(0x60004012) &= (~0x82);

Beberapa ciri program untuk MK
Di sini saya akan cuba menerangkan beberapa ciri program untuk MK yang penting untuk diingati. Perkara-perkara agak jelas, tetapi masih.
Program ini tiada penghujungnya
Tidak seperti kebanyakan program PC, program MK tidak boleh berakhir, TIDAK PERNAH! Apakah sebenarnya yang perlu dilakukan oleh MK selepas menamatkan program anda? Soalannya boleh dikatakan retorik. Oleh itu, jangan lupa untuk memastikan bahawa anda tidak melupakan kitaran yang kekal. Jika dikehendaki, anda boleh meletakkan MK ke dalam mod tidur.
Gunakan pembolehubah integer
Walaupun fakta bahawa kami menggunakan mikropengawal dengan teras Cortex-M4, yang menjalankan operasi pada nombor titik terapung dalam perkakasan, saya menasihati anda untuk tidak menggunakannya. Dalam mikropengawal tanpa sokongan untuk operasi sedemikian, masa pengiraan akan menjadi sangat besar.
Elakkan peruntukan memori dinamik
Ini hanya nasihat. Sebabnya mudah - ingatan tidak mencukupi. Saya sering menemui perpustakaan yang mempunyai kebocoran memori "lambat". Ia sangat tidak menyenangkan apabila, selepas beberapa minggu operasi stabil, MK terhempas dengan ralat. Adalah lebih baik untuk memikirkan seni bina program anda terlebih dahulu supaya anda tidak perlu menggunakan peruntukan memori dinamik.
Jika anda masih mahu menggunakannya, teliti kerja pengurus memori atau tulis kerja anda sendiri.

Jom pergi kerja!

Mengusahakan program untuk MK sentiasa bermula dengan membaca dokumentasi. Untuk MK kami ia boleh didapati di laman web pengilang. Terdapat banyak halaman, tetapi baca semuanya Selamat tinggal tidak perlu. Seperti yang telah disebutkan, kebanyakan dokumentasi terdiri daripada penerangan tentang unit persisian dan daftarnya. Saya juga ingin menarik perhatian anda kepada fakta bahawa Manual Rujukan ini ditulis bukan untuk satu MK, tetapi untuk beberapa baris. Ini menunjukkan bahawa kod akan mudah alih apabila berpindah ke MK lain dalam baris ini (melainkan, sudah tentu, anda cuba menggunakan unit persisian yang tiada dalam MK yang anda gunakan).

Pertama sekali, anda perlu memutuskan blok mana yang hendak digunakan. Untuk melakukan ini, hanya kaji bahagian pengenalan Dan Ciri-ciri utama.

Kawalan langsung keadaan pin MK dijalankan menggunakan blok GPIO. Seperti yang ditunjukkan dalam dokumentasi, STM32 MCU boleh mempunyai sehingga 11 blok GPIO bebas. Pelbagai blok GPIO persisian biasanya dipanggil port. Port ditetapkan oleh huruf A hingga K. Setiap port boleh mengandungi sehingga 16 pin. Seperti yang kami nyatakan sebelum ini, LED disambungkan ke pin PD13. Ini bermakna pin ini dikawal oleh port GPIO unit persisian D. Nombor pin 13.

Kali ini kita tidak akan memerlukan sebarang unit persisian lain.

Kawalan jam persisian
Untuk mengurangkan penggunaan kuasa MK, hampir semua unit persisian dimatikan selepas menghidupkan MK. Blok dihidupkan/dimatikan dengan menggunakan/menghentikan bekalan isyarat jam kepada inputnya. Untuk operasi yang betul, adalah perlu untuk mengkonfigurasi pengawal isyarat jam MK supaya unit persisian yang diperlukan menerima isyarat jam.
Penting: Unit persisian tidak boleh mula beroperasi terus selepas isyarat jam dihidupkan. Anda perlu menunggu beberapa tanda sehingga ia "bermula". Orang yang menggunakan perpustakaan untuk peranti persisian, selalunya tidak tahu tentang ciri ini.

Daftar bertanggungjawab untuk membolehkan jam unit persisian Jam persisian RCC XXX membolehkan daftar.Sebagai ganti XXX boleh ada tayar AHB1, AHB2, AHB3, APB1 dan APB2. Selepas mengkaji dengan teliti perihalan daftar yang sepadan, kita boleh menyimpulkan bahawa masa blok persisian GPIOD dihidupkan dengan menetapkan "1" dalam bit ketiga daftar Mendayakan jam persisian RCC AHB1 (RCC_AHB1ENR):

Sekarang anda perlu memikirkan bagaimana untuk mengetahui alamat daftar itu sendiri RCC_AHB1ENR.

Ulasan: Perihalan sistem jam STM32 MK layak untuk artikel berasingan. Jika pembaca mahu, saya akan mengupas bahagian ini dengan lebih terperinci dalam salah satu artikel berikut.

Menentukan alamat daftar khas
Menentukan alamat daftar khas mesti bermula dengan membaca bahagian Peta ingatan dalam manual Rujukan. Anda boleh melihat bahawa setiap blok diperuntukkan bahagiannya sendiri bagi ruang alamat. Sebagai contoh, untuk blok RCC ini ialah bahagian 0x4002 3800 - 0x4002 3BFF:

Untuk mendapatkan alamat daftar, perlu menambah nilai awal ruang alamat blok RCC Addr. mengimbangi daftar yang diperlukan. Alamat diimbangi juga ditunjukkan dalam penerangan daftar (lihat tangkapan skrin di atas).

Hasilnya, kami telah menentukan alamat daftar RCC_AHB1ENR- 0x4002 3830.

blok GPIO
Untuk pemahaman umum tentang blok GPIO, saya sangat mengesyorkan membaca keseluruhan bahagian Manual Rujukan. Buat masa ini anda tidak boleh memberi banyak perhatian Mod ganti. Kami akan meninggalkannya untuk kemudian.

Sekarang tugas kami adalah untuk mempelajari cara menguruskan keadaan pin MK. Mari kita beralih terus ke penerangan daftar GPIO.

Mod operasi
Pertama sekali, anda perlu menetapkan mod pengendalian pin 13 port D sebagai Mod keluaran tujuan umum, yang bermaksud bahawa blok GPIO akan mengawal keadaan pin MK. Mod pengendalian pin MK dikawal menggunakan daftar Daftar mod port GPIO (GPIOx_MODER) (x = A..I/J/K):

Seperti yang dapat dilihat dari huraian, untuk membuat pelarasan yang kami perlukan, kami perlu menulis nilai 01b ke dalam 26-27 bit daftar GPIOx_MODER. Alamat daftar boleh ditentukan menggunakan kaedah yang sama seperti yang diterangkan di atas.

Mengkonfigurasi parameter operasi pin output port GPIO
Blok GPIO membolehkan anda menggunakan tetapan tambahan untuk pin port keluaran. Tetapan ini dibuat dalam daftar:
  • Daftar jenis keluaran port GPIO (GPIOx_OTYPER)- tetapkan jenis output tolak-tarik atau longkang terbuka
  • Daftar kelajuan keluaran port GPIO (GPIOx_OSPEEDR)- tetapkan kelajuan output
Kami tidak akan menukar parameter ini, kerana kami cukup gembira dengan nilai lalai.
Menetapkan nilai pada pin MK
Akhirnya, kita telah sampai pada saat mengawal keadaan keluaran MK. Terdapat dua kaedah untuk menetapkan nilai output pada pin MK tertentu.

Kami menggunakan daftar set/set semula bit port GPIO (GPIOx_BSRR)

Menulis "0" atau "1" kepada bit 0-16 menyebabkan perubahan yang sepadan dalam keadaan pin port. Untuk menetapkan nilai tertentu pada output satu atau lebih pin MK dan tidak mengubah keadaan pin yang lain, operasi mengubah suai bit individu diperlukan. Operasi ini dilakukan dalam sekurang-kurangnya 3 kitaran. Jika perlu menulis 1s kepada beberapa bit dan 0s kepada yang lain, maka sekurang-kurangnya 4 kitaran jam akan diperlukan. Kaedah ini paling baik digunakan untuk menukar keadaan keluaran kepada keadaan bertentangan jika keadaan asalnya tidak diketahui.

set bit port GPIO/daftar semula (GPIOx_BSRR)

Tidak seperti kaedah sebelumnya, menulis 0 kepada mana-mana bit daftar ini tidak akan membawa kepada apa-apa (dan secara amnya, semua bit adalah tulis sahaja!). Menulis 1 hingga bit 0-15 akan menyebabkan "1" ditetapkan pada output MK yang sepadan. Menulis 1 hingga bit 16-31 akan menetapkan "0" pada output MK yang sepadan. Kaedah ini adalah lebih baik daripada yang sebelumnya jika anda perlu menetapkan nilai tertentu pada pin "MK" daripada menukarnya.

Mari nyalakan LED!
Setelah menemui alamat semua daftar yang diperlukan, anda boleh menulis program yang menghidupkan LED:
void main() ( //Dayakan port D clocking *(unsigned long*)(0x40023830) |= 0x8; //sedikit kelewatan untuk GPIOD bersiap sedia tidak menentu panjang unsigned i=0; i++; i++; i++; i=0; / /Tetapkan PD13 sebagai output tujuan umum *(panjang tidak ditandatangani*)(0x40020C00) = (*(panjang tidak ditandatangani*)(0x40020C00)& (~0x0C000000)) | (0x04000000); //HIDUPKAN LED! *(panjang tidak ditandatangani*) (0x40020C14) |= 0x2000; manakala(1); )
Boleh disusun ( Projek->Kompilasi) dan isi ( Projek->Muat turun->Muat turun aplikasi aktif). Atau jalankan penyahpepijatan ( Projek->Dpwnload dan Nyahpepijat) dan mulakan pelaksanaan (F5).
LED menyala!
LED berkelip
Berkelip LED tidak lebih daripada menghidupkan dan mematikan silih berganti dengan kelewatan antara tindakan ini. Cara paling mudah ialah memasang dan mematikan dalam gelung kekal, dan masukkan kelewatan di antara mereka.
void main() ( //Dayakan port D clocking *(unsigned long*)(0x40023830) |= 0x8; //sedikit kelewatan untuk GPIOD bersiap sedia tidak menentu panjang unsigned i=0; i++; i++; i++; i=0; / /Tetapkan PD13 sebagai output tujuan umum *(panjang tidak ditandatangani*)(0x40020C00) = (*(panjang tidak ditandatangani*)(0x40020C00)& (~0x0C000000)) | (0x04000000); manakala(1) ( //HIDUPKAN LED *( panjang tidak ditandatangani*)(0x40020C14) |= 0x2000; //Lengah untuk(i=0; i<1000000 ;++i); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for(i=0; i<1000000 ;++i); } }
Nilai kelewatan 1,000,000 telah dipilih secara eksperimen supaya tempoh berkelip LED dapat dilihat oleh mata, tetapi tidak terlalu lama.
Mengoptimumkan algoritma
Kelemahan pendekatan berkelip LED yang dipilih ialah teras MK menghabiskan sebahagian besar masanya dalam gelung kosong, walaupun ia boleh melakukan sesuatu yang berguna (dalam contoh kami tidak ada tugas lain, tetapi ia akan muncul pada masa hadapan).

Untuk mengelakkan ini, pembilang kitaran biasanya digunakan, dan keadaan pin MK bertukar apabila program melalui beberapa kitaran tertentu.
void main() ( //Dayakan port D clocking *(unsigned long*)(0x40023830) |= 0x8; //sedikit kelewatan untuk GPIOD bersiap sedia tidak menentu panjang unsigned i=0; i++; i++; i++; i=0; / /Tetapkan PD13 sebagai output tujuan umum *(panjang tidak ditandatangani*)(0x40020C00) = (*(panjang tidak ditandatangani*)(0x40020C00)& (~0x0C000000)) | (0x04000000); manakala(1) ( i++; jika(!(i) %2000000)) ( //HIDUPKAN LED *(panjang tidak ditandatangani*)(0x40020С14) |= 0x2020; ) jika tidak(!(i%1000000)) ( //HIDUPKAN LED *(panjang tidak ditandatangani*)(0x40020С14) & = ~0x2000; ) ) )
Tetapi di sini ia tidak akan menjadi tanpa masalah; dengan perubahan dalam bilangan arahan yang dilaksanakan dalam kitaran, tempoh berkelip LED (atau tempoh pelaksanaan perintah lain dalam kitaran) akan berubah. Tetapi pada peringkat ini kita tidak boleh melawan ini.

Sedikit tentang penyahpepijatan
IAR membolehkan anda menyahpepijat aplikasi secara langsung pada perkakasan. Semuanya kelihatan hampir sama seperti menyahpepijat aplikasi PC. Terdapat mod untuk pelaksanaan langkah demi langkah, memasuki fungsi, melihat nilai pembolehubah (Dalam mod debugging Lihat->Tonton->Tonton1/4).

Tetapi sebagai tambahan kepada ini, adalah mungkin untuk melihat nilai daftar kernel, daftar khas unit persisian (View->Register), dsb.
Saya amat mengesyorkan agar anda membiasakan diri dengan keupayaan penyahpepijat semasa mempelajari pengaturcaraan MK.

Beberapa perkataan sebagai kesimpulan

Mungkin ramai yang akan mengatakan bahawa menulis alamat secara manual dalam program adalah tidak betul, kerana pengilang menyediakan fail dengan definisi daftar dan medan bit, perpustakaan untuk bekerja dengan peranti dan alat lain yang menjadikan kehidupan lebih mudah bagi pemaju. Saya bersetuju sepenuhnya dengan ini, tetapi saya masih percaya bahawa langkah pertama dalam pengaturcaraan MK mesti diambil dengan menggali dokumentasi secara manual, secara bebas menentukan daftar dan medan bit yang diperlukan. Anda tidak perlu menggunakannya pada masa hadapan, tetapi anda pasti perlu tahu cara melakukannya.
Berikut adalah beberapa sebab untuk pernyataan ini:
  • Kadangkala perpustakaan daripada pengilang mengandungi ralat! Saya pernah hampir terlepas tarikh akhir projek kerana ini. Saya menyolder semula cip beberapa kali, memikirkan bahawa kristal telah rosak semasa pematerian (ini telah berlaku sebelum ini). Masalahnya ialah alamat daftar khas telah dimasukkan dengan salah di perpustakaan. Ini biasanya berlaku dengan barisan MK atau MK yang baru memasuki pasaran.
  • Perpustakaan untuk bekerja dengan peranti daripada sesetengah pengeluar tidak melaksanakan semua keupayaan unit persisian. Saya terutama berdosa dengan ini Mikro Luminary, yang kemudiannya dibeli oleh TI. Saya terpaksa menulis permulaan peranti secara manual.
  • Ramai orang membiasakan diri untuk memulakan pengaturcaraan MK dengan mengkaji contoh. Saya percaya bahawa pertama anda perlu memutuskan apa yang membolehkan anda melaksanakan MK. Ini hanya boleh difahami dengan membaca dokumentasi. Jika sesuatu tidak ada dalam contoh, ini tidak bermakna perkakasan tidak menyokongnya. Contoh terakhir ialah sokongan perkakasan PTP STM32. Sudah tentu, anda boleh mencari sesuatu dalam talian, tetapi ia tidak termasuk dalam set standard dari pengilang.
  • Pemacu unit persisian daripada sesetengah pengeluar tidak dioptimumkan sehingga menukar keadaan pin menggunakan perpustakaan mengambil masa sehingga 20 kitaran jam. Ini adalah kemewahan yang tidak mampu dimiliki untuk beberapa tugas.

Terima kasih kepada semua orang yang membaca siaran saya, ternyata lebih daripada yang saya jangkakan pada mulanya.
Saya mengharapkan komen dan kritikan yang beralasan. Jika mereka yang membacanya mempunyai keinginan, saya akan cuba meneruskan siri artikel tersebut. Mungkin sesiapa sahaja mempunyai idea tentang topik yang patut dibincangkan - saya gembira mendengarnya.