代码一:
#define Writeflash(addr,dat) *((volatile INT16U *)(addr<<1))=(INT16U)dat
#define Readflash(addr) (*((volatile INT16U *)(addr<<1)))
/*addr为读写操作的半字地址,data则为要写入的半字数据。因为ARM处理器是以字节为单位
进行数据处理的,而SST39VF160是16位数据宽度,所以,addr地址必须左移1位。*/代码二:
//擦除是否为空
int SST39VF160_CheckBlank(INT32U addr,INT32U WordSize)
{
INT32U i,temp;
for (i=addr;i<(addr+WordSize);i++)
{
temp=*((volatile INT16U *)(i<<1)); //地址左移一位,也就得到16位的数据了。
if(temp!=0xffff) //因为扇区被擦除后,扇区的各位都是1.所以判断temp是否等于0xffff //0xffff
return 0; //如果扇区的各个地址都不为0xffff;则返回0
}
return 1;
}
在网上看到这么一段话,我琢磨不透。“S3C44B0X是按照字节编址的,而Flash ROM是以16位为一个存储单元”是怎样推出要“偏移一位”呢?代码一的注释和上一段一样,也没有给出是如何推导出来的。而且代码二中的下面这行代码的注释更是让我不解。前面的i被定义成INT32U 型,怎么通过左移一位就可以得到16的数据呢?恳请各位大侠给出较为详细的解释.
temp=*((volatile INT16U *)(i<<1)); //地址左移一位,也就得到16位的数据了。解答:
关于那个错位,我不知道能不能跟你说清楚。首先,SST39VF16 FLASH是16位的,也就是以两个字节(半字)为最小操作单位的。也就是说你在FLASH地址上给0x00000,则它给出的数据是第一个16位的半字;在FLASH地址上给0x00001,它给出的是第二个16位的半字;在FLASH地址上给0x00002,它给出的是第三个16位的半字。。。但ARM的地址是以字节编址的,它可以以字节单位来读取或者写外设。
假设我们要读取FLASH的第一个字节,LDRB R0,[R1];将R1内容写0x00000,这个时候ARM执行的是这样的操作:
1、送出地址0x00000
2、在D0-D15上读取数据
3、将读到的16位数据的低8位给R0低8位(高24位为0)假设我们要读取FLASH的第二个字节,LDRB R0,[R1];将R1内容写0x00001,
这个时候ARM执行的是这样的操作:
1、送出地址ox00001
2、在D0-D15上读取数据
3、将读到的16位数据的高8位给R0的低8位(高24位为0)从上面的操作可以看到,如果我们一一对应的将ARM和FLASH得地址连接,那么我们想读FLASH的第2个字节的话,就没有办法读到了。因为你地址给0x00001,FLASH就在数据线上给的是第3个字节和第4个字节的数据,并将高8位(FLASH的第4个字节)给R0;如果你给的地址是0x00000的话,ARM的理解就是将数据线D0-D15的低8位给R0,显然这个16位的数据是FLASH的第1个字节和第2个字节的数据,低8位指的就是第一个自己的数据。显然怎么也读不到FLASH的第2个数据。
我们既要遵循ARM的规则,又要让FLASH给我们正确的数据。你自己想应该怎么办?很简单,把ARM给的地址最低位剪掉,把剩下的给FLASH。要读第2个字节,还是送0x00001,但是最后的1被剪掉了,FLASH得到的地址是ox00000,显然给出的数据是第1个和第二个字节。而ARM觉得送出的地址是0x00001啊,应该把高地址给R0啊,即把第2个字节给了R0。就是一个“欺上瞒下”的过程。

为何写flash的时候要地址左移一位?相关推荐

  1. 写flash,要不要加个判断?

    相关文章 既生Flash,又何生EEPROM? 存储器Flash页.扇区.块的区别 这是我一个知识星球朋友的提问 刚开始我没有认真去思考这个问题,之后我仔细查了下资料,里面的内容还挺多. 先看看EMM ...

  2. c# MODBUS协议源码 上/下位机源码烧写Flash工具

    c# MODBUS协议源码 上/下位机源码烧写Flash工具 包含: 1.C#上位机源码 2.上位机源码包含MODBUS协议源码 3.下位机源码 下位机源码采用STM32F10x芯片 的uC/OS-I ...

  3. STM32F4xx系列使用HAL库配置SPI-读写FLASH

    SPI协议简介 SPI物理层特点    SPI协议层 QSPI协议简介 SPI框图 Flash写入与EEPROM有点相似,不同的是FLASH写入需要软件手动擦除,而EEPROM不用 SPI配置流程 1 ...

  4. 小壁虎EFM32如何写Flash实现存储

    概念 ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通 ...

  5. SPI-读写FLASH

    SPI-读写FLASH SPI协议层 ​ SPI协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通讯总线.它广泛地使 ...

  6. TMS320F28335程序烧写FLASH

    DSP TMS320F28335 FLASH烧写 1.检查map文件 在烧写之前,首先检查Debug目录下的.map文件,如果Debug文件下没有,检查其他的文件夹,每个项目中都会有.map文件. 打 ...

  7. s3c4510 烧写flash

    原创:s3c4510 烧写flash(sst39vf3201) 补齐了所有文件 参考其他资料 作者:wangkj 栏目:ARM技术 原创:S3C4510 烧写FLASH(SST39VF3201) 补齐 ...

  8. Adobe Flash Player(Flash播放器)下载地址

    Adobe Flash Player 是一个跨平台.基于浏览器的应用程序运行时,它可以跨浏览器和操作系统.原汁原味地呈现具有表现力的应用程序.内容和视频. Adobe Flash Player(Fla ...

  9. 指针地址左移右移的代码实例

    指针地址左移可以使用C语言中的指针运算符"+"和整型数相乘的方式实现.例如,下面的代码演示了指针地址左移两个字节的操作: #include <stdio.h>int m ...

最新文章

  1. 豆瓣评分 9.0,超 10 万开发者的入门选择,这本经典好书终于升级啦!
  2. 当我们输入一条SQL查询语句时,发生了什么?
  3. 强化学习笔记 DDPG (Deep Deterministic Policy Gradient)
  4. Sentinel-Go 集成 Nacos 实现外部动态数据源
  5. 陕西省天然气行业十四五建设展望及发展战略规划报告2021版
  6. javascript编程风格(粗略笔记)
  7. LeetCode 2058. 找出临界点之间的最小和最大距离(链表)
  8. 图解SQL inner join、left join、right join、full outer join、union、union all的区别
  9. 扑捉和捕捉的区别照相_扑捉和捕捉的区别照相
  10. 第三十六课:告别演出
  11. 查看邮箱号是否存在_腾讯企业邮箱--新版本
  12. 闲着看看jquery.ajax源码
  13. 日置BT3562无法开机怎么办,日常如何进行保养
  14. 地理空间数据和大数据平台Spark结合能做的事情
  15. 【deepin 20.1】终端的介绍
  16. u8系统更改了服务器,用友u8服务器地址修改
  17. 神奇的BUG——MATLAB之1
  18. WebDAV之葫芦儿·派盘+Orgzly
  19. 2020 中国软件 100 强,腾讯第二、阿里第三,第一是谁呢?你们公司上榜了吗?...
  20. buuctf-N1Book[第六章 CTF之PWN章]

热门文章

  1. Cell Stem Cell:研究人员开发出大脑类器官用于研究认知障碍!
  2. 中科院等发布《2017研究前沿》 中国25个前沿表现卓越 居全球第二
  3. 马云出 1000 亿做阿里达摩院:产品卖到全球了,他说科学研究也要跟上
  4. 2020世界机器人大赛总决赛完美闭幕,MakeX挑战赛连续5年成为WRC官方合作赛项
  5. 面试官:因为这个语言,我淘汰了90%的人!!
  6. 贝叶斯定理:AI 不只是个理科生 | 赠书
  7. 可怕!公司部署了一个东西,悄悄盯着你
  8. skyline粒子效果xml获取
  9. Python——cmd调用(os.system阻塞处理)(多条命令执行)
  10. pfsense软路由防火墙(安装过程、L2tp配置)