nevergiveupzhao 2023-02-18 10:22 采纳率: 100%
浏览 33
已结题

flash跨页写入出现问题

int WriteFlashAcrossPages(unsigned int addr, unsigned char *buf, unsigned int len)
{
#define PAGE_SIZE 256

unsigned int i,j,k;//用于循环的计数器
unsigned int page_num;
unsigned int page_offset;
unsigned int page_addr;
unsigned int endpage_addr;
unsigned int page_remain;
unsigned int buf_offset;
unsigned int buf_remain;
unsigned int page_buf[PAGE_SIZE];//用于存储读取的页数据

page_offset = addr % PAGE_SIZE;             //页内待写入数据的起始偏移量
page_remain = PAGE_SIZE - page_offset;      //当前页剩余可写入空间
page_num = (len-page_remain) / PAGE_SIZE+1;              //循环进行次数(首页加上完整页数)
page_addr=addr-page_offset;                 //起始地址所在页的首地址
endpage_addr=page_addr+PAGE_SIZE*page_num;//最后一页的首地址,条件为真说明跨两页,条件为假说明跨多页(len-page_remain)<=PAGE_SIZE? page_addr+PAGE_SIZE :
buf_offset = 0;                             //待写入数据在buf中的起始偏移量
buf_remain = len;                           //待写入数据的剩余长度,随着写入数据,len不断减小


// 写入数据
for (i = 0; i < page_num; i++)
{
    // 读取页数据
    FlashAddr_read(page_addr, page_buf, PAGE_SIZE);
    // 拷贝数据
    //memcpy(page_buf + page_offset, buf + buf_offset, page_remain);//string.h中定义的,从"buf + buf_offset"位置开始拷贝"page_remain"个字节到"page_buf + page_offset"位置开始的地址中,第一个参数是目标地址,第二个参数是源地址,第三个参数是拷贝的字节数。
    for (j = 0; j < page_remain; j++)
    {
    *(page_buf + page_offset + j) = *(buf + buf_offset + j);
    }
    // 写入页数据
    FlashAddr_program(page_addr, page_buf, PAGE_SIZE);
    // 更新参数
    page_addr += PAGE_SIZE;//下一页的首地址
    buf_offset += page_remain;//buf内的偏移每次要加上写入的数据长度
    buf_remain -= page_remain;//和buf_remain-=buf_offset一样的
    page_offset = 0;//后面所有的页内偏移都是0,因为是写入完整的一页
    page_remain = PAGE_SIZE;//剩余可写入空间也是完整的一页空间
}

// 剩余数据
if (buf_remain > 0)
{
    // 读取页数据
    FlashAddr_read(endpage_addr, page_buf, PAGE_SIZE);
    // 拷贝数据
    //memcpy(page_buf + page_offset, buf + buf_offset, buf_remain);//page_offset=0 ,page_buf + page_offset=pagebuf
    for (k = 0; k < buf_remain; k++)
    {
    *(page_buf + page_offset + k) = *(buf + buf_offset + k);
    }

    // 写入页数据
    FlashAddr_program(endpage_addr, page_buf, PAGE_SIZE);

}

return 0;
}
跨页写入循环只执行了一次,哪里出问题了呢?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-02-18 12:06
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 创建了问题 2月18日

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行