对于STM8来说,其内部的EEPROM确实是个不错的东西,而且STM8S103/105价格已经非常便宜了,当然也可以用STM8S003/005代替,而且价格更便宜,大概在,1.2/2.0元左右,比103/105的便宜1元左右,而且有网友说,其实这两个系列的晶圆完全是一样的(这个是秘密哦),至于ST为什么要这样做,我们就不去猜了,大家应该都知道。
对于EEPROM的读写时间比较长,特别是写入的时间,都是在ms级的,想必大家都知道。但是对于单片机内置EEPROM来说,由于其内部特性,导致单片
机在操作EEPROM时,不能产生中断,当然这个问题一般来说是没有问题的。但是像有数码管扫描的产品来说,这个就是问题了,一般来说,3位数码管扫描周
期为18ms是没有问题的,但大于这个时间,就有闪烁的感觉了,所以,对于3位数码管来说,没有显示的时间大概为6ms,而我们从STM8芯片手册上得到
是典型的EEPROM操作时间为6.6ms,所以,显示3位数码管就比较危险了,如果是4位,或者更多,那就更麻烦了。
对于实验确实可以获取EEPROM的操作时间大概是2.5ms每字节,为此,如果在时间限制比较短的地方,我们可以在数码管点亮后的空闲时间去显示数
据,但每次只能是一字节数据,故要解决这个问题,最好建立个显示缓冲,每次在显示空闲时间去看缓冲中有无数据,如果有,我们就存储,直到存储完整为止。但
是我们还发现一个问题,如果用EEPROM的块操作,实际上,消耗的时间和用操作一字节是一样的。所以,我们也可以用每次操作一块的方式实现EEPROM
的操作,从而实现,大量数据的存储。
下面我们简单说说,如何实现块操作:
STM8的库函数中已经提供了块操作函数FLASH_ProgramBlock(),但是要进行块操作,还必须进行一系列的配置,否则,程序代码会死在这个函数里边的。
1. 修改stm8s_conf.h的注射,让#include "stm8s_flash.h"得以编译
2.修改stm8s.h的注射,让使Flash功能能够从RAM中运行
#if !defined (RAM_EXECUTION)
#define RAM_EXECUTION (1) // 块写入时,必须打开这里的注射
#endif /* RAM_EXECUTION */
3.修改完成后,将产生不少警告,消除的方法,暂时还没有找到,但不影响代码的运行。
/************************************************************************************** * FunctionName : EEPWirteBlock() * Description : 块写入 * EntryParameter : None * ReturnValue : None **************************************************************************************/ void EEPWirteBlock(u16 blockNum, u8 *pDat) { //u8 tmpBuf[FLASH_BLOCK_SIZE] = {0}; FLASH_EraseBlock(blockNum, FLASH_MEMTYPE_DATA); while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET) { ; } FLASH_ProgramBlock(blockNum, FLASH_MEMTYPE_DATA, FLASH_PROGRAMMODE_FAST, pDat); while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET) { ; } }