Untuk konteksnya, saya sedang menulis bootloader untuk STM32H743XI saya karena saya ingin menghapus dan mengunggah kode melalui USB tanpa menggunakan pin.

Jadi bootloader saya mulai dari 0x08000000, ukurannya 21kB (17% dari sektor pertama 128kB), dan saya ingin membaca/menulis data di akhir sektor yang akan dibagikan dengan Aplikasi saya. Ketika saya mengatakan akhir sektor ini adalah 10kB terakhir dari sektor yang berarti saya mulai R/W pada 0x0801D800.

Struktur yang saya ingin R/W adalah 8x32bits karena jika saya mengerti dengan baik ini adalah ukuran KATA pada perangkat STM32H74x/5X.

Ini adalah struktur saya:

typedef struct
{
    int32_t     BootLoaderMode;
    int32_t     StartingPartition;
    int32_t     AppStartingError;
    int32_t     temp4;
    int32_t     temp5;
    int32_t     temp6;
    int32_t     temp7;
    int32_t     temp8;

} ExchangeWord_1;

Saya punya pointer ke struct yang dialokasikan:

ExchangeWord_1* m_ExchangeWord_1 = (ExchangeWord_1*)malloc(sizeof(ExchangeWord_1));

Sebelum menulis saya membuka kunci memori dengan:

HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();

Operasi tulis terlihat seperti (id=0 dan parameter kedua adalah struct yang saya alokasikan):

void writeExchangeWord(uint16_t id, ExchangeWord_1* exchangeWord )
{
   //unlock function

    uint32_t flash_address = (0x0801D800+id*32);
    uint32_t data_address = (uint32_t)exchangeWord;
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, flash_address, data_address);

    //lock function
}

Lalu saya mengunci memori:

HAL_FLASH_Lock();
HAL_FLASH_OB_Lock();

Jadi panggilan pertama ini berfungsi dengan baik dan debugger mengonfirmasinya ketika saya melihat memori:

[Memori flash pada panggilan pertama][1]: https://i.stack.imgur.com/cH9fI.png

Namun pada pemanggilan berikutnya memori terisi 0, lebih aneh lagi pada pemanggilan ketiga banyak kata mulai dari 0x0801D800 yang diisi dengan 0.

Alamat struct saya selaras dengan baik (m_ExchangeWord_1 = 0x20001D60).

Apa yang saya lewatkan? Apakah saya perlu menghapus beberapa tanda sebelum/sesudah menulis?

Terima kasih (=;

0
Yann Kergutuil 6 Mei 2021, 19:12

1 menjawab

Jawaban Terbaik

Ok sepertinya tidak mungkin menulis dua kali berturut-turut di alamat yang sama, saya pernah membaca di suatu tempat bahwa kami hanya mengizinkan untuk beralih sedikit dari 1 ke 0 jika kami ingin menulis beberapa kali tanpa menghapus. Saya memindahkan "area bersama" saya di sektor tertentu yang harus saya hapus setiap kali saya ingin menulis di sana.

Masalah saya terpecahkan.

0
Yann Kergutuil 12 Mei 2021, 09:11