无法写入闪存 - STM32L462

时间:2021-04-01 10:19:39

标签: arm stm32 microcontroller hal flash-memory

我正在尝试通过解析通过 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

我不知道我在做什么错误。有人可以帮我吗?

1 个答案:

答案 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, &sectorError);
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, VERSION_SAVE_ADDRESS, version);
HAL_FLASH_Lock();
相关问题