打印
[STM32F1]

咨询STM32 FLASH模拟EEPROM问题

[复制链接]
1163|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

粉丝