ESP8266 Flash的分布及其讀寫操作

2021-10-07 11:54:36 字數 3672 閱讀 4635

讀寫操作api

基本操作

(1) spi_flash_erase_sector

功能    擦除 flash 的某個扇區。

函式定義    spiflashopresult spi_flash_erase_sector (uint16 sec)

引數    uint16 sec- 扇區號,從0 開始計數,每個扇區大小為4kb。

返回值    spiflashopresult

(2)spi_flash_write

功能    將資料寫入flash 。

請先呼叫spi_flash_erase_sector 擦除待寫區域,再寫入資料。

函式定義    spiflashopresult spi_flash_write (uint32 des_addr, uint32 *src_addr, uint32size)

引數    uint32 des_addr – 寫入flash 的位址,起始位置。

uint32 *src_addr – 寫入flash 的資料指標。

uint32 size – 寫入資料的長度,單位:byte。

返回值    spiflashopresult

(3)spi_flash_read

功能    從 flash 讀取資料。

函式定義    spiflashopresult spi_flash_read(uint32 src_addr, uint32 * des_addr, uint32 size)

引數    uint32 src_addr – 讀取flash 的位址,起始位置。

uint32 *des_addr – 讀取flash 的資料指標。

uint32 size – 讀取資料的長度,單位:byte。

返回值    spiflashopresult

(4)返回值

typedef enumspiflashopresult;

注意事項

每個扇區的大小為4kb,即4*1024 bytes。

flash讀寫資料要以四位元組對齊。

flash要先擦除再寫入。

示例**

/** 方式一

*/#define len 1            //以讀寫4位元組的資料為例

#define sec 123           //讀寫的扇區(sector)號

#define sec_offset 0       //扇區內偏移量(必須是4的倍數)

uint32 write_data[len];

uint32 read_data[len];

//todo

//fill the write_data

//讀取資料

spi_flash_read(sec*4*1024+sec_offset, read_data, len*4); 

//寫入資料

spi_flash_erase_sector(sec);

spi_flash_write(sec*4*1024+sec_offset, write_data, len*4); 

/** 方式二

*/#define len 1             //以讀寫4位元組的資料為例

#define sec 123           //讀寫的扇區(sector)號

#define sec_offset 0      //扇區內偏移量(必須是4的倍數)

uint8 write_data[len*4];

uint8 read_data[len*4];

//todo

//fill the write_data

//讀取資料

spi_flash_read(sec*4*1024+sec_offset, (uint32 *)&read_data, len*4); 

//寫入資料

spi_flash_erase_sector(sec);

spi_flash_write(sec*4*1024+sec_offset, (uint32 *)&write_data, len*4); 

【總結】讀寫位址scr_addr=sec*4*1024+sec_offset

flash位址對映

esp8266提供了讀寫flash的介面,操作很簡單,但不能隨便找個地方就開始擦除然後寫入自己的資料,這樣很容易把資料寫到不該寫入的地方,造成一些潛在的問題,因此難點在於確定讀寫資料的安全位置。

這裡以8m bits即1m bytes(1024 bytes)的flash為例做以說明,其flash布局如下。

bin    燒錄位址    說明

boot.bin(boot_v1.6.bin)    0x00000    啟動程式,sdk中提供。

user1.bin(user1.1024.new.2.bin)    0x01000    主程式,編譯**生成。

esp_init_data_default.bin    0x0fc000    初始化射頻引數,sdk中提供。

blank.bin    0x0fe000    初始化系統引數,sdk中提供。

[注]上表參考esp8266 flash的維基百科的第三節(layout with ota)以及實際燒錄配置。

程式區    boot.bin 起始位址0x00000

user1.bin起始位址0x01000

系統引數區    flash最後4個扇區(即flash最後16k bytes)

esp_init_data_default.bin位於flash倒數第4個 sector

blank.bin位於flash倒數第2個sector

[注]軟體支援雲端公升級(boot),上表參考自《esp8266 flash 讀寫說明》。

下面的圖更加直觀地展示了1024kb flash的分布情況:

結合這張圖,說明兩個問題。

[注]對於1024kb的flash,可以分為256(1024/4)個扇區,扇區號為0~255。

確定各個檔案的燒錄位址

(1)boot.bin,啟動程式,燒錄位址固定為flash的開始位置,即0x00000;

4096換算成十六進製制就是0x01000;

(3)esp_init_data_default.bin,初始化射頻引數,位於flash倒數第4個 sector(即252號扇區),則燒錄位址應為:

252×4×1024=1032192

252×4×1024=1032192

1032192換算成十六進製制就是0x0fc000;

(4)blank.bin,初始化系統引數,位於flash倒數第2個sector(即254號扇區),則燒錄位址為:

254×4×1024=1040384

254×4×1024=1040384

1040384換算成十六進製制就是0x0fe000;

使用者儲存資料的安全區域

如果使用者程式user1.bin小於492kb,則剩餘的空間可以用於儲存使用者資料;

起始位址為:495616 —-> 0x79000,可用空間大小為此後的3個扇區(121號、122號、123號)。

[推薦]儲存在使用者引數區(該區域專門用於上層應用程式儲存使用者引數),起始扇區號為:

512−164=124

512−164=124

起始位址為507904–> 0x7c000,可用此後的4個扇區(124號、125號、126號、127號)。

[注]由上述計算可知,使用者引數區是與程式區是相連的,因此使用者程式大小不能超過492kb。

esp8266 flash位址規劃?

本文選取的是esp8266 12f 4096kb 4m flash記憶體 1.如何讓確定為4m記憶體的?原因 由於是從同事手上接專案,所以並無晶元規格書等物件。檢視工具編譯選項,esp init data default.bin 0x3fc000 blank.bin 0x3fe000 備份系統程式位...

esp8266的flash對映 僅為個人筆記

本人初學者,以下僅為個人理解 iram 指令存放處,有64kb irom flash對映的rom,限制在了8mbit 二級bootloader可以變相的解除限制 dram 變數存放處,有96kb iram1 0 seg org 0x40100000,len 0x8000 因為iram後32kb用ca...

關於ESP8266模組的配置

從接觸esp8266到現在也有快乙個月的時間了。我最開始是用的有人的wifi模組,感覺資料還比較全,用起來還比較順手。後來發現有低成本的esp8266模組就立馬入手了幾個,發現資料太亂了都不知道從 開始搞起,測試了一下經常是busy。所以去買了幾個tm7681 想著是聯華科這樣的大廠出來的雖然貴幾塊...