STM32学习笔记-Flash作为存储器储存数据

发布者:ching80790最新更新时间:2016-08-02 来源: eefocus关键字:STM32  Flash  存储器  储存数据 手机看文章 扫描二维码
随时随地手机看文章
     说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。
     自己收集了一些资料,现将这些资料总结了一下,不想看的可以直接调到后面看怎么操作就可以了。
 
FLASH分类  
     根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。  系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。 选项字节存储芯片的配置信息及对主存储块的保护信息。   
 
FLASH的页面  
      STM32的FLASH主存储块按页组织,有的产品每页1KB,有的产品每页2KB。页面典型的用途就是用于按页擦除FLASH。从这点来看,页面有点像通用FLASH的扇区。
 
STM32产品的分类  
      STM32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。  
小容量产品主存储块1-32KB,     每页1KB。系统存储器2KB。 
中容量产品主存储块64-128KB,   每页1KB。系统存储器2KB。 
大容量产品主存储块256KB以上,  每页2KB。系统存储器2KB。 
互联型产品主存储块256KB以上,  每页2KB。系统存储器18KB。 
     对于具体一个产品属于哪类,可以查数据手册,或根据以下简单的规则进行区分:  
STM32F101xx、STM32F102xx 、STM32F103xx产品,根据其主存储块容量,一定是小容量、中容量、大容量产品中的一种,STM32F105xx、STM32F107xx是互联型产品。  
     互联型产品与其它三类的不同之处就是BootLoader的不同,小中大容量产品的BootLoader只有2KB,只能通过USART1进行ISP,而互联型产品的BootLoader有18KB,能通过USAT1、4、CAN等多种方式进行ISP。小空量产品、中容量产品的BootLoader与大容量产品相同。
 
关于ISP与IAP
      ISP(In System Programming)在系统编程,是指直接在目标电路板上对芯片进行编程,一般需要一个自举程序(BootLoader)来执行。ISP也有叫ICP(In Circuit Programming)、在电路编程、在线编程。 IAP(In Application Programming)在应用中编程,是指最终产品出厂后,由最终用户在使用中对用户程序部分进行编程,实现在线升级。IAP要求将程序分成两部分:引导程序、用户程序。引导程序总是不变的。IAP也有叫在程序中编程。 ISP与IAP的区别在于,ISP一般是对芯片整片重新编程,用的是芯片厂的自举程序。而IAP只是更新程序的一部分,用的是电器厂开发的IAP引导程序。综合来看,ISP受到的限制更多,而IAP由于是自己开发的程序,更换程序的时候更容易操作。
 
FPEC 
     FPEC(FLASH Program/Erase controller 闪存编程/擦除控制器),STM32通过FPEC来擦除和编程FLASH。FPEC使用7个寄存器来操作闪存: 
FPEC键寄存器(FLASH_KEYR)          写入键值解锁。 
选项字节键寄存器(FLASH_OPTKEYR)   写入键值解锁选项字节操作。 
闪存控制寄存器(FLASH_CR)          选择并启动闪存操作。 
闪存状态寄存器(FLASH_SR)          查询闪存操作状态。 
闪存地址寄存器(FLASH_AR)          存储闪存操作地址。 
选项字节寄存器(FLASH_OBR)         选项字节中主要数据的映象。 
写保护寄存器(FLASH_WRPR)          选项字节中写保护字节的映象。
 
键值
     为了增强安全性,进行某项操作时,须要向某个位置写入特定的数值,来验证是否为安全的操作,这些数值称为键值。STM32的FLASH共有三个键值: 
      RDPRT键 = 0x000000A5  用于解除读保护 
      KEY1    = 0x45670123  用于解除闪存锁 
      KEY2    = 0xCDEF89AB  用于解除闪存锁
 
闪存锁 
     在FLASH_CR中,有一个LOCK位,该位为1时,不能写FLASH_CR寄存器,从而也就不能擦除和编程FLASH,这称为闪存锁。 
当LOCK位为1时,闪存锁有效,只有向FLASH_KEYR依次写入KEY1、KEY2后,LOCK位才会被硬件清零,从而解除闪存锁。当LOCK位为1时,对
FLASH_KEYR的任何错误写操作(第一次不是KEY1,或第二次不是KEY2),都将会导致闪存锁的彻底锁死,一旦闪存锁彻底锁死,在下一次复位前,都无法解锁,只有复位后,闪存锁才恢复为一般锁住状态。 
复位后,LOCK位默认为1,闪存锁有效,此时,可以进行解锁。解锁后,可进行FLASH的擦除编程工作。任何时候,都可以通过对LOCK位置1来软件加锁,软件加锁与复位加锁是一样的,都可以解锁。  
 
主存储块的擦除 
     主存储块可以按页擦除,也可以整片擦除。 
 
页擦除 
     主存储块的任何一页都可以通过FPEC的页擦除功能擦除。 建议使用以下步骤进行页擦除: 
1.检查FLASH_SR寄存器的BSY位。以确认没有其他正在进行的闪存操作。必须等待BSY位为0,才能继续操作。 
2.设置FLASH_CR寄存器的PER位为1。选择页擦除操作。 
3.设置FLASH_AR寄存器为要擦除页所在地址,选择要擦除的页。FLASH_AR的值在哪一页范围内,就表示要擦除哪一页。 
4.设置FLASH_CR寄存器的STRT位为1,启动擦除操作。
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。   
7.读出被擦除的页并做验证。擦完后所有数据位都为1。 
 
整片擦除 
     整片擦除功能擦除整个主存储块,信息块不受此操作影响。 建议使用以下步骤进行整片擦除: 
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。 
2.设置FLASH_CR寄存器的MER位为1。选择整片擦除操作。   
3.设置FLASH_CR寄存器的STRT位为1。启动整片擦除操作。   
4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。   
6.读出所有页并做验证。擦完后所有数据位都为1。
 
主存储块的编程 
     对主存储块编程每次可以写入16位。当FLASH_CR寄存器的PG位为1时,在一个闪存地址写入一个半字(16位)将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为1时),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。 建议使用如下步骤对主存储块进行编: 
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。  
2.设置FLASH_CR寄存器的PG位为1。选择编程操作。  
3.在指定的地址写入要编程的半字。直接用指针写。 
4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。 
6.读出写入的地址并验证数据。
 
关于主存储块擦除编程操作的一些疑问
1. 为什么每次都要检查BSY位是否为0? 
     因为BSY位为1时,不能对任何FPEC寄存器执行写操作,所以必须要等BSY位为0时,才能执行闪存操作。 
2. 如果没有擦除就进行编程,会出现什么结果? 
      STM32在执行编程操作前,会先检查要编程的地址是否被擦除,如果没有,则不进行编程,并置FLASH_SR寄存器的PGERR位为1。唯一例外的是,当要编程的数据为0X0000时,即使未擦除,也会进行编程,因为0X0000即使擦除也可以正确编程。 
3. 为什么操作后要读出数据并验证? 
      STM32在某些特殊情况下(例如FPEC被锁住),可能根本就没有执行所要的操作,仅通过寄存器无法判断操作是否成功。所以,保险起见,操作后都要读出所有数据检查。
4. 等待BSY位为1的时间以多少为合适? 
     请参考STM32固件库中的数据。 
5. FLASH编程手册上说进行闪存操作(擦除或编程)时,必须打开内部的RC振荡器(HSI),是不是一定要用HIS进行闪存的擦除及编程操作? 
     对于这点,我的理解是,进行闪存操作时,必须要保证HIS没有被关闭,但是操作时的系统仍然可以是HSE时钟。STM32复位后,HIS默认是开的,只要你不为了低功耗去主动关闭它,则用什么时钟都可以进行闪存操作的。我所编的程序也验证了这一点。 
 
选项字节 
     选项字节用于存储芯片使用者对芯片的配置信息。
目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节。但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码。因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间。选项字节的8字节正码概述如下: 
RDP   字节0。读保护字节,存储对主存储块的读保护设置。 
USER  字节2。用户字节,配置看门狗、停机、待机。 
Data0  字节4。数据字节0,由芯片使用者自由使用。 
Data1  字节6。数据字节1,由芯片使用者自由使用。 
WRP0  字节8。写保护字节0,存储对主存储块的写保护设置。 
WRP1  字节10。写保护字节1,存储对主存储块的写保护设置。
WRP2  字节12。写保护字节2,存储对主存储块的写保护设置。 
WRP3  字节14。写保护字节3,存储对主存储块的写保护设置。 
 
选项字节写使能 
     在FLASH_CR中,有一个OPTWRE位,该位为0时,不允许进行选项字节操作(擦除、编程)。这称为选项字节写使能。只有该位为1时,才能进行选项字节操作。 该位不能软件置1,但可以软件清零。只有向FLASH_OPTKEYR依次写入KEY1和KEY2后,硬件会自动对该位置1,此时,才允许选项字节操作。这称为解锁(打开)选项字节写使能。该位为1后,可以由软件清零,关闭写使能。复位后,该位为0。错误操作不会永远关闭写使能,只要写入正确的键序列,则又可以打开写使能。写使能已打开时,再次打开,不会出错,并且依然是打开的。 很显然,进行选项字节操作前,先要解开闪存锁,然后打开选项字节写使能,之后,才能进行选项字节操作。 
 
选项字节擦除 
     建议使用如下步骤对选项字节进行擦除: 
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。  
2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。 
3.设置FLASH_CR寄存器的OPTER位为1。选择选项字节擦除操作。  
4.设置FLASH_CR寄存器的STRT位为1。 
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
7.读出选项字节并验证数据。 
由于选项字节只有16字节,因此,擦除时是整个选项字节都被擦除了。
 
选项字节编程 
     建议使用如下步骤对选项字节进行编程: 
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。  
2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。  
3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。  
4.写入要编程的半字到指定的地址。启动编程操作。 
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。 
7.读出写入的选项字节并验证数据。 对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码始终是正确的。 
 
主存储块的保护 
     可以对主存储块中的数据进行读保护、写保护。 读保护用于保护数据不被非法读出。防止程序泄密。 
写保护用于保护数据不被非法改写,增强程序的健壮性。 
 
读保护 
     主存储块启动读保护后,简单的说具有以下特性: 
1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。 
2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。 
3.使用调试接口不能访问主存储块。这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。 
只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP。芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。 
 
写保护 
      STM32主存储块可以分域进行写保护。如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。显然,擦除选项字节将导致解除主存储块的写保护。
 
选项字节与它的寄存器映象 
我们知道,FPEC有两个寄存器存储了选项字节的映象。那么,选项字节本体(在FLASH中)与映象(在寄存器中)究竟有什么区别呢? 
选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而以,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将不再改变。所以,更改本体的数据后,不会立即生效,只有复位加载到映象中后,才会生效。 有一点要注意的是,当更改本体的值,使主存储块读保护变为不保护时,会先擦除整片主存储块,然后再改变本体。这是唯一一个改变本体会引发的动作。但即使这样,读保护依然要等到复位后,加载到映象后,才会解除。 
  
关于FLASH编程手册中文版的几处错误(不一定是,但是与我的理解不符)
1.选项字节编程一节中: 
对FPEC解锁后,必须分别写入KEY1和KEY2(见2.3.1节)到FLASH_OPTKEYR寄存器,再设置FLASH_CR寄存器的OPTWRE位为’1’,此时可以对选项字节进行编程 
实际上,对FLASH_OPTKEYR写入KEY1和KEY2后,OPTWRE位会被硬件置1,而不是用软件写1。这一点在后面的寄存器描述中也可以得到验证。 2.对读保护的描述中: 
对读保护的数值对无法理解。正确的应该是,RDP为RDPRT键值时,解除读保护,为其它值时,读保护生效。
 
 
看了半天,原来只要几句就可以解决,当然是不考虑其他功能,只是简单的读写操作。
其中写操作如下:
     FLASH_Unlock();  //解锁FLASH编程擦除控制器
     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
     /*********************************************************************************
          //               FLASH_FLAG_BSY            FLASH忙标志位
          //               FLASH_FLAG_EOP            FLASH操作结束标志位
          //               FLASH_FLAG_PGERR            FLASH编写错误标志位
          //               FLASH_FLAG_WRPRTERR       FLASH页面写保护错误标净         
     **********************************************************************************/
     FLASH_ErasePage(FLASH_START_ADDR);     //擦除指定地址页
     FLASH_ProgramHalfWord(FLASH_START_ADDR+(addr+i)*2,dat); //从指定页的addr地址开始写
     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
     FLASH_Lock();    //锁定FLASH编程擦除控制器
 
从上面可以看出基本顺序是:解锁-》清除标志位(可以不要)-》擦除-》写半字-》清楚标志位(也可以不要)-》上锁。其中FLASH_START_ADDR是宏定义的0x8000000+2048*255,0x8000000是Flash的起始地址,2048是因为我用的是大容量芯片,根据上一笔记Flash地址可以看出芯片每页容量2K,即2048字节,255表示芯片的最后一页,这个根据不同芯片而定。之所以从后面页写起可以防止储存数据破坏用户程序。addr*2是因为每个数据占用2字节(半字),虽然写入的是1字节数据,但是编程是2字节为单位,也就是说一个字节的数据也会占用两个字节地址。
 
 
读操作如下:
    u16 value;
    value = *(u16*)(FLASH_START_ADDR+(addr*2));//从指定页的addr地址开始读
关键字:STM32  Flash  存储器  储存数据 引用地址:STM32学习笔记-Flash作为存储器储存数据

上一篇:ARM 协处理器及其指令
下一篇:Cortex-M3扫盲

推荐阅读最新更新时间:2024-03-16 15:02

STM32单片机最小系统的电路设计
背景 学嵌入式,我们一般从单片机学起。学单片机,不能只学软件,硬件知识也要跟上。软硬件相结合的设计,才是真正优秀的设计。 谈及单片机的硬件设计,我们会先将其浓缩为最小系统,即能实现最基础的功能的最简化设计。以 STM32(F1 系列)单片机为例,最小系统无非是这几部分:电源、复位、时钟、启动模式、下载调试。 电源 STM32 的电源有以下几种类型: 主电源(VDD / VSS) 主电源指的是标记为 VDD1、VDD2... 的引脚。 每个引脚必须加一个 100nF 的滤波电容,且尽量靠近引脚放置,此外需要一个 10uF 的钽电容公用。 后备电源(VBAT) VBAT 引脚可用于电池供电。如果不用,可以与 VDD 连接
[单片机]
<font color='red'>STM32</font>单片机最小系统的电路设计
单片机的四种烧写方式
单片机的四种烧写方式简介 单片机是一种可编程控制器,搭好硬件电路后,可以利用程序实现很多非常复杂的逻辑功能,与纯硬件电路相比,简化了硬件外围的设计、方便了逻辑的设计、丰富了逻辑的输出。不同厂家的单片机需要不同编程IDE来实现编程。在学习单片机之前,要先清楚单片机程序是如何烧写到单片机内部的,在烧写的过程中需要用到什么工具?因为不通用的烧写工具可能价格较贵,比如说Micorchip单片机使用的ICD系列编程器,单台价格在600-1000元人民币之间。今天和大学来认识一下单片机最常用的四种烧写方式和所使用到的工具。 1.使用JTAG接口实现 JTAG接口是一种标准的测试协议,可以实现编程时在线调试,利用单步追踪可以很方便的查找代码
[单片机]
单片机的四种烧写方式
STM32的 位寻址(地址映射)
STM32的寄存器的分布情况: STM比较特色的就是 位带操作: 如下解释: (寄存器的地址是固定好的,我们想要进行位操作的话 就需要用到地址映射,将位带区寄存器的 各位 映射到 位带别名区的地址。) 通过 位带别名区 的 4个字节(32个位)用来存放 位带区的 位地址。 如将 0x2200 0000 映射到 0x2000 000 的第一个位! 具体的映射C程序是这样的: 算法公式: (addr & 0xF0000000)+0x2000000+((addr &0xFFFFF) 5)+(bitnum 2) addr & 0xF0000000: 取0x40
[单片机]
对lpc2000系列微控制器片内flash编程的方法
本文主要是关于lpc2000的相关介绍,并着重对lpc2000的原理及其作用进行了详尽的阐述。 lpc2000 LPC2000系列的向量中断控制器(VIC)支持32个中断请求输入,也即是支持32个中断源,见表5.1。这32个中断按顺序称为VIC通道0,VIC通道1,…,VIC通道31。 每一个VIC通道都支持软件中断与硬件中断,即每个中断均可由软件或硬件中断产生,软件中断与对应通道上的硬件中断是逻辑“或”的关系。软件中断可通过置位VICSoftInt寄存器相应位来产生,也可通过置位VICSoftIntClear寄存器相应位来清除。 LPC2000具有3类中断:FIQ、向量IRQ和非向量IRQ。LPC2000系列可通过对
[单片机]
STM32入门学习笔记之基础定时器实验(上)
7.1 STM32定时器概述 STM32内部共有8个定时器,其中Timer1和Timer8属于高级定时器,Timer2~Timer5属于通用定时器,8个定时器的资源独立,互不影响。 STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。 通用定时器的内部结构如下图所示。 7.2 相关寄存器 要使用通用定时器的基
[单片机]
<font color='red'>STM32</font>入门学习笔记之基础定时器实验(上)
STM32 定时器正交编码器模式 寄存器配置程序
void Encoder_Init(void) { RCC- APB1ENR|=1 1; //TIM3时钟使能 RCC- APB2ENR|=1 2; //使能PORTA时钟 GPIOA- CRL&=0XF0FFFFFF;//PA6 GPIOA- CRL|=0X04000000;//浮空输入 GPIOA- CRL&=0X0FFFFFFF;//PA7 GPIOA- CRL|=0X40000000;//浮空输入 TIM3- DIER|=1 0; //允许更新中断 TIM3- DIER|=1 6; //允许触发中断 MY_NVIC_Init(1,3,TIM3_IRQChannel,2); TIM3- PSC = 0x0;/
[单片机]
NAND Flash下季度或史上最缺货
   NAND  Flash控制芯片与模块厂群联董事长潘健成日前估计,接下来将面临史上最缺货的第3季,而该公司也积极备战,近日捧着5000多万美元现金,大举吃下某大厂释出的货源,为下半年建立更多库存。下面就随网络通信小编一起来了解一下相关内容吧。   群联在去年初 NAND  Flash市况尚未大热时,建立的库存水位一度超过三亿美元,后来市场景气于去年第3季开始往上,价格走升,也让该公司因此大赚。   潘健成提到,今年大概只有5月有机会多收货,所以该公司在前两个礼拜以现金买了大约5000多万美元的额外货源,预计可供第3季使用。   群联在今年4月时,手上库存超过两亿美元,但因 NAND  Flash价格已走扬,所以实际货量不如去
[网络通信]
TMS320C5410烧写Flash实现并行自举引导
摘要:介绍在TMS320C5410环境下对Am29LV200B Flash存储器进行程序烧写,并且实现了TMS320C5410上电后用户程序并行自举引导。 关键词:Am29LV200B Flash DSP 并行自举引导 自举表   Flash是一种可在线进行电擦写,掉电后信息不丢失的存储器。它具有低功耗、大容量、擦写速度快等特点,并且内部嵌入算法完成对芯片的操作,因而在数字信号处理系统中得到了广泛的应用。本文通过一个完整的实例,介绍Am29LV200B Flash存储器的烧写方法,实现TMS320C5410(以下简称C5410)上电后用户程序的并行自举引导。 1 Am29LV200B Flash存储器 1.1 Flash存
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved