簡體   English   中英

STM32 在 Flash 扇區擦除時崩潰

[英]STM32 Crash on Flash Sector Erase

我正在嘗試將 4 個 uint32 的數據寫入我的 STM32F767ZI 的 flash memory,所以我查看了一些示例和參考手冊,但我仍然無法做到。 我的目標是將 4 個 uint32 寫入 flash 並讀回並與原始數據進行比較,並根據比較的成功點亮不同的 LED。 我的代碼如下:

void flash_write(uint32_t offset, uint32_t *data, uint32_t size) {
    FLASH_EraseInitTypeDef EraseInitStruct = {0};
    uint32_t SectorError = 0;

    HAL_FLASH_Unlock();

    EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
    EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    EraseInitStruct.Sector = FLASH_SECTOR_11; 
    EraseInitStruct.NbSectors = 1;
    //EraseInitStruct.Banks = FLASH_BANK_1; // or FLASH_BANK_2 or FLASH_BANK_BOTH

    st = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);

    if (st == HAL_OK) {
        for (int i = 0; i < size; i += 4) {
            st = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_USER_START_ADDR + offset + i, *(data + i)); //This is what's giving me trouble
            if (st != HAL_OK) {
                // handle the error
                break;
            }
        }
    }else {
        // handle the error
    }
    HAL_FLASH_Lock();
}

void flash_read(uint32_t offset, uint32_t *data, uint32_t size) {
    for (int i = 0; i < size; i += 4) {
        *(data + i) = *(__IO uint32_t*)(FLASH_USER_START_ADDR + offset + i);
    }
}

int main(void) {

    uint32_t data[] = {'a', 'b', 'c', 'd'};
    uint32_t read_data[] = {0, 0, 0, 0};

    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();

    flash_write(0, data, sizeof(data));
    flash_read(0, read_data, sizeof(read_data));

    if (compareArrays(data,read_data,4))
    {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7,SET);
    }
    else
    {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14,SET);
    }

    return 0;
}

問題是,在寫入數據之前,我必須擦除一個扇區,當我使用HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) function 執行此操作時,程序總是崩潰,有時甚至會破壞我的代碼空間,迫使我更新固件。 我選擇了離代碼空間最遠的扇區,但當我試圖擦除它時它仍然崩潰。 我在參考手冊中讀到

在寫入或擦除 Flash memory 時,任何嘗試讀取它都會導致總線停止。 一旦程序操作完成,讀操作就會被正確處理。 這意味着在寫/擦除操作正在進行時無法執行代碼或數據提取。

我認為這意味着當我們在 flash 上運行時,代碼最好從 RAM 運行,但我看到網上的其他人沒有這個問題,所以我想知道這是否是我遇到的唯一問題。 考慮到這一點,我想確認這是我唯一的問題,還是我做錯了什么?

在您的循環中,您將 4 的倍數添加到i ,然后將i添加到data 當您添加到指針時,它會自動乘以指向類型的大小,因此您添加的是 16 字節的倍數並讀取輸入緩沖區的末尾。

另外,請確保初始化EraseInitStruct的所有成員。 取消注釋該行並設置正確的值!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM