class="markdown_views prism-github-gist">
EEPROM(Electrically Erasable Programmable Read-Only Memory),电擦除可编程只读存储器。
它是一种可在线电擦除和电写入、掉电后数据不丢失的存储器,在嵌入式系统中应用特别广泛。
它在应用中一般存储用户数据,在系统运行过程中可以随时修改,系统复位之后从里面读取的是修改之后的新数据。
FLASH 存储器又称为闪存(FLASH Memory)。
它结合了 ROM 和 RAM 的优点,既具备EEPROM 可电擦除、掉电不丢失数据的特点,
又因为可以块读写而具备读写速度快的特点。
FLASH相对 EEPROM 来言,成本低廉,我们经常使用的 U 盘就是采用 FLASH 作为存储介质。FLASH在嵌入式系统中应用非常广泛,
一般作为程序存储器使用,在系统运行过程中不修改存储在里面的数据, 系统复位之后里面存储的还是最初的数据。 FLASH 实质上也是 EEPROM 的一种。 STM8S 单片机片内集成 FLASH 程序存储器和数据 EEPROM,它们由一组通用寄存器来控制,用户可以通过编程来实现对它们的写入、擦除,还可以通过它们来设置写保护、配置低功耗模式。选项字节 OPTION BYTES 也是它们的一部分。
STM8系列的单片机存储器有3种规格 这里使用的207系列是2048Byte的数据存储空间(EEPROM)
测试程序
#include "stm8s.h"
#include "stm8s_clk.h"
#include "led.h"
#include "server.h"
#include "tim1.h"
#include "stm8s_clk.h"
#include "stm8s_flash.h"
void testFlashRW();
int main(void){
testFlashRW();
while(1);
}
void testFlashRW(){
u32 add = 0;
uint8_t Tx_Buffer[1] = {0};
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
InitUart1((u32)115200, FALSE);
FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
FLASH_Unlock(FLASH_MEMTYPE_DATA);
add = 0x4000;
uint32_t j;
uint32_t max_size = 2048;
] = FLASH_ReadByte(add);
Uart1SendData( Tx_Buffer, 1);
add++;
}
}
这里有反复测试过具体的数据存储空间 测试过一个临界值是2056个字节 但是使用2056发现数据末尾添加的8位出现数据不正确的情况 所以可以得出确切存储空间是2048个字节。
读写结果使用了串口输出的形式进行查看数据存储是否正确 可以查看
串口输出的数据testFlashRW.txt
至于存储在FLASH空间中的程序具体是占用多少空间可以通过查看
userDebugListQF-stm8-master.map 看到
程序需要的FLASH空间是 1,969 = 1,482 + 158 + 329, 不到2K的FLASH占用
调用 IS_FLASH_ADDRESS_OK(Address) 接口进行检查地址是否越界也可以看到对应型号的单片机所对应的数据存储器大小
#define FLASH_PROG_START_PHYSICAL_ADDRESS ((uint32_t)0x008000)
#if defined (STM8S208) || defined (STM8S207) || defined (STM8AF52Ax) || defined (STM8AF62Ax)
#define FLASH_PROG_END_PHYSICAL_ADDRESS ((uint32_t)0x027FFF)
#define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000)
#define FLASH_DATA_END_PHYSICAL_ADDRESS ((uint32_t)0x0047FF)
#endif
#define IS_FLASH_ADDRESS_OK(ADDRESS)
((((ADDRESS) >= FLASH_PROG_START_PHYSICAL_ADDRESS) && ((ADDRESS) <= FLASH_PROG_END_PHYSICAL_ADDRESS)) ||
(((ADDRESS) >= FLASH_DATA_START_PHYSICAL_ADDRESS) && ((ADDRESS) <= FLASH_DATA_END_PHYSICAL_ADDRESS)))
可以看出从 FLASH_DATA_START_PHYSICAL_ADDRESS 到 FLASH_DATA_END_PHYSICAL_ADDRESS
就是从 0x004000 到 0x0047FF 刚好是 2048 字节
尝试使用flash空间进行数据存储 但是当程序运行到flash空间并且没有被应用程序使用到的地址时
仍然出现保存数据错误的情况
所以使用flash空间保存数据暂时找不到确切的解决方案
查看源码时替换掉 main.c 文件中的代码运行测试即可
点击查看完成的工程源码