从零编写MDK的FLM烧录算法

news2024/11/27 8:45:09

文章目录

  • 前言
  • 一、将代码中的图片资源下载到外部flash
    • 1. 修改分散加载文件
    • 2. 添加外部flash算法
  • 二、制作FLM文件步骤
  • 三、使用STM32CubeMX新建工程

前言

上文讲过,当我们要下载编译好的镜像到Flash时,首先要做的一步就是选择合适的Flash下载算法,而这个算法本身就是一个FLM文件:
在这里插入图片描述
代码既可以下载到内部flash,也可以下载到外部flash,或者一部分下载到内部,一部分下载到外部。

一、将代码中的图片资源下载到外部flash

在UI设计中往往需要大量的图片和字体,图片和字体资源在代码中以静态数组的形式存在,这些大数组在内部flash中一般存放不下,所以需要把这些占用资源比较大的数组放在外部flash中,然后通过QSPI地址映射的方式访问,或者通过SPI将flash中的资源分批读取到RAM缓存中使用。

1. 修改分散加载文件

  1. 通过MDK打开分散加载文件,配置“ExtFlashSection”段:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00020000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00020000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x24000000 0x00080000  {
   .ANY (+RW +ZI)
  }
}

LR_EROM1 0x90000000 0x01000000  {    ; load region size_region
    ER_EROM1 0x90000000 0x01000000  {  ; load address = execution address
		*.o (ExtFlashSection)
		*.o (FontFlashSection)
		*.o (TextFlashSection)
	}
}

添加LR_EROM1 段,起始地址为0x90000000 ,大小为0x01000000 ,LR_EROM1 占用的地址不能与内部flash的地址有重叠。

  1. 在代码中将图片资源分配到ExtFlashSection段
#define LOCATION_ATTRIBUTE(name) __attribute__((section(name))) __attribute__((aligned(4)))

KEEP extern const unsigned char image_watch_seconds[] LOCATION_ATTRIBUTE("ExtFlashSection") = // 4x202 ARGB8888 pixels.
{
    0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00,
    0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0xff,
    0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00,
    0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0x00,
    0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0xff,
    0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0xff,
    0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00,
    0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0x00,
    0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0xff,
    0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0x00,
    0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0xff,
    0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0xff,
    0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0xff, 0xf8, 0xfc, 0xf8, 0x00,
    0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00, 0xf8, 0xfc, 0xf8, 0x00,
    0xf8, 0xfc, 0xf8, 0x00
};

  1. 编译代码
    在这里插入图片描述
    查看map文件,image_watch_seconds这个数组已经被分配到了0X90138690这个地址了,这个地址正是LR_EROM1 所在的区间。

2. 添加外部flash算法

镜像文件中的图片资源被分配到了0x90000000 这个地址所在的区间,接下来需要flash算法识别出这个地址,将地址中的内容烧录到对应的flash中。

编写的外部烧录算法,设备起始地址必须与代码中分散加载文件的LR_EROM1 地址 0x90000000 一致,mdk将会根据不同的地址调用相应的FLM烧录算法。
在这里插入图片描述
然后将编译得到的STM32H7_W25QXX.FLM复制到keil的安装目录:D:\Keil_v5\ARM\Flash中,即可添加到工程。

二、制作FLM文件步骤

  1. 将ARM:CMSIS Pack文件夹(通常是C:\Keil\ARM\Pack\ARM\CMSIS\ version \Device_Template_Flash)中的工程复制到一个新文件夹中,取消文件夹的只读属性,重命名项目文件NewDevice.uvprojx以表示新的flash 设备名称,例如MyDevice.uvprojx。
  2. 打开工程,从工具栏中,使用下拉选择目标来选择处理器架构。
  3. 打开对话框Project - Options for Target - Output并更改Name of Executable字段的内容以表示设备,例如MyDevice。
  4. 调整文件FlashPrg中的编程算法。
  5. 调整文件FlashDev中的设备参数。
  6. 使用Project - Build Target生成新的 Flash 编程算法。必须将输出文件(例如MyDevice.FLM)添加到DFP中。

以上步骤是利用官方的工程模板修改代码,接下来我使用STM32CubeMX从零开始新建工程。

三、使用STM32CubeMX新建工程

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

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

相关文章

WPS Office 2019 版本 excel透视图创建及删除

摘要:记录一下在做2022年总结数据时遇到的问题,主要问题有2个,①从飞书多维表格导下来数据后不能求和计算和下拉序号,②excel数据透视表创建及删除。 相关文章: 一、Excel WPS Office 2019 版本 excel透视图创建及删…

合作升级|Kyligence 跬智智能分析平台入选华为云联营商品

近日,Kyligence 跬智智能分析平台正式入选华为云联营商品,成为华为云在数据分析领域的联营合作伙伴。通过联营模式,双方将加深在产品、解决方案等多个领域的合作,携手打造“共生、共创、共营、共赢”的合作生态,为用户…

[激光原理与应用-65]:激光器-器件 - 多模光纤(宽频光纤)、单模光纤的原理与区别

第1章 光纤基础与概述1.1 概述光纤是光导纤维的简写,是一种由玻璃或塑料制成的纤维,可作为光传导工具。传输原理是“光的全反射”。微细的光纤封装在塑料护套中,使得它能够弯曲而不至于断裂。通常,光纤的一端的发射装置使用发光二…

Spring Boot(五十三):SpringBoot Actuator之简单实现

1 场景介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统,在线上时通常会遇到下面一些问题,比如: 1. 如何知道哪些服务除了问题,如何快速定位? (健康状况) 2. 如何统一监控各个微服务的性能指标…

不确定性量化 (UQ) 可以显著提高预测准确性,在不确定的世界中获得最佳结果昆士兰大学Mike McKerns-中国学者网

在不确定的世界中获得最佳结果,不确定性量化可以解开成功与失败之间的区别。不确定性量化 (UQ) 可以显著提高预测准确性,提供设计优化,并在充满未知的世界中促进快速解决方案改进。昆士兰大学的一个机构"不确定性量化基金会&…

vue3中常用的指令之v-bind和v-on

一、v-bind指令 一个vue2和vue3之间的不同之处:Vue2中template模板中只能有一个根元素,但是在Vue3中允许template中有多个元素。 1.v-bind的绑定基本属性 某些属性也希望是动态绑定的,比如动态绑定a元素中的href属性。 v-bind可以绑定一个…

verilog学习笔记- 14)静态数码管显示实验

目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证: 简介: 数码管也称半导体数码管,它是将若干发光二极管按一定图形排列并封装在一起的一种数码显示器件。常见的数码管如图这种数码管主要被称为八段数码管或 8 字形数码管,可用来显示小数点、数…

【Linux 基础】

【Linux 基础】 一、 Linux 概述 1. Linux 介绍 UNIX 是一个强大的多用户、多任务操作系统,于1969年在贝尔实验室开发,UNIX 的商标权有国际开放组织(The Open Group)所拥有,UNIX 操作系统是商业版,需要收…

【OpenGL学习】Shader和Shader类的抽象

Shader 本节学习OpenGL中Shader的使用并将其抽象为类,简要介绍OpenGL所使用的着色器语言GLSL。 一、什么是Shader? 参考维基百科中对Shader的定义:着色器 - 维基百科,自由的百科全书 (wikipedia.org) 计算机图形学领域中&…

SpringBoot处理跨域总结

解决跨域的五种方法1、CorsFilter新建一个类Configuration public class CorsConfig {Beanpublic CorsFilter corsFilter() {//1. 添加 CORS配置信息CorsConfiguration config new CorsConfiguration();//放行哪些原始域//springboot版本为2.4.0以前写法config.addAllowedOrig…

kaggle竞赛 | Instant Gratification

kaggle比赛链接: https://www.kaggle.com/competitions/instant-gratification/data 目录普通方案优胜方案1. 用方差筛选特征2.QDA二次判别分析3.数据分组(伪标签)4.查看结果赛题总结普通方案 # 数据集路径 INPUT_PATH ../input/import num…

python学习笔记---进程和线程【廖雪峰】

进程和线程 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢? 答案就是操作系统轮流让各个任务交替…

ESP-IDF:企业链表例程,实现初始化,插入,打印等功能。

例程: 简单地写一下企业链表,实现初始化,插入,打印等功能。 /企业链表/ typedef struct LINKNODE09 { // 定义节点 LINKNODE09 *next; } linknode09; // 定义表头 typedef struct LINKLIST09 { // 定义表头 linknode09 head; in…

【胖虎的逆向之路】03——Android一代壳脱壳办法罗列实操

【胖虎的逆向之路】03——Android脱壳办法罗列&脱壳原理详解 【胖虎的逆向之路】01——动态加载和类加载机制详解 【胖虎的逆向之路】02——Android整体加壳原理详解&实现 文章目录【胖虎的逆向之路】03——Android脱壳办法罗列&脱壳原理详解前言一、主流脱壳方法…

uefi和legacy的区别对比

legacy:[ˈleɡəsi],遗产、遗留。 uefi:Unified Extensible Firmware Interface,统一可扩展固件接口。 当我们自己重装或安装操作系统的时候,可能会遇到硬盘的uefi和legacy两种,不过大多数人并不知道uefi和…

低代码开发前景如何?大家都真的看好低代码开发吗?

栖低代码开发前景如何,大家都真的看好低代码开发吗?之前有些过很多关于低代码的内容,这篇就来梳理下国内外低代码开发平台发展现状及前景。 关于低代码解读看这篇>> 什么是低代码(Low-Code)? 关于低…

SpreadJS.Release.16.0.2 Crack by Xacker

SpreadJS拥有 500 多个 Excel 函数的世界销量第一的 JavaScript 电子表格 快速提供真正类似 Excel 的电子表格体验 - 对 Excel 零依赖。创建财务应用程序,仪表板,图表,数据透视表,性能基准,科学实验室笔记本,以及其他类似的 JavaScript 电子表格应用程序…

77. 语言模型以及代码实现

1. 语言模型 给定文本序列 x1,…,xT,语言模型的目标是估计联合概率p(x1,…,xT)它的应用包括 做预训练模型(eg BERT,GPT-3)生成文本,给定前面几个词,不断使用xt~p(x1,…,xt-1) 来生成后续文本判…

CSS选择器整理学习(上)

在前端项目开发中,有时候需要对特殊的元素进行特殊的处理,但有时候元素的位置不确定、层级不确定、数量不确定等问题,导致我们没办法进行元素的选择,这个时候我们就需要用到元素选择器了。 一、CSS选择器 1、.class 选择器例子…

图像处理解决流程--外观检测

一、图像外观检测和面积计算 1、获取标准图像,提取要测定的区域(截取成多个ROI) 2、将目标图像的位置进行平移和旋转(将目标图像和标准图像进行重叠) 3、根据标准图像的区域进行以此计算目标图像的信息 4、判断统计 二…