STM32G070 onchip移植FlashDB

2023-11-01

一、Onchip Flash 特性

  1. 在STM32G070 的片内 Flash写入数据之前必须先对目标地址进行擦除后才能写入数据
  2. 数据写入:G070 Flash 写入数据必须保证8字节对齐,一次写入双字数据64bit 8Byte
  3. 数据读取:使用地址直接读取

二、移植FAL

1. 添加以下文件到工程

在这里插入图片描述

2. 修改fal_cfg.h 中分区表

片上Flash需要注意 分区地址避开程序的存储地址否则将导致程序不能正常运行

#define FAL_PART_TABLE                                                                \
{                                                                                     \
    {FAL_PART_MAGIC_WORD,  "fdb_tsdb",    "stm32_onchip",   100*1024, 4*1024, 0},  \
    {FAL_PART_MAGIC_WORD,  "fdb_kvdb",    "stm32_onchip",   104*1024, 4*1024, 0},  \
}

3. 添加fal_flash_stm32g0_port.c

在这里插入图片描述
由于STM32G070 片上Flash 目标地址 只要写入过一次数据(包含0xFF)就不可以再次写入数据,必须先擦除在写入,也许与FLASH的校验、纠错机制有关系

所以在write函数内,写入数据之前需要先读取即将写入目标地址的存储值与写入值是否相同,若是相同就不必再次写入,否则会写入失败

#define PAGE_SIZE     2048
static int init(void)
{
    return 1;
}

static int read(long offset, uint8_t *buf, size_t size)
{
    size_t i;
    uint32_t addr = stm32_onchip_flash.addr + offset;
    for (i = 0; i < size; i++, addr++, buf++)
    {
        *buf = *(uint8_t *)addr;
    }
    return size;
}


static int write(long offset, const uint8_t *buf, size_t size)
{
    size_t   i;
    uint32_t addr = stm32_onchip_flash.addr + offset;
    __ALIGN_BEGIN uint64_t write_data __ALIGN_END;
    __ALIGN_BEGIN uint64_t read_data  __ALIGN_END;  
    HAL_FLASH_Unlock();
    for (i = 0; i < size; i+=8) 
    {
        read_data = *(uint64_t *)(addr+i);
        if (read_data != (uint64_t)(*((uint64_t *)((uint32_t)buf + i))))
        {
            HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)(uint64_t*)(addr+i),(uint64_t)(*((uint64_t *)((uint32_t)buf + i))));                
            read_data = *(uint64_t *)(addr+i);
            if (read_data != (uint64_t)(*((uint64_t *)((uint32_t)buf + i))))
            {
                HAL_FLASH_Lock(); 
                return -1;
            }
            else
            {        
               feed_dog();//FLash操作可能非常耗时,如果有看门狗需要喂狗,以下代码由用户实现
            }  
        }     
    } 
    HAL_FLASH_Lock();
    return size;
}


static int erase(long offset, size_t size)
{
    HAL_StatusTypeDef flash_status;
    FLASH_EraseInitTypeDef EraseInitStruct;   
    uint32_t HeadErasePage = offset/FLASH_PAGE_SIZE,PAGEError = 0;
    size_t erase_pages = size / FLASH_PAGE_SIZE;
    if(size % FLASH_PAGE_SIZE != 0) erase_pages++;           
    EraseInitStruct.Banks = FLASH_BANK_1;
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.NbPages     = 1;  //一次擦出一个扇区, 以执行一次喂狗,防止超时  
    HAL_FLASH_Unlock();
    for (size_t i = 0; i < erase_pages; i++) 
    {
        EraseInitStruct.Page = HeadErasePage + i;       
        flash_status         = HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);         
        if (flash_status != HAL_OK) 
        {
            HAL_FLASH_Lock(); 
            return -1;
        }
        else
        {
            feed_dog();
        }
    }
    HAL_FLASH_Lock(); 
    return size;
}

const struct fal_flash_dev stm32_onchip_flash =
{
    .name       = "stm32_onchip",//Flash名称
    .addr       = 0x08000000,//Flash起始地址
    .len        = 128*1024,//Flash的大小
    .blk_size   = 2*1024,//一次性可擦除的Flash大小
    .ops        = {init, read, write, erase},//Flash访问驱动
    .write_gran = 64 //最小写入粒度64位按照8字节对齐
};

三、移植FlashDB

1. 添加FlashDB文件到工程

在这里插入图片描述

2. 修改fdb_cfg.h头文件中关于写入粒度的定义

/* the flash write granularity, unit: bit
 * only support 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1) */
#define FDB_WRITE_GRAN                64

3.参考sample案列使用

以下地址包含API说明
FlashDB仓库

SFUD移植

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32G070 onchip移植FlashDB 的相关文章

  • 光照 (5) 光照贴图

    物体在不同的部件上都有不同的材质属性 1 1 漫反射 允许我们对物体的漫反射分量 以及间接地对环境光分量 它们几乎总是一样的 和镜面光分量有着更精确的控制 漫反射贴图 Diffuse Map 使用一张覆盖物体的图像 让我们能够逐片段索引其独
  • 十大排序算法:快速排序算法

    一 快速排序算法思想或步骤 分解 数组A p r 被划分为两个子数组A p q 1 和A q 1 r 使得A q 为大小居中的数 左侧A p q 1 中的每个元素都小于等于它 而右边A q 1 r 每个元素都大于等于它 解决 通过递归调用快
  • linux shell oracle脚本_分享一个shell脚本--统计Oracle最消耗资源的SQL语句

    概述 This project meant to provide useful scripts for DB maintance and management to make work easier and interesting 今天主要

随机推荐

  • Unity Shader Graphs无法代码动态赋值的问题解决

    起因 给一个材质球更换图片 动态更换了很久 换不上去 解决 Reference unity给的是随机的名字只需要改成自己的名字就可以了 完美解决 不需要下划线 只是自己定义的名字 box EndTarget image material S
  • sqli-labs通关攻略教程六(less26~less28a)

    文章目录 less 26 方法1 方法2 补充知识 less 26a less 27 less 27a less 28 less 28a less 26 方法1 由题目可知 本题绕过了空格和注释 注释符用 1 1或者 00绕过 空白符绕过
  • android intent深入解析

    一 Intent的显示调用 1 intent setClass this OtherActivity class 2 intent setClassName this com zizhu activitys OtherActivity 3
  • Linux chown命令

    Linux Unix 是多人多工操作系统 所有的文件皆有拥有者 利用 chown 将指定文件的拥有者改为指定的用户或组 用户可以是用户名或者用户ID 组可以是组名或者组ID 文件是以空格分开的要改变权限的文件列表 支持通配符 一般来说 这个
  • java解决Exception in thread “main“ java.lang.OutOfMemoryError: GC overhead limit exceeded

    这个就是内存占用超过了限制 解决方案 加载文件的容量太大 这个只能切分文件 使用BufferedInputStream一行行读取 BufferedInputStream bufferedReader new BufferedInputStr
  • 输入三角形的3个边长,a,b,c求出三角形的面积。(C语言)

    代码 define CRT SECURE NO WARNINGS 1 include
  • requestBody注解转化json报错

    RequestBody ResponseBody 注解详解 转 解决方法 不要用modelMap 新建一个hashMap类即可 进来给app写接口比较多 遇到一个bug requestBody会自动往modelMap里加解决办法 清空map
  • 用redis实现支持优先级的消息队列

    用redis实现支持优先级的消息队列 为什么需要消息队列 系统中引入消息队列机制是对系统一个非常大的改善 例如一个web系统中 用户做了某项操作后需要发送邮件通知到用户邮箱中 你可以使用同步方式让用户等待邮件发送完成后反馈给用户 但是这样可
  • 出现 HTTP 错误 500.19 错误代码 0x800700b7

    这个内容出现主要问题是在IIS上 我们一般程序开发 iis中默认的路径只是http localhost 相当于环境变量中已定义好了 如果自己创建的项目直接将路径定义到这 就会替换图二中的路径 然后你的程序图一中所指向的路径就会无效 图三是我
  • Java,Enum里定义属性和方法

    最近的项目用到了大神写的统一返回码的代码 ErrorCode java 统一6位 异常码 author Administrator public enum ErrorCode global OK 000000 操作成功 ERROR 0000
  • 子类化QListWidget实现自定义拖拽功能.

    我们经常会碰到这样的一个问题 我们想把其他地方选中的文本 直接通过拖拽移动到一个控件中 从而实现方便添加项的功能 这里我们以QListWidget作为例子 来实现这么一个功能 其他地方的文本可直接拖拽进QListWidget中 且QList
  • pandas to_sql详解

    pandas to sql api的使用文章已经很多了 但是都只是简单介绍了怎么使用 一些细节问题没有介绍到 这里我们增加说明一些细节问题 1 列的对应 2 多值插入 3 批量插入 api说明 照常 我们对api参数也做一下详细的介绍 也就
  • 第一次使用markdown编辑器_交换两个数组

    交换两个数组 将两个整形变量进行交换可引入第三个变量 数组的交换也可以这样做 int main int arr1 1 2 3 定义两个数组 int arr2 2 3 4 int i 0 int tmp 0 定义第三个数组用于交换 for i
  • 12-控制Pawn类移动与调整视角 UE4 C++

    在上一节 11 控制Pawn类移动增加镜头摇臂 已经完成了Pawn的移动和镜头摇臂功能 本节继续增加移动镜头视角的功能 首先在MyPawn h中增加如下代码 void CameraPitch float Value 用于调整抬头低头 voi
  • cocos2d-x下c++调用lua函数

    首先需要lua中的函数句柄传到c 层 通过tolua 将c 类绑定到lua后 构造该c 类时传入lua函数句柄即可 在c 层回调lua函数的具体代码如下 void notifyLua int type int value CCLuaStac
  • C++ sort()排序函数用法详解

    include
  • python自动化操作_文件和目录的批量重命名操作

    一 文件和文件夹的批量重命名 1 文件重命名使用os库里的rename函数 os rename old new 二 复杂路径中的文件重命名 1 注意文件夹修改的时候 会只修改最外层的文件夹 因为改了后就变了名字 找不到啦 解决办法 加top
  • JAVA在线考试系统

    一 项目简介 随着互联网迅速发展 人们的生活已经越来越离不开互联网 人们足不出户就可以工作 买卖 学习等 对于在校学生 通过网络教育不仅可以随时进行网络学习 也可以根据学习的情况自我检测 有利于学生高效 快捷地掌握所学的知识 本系统预设计的
  • 五、传输层(三)TCP

    目录 3 0 TCP特点补充 3 1 TCP报文段首部格式 3 2 TCP连接管理 3 2 1 三报文握手 3 2 2 四报文挥手 3 3 TCP的流量控制和可靠传输 3 4 TCP拥塞控制 3 4 1 接收窗口 拥塞窗口 发送窗口关系 3
  • STM32G070 onchip移植FlashDB

    一 Onchip Flash 特性 在STM32G070 的片内 Flash写入数据之前必须先对目标地址进行擦除后才能写入数据 数据写入 G070 Flash 写入数据必须保证8字节对齐 一次写入双字数据64bit 8Byte 数据读取 使