繁体   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