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