Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
easyflash
flash
STM32
stm32f407 easyflash 移植记录
发布于 2023-07-30 22:26:43 浏览:742
订阅该版
[tocm] # stm32f407 easyflash 移植记录 EasyFlash是一款开源的轻量级嵌入式Flash存储器库,非常适合智能家居、可穿戴、工控、医疗、物联网等需要**断电存储功能**的产品,资源占用极低,并且支持各种 MCU 片上存储器。[项目地址](https://github.com/armink/EasyFlash) 之所以将其移植到 robomaste-C 型开发板上,是为了存储重要日志,以及在正常运行情况下存储重要数据用于调试分析,尽量减小 debug 环境下对系统行为的影响。目前该开发板已经支持 easyflash ,进入 menucofig 中使能即可,main 函数中会进行初始化。**(不需要使用 easyflash 时,一定要记得关闭该功能,Flash 的擦除次数有限)** ![image-20230716113122459.png](https://oss-club.rt-thread.org/uploads/20230730/04d2c2b9e371b8845f361583f2cd9004.png) robomaster C 板使用芯片 STM32F407IGH6 片上搭载 1MB Flash,**具体参数**如下所示: ![image-20230714114058907.png](https://oss-club.rt-thread.org/uploads/20230730/d866a29b6893f622c7623e821d381cfa.png) ![image-20230714114122323.png](https://oss-club.rt-thread.org/uploads/20230730/4ac96af2d53dc09dc212fa8a9fa655c6.png) ## 对接要点 对接的具体流程就不详细描述了,有很多大佬成功移植的教程,项目仓库中也有丰富的相关文档。这里记录对接要点,以及需要注意的一些坑。 - 因为使用的是 STM32F407 1MB 的片上 Flash, 直接使用 HAL 库的相关 API,需要引用 `Inc\stm32f4xx_hal_flash.h`、 `Inc\stm32f4xx_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 有变动,可以参考我的具体实现: ```C 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是对的; 以上这些都是在移植过程中遇到的一些问题,和留下的教训,参考了很多前人的经验 。感谢 [armink](https://github.com/armink) 大佬,有了 easyflash ,我们就可以更便捷灵活的利用和管理 Flash 资源了。
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
螺丝松掉的人
这家伙很懒,什么也没写!
文章
42
回答
0
被采纳
0
关注TA
发私信
相关文章
1
OTA 片上FLASH擦除失败
2
请问 怎么实现flash的FIFO存储呢
3
FAL初始化输出调试信息bug
4
spi1挂载w25q32失败
5
SD卡与外置flash(dg25q32)一起应用,挂载spi2总线上
6
w25q128 flash 怎么在电脑和开发板上切换挂载
7
RTT没有对FLASH进行操作的指令吗
8
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
9
使用FAL接口写的片内flash的擦除函数会死掉
10
关于潘多拉flash操作例程的
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部