[英]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.