私は STM32F401VCT6U 「ディスカバリー」ボードを使用しており、ユーザーが実行時にメモリにアドレスを書き込む方法を提供する必要があります。
次の関数に簡略化できるものを書きました。
uint8_t Write(uint32_t address, uint8_t* values, uint8_t count)
{
uint8_t index;
for (index = 0; index < count; ++index) {
if (IS_FLASH_ADDRESS(address+index)) {
/* flash write */
FLASH_Unlock();
if (FLASH_ProgramByte(address+index, values[index]) != FLASH_COMPLETE) {
return FLASH_ERROR;
}
FLASH_Lock();
} else {
/* ram write */
((uint8_t*)address)[index] = values[index]
}
}
return NO_ERROR;
}
上記で、address
はベースアドレス、values
は少なくともcount
メモリに書き込むバイトと書き込むバイト数を含むサイズのバッファですcount
。
さて、私の問題は次のとおりです。上記の関数がaddress
フラッシュ内のベースで呼び出されcount=100
、最初の数回は正常に動作し、渡されたvalues
バッファがフラッシュに書き込まれます。ただし、これらの最初の数回の呼び出しの後、私はもう値を書き込むことはできません: フラッシュの値のビットをリセットすることしかできません。任意の値への 0x00 は成功します (ただし、後でアドレスに他の値を書き込むことはできません)。
base を変更することで、フラッシュ内の他のアドレスに正常に書き込むことができますがaddress
、これも数回 ( を使用して 2 回または 3 回呼び出しますcount=100
) だけです。
この動作は、フラッシュの最大書き込み回数に達したことを示唆していますが、それほど高速になるとは思えません。枯渇する前に、少なくとも10,000回の書き込みが予想されます。それで、私は何を間違っていますか?