ESP8266_12f中写flash的问题
本帖最后由 杀进丧尸城 于 2017-3-8 14:03 编辑不管在哪个项目里基本上都会用到掉电记录数据的,所以不得不搞清楚。
根据2C-ESP8266__SDK__Programming Guide__CN_v1.2.0中38页所说一个扇区4KB,读写必须4字节对齐;所以读写一次只能读写uint32,也就是4个字节;这么说起来,读写的次数那就多了,怎么办???
写入数据:
uint32 value;
uint8 *addr_case1 = (uint8 *)&value;
addr_case1=....
addr_case1=.....
addr_case1=....
addr_case1=....
spi_flash_erase_sector(0x7C);//擦出当前地址的flash
spi_flash_write(0x7C000,(uint32 *)addr_case1,sizeof(addr_case1));//写flash,4个字节共32位
os_printf("@@@@@@FLASH write@@@@@:%02x%02x%02x%02x\r\n",addr_case1, addr_case1, addr_case1, addr_case1);
读取数据:
uint32 value;
uint8 *addr_case1 = (uint8 *)&value;
spi_flash_read(0x7C000,(uint32 *)addr_case1,sizeof(addr_case1));//读取flash值
os_printf("@@@@@@FLASH read@@@@@:%02x%02x%02x%02x\r\n",addr_case1, addr_case1, addr_case1, addr_case1);
以上读写是正常的,没有问题;
如果我的数据不止4个字节,又该怎么读写???
想了半天,只有用死办法了。
写入数据:
uint32 value,cal,al;
uint8 *addr_case1 = (uint8 *)&value;
uint8 *adlr_case1 = (uint8 *)&cal;
uint8 *adcr_case1 = (uint8 *)&al;
addr_case1=....
addr_case1=...
addr_case1=...
addr_case1=...
adlr_case1=....
adlr_case1=...
adlr_case1=....
adlr_case1=....
adcr_case1=....
adcr_case1=...
adcr_case1=...
spi_flash_erase_sector(0x7C);//擦出当前地址的flash
spi_flash_write(0x7C000,(uint32 *)addr_case1,sizeof(addr_case1));//写flash,4个字节共32位
os_printf("@@@@@@FLASH write@@@@@:%02x%02x%02x%02x\r\n",addr_case1, addr_case1,addr_case1,addr_case1);
spi_flash_write(0x7C010,(uint32 *)adlr_case1,sizeof(adlr_case1));//写flash,4个字节共32位
os_printf("@@@@@@FLASH write@@@@@:%02x%02x%02x%02x\r\n",adlr_case1, adlr_case1, adlr_case1, adlr_case1);
spi_flash_write(0x7C020,(uint32 *)adcr_case1,sizeof(adcr_case1));//写flash,4个字节共32位
os_printf("@@@@@@FLASH write@@@@@:%02x%02x%02x\r\n",adcr_case1, adcr_case1, adcr_case1);
读取数据:
uint32 value,cal,al;
uint8 *addr_case1 = (uint8 *)&value;
uint8 *adlr_case1 = (uint8 *)&cal;
uint8 *adcr_case1 = (uint8 *)&al;
spi_flash_read(0x7C000,(uint32 *)addr_case1,sizeof(addr_case1));//读取flash值
spi_flash_read(0x7C010,(uint32 *)adlr_case1,sizeof(adlr_case1));//读取flash值
spi_flash_read(0x7C020,(uint32 *)adcr_case1,sizeof(adcr_case1));//读取flash值
os_printf("@@@@@@FLASH read@@@@@:%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\r\n",addr_case1, addr_case1,addr_case1,addr_case1,adlr_case1, adlr_case1,adlr_case1,adlr_case1,adcr_case1, adcr_case1,adcr_case1);
以下是打印出来的数据:
如果这样写下去,不是要写疯了,并且读取的时候也很耽误时间的;有没有更好的方法减少代码量啊!!!
或者有没有其他写法,求指教。谢谢!!!
终于搞明白了,读和写必须四个字节四个字节的读写;擦出一次就是一个扇区,一个扇区就是4K=41024=4096,转换成16进制就是0x1000;写一次必须4个字节,如果再次写,在当前扇区就必须先擦出再写了,并且先前写的数据也不见了,所以写那么一次写一个扇区的数据,要么就换一个扇区写;读取数据的时候可以4个字节的读,没什么问题。
比如:第一次写入:
spi_flash_erase_sector(0x7C);//擦出当前地址的flash
spi_flash_write(0x7C000,(uint32 *)addr_case1,sizeof(addr_case1));//写flash,4个字节共32位
spi_flash_write(0x7C010,(uint32 *)adlr_case1,sizeof(adlr_case1));//写flash,4个字节共32位
spi_flash_write(0x7C020,(uint32 *)adcr_case1,sizeof(adcr_case1));//写flash,4个字节共32位
第二次写入:
spi_flash_erase_sector(0x7D);//擦出当前地址的flash
spi_flash_write(0x7D000,(uint32 *)addr_case1,sizeof(addr_case1));//写flash,4个字节共32位
spi_flash_write(0x7D010,(uint32 *)adlr_case1,sizeof(adlr_case1));//写flash,4个字节共32位
spi_flash_write(0x7D020,(uint32 *)adcr_case1,sizeof(adcr_case1));//写flash,4个字节共32位
第三次写入:
spi_flash_erase_sector(0x7E);//擦出当前地址的flash
spi_flash_write(0x7E000,(uint32 *)addr_case1,sizeof(addr_case1));//写flash,4个字节共32位
spi_flash_write(0x7E010,(uint32 *)adlr_case1,sizeof(adlr_case1));//写flash,4个字节共32位
spi_flash_write(0x7E020,(uint32 *)adcr_case1,sizeof(adcr_case1));//写flash,4个字节共32位
页:
[1]