Mode bootloader STM32 DFU menggunakan CubeMX. Petunjuk langkah demi langkah

Jadi, pekerjaan mandrigal ini didorong oleh ketiadaan instruksi langkah-demi-langkah yang hampir lengkap menggunakan alat yang biasa ditawarkan oleh STMicroelectronics.

Sejumlah besar bootloader yang ditemukan di jaringan, kadang-kadang sangat sibuk, sayangnya "dipertajam" untuk kristal tertentu.

Materi yang diusulkan berisi prosedur untuk menggunakan paket CubeMX, "bootloader" DfuSeDemo dan utilitas persiapan firmware manajer file Dfu, yaitu, kami abstrak Daftar Keinginan kami dari perangkat keras, maafkan assembler makro dan guru lembar data.

Memasak lingkungan ...

Kita perlu CubeMX sendiri, unduhan file manager DfuSeDemo + Dfu, semuanya dalam paket yang sama, STM32 ST-LINK Utility, kami menemukan semuanya di situs web STMicroelectronics gratis.

Tongkat eksperimental kami dengan chip STM32F103C8T6 Paman Liao

gambar

dan programmer ST-Link dari sana.

gambar

Nah, IDE favorit Anda, dalam presentasi khusus ini kami menggunakan KEIL, pengaturan kompilasi di IDE lain tidak jauh berbeda.

Jadi ayo pergi ...

Luncurkan CubeMX dan pilih kristal Anda ...

gambar

Rayakan Wishlist Anda ...

gambar

Dalam tugas khusus ini, kami mengaktifkan perangkat USB โ†’ Device FS dan, dengan demikian, Perangkat USB โ†’ DownLoad Memperbarui kelas Firmware, dan RCC yang tak terlupakan โ†’ Jam Kecepatan Tinggi โ†’ Cristal / Ceramic Resonator adalah yang ada di papan.

Selanjutnya, pilih sakelar mode bootloader-a, dalam contoh ini, cukup gunakan jumper boot1 yang ada.

gambar

Kami melihat skema kecil dan, sesuai dengannya, boot1 dilampirkan ke kaki PB2, jadi kami menggunakannya dalam mode GPIO_Input.

Selesai, aktifkan tab Konfigurasi Jam dan mulai mesin pemilihan konfigurasi.

gambar
Lompat ke tab Cofiguration ...

gambar

Pilih tombol GPIO ...

gambar

Dan di lapangan ...

gambar
tulis label khusus, biarlah boot1.

Selanjutnya, siapkan proyek ...

gambar

Pilih Proyek โ†’ Pengaturan ...

gambar

Pilih dan isi ....

gambar

Oleh karena itu, kami memilih IDE Cub yang akan kami buat proyeknya, dalam kasus kami, MDK-ARM V5.

Tab Pembuat Kode dalam perwujudan ini akan tetap tidak berubah ...

gambar

Nah, itu saja, kami memulai pembuatan proyek Project โ†’ Generate Code

gambar

Pada akhirnya, Cub akan meminta Anda untuk segera meluncurkan IDE Anda ... apa yang harus Anda lakukan.

gambar

gambar

Kami memulai kompilasi dan perakitan dan memuat ke dalam kristal ... F7, F8 ...

gambar

Hasil akhirnya ...

Kami mengganti pin di papan kami ke mode operasi dan menghubungkan kabel USB ...

gambar

gambar

Buka panel kontrol di Windows โ†’ sistem โ†’ manajer perangkat โ†’ USB controller. Dan lihat daftar perangkat, Windows akan sedikit berbunyi dan menginstal Perangkat STM di driver Mode DFU (jika belum).

Jadi, pengemudi bangkit dan memutuskan, mulai "boot" DfuSeDemo ...

gambar

Kami melihat apa yang kami tangkap Perangkat DFU dan klik dua kali pada bidang Pilih Target ...

gambar

Kami dengan hati-hati melihat dan mengagumi bahwa kilat hingga alamat 0x0800C000 ditutup untuk penulisan dan kami menulis alamat ini, kami membutuhkannya ...

Ngomong-ngomong, saya mencobanya di STM32F407VE, di mana memori terbuka untuk merekam dari 0x08000000, yaitu, sejak awal ... mengapa, dalam versi kami, tidak jelas, tidak menggali, dikubur di suatu tempat, tetapi jelas tidak ditulis, tidak ada tertulis, karena sebagian besar menghilang tanpa pemilik ... mungkin seseorang akan memberi tahu Anda di mana untuk menggali ...

Jadi, "potongan rambut baru saja dimulai" ...

Kami hanya membutuhkan dua file sumber ...

gambar

Kami membukanya di IDE dan kami benar, kami menambahkan ...

Kami memperhitungkan bahwa CubeMX TIDAK BERSAMA ketika membuat ulang insert antara USER CODE BEGIN dan USER CODE END ... di sana kami akan memasukkan tambahan kami ...

Mari kita mulai dengan main.c

/* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ typedef void (*pFunction)(void); pFunction JumpToApplication; uint32_t JumpAddress; /* USER CODE END PV */ . . . /* USER CODE BEGIN 0 */ uint32_t AddressMyApplicationBegin = 0x0800C000; uint32_t AddressMyApplicationEnd = 0x0800FBFC; /* USER CODE END 0 */ . . . /* USER CODE BEGIN 2 */ /* Check if the KEY Button is pressed */ if(HAL_GPIO_ReadPin(boot1_GPIO_Port, boot1_Pin ) == GPIO_PIN_SET) { /* Test if user code is programmed starting from address 0x0800C000 */ if (((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4); JumpToApplication = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD); JumpToApplication(); } } MX_USB_DEVICE_Init(); /*      */ /* USER CODE END 2 */ . . . 

itu saja dengan main.c ...

buka usbd_conf.h dan ke

 #define USBD_DFU_APP_DEFAULT_ADD 0x0800000 

ingatkan ...

 #define USBD_DFU_APP_DEFAULT_ADD 0x080C000 //     โ€ฆ 

kita beralih ke usbd_dfu_it.c, di sini lebih lanjut ....

 . . . /* USER CODE BEGIN PRIVATE_TYPES */ extern uint32_t AddressMyApplicationBegin; extern uint32_t AddressMyApplicationEnd; /* USER CODE END PRIVATE_TYPES */ . . . /* USER CODE BEGIN PRIVATE_DEFINES */ #define FLASH_ERASE_TIME (uint16_t)50 #define FLASH_PROGRAM_TIME (uint16_t)50 /* USER CODE END PRIVATE_DEFINES */ . . .   ,    ยซยป  โ€ฆ uint16_t MEM_If_Init_FS(void) { /* USER CODE BEGIN 0 */ HAL_StatusTypeDef flash_ok = HAL_ERROR; //   while(flash_ok != HAL_OK){ flash_ok = HAL_FLASH_Unlock(); } return (USBD_OK); /* USER CODE END 0 */ } . . . uint16_t MEM_If_DeInit_FS(void) { /* USER CODE BEGIN 1 */ HAL_StatusTypeDef flash_ok = HAL_ERROR; //  flash_ok = HAL_ERROR; while(flash_ok != HAL_OK){ flash_ok = HAL_FLASH_Lock(); } return (USBD_OK); /* USER CODE END 1 */ } . . . uint16_t MEM_If_Erase_FS(uint32_t Add) { /* USER CODE BEGIN 2 */ uint32_t NbOfPages = 0; uint32_t PageError = 0; /* Variable contains Flash operation status */ HAL_StatusTypeDef status; FLASH_EraseInitTypeDef eraseinitstruct; /* Get the number of sector to erase from 1st sector*/ NbOfPages = ((AddressMyApplicationEnd - AddressMyApplicationBegin) / FLASH_PAGE_SIZE) + 1; eraseinitstruct.TypeErase = FLASH_TYPEERASE_PAGES; eraseinitstruct.PageAddress = AddressMyApplicationBegin; eraseinitstruct.NbPages = NbOfPages; status = HAL_FLASHEx_Erase(&eraseinitstruct, &PageError); if (status != HAL_OK) { return (!USBD_OK); } return (USBD_OK); /* USER CODE END 2 */ } . . . uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len) { /* USER CODE BEGIN 3 */ uint32_t i = 0; for(i = 0; i < Len; i+=4) { /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by byte */ if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest+i), *(uint32_t*)(src+i)) == HAL_OK) { // Usart1_Send_String("MEM_If_Write_FS OK!"); /* Check the written value */ if(*(uint32_t *)(src + i) != *(uint32_t*)(dest+i)) { /* Flash content doesn't match SRAM content */ return 2; } } else { /* Error occurred while writing data in Flash memory */ return (!USBD_OK); } } return (USBD_OK); /* USER CODE END 3 */ } . . . uint8_t *MEM_If_Read_FS (uint8_t *src, uint8_t *dest, uint32_t Len) { /* Return a valid address to avoid HardFault */ /* USER CODE BEGIN 4 */ uint32_t i = 0; uint8_t *psrc = src; for (i = 0; i < Len; i++) { dest[i] = *psrc++; } return (uint8_t*)(dest); /* ,     */ /* USER CODE END 4 */ } . . . uint16_t MEM_If_GetStatus_FS (uint32_t Add, uint8_t Cmd, uint8_t *buffer) { /* USER CODE BEGIN 5 */ switch (Cmd) { case DFU_MEDIA_PROGRAM: buffer[1] = (uint8_t)FLASH_PROGRAM_TIME; buffer[2] = (uint8_t)(FLASH_PROGRAM_TIME << 8); buffer[3] = 0; break; case DFU_MEDIA_ERASE: default: buffer[1] = (uint8_t)FLASH_ERASE_TIME; buffer[2] = (uint8_t)(FLASH_ERASE_TIME << 8); buffer[3] = 0; break; } return (USBD_OK); /* USER CODE END 5 */ } 

Sebenarnya itu saja ...

Kami menghubungkan programmer, melempar jumper ke mode pemrograman, F7, F8 dan botloader direkam ...

Bisakah saya menggunakan ...

Sekarang kita akan menyiapkan aplikasi untuk memuat melalui bootloder ...
Aplikasi favorit akan berkedip LED ...

Kami menyiapkan dan men-debug aplikasi, dan mengubah masing-masing tempat di kompiler dan badan program untuk mengubah alamat peluncuran program dan mengganggu vektor ...

Yaitu di KEIL โ†’ Konfigurasi โ†’ Alat Flash

gambar

Ubah alamat awal program ...

gambar

Kami mengatakan untuk menghasilkan file HEX

gambar

dan ubah alamat tabel vektor ...

mengumpulkan program F7 ...

mengkonversi HEX yang diterima menjadi file dfo menggunakan utilitas manajer file Dfu ...

gambar

pilih file HEX kami dengan tombol S19 atau HEX ... dan klik Hasilkan ...

gambar

kami mendapatkan file dfu.

Sebenarnya semuanya sudah siap.

Memuat ke pengontrol ...

Kami menghubungkan papan eksperimental kami dengan botloader yang sudah dimuat ke USB, setelah mengatur jumper ke Mode DFU.

gambar

Anda dapat mengontrol tampilan Perangkat STM dalam Mode DFU dalam daftar perangkat.
jalankan "bootloader".

gambar
katakan padanya file dfu kami ...

gambar

Kami menekan Upgrade dan kami amati hasil pemuatan ... untuk kepercayaan diri, kami tekan cek.

gambar

semuanya berhasil ... Anda dapat menjalankan ...

jika kesalahan keluar, itu berarti suatu tempat ...

gambar

misalnya ...

Jadi, kami akan menganggap bahwa semuanya berhasil ... alihkan jumper ke mode aplikasi

gambar

dan nikmati diode yang berkedip ...
...
Uhhhh Begitu banyak bukoffff. Bosan menyalin foto :-)

Terima kasih atas perhatiannya ...

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


All Articles