Pemrogram paling sederhana untuk firmware stm32. Firmware ARM Cortex M3 menggunakan contoh STM32 dan LPC1300. Firmware STM32 menggunakan pemrogram ST-Link untuk Windows

Diterbitkan 08/09/2016

Mikrokontroler STM32 menjadi semakin populer karena kekuatannya, periferal yang cukup beragam, dan fleksibilitasnya. Kami akan mulai belajar menggunakan papan tes anggaran, yang biayanya tidak melebihi $2 (dari Cina). Kami juga membutuhkan ST-Link programmer, biayanya sekitar $2,5 (dari Cina). Jumlah pengeluaran tersebut terjangkau bagi pelajar dan anak sekolah, jadi saya mengusulkan untuk memulai dengan opsi anggaran ini.


Mikrokontroler ini bukan yang paling kuat di antara yang lain STM32, tapi juga bukan yang terlemah. Ada berbagai papan dengan STM32, termasuk Penemuan yang harganya sekitar $20. Di papan seperti itu, hampir semuanya sama seperti di papan kami, ditambah seorang programmer. Dalam kasus kami, kami akan menggunakan programmer secara terpisah.

Mikrokontroler STM32F103C8. Karakteristik

  • Inti Cortex-M3 32-bit lengan
  • Frekuensi maksimum 72MHz
  • Memori Flash 64Kb untuk program
  • Memori SRAM 20Kb
  • Catu daya 2.0… 3.3V
  • 2x12-bit ADC (0...3.6V)
  • pengontrol DMA
  • 37 input/output toleran 5V
  • 4 pengatur waktu 16-bit
  • 2 pengatur waktu pengawas
  • I2C – 2 bus
  • USART – 3 bus
  • SPI – 2 bus
  • Antarmuka USB 2.0 kecepatan penuh
  • RTC – jam bawaan

Tersedia di papan STM32F103C8

  • Port keluaran A0-A12, B0-B1, B3-B15, C13-C15
  • Mikro-USB melalui mana Anda dapat memberi daya pada papan. Papan ini memiliki penstabil tegangan 3.3V. Daya 3.3V atau 5V dapat disuplai ke pin yang sesuai di papan.
  • Tombol Mengatur ulang
  • Dua jumper BOOT0 Dan BOOT1. Kami akan menggunakannya selama flashing via UART.
  • Dua kuarsa 8 MHz dan 32768 Hz. Mikrokontroler mempunyai pengali frekuensi, sehingga dengan kuarsa 8 MHz kita dapat mencapai frekuensi pengontrol maksimal 72 MHz.
  • Dua LED. PWR– memberi sinyal bahwa daya telah disuplai. PC13– terhubung ke keluaran C13.
  • Konektor untuk programmer ST-Link.

Jadi, mari kita mulai dengan mencoba mem-flash mikrokontroler. Ini dapat dilakukan melalui USART, atau menggunakan programmer ST-Link.

Anda dapat mengunduh file uji untuk firmware. Program ini mem-flash LED di papan.

Firmware STM32 menggunakan adaptor USB-Uart untuk Windows

Dalam memori sistem STM32 Ada Pemuat boot. Bootloader dicatat pada tahap produksi dan mikrokontroler apa pun STM32 dapat diprogram melalui antarmuka USART menggunakan adaptor USART-USB. Adaptor semacam itu paling sering dibuat berdasarkan sirkuit mikro yang populer FT232RL. Pertama-tama, sambungkan adaptor ke komputer dan instal driver (jika diperlukan). Anda dapat mengunduh driver dari situs web produsen FT232RL– ftdichip.com. Anda perlu mengunduh driver VCP(port com virtual). Setelah menginstal driver, port serial virtual akan muncul di komputer Anda.


Menghubungkan RX Dan TX output ke pin yang sesuai USART1 mikrokontroler. RX sambungkan adaptor ke TX mikrokontroler (A9). TX sambungkan adaptor ke RX mikrokontroler (A10). Karena USART-USB memiliki output daya 3,3V, kami akan menyuplai daya ke board darinya.

Untuk memasukkan mikrokontroler ke mode pemrograman, Anda perlu mengatur pin BOOT0 Dan BOOT1 ke keadaan yang diinginkan dan reboot dengan tombol Mengatur ulang atau mematikan dan menghidupkan daya mikrokontroler. Untuk ini kami memiliki jumper. Kombinasi yang berbeda memaksa mikrokontroler ke mode yang berbeda. Kami hanya tertarik pada satu mode. Untuk melakukan ini, mikrokontroler memiliki BOOT0 harus ada yang logis, dan hasilnya BOOT1– logika nol. Di papan ini adalah posisi pelompat berikut:

Setelah menekan tombol Mengatur ulang atau melepas dan menyambungkan daya, mikrokontroler harus masuk ke mode pemrograman.

Perangkat lunak firmware

Jika kita menggunakan adaptor USB-UART, nama portnya akan seperti ini /dev/ttyUSB0

Dapatkan informasi chip

Hasil:

Kami membaca dari chip ke dalam file dump.bin

sudo stm32flash -r dump.bin /dev/ttyUSB0

Menulis ke chip

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

Hasil:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Menggunakan Parser: Antarmuka BINARY Mentah serial_posix: 57600 8E1 Versi: 0x22 Opsi 1: 0x00 Opsi 2: 0x00 ID Perangkat: 0x0410 (Kepadatan sedang) - RAM: 20KiB (512b dicadangkan oleh bootloader) - Flash: 128KiB (ukuran sektor: 4x1024) - Opsi RAM: 16b - RAM Sistem: 2KiB Tulis ke memori Menghapus memori Alamat yang ditulis dan diverifikasi 0x08012900 (100,00%) Selesai. Memulai eksekusi di alamat 0x08000000... selesai.

Firmware STM32 menggunakan programmer ST-Link untuk Windows

Saat menggunakan programmer ST-Link kesimpulan BOOT0 Dan BOOT1 tidak digunakan dan harus berada dalam posisi standar untuk pengoperasian normal pengontrol.

(Pesan dalam bahasa Rusia)

penandaan STM32

Keluarga perangkatJenis produkSubfamili perangkatJumlah pinUkuran memori flashKemasanKisaran suhu
STM32 =
Mikrokontroler 32-bit berbasis ARM
F = Tujuan umum
L = Daya sangat rendah
TS=Layar Sentuh
W = sistem nirkabel pada chip
60 = resistif multisentuh
103 = garis kinerja
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
Saya = 176 pin
B = 208 pin
N = 216 pin
4 = 16 Kbyte memori Flash
6 = 32 Kbyte memori Flash
8 = 64 Kbyte memori Flash
B = 128 Kbyte memori Flash
Z = 192 Kbyte memori Flash
C = 256 Kbyte memori Flash
D = 384 Kbyte memori Flash
E = 512 Kbyte memori Flash
F = 768 Kbyte memori Flash
G = 1024 Kbyte memori Flash
I = 2048 Kbyte memori Flash
H = UFBGA
N=TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Kisaran suhu industri, –40…+85 °C.
7 = Kisaran suhu industri, -40…+ 105 °C.
STM32F103 C8 T6

Bagaimana cara menghapus proteksi tulis/baca?

Jika Anda menerima papan dengan STM32F103, tetapi pemrogram tidak melihatnya, ini berarti pihak Cina telah melindungi memori Flash mikrokontroler. Pertanyaan “mengapa?” mari kita abaikan saja. Untuk menghilangkan pemblokiran, kami akan menghubungkan adaptor UART dan memprogram melaluinya. Kami mengatur jumper untuk pemrograman dan berangkat:

Saya akan melakukan ini dari Ubuntu menggunakan utilitas stm32flash.

1. Periksa apakah mikrokontroler terlihat:

Sudo stm32flash /dev/ttyUSB0

Anda harus mendapatkan sesuatu seperti ini:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Antarmuka serial_posix: 57600 8E1 Versi: 0x22 Opsi 1: 0x00 Opsi 2: 0x00 ID Perangkat: 0x0410 (Kepadatan sedang) - RAM: 20KiB (512b dicadangkan oleh bootloader) - Flash: 128KiB (ukuran sektor: 4x1024) - RAM Opsi: 16b - RAM Sistem: 2KiB

2. Hapus proteksi baca lalu proteksi tulis:

Sudo stm32flash -k /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Antarmuka serial_posix: 57600 8E1 Versi: 0x22 Opsi 1: 0x00 Opsi 2: 0x00 ID Perangkat: 0x0410 (Kepadatan sedang) - RAM: 20KiB ( 512b dicadangkan oleh bootloader) - Flash: 128KiB (ukuran sektor: 4x1024) - Opsi RAM: 16b - RAM Sistem: 2KiB Read-UnProtecting flash Selesai.

sudo stm32flash -u /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Antarmuka serial_posix: 57600 8E1 Versi: 0x22 Opsi 1: 0x00 Opsi 2: 0x00 ID Perangkat: 0x0410 (Kepadatan sedang) - RAM: 20KiB ( 512b dicadangkan oleh bootloader) - Flash: 128KiB (ukuran sektor: 4x1024) - RAM Opsi: 16b - RAM Sistem: 2KiB Flash tanpa proteksi tulis Selesai.

Sekarang Anda dapat bekerja secara normal dengan mikrokontroler.

Sekarang tentang semuanya secara lebih rinci. Sebagian besar pengontrol STM32 memiliki bootloader internal (tidak dapat dihapus) di area memori khusus yang beroperasi menggunakan protokol UART, SPI, I2C, dan CAN. Tentu saja cara termudah adalah bekerja melalui UART, karena... Hampir setiap orang yang berhubungan dengan elektronik memilikinya, jadi kami akan mempertimbangkannya.

Pemilihan area memori tempat pengontrol dimuat dilakukan dengan menerapkan level rendah atau tinggi ke kaki BOOTx (bisa ada satu atau beberapa). Untuk informasi selengkapnya tentang cara memilih bootloader pada pengontrol tertentu, lihat AN2606. AN2606 juga menentukan antarmuka pengontrol mana yang dapat digunakan untuk pemrograman. Selain itu, untuk menulis kode ke pengontrol, Anda memerlukan program kecil dari situs web ST yang disebut STM32 FlashLoader Demonstrator.

Nah, untuk memahami bagaimana menggunakan pengetahuan ini, mari kita memprogram board dengan STM32F103C8T6B.

Papan memiliki jumper untuk mengatur mode boot pengontrol. Sayangnya, mereka tidak ditandatangani, jadi lihat foto di atas dan pasang dengan cara yang sama. Menyetel jumper BOOT0 ke "1" dan BOOT1 ke "0" akan mengaktifkan bootloader bawaan, seperti yang dinyatakan dalam AN2606. Sekarang Anda dapat menghubungkan daya, serta jalur sinyal RX dan TX. Jangan lupa bahwa jalur RX dan TX dihubungkan secara melintang:

RX<--->TX

TX<--->RX


Selanjutnya, luncurkan program FlashLoader Demonstrator. pilih port COM yang diinginkan dan klik berikutnya. Jika semuanya terhubung dengan benar, maka kami menerima pesan bahwa pengontrol yang terhubung memiliki memori 64 KB dan tidak memiliki perlindungan baca.


Klik berikutnya. Sebuah lembar terbuka dengan halaman memori yang tersedia di pengontrol, kami tidak tertarik padanya, klik berikutnya lagi. Sebuah halaman terbuka dengan kemampuan untuk memilih tindakan pada pengontrol:
  • Hapus (hapus)
  • Unduh ke perangkat (unggah firmware ke MK)
  • Unggah dari perangkat (baca firmware dari MK)
  • Aktifkan/Nonaktifkan perlindungan Flash (mengaktifkan/menonaktifkan perlindungan memori flash)
  • Edit byte opsi (pengeditan perlindungan memori)

Klik pada tiga titik, pilih file kita “test_stm.hex”, centang kotak di sebelah “Verify aster download” untuk memeriksa kebenaran download, serta “Jump to the user program” agar MK segera mulai mengeksekusi program yang diunduh setelah proses pengunduhan selesai.

Klon Arduino ini menawarkan bootloader khusus yang memungkinkan Anda mengunggah firmware melalui USB, tanpa menggunakan komponen eksternal seperti ST-Link atau adaptor USB-UART.

Hari ini saya perlu bekerja dengan pengontrol kosong dari CooCox dan tanpa stm32duino. Tapi inilah masalahnya. Bahkan penutup mata sederhana dengan bola lampu yang dituangkan melalui bootloader ini tidak berfungsi.

Mari kita cari tahu. Mungkin bagi sebagian orang perhitungan saya tampak dangkal. Namun saya baru mulai mempelajari pengontrol STM32 dan menghabiskan setidaknya setengah hari untuk mencari masalahnya. Mungkin artikel ini akan mempersingkat waktu perkembangan seseorang.

Saya tidak menentang ST-Link dan debugger lainnya. Tetapi perangkat saya yang sudah jadi tidak akan memilikinya, tetapi pasti memiliki USB. Mengapa tidak segera menyertakan kemampuan memperbarui firmware melalui USB? Secara pribadi, menurut saya metode ini nyaman. Lagipula, saya sudah memiliki kabel yang terhubung yang membawa daya dan Serial USB.

Mari kita lihat cara kerja bootloader. Mari kita mulai dengan contoh pengontrol AVR. Kenapa aku mengingatnya? Saya beralih dari Arduino dan secara tidak sadar mengharapkan perilaku yang sama. Namun di STM32 ternyata berbeda. Oleh karena itu saya ingin membahas perbedaan kedua mikrokontroler ini.

Jadi. Pada mikrokontroler AVR ATMega, sejumlah memori dapat dicadangkan untuk bootloader di dekat akhir flash. Dengan menggunakan bit sekering, Anda dapat mengontrol dari alamat mana program akan dimulai. Jika tidak ada bootloader, program dimulai dari alamat 0x0000. Jika ada bootloader, itu dimulai dari beberapa alamat lain (misalnya, di ATMega32 dengan 0x3C00, jika ukuran bootloader dipilih 2k).

Ketika bootloader telah menyelesaikan tugasnya, ia mentransfer kendali ke program utama dari alamat 0x0000. Itu. Program selalu dimulai dari alamat 0x0000. Kompiler dan linker bekerja dengan asumsi bahwa kode akan berada di awal ruang alamat.

Hal ini tidak terjadi pada mikrokontroler STM32. Semua program dimulai dari alamat 0x0800000. Bootloadernya tidak terlalu istimewa. Ini adalah program yang sama yang dimulai dari alamat awal yang sama. Selama pengoperasian, bootloader dapat menerima firmware (melalui USB atau UART, membaca dari flash drive, menerima dari satelit, mengambil dari subruang, apa pun...) dan menulisnya ke alamat yang lebih tinggi dari bootloader itu sendiri. Dan, tentu saja, di akhir pekerjaan Anda, alihkan kendali ke program utama.

Jadi, saat mengkompilasi firmware, Anda perlu mengetahui di mana bootloader akan menulis firmware dan menyesuaikan alamatnya.

Itu saja untuk teorinya. Mari kita lanjutkan ke latihan. Di bawah ini adalah petunjuk langkah demi langkah tentang cara memasang bootloader USB ke mikrokontroler seri STM32F1xx, dan mungkin ke beberapa mikrokontroler lainnya juga.

Namun ada beberapa keterbatasan pada desain sirkuit. Sayangnya, saya tidak kuat di sini. YTP memerlukan resistor pull-up 1,5k untuk port PA12 (alias USB D+). Hal ini memungkinkan bootloader untuk terhubung dan memutuskan sambungan dari USB pada waktu yang tepat.

Petunjuk:

  • Unduh github.com/rogerclarkmelbourne/STM32duino-bootloader. Direktori STM32F1binaries sudah berisi paket bootloader yang dikompilasi untuk papan yang berbeda. Indeks di akhir nama file menunjukkan di mana LED terhubung. Jika LED terhubung ke pin C13, saya menggunakan file generic_boot20_pc13.bin.
  • Mari kita flash. Ya, Anda memerlukan adaptor USB-UART, tetapi Anda mungkin dapat menggunakan debugger
  • Sekarang mikrokontroler siap untuk di-flash melalui bootloader USB. Namun Anda tetap perlu memperbaiki firmware itu sendiri. Dan Anda perlu melakukan 2 hal:
    • Berikan tautan dengan alamat awal. Di CooCox, ini dilakukan di pengaturan proyek, tab Tautan, bagian Area Memori, Alamat Mulai IROM1. Bootloader menempati 8 kilobyte pertama, yang berarti alamat awal firmware adalah 0x0800000 + 0x2000 = 0x08002000. Bidang Ukuran mungkin juga harus dikurangi sebesar 8k
    • Di suatu tempat di awal program, sebelum menginisialisasi periferal, lakukan panggilan NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
  • Pengunggah firmware dimungkinkan. Di direktori tools, cari skrip bernama maple_upload. Saya hanya menggunakan versi Windows - maple_upload.bat
  • Jalankan seperti ini:
    "maple_upload.bat" COM20 2 1EAF:0003 "PathToFirmware.bin"

    Alih-alih COM20, Anda perlu mengganti port Anda sendiri tempat mikrokontroler terpasang.

    Pengisi adalah hal yang sangat rumit; ia tidak menyukai jalur relatif. jadi path ke firmware harus ditentukan secara lengkap.

    1EAF:0003 adalah VID dan PID

    2 adalah parameter AltID, yang menunjukkan bahwa firmware harus diunggah ke alamat 0x08002000 (baca)

Sedikit lebih banyak nuansa. Sebelum mengunggah firmware, Anda perlu menjalankan bootloader. Cara termudah adalah dengan menekan tombol reset. Setelah ini, bootloader akan mulai dan menunggu firmware selama beberapa detik. Jika saat ini belum ada yang meluncurkan maple_upload, bootloader akan mentransfer kontrol ke firmware utama.

Hal ini dapat menyebabkan ketidaknyamanan. Jika mikrokontroler tidak berfungsi dan hang, maka mikrokontroler tidak lagi mendengarkan port. Oleh karena itu, ia tidak dapat mendengar urutan kunci dan melakukan boot ulang ke bootloader. Maka hanya reset yang akan membantu.

Itu saja. Saya harap artikel saya akan menjelaskan cara kerja bootloader di STM32 dan bagaimana Anda dapat mengunduh firmware melalui port USB. Sayangnya, hambatan masuknya masih tinggi, tapi mungkin artikel saya bisa membantu seseorang mengatasinya.

Seperti yang sudah Anda duga, artikel ini akan membahas metode terakhir. Menurut saya ini bukan pilihan terbaik untuk penggunaan biasa, tetapi dalam beberapa kasus ini sangat bagus. Katakanlah perangkat sudah siap dan berfungsi untuk pengguna, dan tiba-tiba muncul kebutuhan untuk melakukan flashing. Tentu saja, Anda dapat membongkar perangkat dan menyoldernya ke antarmuka debugging, tetapi ini relatif sulit + Anda memerlukan debugger. Bagaimana jika perangkat sudah terhubung ke komputer melalui UART? Dalam hal ini, lebih mudah menggunakan antarmuka ini untuk mengunduh firmware. Di sinilah bootloader akan sangat berguna. Pengguna hanya perlu menekan satu tombol dan perangkat memasuki mode firmware. Beberapa klik mouse dan firmware diperbarui. Sekarang mari kita coba memahami lebih detail cara kerjanya. Pertama, kita perlu menghubungkan pengontrol kita ke komputer melalui antarmuka USART1.

Untuk mengontrol pembebanan pengontrol, terdapat dua pin BOOT1 dan BOOT0. Bergantung pada kombinasi level logika di dalamnya, pengontrol akan mulai mengeksekusi kode dari area memori yang berbeda saat daya dihidupkan. Hal ini dapat dilihat dari tabel di bawah ini:

BOOT1BOOT0Apa yang sedang berjalan
X0 Program di-flash dalam FLASH
0 1 Pemuat
1 1 Program dari SRAM

Seperti yang Anda ingat, bootloader berada di area memori yang disebut Sytem Memory. Itu tidak dapat diubah dengan cara apapun. Hal ini membuat pengontrol tidak dapat digunakan dalam hal perangkat lunak, bahkan jika flashing tiba-tiba terganggu - perangkat tidak dalam bahaya. Anda selalu dapat memulai firmware lagi. Dengan poin lain dalam tabel, semuanya sederhana: kombinasi pertama berarti pengontrol akan menjalankan firmware yang di-flash ke dalamnya, dan kombinasi terakhir berarti pengontrol akan mengeksekusi kode dari RAM yang masih perlu ditempatkan di sana. Saya masih kurang paham mengapa hal ini diperlukan, kecuali programnya berjalan lebih cepat (menurut Internet). Mari kita kembali ke bootloader. Untuk memasukkan pengontrol kami ke mode firmware, tahan tombol BOOT dan tekan RESET. Setelah itu, tombolnya bisa dilepas. Untuk firmware digunakan software khusus yang disebut Flash Loader Demonstrator. Anda dapat mendownloadnya dari situs ST atau dari saya. Prosedur firmware sangat sederhana: Anda hanya perlu mengikuti instruksi dari wizard. Pada langkah pertama, kita akan diminta untuk memilih nomor port com yang terhubung dengan pengontrol dan menentukan pengaturan koneksi. Yang perlu diperhatikan adalah bootloader memiliki deteksi kecepatan otomatis. Ini berarti Anda dapat dengan bebas memilih kecepatan apa pun dari daftar dan itu akan berhasil. Andai saja adaptor RS232 - UART (atau USB-UART) Anda mendukungnya. Konverter CP2102 saya, yang akan saya bahas secara singkat, berfungsi dengan baik pada semua kecepatan. Namun, Anda perlu ingat bahwa bootloader mengonfigurasi pengontrol ke jam dari osilator internal. Dan frekuensinya sangat berfluktuasi tergantung pada tegangan suplai dan suhu. Oleh karena itu, jika Anda memiliki masalah dengan kestabilan kedua parameter ini, maka lebih baik memilih kecepatan rendah.

Jika koneksi dengan pengontrol terjalin, program akan memberi kita jendela yang menunjukkan berapa banyak memori yang dimiliki pengontrol dan apakah perlindungan pembacaan memori diaktifkan. Jika pengontrol dilindungi dari pembacaan firmware, maka Anda dapat menghapus perlindungan tersebut, tetapi isi memori flash akan dimusnahkan. Ini dilakukan dengan tombol "Hapus perlindungan", yang tidak tersedia untuk saya karena... Perlindungan memori tidak diaktifkan.

Langkah selanjutnya dari wizard menunjukkan halaman memori flash mana yang dilindungi dari penulisan/pembacaan. Anda harus ingat untuk memilih jumlah memori yang dimiliki pengontrol yang dapat diprogram. Sepertinya ada detektor otomatis yang akan membuat pilihan tepat, tapi saya tidak yakin. Pengontrol saya memiliki memori 128 kBytes, itulah yang saya pilih:

Langkah paling menarik dari master. Di atasnya kita dapat memilih apa yang ingin kita lakukan dengan pengontrolnya. Kita dapat menghapus memori pengontrol. Baik semua maupun beberapa halaman. Tentu saja Anda dapat mem-flash pengontrolnya. Anda dapat memprogram dan menghapus memori hanya jika hal ini tidak dilarang. Dimungkinkan untuk memeriksa isi memori setelah menginstal firmware. Atau Anda bisa langsung mulai menjalankan program firmware. Membaca memori kembali dimungkinkan jika tidak dilarang. Anda dapat menghapus atau menginstal perlindungan tulis/baca di jendela yang sama. Anda juga dapat mengedit "Opsi byte". Saya belum tahu apa ini, jadi saya tidak bisa mengatakan apa pun yang masuk akal.
. Jika Anda memiliki pertanyaan tentang bootloader, tanyakan, saya akan mencoba menjawabnya.

Klon Arduino ini menawarkan bootloader khusus yang memungkinkan Anda mengunggah firmware melalui USB, tanpa menggunakan komponen eksternal seperti ST-Link atau adaptor USB-UART.

Hari ini saya perlu bekerja dengan pengontrol kosong dari CooCox dan tanpa stm32duino. Tapi inilah masalahnya. Bahkan penutup mata sederhana dengan bola lampu yang dituangkan melalui bootloader ini tidak berfungsi.

Mari kita cari tahu. Mungkin bagi sebagian orang perhitungan saya tampak dangkal. Namun saya baru mulai mempelajari pengontrol STM32 dan menghabiskan setidaknya setengah hari untuk mencari masalahnya. Mungkin artikel ini akan mempersingkat waktu perkembangan seseorang.

Saya tidak menentang ST-Link dan debugger lainnya. Tetapi perangkat saya yang sudah jadi tidak akan memilikinya, tetapi pasti memiliki USB. Mengapa tidak segera menyertakan kemampuan memperbarui firmware melalui USB? Secara pribadi, menurut saya metode ini nyaman. Lagipula, saya sudah memiliki kabel yang terhubung yang membawa daya dan Serial USB.

Mari kita lihat cara kerja bootloader. Mari kita mulai dengan contoh pengontrol AVR. Kenapa aku mengingatnya? Saya beralih dari Arduino dan secara tidak sadar mengharapkan perilaku yang sama. Namun di STM32 ternyata berbeda. Oleh karena itu saya ingin membahas perbedaan kedua mikrokontroler ini.

Jadi. Pada mikrokontroler AVR ATMega, sejumlah memori dapat dicadangkan untuk bootloader di dekat akhir flash. Dengan menggunakan bit sekering, Anda dapat mengontrol dari alamat mana program akan dimulai. Jika tidak ada bootloader, program dimulai dari alamat 0x0000. Jika ada bootloader, itu dimulai dari beberapa alamat lain (misalnya, di ATMega32 dengan 0x3C00, jika ukuran bootloader dipilih 2k).

Ketika bootloader telah menyelesaikan tugasnya, ia mentransfer kendali ke program utama dari alamat 0x0000. Itu. Program selalu dimulai dari alamat 0x0000. Kompiler dan linker bekerja dengan asumsi bahwa kode akan berada di awal ruang alamat.

Hal ini tidak terjadi pada mikrokontroler STM32. Semua program dimulai dari alamat 0x0800000. Bootloadernya tidak terlalu istimewa. Ini adalah program yang sama yang dimulai dari alamat awal yang sama. Selama pengoperasian, bootloader dapat menerima firmware (melalui USB atau UART, membaca dari flash drive, menerima dari satelit, mengambil dari subruang, apa pun...) dan menulisnya ke alamat yang lebih tinggi dari bootloader itu sendiri. Dan, tentu saja, di akhir pekerjaan Anda, alihkan kendali ke program utama.


Jadi, saat mengkompilasi firmware, Anda perlu mengetahui di mana bootloader akan menulis firmware dan menyesuaikan alamatnya.

Itu saja untuk teorinya. Mari kita lanjutkan ke latihan. Di bawah ini adalah petunjuk langkah demi langkah tentang cara memasang bootloader USB ke mikrokontroler seri STM32F1xx, dan mungkin ke beberapa mikrokontroler lainnya juga.

Namun ada beberapa keterbatasan pada desain sirkuit. Sayangnya, saya tidak kuat di sini. YTP memerlukan resistor pull-up 1,5k untuk port PA12 (alias USB D+). Hal ini memungkinkan bootloader untuk terhubung dan memutuskan sambungan dari USB pada waktu yang tepat.

  • Sekarang mikrokontroler siap untuk di-flash melalui USB bootloader. Namun Anda tetap perlu memperbaiki firmware itu sendiri. Dan Anda perlu melakukan 2 hal:
    • Berikan tautan dengan alamat awal. Di CooCox, ini dilakukan di pengaturan proyek, tab Tautan, bagian Area Memori, Alamat Mulai IROM1. Bootloader menempati 8 kilobyte pertama, yang berarti alamat awal firmware adalah 0x0800000 + 0x2000 = 0x08002000. Bidang Ukuran mungkin juga harus dikurangi sebesar 8k.
    • Di suatu tempat di awal program, sebelum menginisialisasi periferal, lakukan panggilan

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);

      PEMBARUAN 17/05/2018: Versi modern STM32Cube tidak memiliki fungsi NVIC_SetVectorTable(). Sebagai gantinya, Anda dapat memperbaiki VECT_TAB_OFFSET default di file system_stm32f1xx.c (atau yang serupa untuk mikrokontroler lain)

  • Pengunggah firmware dapat diambil dari proyek stm32duino. Di direktori tools, cari skrip bernama maple_upload. Saya hanya menggunakan versi Windows - maple_upload.bat.
  • Jalankan seperti ini:

    "maple_upload.bat" COM20 2 1EAF:0003 "Jalur\Ke\Firmware.bin"
    Alih-alih COM20, Anda perlu mengganti port Anda sendiri tempat mikrokontroler terpasang.

    Pengisi adalah hal yang sangat rumit; ia tidak menyukai jalur relatif. jadi path ke firmware harus ditentukan secara lengkap.

    1EAF:0003 adalah VID dan PID

    2 adalah parameter AltID, yang menunjukkan bahwa firmware harus diunggah ke alamat 0x08002000 (baca).

  • Sedikit lebih banyak nuansa. Sebelum mengunggah firmware, Anda perlu menjalankan bootloader. Cara termudah adalah dengan menekan tombol reset. Setelah ini, bootloader akan mulai dan menunggu firmware selama beberapa detik. Jika saat ini belum ada yang meluncurkan maple_upload, bootloader akan mentransfer kontrol ke firmware utama.

    Hal ini dapat menyebabkan ketidaknyamanan. Jika mikrokontroler tidak berfungsi dan hang, maka mikrokontroler tidak lagi mendengarkan port. Oleh karena itu, ia tidak dapat mendengar urutan kunci dan melakukan boot ulang ke bootloader. Maka hanya reset yang akan membantu.

    Itu saja. Saya harap artikel saya akan menjelaskan cara kerja bootloader di STM32 dan bagaimana Anda dapat mengunduh firmware melalui port USB. Sayangnya, hambatan masuknya masih tinggi, tapi mungkin artikel saya bisa membantu seseorang mengatasinya.

    • Sergei Savenkov

      semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat