1

STM32F407ボードのフラッシュ メモリにデータを保存しようとしています。それらを保存する前に、メモリ セクタを消去する必要があります。アドレス 0x08004000 で始まる16 キロバイトの Sector1を選択し、電圧範囲 2.1-2.7 Vを選択しました。HAL ライブラリを使用しています。

FLASH->CR |= FLASH_CR_STRT; の後、プログラムは応答を停止します。HAL_FLASHEx_Erase() -> FLASH_Erase_Sector() 関数内の行。

私のせいだと確信していますが、何が悪いのかわかりません。

HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.Sector = FLASH_SECTOR_1;
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_2;
EraseInitStruct.NbSectors = 1;
uint32_t SectorError = 0;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) {     
    HAL_FLASH_Lock();
    return;
}

uint16_t data = 300;
//----------------------------write data
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, start_address, data) != HAL_OK) {
    HAL_FLASH_Lock();
    return;
}
HAL_FLASH_Lock();

選択した電圧範囲またはセクタ数が間違っていませんか?

回答ありがとうございます。

4

2 に答える 2

2

解決策を見つけました。HAL_FLASHEx_Erase() 関数の代わりに HAL_FLASH_Lock() 関数を使用しましたが、正常に動作します。誤ってプログラムを消去していたので、SECTOR も変更しました。

unit32_t address = 0x0800C000;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

FLASH_Erase_Sector(FLASH_SECTOR_3, VOLTAGE_RANGE_3);

//----------------------------write data  
uint8_t data = 'A';
if (HAL_FLASH_Program(TYPEPROGRAM_BYTE, address, data) != HAL_OK) {
    HAL_FLASH_Lock();
    return;
}
HAL_FLASH_Lock();

ご協力いただきありがとうございます。

于 2015-11-16T20:08:26.747 に答える
2

プログラムが 16k より大きい場合は、その一部をフラッシュから消去できたことになります。フラッシュの最後からセクターを選択するか (ただし、消去時間が長くなります)、リンカー構成でセクションを少し再配置する必要があります。

于 2015-11-16T05:52:43.443 に答える