参考博客:
spi_flash_erase_sector函数只能每次擦除4KByte,写的时候,只能在已经擦除的区域里写。4KByte就是4096Byte对应十六进制就是0x1000,而每次写又得以4个字节那样对齐地写。也就是说擦除一次可以写入1024次。即可以:
uint32 value;
uint8 *addr_case1 = (uint8 *)&value;
addr_case1[0]=0x11;
addr_case1[1]=0x12;
addr_case1[2]=0x13;
addr_case1[3]=0x14;
spi_flash_erase_sector(0x201);//擦出当前地址的flash
spi_flash_write(0x201000,(uint32 *)addr_case1,sizeof(addr_case1));//写flash,4个字节共32位
printf("write:%02x%02x%02x%02x\r\n",addr_case1[0], addr_case1[1], addr_case1[2], addr_case1[3]);
uint32 value;
uint8 *addr_case1 = (uint8 *)&value;
spi_flash_read(0x201000,(uint32 *)addr_case1,sizeof(addr_case1));//读取flash值
printf("read:%02x%02x%02x%02x\r\n",addr_case1[0], addr_case1[1], addr_case1[2], addr_case1[3]);
typedef enum {
SPI_FLASH_RESULT_OK, /**< SPI Flash operating OK */
SPI_FLASH_RESULT_ERR, /**< SPI Flash operating fail */
SPI_FLASH_RESULT_TIMEOUT /**< SPI Flash operating time out */
} SpiFlashOpResult;
/**
* @brief Erase the Flash sector.
*
* @param uint16 sec : 扇区数,从扇区0开始计数,每个扇区长度为 4KB。
*
* @return SpiFlashOpResult
*/
SpiFlashOpResult spi_flash_erase_sector(uint16 sec);
从上面对函数spi_flash_erase_sector()的解释可以看出:擦除的扇区数是以模组整个的Flash总扇区数来计算的。我使用的是ESP8266-12F模组,默认flash为32Mb也就是4MB。那么flash的总扇区数为:4*1024 = 4096(kB) 4096/4 = 1024(个扇区)
Running Cesanta flasher (speed 115200)...
params: ?
MEMORY START
ELSE.... 26
P: OHAI
Writing 4096 @ 0x0... 0 (0 %)
1024 (25 %)
2048 (50 %)
3072 (75 %)
4096 (100 %)
Wrote 4096 bytes at 0x00000000 in 0.4 seconds (89.0 kbit/s)...
Writing 339968 @ 0x1000... 0 (0 %)
1024 (0 %)
2048 (0 %)
......
Wrote 339968 bytes at 0x00001000 in 29.5 seconds (92.3 kbit/s)...
Writing 4096 @ 0x3fc000... 0 (0 %)
1024 (25 %)
2048 (50 %)
3072 (75 %)
4096 (100 %)
Wrote 4096 bytes at 0x003fc000 in 0.4 seconds (88.8 kbit/s)...
Writing 4096 @ 0x3fe000... 0 (0 %)
1024 (25 %)
2048 (50 %)
3072 (75 %)
4096 (100 %)
Wrote 4096 bytes at 0x003fe000 in 0.4 seconds (89.3 kbit/s)...
Leaving...
com closed
以上是在下载ESP8266程序时打印出来的信息,可以看到:
AliOS-Things上的使用例程:
/*
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
*/
#include <aos/aos.h>
#include <hal/soc/soc.h>
#include "stdio.h"
#include "../../../platform/mcu/esp8266/bsp/include/espressif/spi_flash.h"
// 写flash
void write_config(void)
{
uint32 value, value2, value3, value4;
value = 1994;
value2 = 1995;
value3 = 1996;
value4 = 1997;
printf("erase:%d\r\n", spi_flash_erase_sector(0x201));
printf("write:%d\r\n", spi_flash_write(0x201000, (uint32 *)&value, sizeof(value)));
printf("write:%d\r\n", spi_flash_write(0x201004, (uint32 *)&value2, sizeof(value2)));
printf("write:%d\r\n", spi_flash_write(0x201008, (uint32 *)&value3, sizeof(value3)));
printf("write:%d\r\n", spi_flash_write(0x20100C, (uint32 *)&value4, sizeof(value4)));
printf("sizeof:%d\r\n", sizeof(value));
}
//读取flash内容
void read_config(void) {
uint32 temp, temp2, temp3, temp4;
printf("sizeof:%d\r\n", sizeof(temp));
printf("read:%d\r\n", spi_flash_read(0x201000, (uint32 *)&temp, sizeof(temp)));
printf("read:%d\r\n", spi_flash_read(0x201004, (uint32 *)&temp2, sizeof(temp2)));
printf("read:%d\r\n", spi_flash_read(0x201008, (uint32 *)&temp3, sizeof(temp3)));
printf("read:%d\r\n", spi_flash_read(0x20100C, (uint32 *)&temp4, sizeof(temp4)));
printf("temp:%d\r\n", temp);
printf("temp2:%d\r\n", temp2);
printf("temp3:%d\r\n", temp3);
printf("temp4:%d\r\n", temp4);
}
int application_start(int argc, char *argv[])
{
printf("liefyuan's esp8266 :%d\r\n", user_rf_cal_sector_set());
write_config();
read_config();
aos_loop_run();
return 0;
}