如何实现用代码操作网络单片机W7100A的代码闪存

Home / 博客 / 如何实现用代码操作网络单片机W7100A的代码闪存

W7100A的内部存储器由两部分组成:程序存储器和数据存储器。

程序存储器又由启动ROM和代码闪存组成。启动ROM的地址范围从0x0000到0x07FF,启动ROM中含有ISP函数以及W7100A内嵌的其它必需的代码程序。代码闪存的地址范围从0x0000到0xFFFF,它位于另外一个不同的存储器空间内并且和启动ROM共享部分地址范围以节省用户的应用代码。更多关于W7100A存储器组成的详细信息请参考中文主页中的 ‘W7100用户手册’

图1.1 代码闪存更新过程

如图1.1在用户应用代码执行过程中允许修改或者更新64kbyte的程序闪存,这样用户可以在程序运行时更新固件。本篇文档将会介绍如何读取、写入以及擦除代码闪存。

下面是用来控制代码闪存的函数,将会在下面部分详细介绍。

                                      表1.1 代码闪存存取函数

注意:

请注意用来写入和擦除W7100A存储器数据的WizISP程序中的ISP与本文档中用到的ISP不同。更多关于WizISP的详细信息请参考‘WizISP程序指南’

1.    代码闪存编程

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写入存储器地址0x4000中,参照下面方框中的格式。

ISPID   = ISP_BPROG; ISPADDR = 0x4000; ISPDATA = 0xFF

下一步是调用ISP代码。为了能够调用ISP代码,用户需要跳转到ISP代码定义的地方。ISP代码被定义为0x0003,但是可以根据编译器来定义不同的值。本文档中的代码基于Keil 4.10编译器。

 

4. 将WCONF寄存器的ISPEN设置为‘1’,启动ROM和ISP ENTRY将处于未激活状态。

代码闪存存取的示例函数见1.2~1.5章节

 

1.2         读(Read)

在ISPID命令中,代码闪存读被定义为ISP_READ(0x00)。读命令读取指定地址的1byte数据,并且将数据保存到ISPDATA。读命令函数如下所示。

 

1.3         写(Write)

在ISPID命令中,代码闪存写被定义为ISP_BPROG(0x40)。写命令向指定的地址中写入1 byte数据。写命令函数如下所示:

 

1.4    扇区擦除(Sector Erase)

代码闪存扇区擦除在ISPID命令中被定义为ISP_SERASE(0x30)。‘扇区擦除’命令擦除从指定存储器地址开始的256 byte大小的block。与读和写命令相比较,擦除命令有一些不同。这里有两个步骤:第一步预写,设置闪存中的每一个单元都为相同的电气充电电平;第二步指定地址,并且擦除从指定点开始的256 byte大小的block。用户需要注意在这两步中都要调用ISP entry函数。

1.5    芯片擦除(Chip Erase)

在ISPID命令中代码闪存芯片擦除被定义为ISP_MERASE(0x10)。一旦执行芯片擦除,就会擦除代码闪存中的全部数据。芯片擦除的步骤和扇区擦除完全相同。ISP_ERASE命令和ISPID类似用作预写。这两个命令都需要调用ISP Entry函数,没有输入值和返回值。

警告:

请注意在用户代码执行过程中如果使用芯片擦除命令,所有的操作数据都会被擦除。

 

2.    示例演示

这一章将会介绍读、写和擦除函数的示例代码。函数的执行可以按照下面的顺序来验证和执行,如下图3.1所示。

图3.1 示例演示样本流程

1. 擦除– 擦除从基地址开始的256字节。

2. 写 – 从基地址开始的256字节写0 ~ FF。

3. 验证 – 执行读来读取写入的值并且和实际使用的值比较

注意:

在这片文档中的程序代码都是假的代码,只是整个代码的一部分。示例代码都是基于KEIL µvision V4.10版编译器。

示例程序命令的结果入下面所示。

 

                              图3.2 应用示例结果