硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4387|回复: 1
收起左侧

[有问必答] 开发板例程FLASH模拟EEPROM的代码问题

[复制链接]

62

主题

77

回帖

263

积分

高级会员

积分
263
发表于 2015-11-17 18:11:50 | 显示全部楼层 |阅读模式
/*
*********************************************************************************************************
*    函 数 名: 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;
        }        
    }

    /* 按字节模式编程(为提高效率,可以按字编程,一次写入4字节) */
    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,超出了数组上限将出错。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116767
QQ
发表于 2015-11-17 18:23:58 | 显示全部楼层
是的,修改下的话就更完善些了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-7-5 22:00 , Processed in 0.234268 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表