如何实现用代码操作网络单片机W7100A的代码闪存
iMCU W7100A 是一款单片式以太网控制芯片,内嵌8051单片机、硬件 TCP/IP协议栈,以及10/100 高速以太网络MAC/PHY。
W7100A的内部存储器由两部分组成:程序存储器和数据存储器。
程序存储器又由启动ROM和代码闪存组成。启动ROM的地址范围从0×0000到0x07FF,启动ROM中含有ISP函数以及W7100A内嵌的其它必需的代码程序。代码闪存的地址范围从0×0000到0xFFFF,它位于另外一个不同的存储器空间内并且和启动ROM共享部分地址范围以节省用户的应用代码。更多关于W7100A存储器组成的详细信息请参考中文主页中的 ‘W7100数据手册’。
图1.1 代码闪存更新过程
如图1.1在用户应用代码执行过程中允许修改或者更新64kbyte的程序闪存,这样用户可以在程序运行时更新固件。本篇文档将会介绍如何读取、写入以及擦除代码闪存。
下面是用来控制代码闪存的函数,将会在下面部分详细介绍。
表1.1 代码闪存存取函数
注意:
请注意用来写入和擦除W7100A存储器数据的WizISP程序中的ISP与本文档中用到的ISP不同。
1.1 编程过程
代码闪存的编程流程如下:
如果用户按照下面的步骤进行,那么在用户代码执行过程中可以执行字节读(Byte read)、字节写(Byte write)或者其它ISPID命令对代码闪存中的数据进行修改。
图2.1 代码闪存存取过程
1. 当使用ISP函数时,不能有中断发生。通过设置EA=0禁止所有的中断。
2. 为了能够激活启动ROM和ISP ENTRY,将WCONF寄存器的ISPEN设置为‘0’。
3. 根据定义的ISPID写入相应的ISPADDR和ISPDATA。例如,如果用户希望将0xFF写入存储器地址0×4000中,参照下面方框中的格式。
ISPID = ISP_BPROG; ISPADDR = 0×4000; ISPDATA = 0xFF下一步是调用ISP代码。为了能够调用ISP代码,用户需要跳转到ISP代码定义的地方。ISP代码被定义为0×0003,但是可以根据编译器来定义不同的值。本文档中的代码基于Keil 4.10编译器。
4. 将WCONF寄存器的ISPEN设置为‘1’,启动ROM和ISP ENTRY将处于未激活状态。
代码闪存存取的示例函数见1.2~1.5章节
1.2 读(Read)
在ISPID命令中,代码闪存读被定义为ISP_READ(0×00)。读命令读取指定地址的1byte数据,并且将数据保存到ISPDATA。读命令函数如下所示。
1.3 写(Write)
在ISPID命令中,代码闪存写被定义为ISP_BPROG(0×40)。写命令向指定的地址中写入1 byte数据。写命令函数如下所示:
1.4 扇区擦除(Sector Erase)
代码闪存扇区擦除在ISPID命令中被定义为ISP_SERASE(0×30)。‘扇区擦除’命令擦除从指定存储器地址开始的256 byte大小的block。与读和写命令相比较,擦除命令有一些不同。这里有两个步骤:第一步预写,设置闪存中的每一个单元都为相同的电气充电电平;第二步指定地址,并且擦除从指定点开始的256 byte大小的block。用户需要注意在这两步中都要调用ISP entry函数。
1.5 芯片擦除(Chip Erase)
在ISPID命令中代码闪存芯片擦除被定义为ISP_MERASE(0×10)。一旦执行芯片擦除,就会擦除代码闪存中的全部数据。芯片擦除的步骤和扇区擦除完全相同。ISP_ERASE命令和ISPID类似用作预写。这两个命令都需要调用ISP Entry函数,没有输入值和返回值。
警告:
请注意在用户代码执行过程中如果使用芯片擦除命令,所有的操作数据都会被擦除。
2. 示例演示这一章将会介绍读、写和擦除函数的示例代码。函数的执行可以按照下面的顺序来验证和执行,如下图3.1所示。
图3.1 示例演示样本流程
1. 擦除– 擦除从基地址开始的256字节。
2. 写 – 从基地址开始的256字节写0 ~ FF。
3. 验证 – 执行读来读取写入的值并且和实际使用的值比较
注意:
在这片文档中的程序代码都是假的代码,只是整个代码的一部分。示例代码都是基于KEIL μvision V4.10版编译器。
示例程序命令的结果入下面所示。
图3.2 应用示例结果
谢谢关注!更多资讯可登陆官网查看或留言与我交流~~