[STM32F1] 咨询STM32 FLASH模拟EEPROM问题

[复制链接]
1323|1
 楼主| stm32f103vct6 发表于 2015-11-17 18:30 | 显示全部楼层 |阅读模式
*********************************************************************************************************
*    函 数 名: 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,超出了数组上限将出错。

大家有没有更合理的存储方式?

捉虫天师 发表于 2015-11-17 18:54 | 显示全部楼层
可以试试铁电存储器,富士通做 这个,之前有活动送,我搞了4个芯片,无限次擦写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

66

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部