单片机IAP编程相关疑问
刚刚接触这个东西,着实不会,看别人的代码发现写flash使用到了什么IAP命令字,然而读的时候直接用memcpy(缓冲区,读取地址,长度)。顿感疑惑,望高手解答一下,谢谢了,如果有好的链接,也麻烦发一下吧。
[解决办法]
RAM的特性是可以随机读写,NOR-FLASH的特性是可以随机读,不可以随机写,NAND-FLASH的特性是即不可以随机读也不可以随机写。
随机访问的意思是只要该设备挂在了内存地址空间内,就可以随时任意访问某个地址空间。挂在内存地址空间内的RAM就是可以随机读写的。
而NOR-FLASH即使挂在内存地址空间,也是不能随机写的,只能按一定的命令序列写入,而且NOR-FLASH还有一个特性,就是地址空间内的某个比特用写命令只可以从1写到0,而不能从0写到1,要想将地址空间内的数值比特都变成1,就必须执行一个特殊的电擦除命令,由于电擦除逻辑比较复杂,因此擦除命令一般是以块(一般几KB到几十KB)为单位的。
因此如果你想要改变NOR-FLASH某个地址偏移内的值,必须先用程序将整个块读出来放在RAM的缓冲内,然后改变该值,然后通过擦除命令擦除NOR-FLASH该块,然后通过写命令吧RAM缓冲内的数据写入到NOR-FLASH中。
至于memcpy么,只要第一个参数指向的空间支持随机写操作,第二个参数指向的空间支持随机读操作,就可以调用这个函数进行数据搬移。其本质是对类似下面代码实现的功能的优化
void mycopy(void *pmem_dest, void *pmem_src, size_t len)
{
unsigned char *pdest, *psrc;
int i;
pdest = (unsigned char *)pmem_dest;
psrc = (unsigned char *)pmem_src;
for(i=0; i<len; i++)
{
*pdest++ = *psrc++;
}
}
[解决办法]
首先,我觉得你应该搞懂CPU是怎么读写内存地址空间内某地址的数据的,也就是读写的时序,这个一般控制器的datasheet里都有.这个搞懂了,上面的问题就迎刃而解了。
或者,这个问题你可以存疑,毕竟你想实现的是IAP功能,先把程序做起来,经验和知识积累多了,这些问题自然而然就解决了。