EasyFlash是一款開源的輕量級(jí)嵌入式Flash存儲(chǔ)器庫(kù),非常適合智能家居、可穿戴、工控、醫(yī)療、物聯(lián)網(wǎng)等需要斷電存儲(chǔ)功能的產(chǎn)品,資源占用極低,并且支持各種 MCU 片上存儲(chǔ)器。
之所以將其移植到 robomaste-C 型開發(fā)板上,是為了存儲(chǔ)重要日志,以及在正常運(yùn)行情況下存儲(chǔ)重要數(shù)據(jù)用于調(diào)試分析,盡量減小 debug 環(huán)境下對(duì)系統(tǒng)行為的影響。目前該開發(fā)板已經(jīng)支持 easyflash ,進(jìn)入 menucofig 中使能即可,main 函數(shù)中會(huì)進(jìn)行初始化。(不需要使用 easyflash 時(shí),一定要記得關(guān)閉該功能,F(xiàn)lash 的擦除次數(shù)有限)
robomaster C 板使用芯片 STM32F407IGH6 片上搭載 1MB Flash,具體參數(shù)如下所示:
對(duì)接要點(diǎn)
對(duì)接的具體流程就不詳細(xì)描述了,有很多大佬成功移植的教程,項(xiàng)目倉(cāng)庫(kù)中也有豐富的相關(guān)文檔。這里記錄對(duì)接要點(diǎn),以及需要注意的一些坑。
因?yàn)槭褂玫氖?STM32F407 1MB 的片上 Flash, 直接使用 HAL 庫(kù)的相關(guān) API,需要引用 Incstm32f4xx_hal_flash.h、 Incstm32f4xx_hal_flash_ex.h 這兩個(gè)頭文件;
對(duì)接時(shí)需要 Flash 的具體參數(shù)如,開始地址,操作粒度等,這些參數(shù)需要了解清楚,文章前面的圖片中也可以讀出;
可以搭配 STM32 ST-LINK Utility 工具查看 Flash 存儲(chǔ)情況,擦除后全為 0xffffffff;
擦除和寫入 Flash 時(shí),需要先解鎖 Flash,操作完之后再上鎖;
HAL_FLASH_Program()函數(shù)對(duì)于不同芯片的HAL庫(kù),入?yún)⒁膊簧跸嗤?,有的芯片可以?字節(jié)、2字節(jié)、4字節(jié)、8字節(jié)寫入,比如STM32F407,有的芯片只能按8字節(jié)寫入,比如STM32L4。同時(shí),F(xiàn)lash寫入時(shí)要注意字節(jié)對(duì)齊;
很多博客都是關(guān)于 F1 移植的,F(xiàn)4 和 F1 的是有區(qū)別的,而且網(wǎng)上大部分使用 HAL 都是 2016 年的,現(xiàn)在 HAL 以及更新過(guò),并且相關(guān) API 有變動(dòng),可以參考我的具體實(shí)現(xiàn):
EfErrCode ef_port_erase(uint32_t addr, size_t size) {
EfErrCode result = EF_NO_ERR;
FLASH_Status flash_status;
size_t erased_size = 0;
uint32_t cur_erase_sector;
/* make sure the start address is a multiple of EF_ERASE_MIN_SIZE /
EF_ASSERT(addr % EF_ERASE_MIN_SIZE == 0);
/ start erase /
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR
| FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
/ it will stop when erased size is greater than setting size */
while(erased_size < size) {
cur_erase_sector = stm32_get_sector(addr + erased_size);
flash_status = FLASH_EraseSector(cur_erase_sector, VoltageRange_3);
if (flash_status != FLASH_COMPLETE) {
result = EF_ERASE_ERR;
break;
}
erased_size += stm32_get_sector_size(cur_erase_sector);
}
FLASH_Lock();
return result;
}
EfErrCode ef_port_write(uint32_t addr, const uint32_t *buf, size_t size) {
EfErrCode result = EF_NO_ERR;
size_t i;
uint32_t read_data;
uint8_t *buf_8 = (uint8_t )buf;
FLASH_Unlock();
FLASH_ClearFlag(
FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR
| FLASH_FLAG_PGSERR);
for (i = 0; i < size; i++, buf_8++, addr++)
{
/ write data */
FLASH_ProgramByte(addr, *buf_8);
read_data = *(uint8_t ) addr;
/ check data */
if (read_data != *buf_8) {
result = EF_WRITE_ERR;
break;
}
}
FLASH_Lock();
return result;
}
分區(qū)首次使用的話是要擦除一次的,所以第一次報(bào)sector header check failed是對(duì)的;
-
單片機(jī)
+關(guān)注
關(guān)注
6042文章
44617瀏覽量
637874 -
STM32
+關(guān)注
關(guān)注
2271文章
10923瀏覽量
357208 -
嵌入式芯片
+關(guān)注
關(guān)注
4文章
230瀏覽量
27721 -
片上存儲(chǔ)器
+關(guān)注
關(guān)注
0文章
6瀏覽量
6472 -
STM32F407
+關(guān)注
關(guān)注
15文章
188瀏覽量
29608 -
Flash單片機(jī)
+關(guān)注
關(guān)注
0文章
111瀏覽量
9444 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
121瀏覽量
6367
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論