我正在尝试通过解析通过 UART 发送的十六进制文件将数据闪存到我的闪存中。但是擦除闪存后,我无法写入。这是我的代码:
擦除闪存的代码:
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR | FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR |FLASH_FLAG_PGSERR);
/* Get the 1st page to erase */
FirstPage = ADDR_FLASH_PAGE_12;
/* Get the number of pages to erase from 1st page */
NbOfPages = 243;
/* Get the bank */
BankNumber = FLASH_BANK_1;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = BankNumber;
EraseInitStruct.Page = FirstPage;
EraseInitStruct.NbPages = NbOfPages;
HAL_FLASHEx_Erase(&EraseInitStruct,&PAGEError);
写入闪存的代码:
uint64_t flashData = 0;
uint32_t flashWriteAddress = (extendedAddress | recordAddress | k);
nibbleArrayToUInt64(&data[recordDataOffset],(uint32_t)i); //convert nibble[] to uint64_t and store in flashData
CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,flashWriteAddress,(uint64_t)flashData);
将半字节数组转换为 uint64_t 的代码:
void nibbleArrayToUInt64(uint8_t* var, uint32_t lowest_pos)
{
uint8_t byte;
flashData = 0;
for(int j=0;j<16;j+=2)
{
byte = (((uint64_t)(var[lowest_pos+j]<<4 | var[lowest_pos+j+1])));
flashData |= (((uint64_t)byte) << (8*(7-(j/2))));
}
}
触发的错误标志是:
HAL_FLASH_ERROR_PROG
HAL_FLASH_ERROR_PGA
HAL_FLASH_ERROR_PGS
我不知道我在做什么错误。有人可以帮我吗?
答案 0 :(得分:0)
您应该在擦除或写入之前解锁闪存。例如:
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.Banks = 0;
pEraseInit.NbSectors = 1;
pEraseInit.Sector = FLASH_SECTOR_2;
pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
uint32_t sectorError;
HAL_FLASHEx_Erase(&pEraseInit, §orError);
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, VERSION_SAVE_ADDRESS, version);
HAL_FLASH_Lock();