擦除方式:1 页擦除 2 全片擦除
en_result_t WriteConfigToFlash(SubDeviceNode_t* sSubNode)
{
uint32_t point = 0;
uint16_t crc16 = 0 ;
char i = 0;
en_result_t ret = Ok;
FlashEraseSector();
point += 2;
point += 2;
for(i = 0; i < MAX_SUB_NODE; i++)
{
ret = Flash_WriteWord((uint32_t)(CONFIG_ADDRESS+point), sSubNodeDev[i].subNodeId);
point += 4;
}
for(i = 0; i < sizeof(gMqttIP); i++)
{
Flash_WriteByte((uint32_t)(CONFIG_ADDRESS+point),gMqttIP[i]);
point++;
}
for(i = 0; i < sizeof(gMqttTopic); i++)
{
Flash_WriteByte((uint32_t)(CONFIG_ADDRESS+point), gMqttTopic[i]);
point++;
}
for(i = 0; i < sizeof(gMqttUser); i++)
{
Flash_WriteByte((uint32_t)(CONFIG_ADDRESS+point), gMqttUser[i]);
point++;
}
for(i = 0; i < sizeof(gMqttPassword); i++)
{
Flash_WriteByte((uint32_t)(CONFIG_ADDRESS+point), gMqttPassword[i]);
point++;
}
Flash_WriteHalfWord((uint32_t)(CONFIG_ADDRESS+point), gMqttPort);
point += 2;
for(i = 0; i < sizeof(gMqttClientId); i++)
{
Flash_WriteByte((uint32_t)(CONFIG_ADDRESS+point), gMqttClientId[i]);
point++;
}
//Printf("gImei=%s\n",gImei);
for(i = 0; i < sizeof(gICCID); i++)
{
Flash_WriteByte((uint32_t)(CONFIG_ADDRESS+point), gICCID[i]);
point++;
}
ret = Flash_WriteHalfWord((uint32_t)(CONFIG_ADDRESS), point);
crc16 = CRC16_Modbus(0xFFFF, (unsigned char*)CONFIG_ADDRESS, point);
ret = Flash_WriteHalfWord((uint32_t)(CONFIG_ADDRESS+point), crc16);
Printf("Write Flash point=%d crc16=0x%04x ret=%d\n",point, crc16, ret);
return ret;
}
/**
*****************************************************************************
** \brief FLASH 字写
**
** 用于向FLASH写入1个字的数据.
**
** \param [in] u32Addr Flash地址
** \param [in] u32Data 1个字数据
**
** \retval Ok 写入成功.
** \retval ErrorInvalidParameter FLASH地址无效
** \retval ErrorTimeout 操作超时
*****************************************************************************/
en_result_t Flash_WriteWord(uint32_t u32Addr, uint32_t u32Data)
{
en_result_t enResult = Ok;
volatile uint32_t u32TimeOut = FLASH_TIMEOUT_PGM;
if (FLASH_END_ADDR < u32Addr)
{
enResult = ErrorInvalidParameter;
return (enResult);
}
//busy?
u32TimeOut = FLASH_TIMEOUT_PGM;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 解锁
Flash_UnlockAll();
//set OP
u32TimeOut = FLASH_TIMEOUT_PGM;
while(Program != M0P_FLASH->CR_f.OP)
{
if(u32TimeOut--)
{
FLASH_BYPASS();
M0P_FLASH->CR_f.OP = Program;
}
else
{
return ErrorTimeout;
}
}
//write data
*((volatile uint32_t*)u32Addr) = u32Data;
//busy?
u32TimeOut = FLASH_TIMEOUT_PGM;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 加锁
Flash_LockAll();
return (enResult);
}
当出现无法把数据 写入内存时可从这几个方面查