STM32F4 konsep boot dan relokasi tabel vektor

8

Ada beberapa hal yang saya tidak mengerti pada proses boot mikrokontroler STM32F4.

Pemahaman saya adalah sebagai berikut:

  1. Sepatu bot ARM Cortex-M4 mengharapkan nilai inisialisasi penunjuk tumpukan dan vektor interupsi aktif 0x00000000 + SCB->VTOR, sedangkan SCB->VTORdihapus saat reset.
  2. Tidak ada memori di lokasi itu. Memori flash dimulai pada 0x08000000, SRAM pada 0x20000000.
  3. Untuk memungkinkan booting, μC dapat memetakan rentang memori flash atau SRAM 0x00000000. Rentang memori yang akan dipetakan ditentukan oleh status pin booting.

Pertanyaan saya:

  1. Mengapa manual referensi STM32F4 mengatakan pada halaman 69 itu

    Ketika perangkat melakukan booting dari SRAM, dalam kode inisialisasi aplikasi, Anda harus memindahkan tabel vektor dalam SRAM menggunakan tabel pengecualian NVIC dan register offset.

    ? Dalam pandangan saya, ini tidak perlu, karena seluruh wilayah memori tetap ada. Menariknya, ini sepertinya tidak diperlukan ketika wilayah flash dipetakan kembali ke 0x0angkasa.

  2. Satu-satunya penggunaan untuk boot dari SRAM saya bisa memikirkan jika untuk mengurangi siklus tulis pada flash selama pengembangan. Sebelum Anda melepaskan μC dari reset, Anda menulis program ke SRAM menggunakan debugger dan kemudian boot dari sana. Namun, karena Anda memiliki akses debugger, toh tidak akan ada batasan untuk memulai dari mana. Jadi mengapa memiliki fitur ini?

    Bahwa posisi boot berasal dari pin menunjukkan (setidaknya menurut pendapat saya) bahwa fitur ini digunakan tidak selama pengembangan tetapi dalam operasi akhir. Dan dalam operasi terakhir, SRAM jelas saat boot. Oleh karena itu tidak masuk akal untuk boot dari SRAM.

Multisink
sumber
Anda mungkin ingin mem-boot dari RAM, untuk melakukan pembaruan firmware. Kode RAM dijalankan, dan mem-flash ulang isi memori Flash. Setelah pembaruan selesai, Anda mengatur ulang eksekusi dari Flash.
Fotis Panagiotopoulos

Jawaban:

5

Pertanyaan 1:

Saya tidak bisa menjawab pertanyaan pertama Anda. Namun dalam manual pemrograman tempat register VTOR dijelaskan ( halaman 212 ) menyatakan bahwa bit 29 digunakan untuk menentukan di mana tabel vektor berada, baik di wilayah kode (0) atau di wilayah SRAM (1).

Sekarang saya tidak mengerti mengapa ini harus dilakukan karena alasan yang sama dengan yang Anda sebutkan, SRAM akan dialihkan ke 0x0, jadi mengapa ada kebutuhan untuk mengatur offset ini?

Satu-satunya tebakan yang saya miliki dinyatakan pada halaman 69 yang dikutip. Mereka mengatakan:

area kode dimulai dari alamat 0x0000 0000 (diakses melalui bus ICode / DCode)

area data (SRAM) dimulai dari alamat 0x2000 0000 (diakses melalui bus sistem)

Cortex ® -M4 dengan CPU FPU selalu mengambil vektor reset pada bus ICode

Mungkin pada interupsi bus ICode digunakan, yang tidak dapat mengakses SRAM bahkan ketika memetakan kembali (saya tidak tahu apakah ini benar). Ini akan menjelaskan mengapa bit ini harus diatur sesuai, memberitahu inti untuk menggunakan bus sistem dan mengakses SRAM.

Pertanyaan 2:

Walaupun mungkin benar, bahwa SRAM kosong pada boot pertama perangkat, itu tidak selalu untuk boot nanti. Jadi Anda bisa membuat sesuatu seperti perangkat bertenaga baterai yang memprogram SRAM-nya selama produksi dan kemudian berjalan sampai baterai mati, yang akan menghapus SRAM-nya. Saya kira ini akan membuat rekayasa balik perangkat sedikit lebih sulit.

Pada perangkat bertenaga baterai, Anda mungkin akan menggunakan mode siaga untuk menghemat daya, dan jika Anda meninggalkan mode itu, pin-Boot akan dicoba lagi, jadi mereka harus memiliki pengaturan yang benar untuk mendapatkan SRAM lagi.

Anda juga dapat me-reboot perangkat dengan aman karena konten SRAM tidak hancur jika tidak ada pengambilan daya.

Bukan aplikasi yang sangat meyakinkan untuk memperbaiki semua kesulitan untuk memetakan ulang SRAM.

Gudang senjata
sumber