*********************************************************************************************************
* 函 数 名: bsp_WriteCpuFlash
* 功能说明: 写数据到CPU 内部Flash。
* 形 参: _ulFlashAddr : Flash地址
* _ucpSrc : 数据缓冲区
* _ulSize : 数据大小(单位是字节)
* 返 回 值: 0-成功,1-数据长度或地址溢出,2-写Flash出错(估计Flash寿命到)
*********************************************************************************************************
*/
uint8_t bsp_WriteCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpSrc, uint32_t _ulSize)
{
......
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
/* 需要擦除 */
if (ucRet == FLASH_REQ_ERASE)
{
status = FLASH_ErasePage(bsp_GetSector(_ulFlashAddr));
if (status != FLASH_COMPLETE)
{
return 2;
}
}
/* */
for (i = 0; i < _ulSize / 2; i++)
{
//FLASH_ProgramByte(_ulFlashAddr++, *_ucpSrc++);
usTemp = _ucpSrc[2 * i];
usTemp |= (_ucpSrc[2 * i + 1] << 8);
status = FLASH_ProgramHalfWord(_ulFlashAddr, usTemp);
if (status != FLASH_COMPLETE)
{
break;
}
_ulFlashAddr += 2;
}
/* Flash 加锁,禁止写Flash控制寄存器 */
FLASH_Lock();
__set_PRIMASK(0);
...
}
假设传进来的变量:char[5]={0 };
这个函数接收进来的_ulSize值为5,,即数据为5个字节时候,那么这种保存方式第5个字节将丢失。
如果改:for (i = 0; i < (1_ulSize+1) / 2; i++) 防止最后一个数据丢失,
那么按半字存储近FLASH时候,循环到第三步时候,i=2
usTemp = _ucpSrc[2 * i]; 数组下标=4 (即第5个数据)
usTemp |= (_ucpSrc[2 * i + 1] << 8); 数组下标等于5,超出了数组上限将出错。
大家有没有更合理的存储方式?
|