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

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日

悬赏问题

  • ¥15 ssh登录页面的问题
  • ¥60 渗透一个指定银行app,拿到客户信息,需要什么级别
  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图