EasyFlash是一款開源的輕量級嵌入式Flash存儲器庫,非常適合智能家居、可穿戴、工控、醫療、物聯網等需要斷電存儲功能的產品,資源占用極低,并且支持各種 MCU 片上存儲器。
之所以將其移植到 robomaste-C 型開發板上,是為了存儲重要日志,以及在正常運行情況下存儲重要數據用于調試分析,盡量減小 debug 環境下對系統行為的影響。目前該開發板已經支持 easyflash ,進入 menucofig 中使能即可,main 函數中會進行初始化。(不需要使用 easyflash 時,一定要記得關閉該功能,Flash 的擦除次數有限)
robomaster C 板使用芯片 STM32F407IGH6 片上搭載 1MB Flash,具體參數如下所示:
對接要點
對接的具體流程就不詳細描述了,有很多大佬成功移植的教程,項目倉庫中也有豐富的相關文檔。這里記錄對接要點,以及需要注意的一些坑。
因為使用的是 STM32F407 1MB 的片上 Flash, 直接使用 HAL 庫的相關 API,需要引用 Incstm32f4xx_hal_flash.h、 Incstm32f4xx_hal_flash_ex.h 這兩個頭文件;
對接時需要 Flash 的具體參數如,開始地址,操作粒度等,這些參數需要了解清楚,文章前面的圖片中也可以讀出;
可以搭配 STM32 ST-LINK Utility 工具查看 Flash 存儲情況,擦除后全為 0xffffffff;
擦除和寫入 Flash 時,需要先解鎖 Flash,操作完之后再上鎖;
HAL_FLASH_Program()函數對于不同芯片的HAL庫,入參也不甚相同,有的芯片可以按1字節、2字節、4字節、8字節寫入,比如STM32F407,有的芯片只能按8字節寫入,比如STM32L4。同時,Flash寫入時要注意字節對齊;
很多博客都是關于 F1 移植的,F4 和 F1 的是有區別的,而且網上大部分使用 HAL 都是 2016 年的,現在 HAL 以及更新過,并且相關 API 有變動,可以參考我的具體實現:
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;
}
分區首次使用的話是要擦除一次的,所以第一次報sector header check failed是對的;
-
單片機
+關注
關注
6044文章
44632瀏覽量
639181 -
STM32
+關注
關注
2273文章
10928瀏覽量
357893 -
嵌入式芯片
+關注
關注
4文章
230瀏覽量
27752 -
片上存儲器
+關注
關注
0文章
6瀏覽量
6484 -
STM32F407
+關注
關注
15文章
188瀏覽量
29684 -
Flash單片機
+關注
關注
0文章
111瀏覽量
9474 -
HAL庫
+關注
關注
1文章
121瀏覽量
6401
發布評論請先 登錄
相關推薦
國產優秀替代_APM32F407替代STM32F407記錄
![國產優秀替代_APM32<b class='flag-5'>F407</b>替代<b class='flag-5'>STM32F407</b><b class='flag-5'>記錄</b>](https://file.elecfans.com/web2/M00/42/9D/poYBAGJ51bOAJqFKABHtxRNfi74263.png)
記錄STM32f407程序移植到GD32F407的全過程
STM32F407 DCMI攝像頭源碼
![<b class='flag-5'>STM32F407</b> DCMI攝像頭源碼](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F407開發板用戶手冊】第13章 STM32F407啟動過程詳解
![【<b class='flag-5'>STM32F407</b>開發板用戶手冊】第13章 <b class='flag-5'>STM32F407</b>啟動<b class='flag-5'>過程</b>詳解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32F407與STM32F105 CAN通訊失敗的定位解決
![<b class='flag-5'>STM32F407</b>與<b class='flag-5'>STM32F</b>105 CAN通訊失敗的定位解決](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32F407芯片介紹
![<b class='flag-5'>STM32F407</b>芯片介紹](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
在 STM32CubeIDE 中針對 STM32F407 移植 ThreadX
![在 <b class='flag-5'>STM32</b>CubeIDE 中針對 <b class='flag-5'>STM32F407</b> <b class='flag-5'>移植</b> ThreadX](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32F407+FreeRTOS+LWIP1.4.1移植問題記錄
![<b class='flag-5'>STM32F407</b>+FreeRTOS+LWIP1.4.1<b class='flag-5'>移植</b>問題<b class='flag-5'>記錄</b>](https://file1.elecfans.com/web2/M00/8D/64/wKgZomS6IOiAWxDqAABH_3KWshU114.jpg)
評論