RWW特性允许用户在执行程序和读程序存储器时对DATA EEPROM区域进行写操作,因此执行的时间被优化了。相反的操作是不允许的:即你不可以在写程序存储器时对DATA EEPROM进行读操作。
RWW特性是一直有效的而且可以在任意时刻使用。注意:并不是所有STM8都拥有RWW特性,请参考相应的数据手册来了解更多信息。
字节编程
可以对主程序存储器和DATA区域逐字节地编程。要对一个字节编程,应用程序可直接向目标地址写入数据。
- 在主程序存储器中
当字节编程操作执行时,应用程序停止运行。
- 在DATA区域中
- 有RWW功能的器件:在IAP模式下,应用程序不停止运行,字节编程利用RWW功能进行操作。
- 无RWW功能的器件:当字节编程操作执行时,应用程序停止运行。
要擦除一个字节,向对应的字节简单写入'0x00'即可。
应用程序可以通过读FLASH_IAPSR寄存器来校验编程或擦除操作是否已被正确执行:
- 在一次成功的编程操作后EOP位被置1。
- 当软件试图对一个被保护的页进行写操作时WP_PG_DIS位被置1。在这种情况下,写操作不会被执行。
如果FLASH_CR1中的IE位已经被预先使能,则只要这些标志位(EOP/WP_PG_DIS)中有一个被置位就会产生一个中断。
STM8自动快速字节编程,根据目标地址的初始化内容的不同,编程持续时间可能也有所不同。如果字(4个字节)中包含不为空的字节,编程前字会被自动擦除。相反,如果字节为空,由于不会执行擦除操作从而编程时间变短。然而,可以通过对FLASH_CR1中的FIX位置1来强迫执行系统擦除操作而不管其内容是否为空,从而使编程时间固定(请参考FLASH控制寄存器)。编程总时间随之被规定为擦除时间和写操作时间的和(请参考tPROG参数,在数据手册的"Flash program memory"表中)。
注意:为了快速写一个字节(没有擦除操作),将要被写入数据的整个字(4个字节)必须被预先擦除。因此不可能对同一个字做连续两次快速写操作(在第二次写之前没有擦除操作):第一次写字节操作将是快速操作但针对另外一个字节的第二次写操作将需要一个擦除操作。
字编程
字写入操作允许一次对整个4字节的字进行编程,从而将编程时间缩短。
主程序存储器和DATA EEPROM都可以进行字操作。在一些STM8S器件中,也拥有当DATA EEPROM在进行写操作时同时具备RWW功能。请参考数据手册了解更多信息。为了对一个字编程,FLASH_CR2和FLASH_NCR2中的/WPRG/NWPRG位必须预先置位清零来使能字编程模式(请参考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互补控制寄存器2(FLASH_NCR2))。然后将要被编程字的4个字节必须被从首地址开始装载。当四个字节都被写入后,编程周期自动开始。
像字节操作一样,STM8的FLASH_IAPSR中的EOP与WR_PG_DIS控制位和FLASH中断相配合,可用于检查操作是否被正确执行完毕。
块编程
块编程比字节编程和字编程都要快。在STM8块编程操作中,整个块的编程或擦除在一个编程周期就可以完成。请参考(表4)了解具体器件的块的大小。在主程序存储器和DATA区域都可以执行块操作。
- 在主程序存储器中
用于块编程的代码必须全部在RAM中执行。 - 在DATA区域中
- 有RWW功能的器件:DATA块操作可在主程序存储器中执行,然而数据装载阶段(下文中有述)必须在RAM中执行。
- 无RWW功能的器件:用于块编程的代码必须全部在RAM中执行。
一共有三种可能的块操作:
- 块编程(也叫标准块编程):整个块在编程前被自动擦除。
- 快速块编程:在编程前没有预先的块擦除操作。
- 块擦除。
(表4)
在STM8块编程时,中断被硬件自动屏蔽。
标准块编程
块编程操作允许一次对整个块进行编程,整个块在编程前被自动擦除。
为了对整个块编程,FLASH_CR2和FLASH_NCR2中的PRG/NPRG位必须预先置位/清零来使能标准块编程(请参考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互补控制寄存器2(FLASH_NCR2))。然后需要向主程序存储器或DATA区域的目标地址依次写入要编程的数据,这样数据会被锁存在内部缓存中。为编程整个块,块中的所有字节都需要被写入数据。但要注意,所有被写入缓存的数据必须位于同一个块中,这意味着这些数据必须有同样的高位地址:仅仅低6位的地址可以不一样。当目标块的最后一个字节被装载到缓存后,编程就自动开始了。编程前首先会自动执行一次擦除操作。
当对DTA区域进行块编程时,应用程序可以检查FLASH_IAPSR中的HVOFF位确认编程状态。一旦HVOFF被置0,真正的编程阶段就开始了,此时应用程序就可以返回到主程序中去了。FLASH_IAPSR中的EOP与WR_PG_DIS控制位和FLASH中断相配合,可用于检查操作是否被正确执行完毕。
快速块编程
STM8快速块编程允许不擦除存储器内容就对块进行编程,因此快速块编程的编程速度是标准块编程的两倍。该模式仅用于被编程部分已经被擦除过的情况,同时这种模式对向空白部分写入完整的应用代码特别有用,因为这种模式可以节省相当可观的时间。
快速块编程的步骤和标准块编程的步骤大致一样,FLASH_CR2和FLASH_NCR2中的FPRG/NFPRG位必须预先置位/清零来使能快速块编程(请参考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互补控制寄存2(FLASH_NCR2))。FLASH_IAPSR中的EOP与WR_PG_DIS控制位和FLASH中断相配合,可用于检查快速块编程操作是否被正确执行完毕。
警告:在执行快速块编程之前如果这个块不是空的话,不能保证写入的数据无误。
块擦除
块擦除允许擦除整个块。
为了擦除整个块,FLASH_CR2和FLASH_NCR2中的ERASE/NERASE位必须预先置位/清零来使能块擦除(请参考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互补控制寄存器2(FLASH_NCR2))。通过对块中所有的字写入'0x00 00 00 00'来擦除整个块。字的起始地址必须以'0','4','8',或'C'作为结尾。
FLASH_IAPSR中_PG_DIS控制位和FLASH中断相配操作是否被正确执行完毕。
选项字节(Option byte)编程
对选项字节编程和对DATA EEPROM区域编程非常相似。
应用程序可直接向目标地址进行写操作。利用STM8的RWW功能,在对选项字节写操作的同时程序不必停下来。
请参考相应的数据手册来了解选项字节内容的细节。