为何写flash的时候要地址左移一位?
地址 时候 为何 Flash 一位 左移
2023-09-27 14:28:47 时间
#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;
}
morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。
在网上看到这么一段话,我琢磨不透。“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。就是一个“欺上瞒下”的过程。
morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。
相关文章
- 查看局域网内某个ip的mac地址
- paddlehub官方数据集查看地址
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- VMware-Fusion-7.0.0-2103067 Pro SN:序列号+ 百度云下载地址
- ubuntu Server 设置主机静态 ip地址
- 通过jS(javascript)获取到WEB地址传参!
- webpack配置接口地址代理
- UA-DETRAC BITVehicle车辆检测数据集(含下载地址)
- ASLR(Address space layout randomization)地址空间布局随机化
- 华为eNSP配置DHCP排除地址
- android studio下载地址
- 微信开发者工具可以获取地址而手机上不能获取地址
- iOS开发 - 仿京东添加收货地址效果
- PCF8574AT的I2C地址和单独IO操作
- C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别
- NAT+PAT+OSPF+设备互连地址详解
- NSA开发的工控ICS/SCADA态势感知开源工具Grassmarlin(附下载地址)