概念:计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是1个字节,
1个存储单元存放1个字节,每个存储单元对应一个32位(bit)地址,所以重要的话说三遍:对于32bit的ARM CPU
一个32位地址指向1个字节!!! 一个32位地址指向1个字节!!! 一个32位地址指向1个字节!!!
我们常说的flash空间,多少多少K,指的是多少多少K byte
假如我们执行下面的函数操作:
FlashWriteWord_P(0x1082,&WordVar); /* 向0x1082、0x1083中写入0xABCD */
经过编译,从map文件查看flash内容如下:
注意,前面的1080是十六进制,所以从0x1080到0x1090,共16个地址跨越,因为还有0x108A....0x108F
从这个map中,我们能发现一些问题
(1)验证了一个32位地址存放的是1个字节。
(2)将一个16位数,也就是2个字节,存放的顺序是低字节在前,高字节在后,这个跟感官上不一样。
(3)未存放数据的闪存单元是0xFF,这个不是巧合,因为flash说到底,内部也是只有1和0两种状态,CPU默认都是1.
另外,一个潜规定,向Flash中写数据,起始地址最好是偶数,否则容易出现错误,所以:
可以在0x1080、0x1081中存放一个uint16_t类型的数据;
可以在0x1082、0x1083中存放一个uint16_t类型的数据;
但是不能在0x1081、0x1082中存放一个uint16_t类型的数据。
从上可以看出,数据在flash中存放顺序是低在前,高在后,那么读flash时呢,答案是,会再反转,高在前,低在后,因为读flash必须一次至少读16位,不太允许读8位,所以正好又反过来了。
在编程时,要注意给要分配要存储的内容地址,每个数据对应地址,都是偶数,因为1个数据要占用2个地址。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』