Unduh firmware ke STM32 melalui USB

gambar

Dalam proyek saya, saya menggunakan mikrokontroler STM32F103C8 dan kerangka stm32duino . Klon Arduino ini menawarkan bootloader khusus yang memungkinkan Anda untuk mengunggah firmware melalui USB, tanpa menggunakan komponen eksternal seperti ST-Link atau adaptor USB-UART.

Hari ini saya perlu bekerja dengan controller kosong dari bawah CooCox dan tanpa stm32duino. Tapi ini masalahnya. Bahkan bola lampu tanda bahaya sederhana yang dituangkan melalui bootloader ini tidak berfungsi.

Mari kita perbaiki. Mungkin kalkulasi saya bagi sebagian orang tampak biasa. Tapi saya baru mulai mempelajari pengontrol STM32 dan membunuh setidaknya setengah hari untuk menemukan masalah. Tiba-tiba artikel ini akan mempersingkat waktu pengembangan untuk seseorang.

Saya tidak menentang ST-Link dan para penentang lainnya. Tetapi di perangkat saya yang sudah jadi tidak akan, tetapi pasti akan ada USB. Mengapa tidak segera meletakkan kemampuan untuk memperbarui firmware melalui USB? Secara pribadi, saya menemukan metode ini nyaman. terlebih lagi, saya sudah memiliki kabel yang terhubung dengan yang ada daya dan USB Serial.

Mari kita lihat bagaimana bootloader bekerja. Untuk memulai dengan contoh pengontrol AVR. Mengapa saya mengingatnya? Saya beralih dari Arduino dan secara tidak sadar mengharapkan perilaku yang sama. Tetapi dalam STM32 semuanya ternyata berbeda. Oleh karena itu, saya ingin berbicara tentang perbedaan antara kedua mikrokontroler ini.

Jadi Dalam mikrokontroler AVeg ATMega, sejumlah memori dapat dicadangkan untuk bootloader di dekat akhir flash. Menggunakan bit sekering Anda dapat mengontrol dari mana alamat 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 adalah 2k).

gambar

Ketika bootloader telah melakukan tugasnya, ia mentransfer kontrol ke program utama dari alamat 0x0000. Yaitu program selalu dimulai pada 0x0000. Compiler dan linker bekerja dengan fakta bahwa kode tersebut akan ditempatkan di awal ruang alamat.

Dalam mikrokontroler STM32, ini tidak benar. Semua program dimulai dari alamat 0x0800000. Bootloader tidak terlalu istimewa. Ini adalah program yang sama yang dimulai dari alamat awal yang sama. Dalam prosesnya, bootloader dapat menerima firmware (melalui USB atau UART, membaca dari USB flash drive, menerima dari satelit, mendapatkannya dari subruang, apa pun ...) dan menulisnya ke alamat yang lebih tinggi dari bootloader itu sendiri. Dan, tentu saja, di akhir pekerjaannya, transfer kontrol ke program utama.

gambar

Jadi ketika mengkompilasi firmware Anda perlu tahu di mana bootloader akan menulis firmware dan menyesuaikan alamatnya.

Itu semua dengan teori. Mari kita lanjutkan berlatih. Di bawah ini adalah petunjuk langkah demi langkah tentang cara mengencangkan bootloader USB ke mikrokontroler seri STM32F1xx, dan mungkin juga ke beberapa yang lain.

Namun, ada beberapa batasan pada sirkuit. Di sini, sayangnya, saya tidak kuat. ITP membutuhkan resistor pull-up 1,5k untuk port PA12 (alias USB D +). Ini memungkinkan bootloader untuk terhubung dan memutuskan koneksi dari USB pada waktu yang tepat.

Instruksi:

  • Unduh github.com/rogerclarkmelbourne/STM32duino-bootloader . Dalam direktori STM32F1 \ binari sudah ada paket bootloader yang dikompilasi untuk papan yang berbeda. Indeks di akhir nama file menunjukkan di mana LED terhubung. Dalam kasus board saya di mana LED terhubung ke pin C13, saya menggunakan file generic_boot20_pc13.bin.

  • Kami flash sesuai dengan instruksi . Ya, di sini Anda akan memerlukan adaptor USB-UART, tetapi Anda juga dapat menggunakan debugger .

  • Sekarang mikrokontroler siap untuk mem-flash bootloader USB. Tetapi Anda masih harus memperbaiki firmware itu sendiri. Dan Anda perlu melakukan 2 hal:

    • Berikan tautan ke alamat awal. Dalam CooCox, ini dilakukan dalam pengaturan proyek, tab Tautan, bagian Area Memori, Alamat Awal IROM1. Bootloader mengambil 8 kilobyte pertama, yang berarti alamat awal firmware adalah 0x0800000 + 0x2000 = 0x08002000. Kolom Ukuran, mungkin, juga harus dikurangi sebesar 8k.

    • Di suatu tempat di awal program, sebelum menginisialisasi pinggiran, lakukan panggilan

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); 


      UPDATE 05/17/2018: Tidak ada fungsi NVIC_SetVectorTable () dalam versi modern STM32Cube. Sebagai gantinya, Anda dapat memperbaiki definisi VECT_TAB_OFFSET di file system_stm32f1xx.c (atau serupa dengan mikrokontroler lain)

  • Isi firmware dapat diambil dari proyek stm32duino . Di direktori alat, cari skrip yang disebut maple_upload. Saya hanya menggunakan versi Windows - maple_upload.bat.

  • Jalankan seperti ini:

     "maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin" 

    Alih-alih COM20, Anda harus mengganti porta tempat mikrokontroler terpasang.

    Tuang adalah hal yang sangat lembut, tidak suka jalur relatif. jadi jalur ke firmware harus ditentukan sepenuhnya.

    1EAF: 0003 adalah VID dan PID

    2 - ini adalah parameter AltID, yang menunjukkan bahwa firmware harus diunggah pada 0x08002000 (baca di sini ).

Sedikit nuansa. Sebelum mengunggah firmware, Anda harus menjalankan bootloader. Cara termudah adalah dengan menekan tombol reset. Setelah itu, bootloader akan mulai dan akan menunggu beberapa detik untuk firmware. Jika tidak ada yang memulai maple_upload saat ini, bootloader akan mentransfer kontrol ke firmware utama.

Agar tidak menekan reset setiap kali, papan berbasis libmaple / stm32duino menggunakan trik. Mereka mendengarkan port serial usb. Jika sinyal DTR muncul di sana dan urutan kunci byte ditransmisikan, maka mikrokontroler dimuat kembali ke dalam bootloader. Lihat ke dalam fungsi rxHook () .

Ini dapat menyebabkan ketidaknyamanan. Jika mikrokontroler dimatikan dan hang, maka ia tidak lagi mendengarkan port. Karena itu, ia tidak dapat mendengar urutan tombol dan reboot ke bootloader. Kemudian hanya mengatur ulang untuk membantu.

Itu saja. Saya harap artikel saya akan menjelaskan bagaimana bootloader bekerja di STM32 dan cara mengunduh firmware melalui port USB. Sayangnya, ambang entri masih tinggi, tetapi tiba-tiba artikel saya akan membantu seseorang mengatasinya.

Source: https://habr.com/ru/post/id403007/


All Articles