Bagaimana Cara Mendesain BootLoader untuk MCU Seri STM32?

Daftar Isi

BootLoader Design for STM32

BootLoader adalah istilah yang sudah tidak asing lagi bagi banyak orang, dan bahkan sering digunakan. Misalnya, kita membutuhkannya saat melakukan pembaruan sistem secara daring atau menjalankan program di memori eksternal. Dalam postingan ini, kita akan membahas cara merancang program BootLoader untuk MCU seri STM32.

Prinsip Dasar BootLoader

Karena kita ingin mengimplementasikan program BootLOader untuk STM32, pertama-tama kita harus memahami prinsip-prinsip dasar program BootLOader.

Seperti yang kita ketahui, program BootLoader harus berfungsi sebagai panduan sistem, yang merupakan fungsi dasar dari program BootLoader. Untuk MCU seri STM32, program akan dijalankan dari alamat awal memori Flash internal setelah sistem dimulai. Kemudian masuk ke program aplikasi dan menjalankannya sesuai urutan yang telah ditetapkan. Pada saat ini, BootLoader dan program aplikasi terintegrasi, seperti yang ditunjukkan pada gambar:

BootLoader and APP start independently
BootLoader and APP start independently

Namun, terkadang kita tidak ingin aplikasi tersebut langsung dijalankan, misalnya saat kita ingin mengimplementasikan IAP untuk sistem; atau kita tidak ingin aplikasi tersebut berjalan di memori Flash internal; atau aplikasi tersebut berjalan di memori Flash internal, tetapi kita ingin aplikasi tersebut dijalankan dari alamat memori Flash internal yang kita tentukan, dan sebagainya. Pada saat-saat seperti ini, kita memerlukan program BootLoader terpisah. Sistem terlebih dahulu menjalankan program BootLoader, dan masuk ke eksekusi program aplikasi setelah sistem siap, seperti yang ditunjukkan pada gambar:

BootLoader and APP run at the same time (APP is stored in internal Flash)
BootLoader and APP run at the same time (APP is stored in internal Flash)

Pada gambar di atas, kita sebenarnya menyimpan aplikasi di lokasi tertentu pada memori Flash internal, yang tentunya bertujuan untuk memenuhi beberapa kebutuhan kita, seperti pembelian dalam aplikasi (IAP). Tentu saja, kita juga dapat menyimpan program aplikasi di memori Flash eksternal, dan kemudian program BootLoader akan berpindah ke memori Flash eksternal untuk menjalankan program aplikasi tersebut, namun hal ini bergantung pada ketersediaan program eksekusi di memori Flash eksternal. Prosesnya secara spesifik adalah sebagai berikut:

BootLoader and APP run at the same time (APP is stored in external Flash)
BootLoader and APP run at the same time (APP is stored in external Flash)

Tentu saja, ini hanyalah sebuah contoh, dan kita hanya perlu mengubah alamatnya sesuai dengan memori yang digunakan. Adapun fungsi-fungsi yang akan diimplementasikan dalam program BootLoader, hal itu bergantung pada penggunaannya. Pada dasarnya, kita dapat menambahkan fungsi apa pun yang diinginkan, seperti deteksi perangkat keras, pembaruan sistem, dan sebagainya.

Desain BootLoader untuk STM32

Perencanaan Cepat

Kami menggunakan STM32F407IGT6 sebagai MCU target, yang memiliki memori Flash sebesar 1 MB dan SRAM sebesar 192 KB. Kami membagi memori Flash menjadi dua bagian, yaitu area program boot (0x0800 0000 – 0x0800 3FFF) dengan ukuran 16 KB, dan sisanya adalah area program aplikasi (0x0800 4000 – 0x080F FFFF). Distribusi spesifiknya adalah sebagai berikut:

Flash Division of MCU - Bootloader and APP
Flash Division of MCU - Bootloader and APP

Kami mengalokasikan ruang penyimpanan sebesar 16K untuk program BootLoader. Namun, program tersebut dapat mengakses seluruh ruang penyimpanan Flash.

Struktur BootLoader

Mari kita bahas struktur program BootLoader. Tujuan utama dari desain program BootLoader ini adalah untuk melakukan pembaruan program aplikasi. Lalu, apa saja fungsi utama yang perlu diimplementasikan dalam program BootLoader? Ada beberapa aspek yang harus dimasukkan. Salah satunya adalah konfigurasi dasar, seperti pengaturan jam, dll., yang kita implementasikan dalam program utama; yang lainnya adalah pengoperasian Flash, dan kita pasti akan memeriksa serta menulis data ke Flash saat melakukan pembaruan program aplikasi; ini adalah program pengendali lompatan, kita perlu menjalankan program aplikasi pada akhirnya, dan fungsi lompatan sangatlah penting. Tentu saja, mungkin ada kebutuhan lain sesuai dengan kebutuhan yang berbeda. Secara spesifik seperti yang ditunjukkan pada gambar di bawah ini:

BootLoader Program Functions
BootLoader Program Functions

Pada gambar di atas, selain tiga implementasi dasar penandatanganan, kami juga menambahkan fungsi untuk memperoleh berkas IAP. Bagian fungsi ini juga diperlukan, namun mungkin terdapat perbedaan yang signifikan antar mode yang berbeda. Hal ini karena cara memperoleh berkas dapat melalui berbagai jenis komunikasi, seperti port Ethernet, port serial, dan sebagainya. Selain itu, berkas juga dapat disimpan pada berbagai jenis media penyimpanan, seperti kartu SD, flash disk, dan sebagainya. Oleh karena itu, meskipun fungsi ini esensial, metode implementasinya sangat fleksibel. Dalam implementasi selanjutnya, kami akan menganalisis masalah-masalah spesifik secara rinci.

Implementasi BootLoader

Sekarang, kita telah menentukan pembagian bagian-bagian Flash dan memahami alur kerja dasar BootLoader. Selanjutnya, saya akan membahas cara mengimplementasikan program BootLoader.

Pengkodean BootLoader

Kita tahu bahwa ketika chip dinyalakan, chip tersebut akan menjalankan program BootLoader terlebih dahulu, lalu beralih ke area program aplikasi untuk menjalankan program aplikasi tersebut. Oleh karena itu, saat kami menulis program BootLoader, kami terlebih dahulu memeriksa apakah sistem memiliki persyaratan IAP. Jika ada permintaan IAP, sistem akan masuk ke mode IAP. Setelah selesai, sistem akan melompat ke program aplikasi untuk dieksekusi. Jika tidak ada permintaan IAP, sistem akan langsung melompat ke program aplikasi untuk dieksekusi. Proses spesifiknya adalah sebagai berikut:

Flow Chart of IAP Mode in BootLoader Operation
Flow Chart of IAP Mode in BootLoader Operation

Mengenai pemrosesan IAP, akan ada metode pemrosesan yang berbeda-beda tergantung situasinya. Di sini, kita akan fokus membahas program kontrol lompatan. Pertama-tama, tentukan alamat awal aplikasi dan nyatakan tipe penunjuk fungsi. Rinciannya sebagai berikut:

				
					#define ApplicationAddress 0x08004000 //Application first address definition

typedef void (*pFunction)(void); //Define the jump function pointer type
				
			

Beberapa orang mungkin bertanya apa yang mendefinisikan tipe penunjuk fungsi tersebut, karena pada akhirnya kita melompat ke fungsi Reset_Handler, sehingga kita harus memiliki penunjuk fungsi yang dapat menunjuk ke fungsi tersebut. Selanjutnya, kita dapat mengimplementasikan program lompat tersebut.

				
					/*jump to application processing function*/
static void JumpToApplication(void)
{
   uint32_tStackAddr; //Application stack address
   uint32_tResetVector; //The address of the application interrupt vector table
 
   pFunctionJumpToApp; //Define the jump function pointer
 
  __set_PRIMASK(1); //Turn off global interrupt
 
   StackAddr= *(__IO uint32_t*)ApplicationAddress; //0x08004000;
  ResetVector = *(__IO uint32_t*)(ApplicationAddress + 4); //0x08004004;
 
  if((StackAddr&0x2FFC0000)==0x20000000) //Check whether the stack top address is legal.
   {
    __set_MSP(StackAddr); //Initialize the application stack pointer
 
    JumpToApp = (pFunction)ResetVector;
    JumpToApp();
   }
}
				
			

Pemrosesan Aplikasi

Setelah memahami kode BootLoader, jika kita ingin aplikasi dapat berjalan dengan benar, kita perlu memodifikasi aplikasi tersebut sesuai kebutuhan. Ada dua perubahan penting. Jika aplikasi tersebut merupakan program bare-metal, kita perlu mengaktifkan midrange global sebelum mengonfigurasi jam.

				
					/*Enable global interrupt, closed in BootLoader*/
 __set_PRIMASK(0);
				
			

Pada saat yang sama, alamat offset dari tabel vektor mid-end juga perlu diubah. Untuk STM32F07 yang kita gunakan, perubahan tersebut dapat dilakukan langsung pada berkas system_stm32f4xx.c.

				
					#define VECT_TAB_OFFSET  0x4000 /*!< Vector Table base offsetfield.
				
			

Selanjutnya, kita juga perlu melakukan penyesuaian yang diperlukan pada lingkungan pengembangan, dengan mengambil IAR EWARM V8.4 yang kita gunakan sebagai contoh. Sesuaikan pengaturan tabel vektor interupsi dan area penyimpanan Flash dalam berkas icf. Rinciannya adalah sebagai berikut:

Linker configuration file editor - Vector Table
Linker configuration file editor - Vector Table
Linker configuration file editor - Memory Regions
Linker configuration file editor - Memory Regions

Setelah menyelesaikan konfigurasi di atas, kita dapat mengunduh program aplikasi dan program BootLoader untuk memastikan proses booting berjalan dengan benar.

Ringkasan

Dalam artikel ini, kami baru saja mengimplementasikan program BootLoader sederhana. Setelah diunduh ke MCU target, lompatan (jump) berhasil dilakukan, dan program aplikasi juga berjalan dengan normal, yang menunjukkan bahwa desain kami benar, dan berbagai fungsi dapat ditambahkan berdasarkan hal ini untuk merealisasikan aplikasi IAP yang sesuai.

Perlu diperhatikan bahwa kami telah menonaktifkan interupsi global dalam program BootLoader, dan ingatlah untuk mengaktifkan interupsi global sebelum aplikasi menginisialisasi jam sistem, jika tidak, SystemTick tidak dapat berfungsi dan akan terjadi kesalahan perangkat keras (hardfault). Namun, jika aplikasi berjalan pada RTOS, mengaktifkan interupsi mungkin tidak tepat, sehingga hal ini perlu diperhatikan.

Berlangganan

Daftar ke milis kami untuk mendapatkan pembaruan blog bulanan, berita teknologi, dan studi kasus. Kami tidak akan pernah mengirimkan spam, dan Anda dapat berhenti berlangganan kapan saja.

Scroll to Top

Instant Quote