STM32G070 onchip移植FlashDB

news2024/9/24 7:23:52

一、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移植

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全面详解Java多线程基础-2:线程的状态

相关阅读&#xff1a; 全面详解Java多线程基础-1&#xff1a;Thread类及其基本用法 操作系统里的进程&#xff0c;自身是有一个状态的。而Java的Thread类是对系统线程的封装&#xff0c;它把这里的“状态”又进一步精细化了。 理解线程状态&#xff0c;意义是能够让我们更好地…

当ChatGPT遇上StableDiffusion ChatGPT指导StableDiffusion绘画

ChatGPT指导StableDiffusion 前言开始使用场景1&#xff1a;繁华的街道场景2&#xff1a;桥上的女生 项目及教程地址&#xff0c;附GPT访问地址安装教程及安装包地址&#xff1a;点我下载开源项目&#xff1a;点我下载GPT访问地址&#xff0c;点我访问 前言 Stable Diffusion …

java下

双列集合的特点 双列集合一次需要存一对数据&#xff0c;分别为键和值键不能重复&#xff0c;值可以重复键和值是一一对应的&#xff0c;每一个键只能找到自己对应的值键&#xff0b;值这个整体我们称之为“键值对”或者“键值对对象”&#xff0c;在Java中叫做“Entry对象” …

git及vs2019代码量统计的方法

git 在工程下打开git bash //替换username&#xff0c;查看个人代码量 git log --author"username" --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", ad…

基于matlab之NR SSB 光束扫描仿真

一、前言 此示例说明如何在 5G NR 系统的发射器 &#xff08;gNB&#xff09; 和接收器 &#xff08;UE&#xff09; 端使用波束扫描。本示例使用同步信号块 &#xff08;SSB&#xff09; 说明了初始访问期间使用的一些波束管理程序。为了完成声束扫描&#xff0c;该示例使用了…

人工智能全球发展趋势、经济影响和未来挑战

人工智能&#xff08;AI&#xff09;作为一种新兴技术&#xff0c;正在引领世界经济和社会的变革。在过去几年中&#xff0c;全球范围内对人工智能的投资和研究持续增长&#xff0c;这使得人工智能成为了各行各业的关注焦点。本文将介绍人工智能的基础知识和应用场景&#xff0…

3个问题!验明GPT-4真身;基于GPT科研加速技巧汇总;Midjourney神仙教程;印象笔记有AI功能啦 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『GPT-4 验明真身的三个经典问题』快速区分 GPT-3.5 与 GPT-4&#xff0c;快来对答案 这里收集了几个免费使用 GPT-4 的工具&#xff…

LVDS为汽车应用提供可靠的视频接口

摘要&#xff1a;汽车视频应用中&#xff0c;降低视频干扰的途径是用数字信号替代模拟信号。最有效的视频传输方案是采用低电压差分信号(LVDS)接口&#xff0c;因为它具有较低的信号幅度(0.35V)和差分架构&#xff0c;可大大降低电磁辐射。 新型汽车电子信号格式变化最快的是视…

如何在 iPhone 上恢复永久删除的照片?

iPhone永久删除的照片是否永远消失了&#xff1f; 你想知道永久删除的照片在 iPhone 上放在哪里吗&#xff1f;通常情况&#xff0c;操作系统会将已删除照片的存储空间进行标记为准备好覆盖&#xff08;还未实际删除&#xff09;。iPhone 也是如此。 如果互联网连接良好&a…

从功能到外企测开,工作1年半拿下年薪30万的测开 offer,未来可期

说一下我的大致情况&#xff0c;女&#xff0c;2018年毕业于末流211计算机本科。后来待业两年&#xff0c;完全没有从事互联网方面的工作。去年来到北京&#xff0c;在小公司做了一年多功能测试。今年11月底跳槽到外企&#xff0c;开始了我钱多事少离家近&#xff0c;每周965的…

如何用ChatGPT做品牌项目的二手信息搜集?

该场景对应的关键词库&#xff08;25个&#xff09;&#xff1a; 品牌案例、竞品、信息来源、项目分析、官方渠道、品类、品牌、节日节庆、明星、国家、奖项、代理商、项目名称、项目描述、品牌介绍、竞争情况、运营数据、财务信息、交易信息、法律问题、网络平台、行业人士、品…

线程池?我不懂?

为什么要使用线程池&#xff1f; 降低资源消耗。通过重复利用已创建的线程&#xff0c;降低线程创建和销毁造成的消耗提高响应速度。当任务到达时&#xff0c;任务可以不需要等到线程创建就能立即执行增加线程的可管理型。线程是稀缺资源&#xff0c;使用线程池可以进行统一分…

c++学习之c++对c的扩展1

目录 1.面向过程与面向对象的编程 2.面向对象编程的三大特点 3.c对c的扩展&#xff1a; 1.作用域运算符&#xff1a;&#xff1a; 2.命名空间 1.c命名空间&#xff08;namespace&#xff09; 2.命名空间的使用 1.在不同命名空间内可以创建相同的名称 2.命名空间只能在全…

Java基础——异常+IO流资源释放

异常 &#xff08;1&#xff09;什么是异常&#xff1a; 程序在编译/执行的过程中可能出现的问题注意&#xff1a;语法错误不属于异常 &#xff08;2&#xff09;为什么要学习异常&#xff1a; 异常一旦出现了&#xff0c;如果没有提前处理&#xff0c;程序就会退出JVM虚拟…

java的泛型

1. 泛型是什么 ​ Java泛型是J2 SE1.5中引入的一个新特性&#xff0c;其本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数&#xff08;type parameter&#xff09;, 这种参数类型可以用在类、接口和方法的创建中&#xff0c;分别称为泛型类、泛型接口、…

如何开展兼容性测试?兼容性测试有什么作用?

兼容性测试是指测试软件在特定的硬件平台上、不同的应用软件之间、不同的操作系统平台上、不同的网络等环境中是否能够很友好的运行的测试。兼容性测试是软件测试过程中必不可少的一个过程&#xff0c;没有兼容性测试的测试是不完整的测试&#xff0c;下面来分享怎么做兼容测试…

【艾特淘】淘宝卖家如何获取手淘推荐流量?

目前手淘推荐在流量构成中的占比越来越大。平台的推送机制越来越精准&#xff0c;卖家的使用习惯在慢慢改变&#xff0c;因此手淘推荐成了必争之地&#xff0c;尤其是免费的手淘推荐流量&#xff0c;成本很低&#xff01;那么今天就给大家介绍一下手淘推荐的基本操作思路。首先…

【MySQL | 基础篇】04、MySQL 多表查询

目录 一、多表关系 1.1 一对多 ​1.2 多对多 1.3 一对一 二、多表查询概述 2.1 数据准备 2.2 概述 2.3 分类 三、内连接 3.1 案例 四、外连接 4.1 案例 五、自连接 5.1 自连接查询 5.2 联合查询 六、子查询 6.1 概述 6.2 标量子查询 6.3 列子查询 6.4 行…

NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据---大数据之Nifi工作笔记0036

首先拖入一个处理器组,然后把名字修改一下 首先拖入一个处理器组,把名字修改成mysql数据实时采集 然后拖入一个querydatabasetable处理器,然后配置处理器的数据库连接池 创建一个数据库连接池 选择上图中的连接池,然后给service Name改个名字 然后我们点击右边的箭头,然后

用智能手机拍的模糊照片怎么办?学会这个技巧让它变得清晰

智能手机的相机功能越来越强大&#xff0c;但有时候我们还是会拍出一些模糊的照片。这可能是因为手抖或者光线不足等原因导致的。但不要担心&#xff0c;有一些简单的技巧可以帮助您将模糊的照片变得更加清晰。 1.稳定手机 拍摄清晰照片的第一步是确保相机保持稳定。拍照时最…