0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

stm32f407 easyflash移植过程记录

冬至子 来源:螺丝松掉的人 作者:螺丝松掉的人 2023-07-31 14:24 次阅读

EasyFlash是一款开源的轻量级嵌入式Flash存储器库,非常适合智能家居、可穿戴、工控、医疗、物联网等需要断电存储功能的产品,资源占用极低,并且支持各种 MCU 片上存储器。

之所以将其移植到 robomaste-C 型开发板上,是为了存储重要日志,以及在正常运行情况下存储重要数据用于调试分析,尽量减小 debug 环境下对系统行为的影响。目前该开发板已经支持 easyflash ,进入 menucofig 中使能即可,main 函数中会进行初始化。(不需要使用 easyflash 时,一定要记得关闭该功能,Flash 的擦除次数有限)

1.jpg

robomaster C 板使用芯片 STM32F407IGH6 片上搭载 1MB Flash,具体参数如下所示:

1.jpg

1.jpg

对接要点

对接的具体流程就不详细描述了,有很多大佬成功移植的教程,项目仓库中也有丰富的相关文档。这里记录对接要点,以及需要注意的一些坑。

因为使用的是 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是对的;

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6002

    文章

    43980

    浏览量

    620888
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348844
  • 嵌入式芯片
    +关注

    关注

    4

    文章

    224

    浏览量

    27508
  • 片上存储器
    +关注

    关注

    0

    文章

    6

    浏览量

    6424
  • STM32F407
    +关注

    关注

    15

    文章

    187

    浏览量

    28993
  • Flash单片机
    +关注

    关注

    0

    文章

    111

    浏览量

    9296
  • HAL库
    +关注

    关注

    1

    文章

    112

    浏览量

    5894
收藏 人收藏

    评论

    相关推荐

    STM32F407怎么移植基于RTL8305SC的LWIP?

    我现在手里有块板子,是STM32F407与RTL8305SC组成的网络部分,现在想移植LWIP,怎么移植 求教
    发表于 03-30 04:35

    STM32F1移植STM32F407

    STM32F1移植STM32F407(ld3320)参考红色,F4黑色EXTI:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    发表于 08-04 07:56

    stm32f407的内核移植

    上一篇博文讲到了先移植基于stm32f407的u-boot,本文讲到的是最难的移植stm32f407的内核,这个内核源代码我也是在网上找到了,看介绍是国外大神所修改而成的,真的万分感谢
    发表于 08-05 06:18

    STM32F407移植ThreadX

    STM32CubeIDE 中针对 STM32F407 移植 ThreadX,不依赖盗版破解的Keil MDK、IAR等软件。
    发表于 08-23 08:22

    UCOS III是怎样移植STM32F407上去的

    UCOS III是怎样移植STM32F407上去的?移植步骤有哪些呢?
    发表于 10-20 06:38

    STM32F407的CAN通信过程是怎样的

    STM32F407的CAN通信目的是什么?STM32F407的CAN通信过程是怎样的?
    发表于 10-20 06:26

    怎样去移植stm32f407的uClinux内核呢

    怎样去移植stm32f407的uClinux内核呢?求解答
    发表于 10-26 07:50

    记录STM32f407程序移植到GD32F407的全过程

    0、前言本文记录STM32f407程序移植到GD32F407的全过程,两个芯片是pin to pin,基本特性都是,最大168MHZ,102
    发表于 01-26 08:17

    如何将stm32f407移植stm32f427上呢

    写在前面:本次系列是针对比赛的调试,去年比赛我们使用的核心控制板是STM32F407,今年决定用STM32F427,所以需要移植我们的程序,这里用到的调试软件是IAR,当然用keil也是一样的。在此
    发表于 02-21 07:06

    STM32F407的ADC与USART的学习过程记录

    怎样去使用STM32F407的ADC与USART呢?有哪些使用方法与步骤?
    发表于 02-24 06:16

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解
    发表于 11-23 18:06 70次下载
    【<b class='flag-5'>STM32F407</b>开发板用户手册】第13章 <b class='flag-5'>STM32F407</b>启动<b class='flag-5'>过程</b>详解

    STM32f407程序移植到GD32F407

    0、前言本文记录STM32f407程序移植到GD32F407的全过程,两个芯片是pin to pin,基本特性都是,最大168MHZ,102
    发表于 12-02 14:36 78次下载
    <b class='flag-5'>STM32f407</b>程序<b class='flag-5'>移植</b>到GD32F<b class='flag-5'>407</b>

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作
    发表于 12-04 13:36 73次下载
    【<b class='flag-5'>STM32F407</b>开发板用户手册】第1章   初学<b class='flag-5'>STM32F407</b>的准备工作

    STM32CubeIDE 中针对 STM32F407 移植 ThreadX

    STM32CubeIDE 中针对 STM32F407 移植 ThreadX,不依赖盗版破解的Keil MDK、IAR等软件。
    发表于 12-04 13:36 17次下载
    在 <b class='flag-5'>STM32</b>CubeIDE 中针对 <b class='flag-5'>STM32F407</b> <b class='flag-5'>移植</b> ThreadX

    stm32f407原理图

    stm32f407原理图
    发表于 07-14 16:07 169次下载