请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CC1312R 大家好!
在我的设计中、我希望外部闪存中有一个 OAD 映像、以及一个备份出厂映像。
我的 OAD 闪存扇区大小为0x80000字节、通过测试、我看到出厂映像和 OAD 映像无法放入此大小的扇区:
上传的图像位于地址范围:0x20000 - 0x60380。
出厂映像位于地址范围:0x37000 - 0x7EC20。
因此、我曾尝试将 OAD 闪存扇区大小从0x80000增大到0x120000、之后我看到创建出厂映像会在需要写入扇区元数据时失败。
uint8_t OADStorage_createFactoryImageBackup(void)
{
uint8_t rtn = OADStorage_Status_Success;
uint8_t status = 0;
uint32_t dstAddr = oadFindFactImgAddr();
uint32_t dstAddrStart = dstAddr;
uint32_t imgStart = _imgHdr.imgPayload.startAddr;
uint32_t imgLen = _imgHdr.fixedHdr.imgEndAddr - (uint32_t)&_imgHdr;
/* initialize external flash driver */
if(flash_open() != 0)
{
// First erase factory image metadata page
if(eraseFlashPg(EXT_FLASH_PAGE(EFL_ADDR_META)) != FLASH_SUCCESS)
{
return OADStorage_FlashError;
}
/* Erase - external portion to be written*/
status = oadEraseExtFlashPages(EXT_FLASH_PAGE(dstAddr),
(_imgHdr.fixedHdr.imgEndAddr - _imgHdr.imgPayload.startAddr -1),
EFL_PAGE_SIZE);
if(status == OADStorage_Status_Success)
{
/* COPY - image from internal to external */
// if(writeFlashPg(dstAddrStart, sizeof(imgHdr_t), (uint8_t *)(imgStart), imgLen) == FLASH_SUCCESS)
if(writeFlash(dstAddr, (uint8_t *)(imgStart), imgLen) == FLASH_SUCCESS)
{
imgHdr_t imgHdr = { .fixedHdr.imgID = OAD_EXTFL_ID_VAL }; /* Write OAD flash metadata identification */
/* Copy Image header from internal flash image, skip ID values */
memcpy( ((uint8_t *)&imgHdr + CRC_OFFSET), ((uint8_t *)imgStart + 8) , OAD_IMG_HDR_LEN);
/*
* Calculate the CRC32 value and update that in image header as CRC32
* wouldn't be available for running image.
*/
imgHdr.fixedHdr.crc32 = CRC32_calc(imgHdr.imgPayload.startAddr, INTFLASH_PAGE_SIZE, 0, imgLen, false);
/* Update CRC status */
imgHdr.fixedHdr.crcStat = CRC_VALID;
/* Update image length */
imgHdr.fixedHdr.len = _imgHdr.fixedHdr.imgEndAddr - (uint32_t)&_imgHdr;
uint32_t *ptr = (uint32_t *)&imgHdr;
/* update external flash storage address */
ptr[OAD_IMG_HDR_LEN/4] = dstAddrStart;
/* Allow application or some other place in BIM to mark factory image as
pending copy (OAD_IMG_COPY_PEND). Should not be done here, as
what is in flash at this time will already be the factory
image. */
imgHdr.fixedHdr.imgCpStat = DEFAULT_STATE;
imgHdr.fixedHdr.imgType = OAD_IMG_TYPE_FACTORY;
/* WRITE METADATA */
if(writeFlash(EFL_ADDR_META, (uint8_t *)&imgHdr, OAD_IMG_HDR_LEN + 8) != FLASH_SUCCESS)
{
rtn = OADStorage_FlashError;
}
} // end of if(writeFlash((dstAddr+4, (uint8_t *)(imgStart +4), (imgLen -4)) == FLASH_SUCCESS)
else
{
rtn = OADStorage_FlashError;
}
}
else // if(extFlashErase(dstAddr, imgLen))
{
rtn = OADStorage_FlashError;
} // end of if(extFlashErase(dstAddr, imgLen))
ExtImageInfo_t metadataHdr={0};
/* Read whole metadata header */
readFlash(0, (uint8_t *)&metadataHdr, EFL_METADATA_LEN);
/* close driver */
flash_close();
} // end of flash_Open
return(rtn);
}
内联:
if (writeFlash (EFL_ADDR_meta、(uint8_t *)&imgHdr、OAD_IMG_HDR_LEN + 8)!= FLASH_SUCCESS)
writeFlash 返回 NVS_STATUS_INV_WRITE、我不明白为什么。