首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

单片机IAP编程有关疑问

2013-01-08 
单片机IAP编程相关疑问刚刚接触这个东西,着实不会,看别人的代码发现写flash使用到了什么IAP命令字,然而读

单片机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功能,先把程序做起来,经验和知识积累多了,这些问题自然而然就解决了。

热点排行