Ⅰ.呼叫介面方面
①codeflash與dataflash分為兩組介面,詳見EVT包中的FLASH例程。
codeflash基地址為0。讀寫codeflash的介面帶有核心加解密。擦除flash不涉及加解密;擦除codeflash後讀出4位元組迴圈“亂碼”是正常的。codeflash最小擦除單位:4096位元組。
dataflash基地址為0x70000。讀寫dataflash的介面自帶0x70000的基地址,不帶加解密,操作dataflash時只需要關心偏移地址。使用者可以進MCU的原廠boot,走ISP工具直接讀出dataflash。dataflash最小擦除單位:256位元組。
②不論是codeflash還是dataflash,寫之前一定要先擦除。dataflash的介面名中帶有EEPROM字樣,但本質上它還是flash。
③介面中的讀/寫buff快取在ram中的地址,一定要4位元組對齊,否則可能導致hardfault復位。四位元組對齊問題的排查可見部落格:CH57x/CH58x/CH32V wch risc-v 晶片hardfault問題追蹤&程式卡死追蹤 - iot-fan - 部落格園 (cnblogs.com)
④擦除flash的起始地址、擦除長度都建議對齊最小擦除單位。由於地址或是長度不對齊,擦除n個單位長度時,會將涉及到的n+1甚至n+2個最小單位全部擦除。
Ⅱ.手冊資訊,介紹了擦寫壽命、單詞扇區擦除操作時間。RISC-V核心的CH5Xx藍芽MCU此處引數相差不大。
Ⅲ.BLE例程中使用到的dataflash區域。注意避開或是在宏定義中重新規劃
Dataflash |
佔用長度 |
相關宏定義 |
用途 |
0 |
12K位元組(0x2FFF) |
CONFIG_MESH_NVS_ADDR_DEF等 |
Mesh網路資訊 |
0x7000 |
4位元組(0x7003) |
OTA_DATAFLASH_ADD |
OTA升級的標誌 |
0x7E00 |
512位元組(0x7FFF) |
BLE_SNV_ADDR等 |
BLE配對繫結資訊 |
Ⅳ.操作flash時間開銷實測(以CH592為例)
codeflash只支援4096位元組“塊擦”,不支援“頁擦”。dataflash支援256位元組“頁擦”,也支援4096位元組“塊擦”。本質上是同一塊flash,
位元組數 |
擦除時長(ms) |
寫入時長(ms) |
讀出時長(us) |
1 |
17.14 |
2.2 |
7 |
100 |
17.15 |
2.2 |
48 |
256(1頁) |
17.15 |
1.6 |
110 |
300 |
34.28 |
3.7 |
127 |
500 |
34.27 |
3.7 |
207 |
512(2頁) |
34.28 |
3.2 |
212 |
513 |
51.45 |
5.3 |
212 |
4096(擦1塊) |
17.13 |
25.5 |
1.65ms |
4096+256(1塊+1頁) |
34.32 |
27.1 |
1.75ms |
4096+300 |
51.44 |
29.2 |
1.76ms |