讀寫操作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 想著是聯華科這樣的大廠出來的雖然貴幾塊...