OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8510|回复: 10

FLASH secpos++;//扇区地址增1

[复制链接]

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
发表于 2013-3-8 11:39:50 | 显示全部楼层 |阅读模式
 

原子大哥,刚学习到FLASH的读写这一章,有个问题,看了两天也没有看明白,如下:
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)  
{
 u32 secpos;
 u16 secoff;
 u16 secremain;   
  u16 i;   
 u8 * SPI_FLASH_BUF;  
    SPI_FLASH_BUF=SPI_FLASH_BUFFER;     
  secpos=WriteAddr/4096;//扇区地址 
 secoff=WriteAddr%4096;//在扇区内的偏移
 secremain=4096-secoff;//扇区剩余空间大小  
  //printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用
  if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
 while(1)
 { 
  SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
  for(i=0;i<secremain;i++)//校验数据
  {
   if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除    
  }
  if(i<secremain)//需要擦除
  {
   SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
   for(i=0;i<secremain;i++)    //复制
   {
    SPI_FLASH_BUF[i+secoff]=pBuffer;  
   }
   SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区 

  }else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.       
  if(NumByteToWrite==secremain)break;//写入结束了
  else//写入未结束
  {
   secpos++;//扇区地址增1      
//上面这句话,是说扇区地址加1,我还是没有理解,按照我的理解,应该是加4096,比如secpos为扇区的首地址(比如:XX0000H),那么当这个扇区写完后,应该是跳转到写下一个扇区,W25Q64上是XX1000H,加1怎么实现的?还是我把这个概念搞混淆了?恳请原子大哥给指导指导,先谢谢原子大哥!

   secoff=0;//偏移位置为0  

      pBuffer+=secremain;  //指针偏移
   WriteAddr+=secremain;//写地址偏移   
      NumByteToWrite-=secremain;    //字节数递减
   if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
   else secremain=NumByteToWrite;   //下一个扇区可以写完了
  } 
 }; 
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-8 12:10:36 | 显示全部楼层
回复【楼主位】zjm_z:
---------------------------------
secpos,是扇区偏移,不是指扇区大小!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

23

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2011-12-29
在线时间
1 小时
发表于 2013-3-8 11:54:37 | 显示全部楼层
 secpos=WriteAddr/4096;//扇区地址
我的理解是每个扇区是4096
扇区加1等于是从上一个扇区的结束地址转到下一个扇区的开始地址
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
 楼主| 发表于 2013-3-8 14:16:48 | 显示全部楼层
回复【2楼】asdbhk:
---------------------------------
兄弟,你从哪里看出secpos为上一个扇区的结束地址?我到觉的secpos应该为扇区的首地址,如我理解有误,请兄弟多多指教。
回复 支持 反对

使用道具 举报

23

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2011-12-29
在线时间
1 小时
发表于 2013-3-8 14:27:45 | 显示全部楼层
回复【4楼】zjm_z:
-------------------------------
是我没说明白
我说的是一个扇区写不下的时候secpos+1  就相当于从上一个扇区的末尾转到下一个扇区的开始接着写
一整个扇区是4096 就像原子老大说的secpos是扇区偏移 从一个扇区移到另一个扇区操作
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
 楼主| 发表于 2013-3-8 14:50:40 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子大哥,secpos+1的本意是指从当前已写完的扇区转移到下一个新的扇区首地址吧(首地址叫法不一定正确),即(secpos+1)*4096为新扇区的首地址吧,这样理解对吗
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
 楼主| 发表于 2013-3-8 14:57:30 | 显示全部楼层
回复【5楼】asdbhk:
---------------------------------
呵呵,谢谢兄弟的帮忙,是我理解错了,现在基本上明白了。
回复 支持 反对

使用道具 举报

34

主题

178

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-11-1
在线时间
183 小时
发表于 2014-5-8 16:41:52 | 显示全部楼层
回复【7楼】zjm_z:
---------------------------------
能不能详细的把你理解的说下吗?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-5-19
在线时间
8 小时
发表于 2017-8-27 15:09:00 | 显示全部楼层
我不明白啊就是,secpos=WriteAddr/4096,,是什么意思啊??
回复 支持 反对

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2020-12-19
在线时间
20 小时
发表于 2021-3-9 20:32:37 | 显示全部楼层
过了这么多年了,谁明白了给说下白
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-2-22
在线时间
6 小时
发表于 2021-8-11 13:29:43 | 显示全部楼层
secpos指的是页,扇区地址加一页(0~~255),每一页是2k
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 02:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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