一、FLM下载算法模板文件路径:在你安装mdk软件的arm/flash目录下,例如:
C:\\Keil_v5\\ARM\\Flash\\_Template




这两个工程是 **“FLASH 算法工程” 与 “算法测试工程”** 的关系,核心区别在于定位、用途和代码结构:
一、主目录工程(_Template下的NewDevice.uvproj)
| 定位 | FLASH 算法工程(生成 FLM 文件的核心工程) |
| 用途 | 编译生成.flm格式的 FLASH 下载算法文件,供 Keil 烧录时调用 |
| 代码结构 | 仅包含 FLASH 算法必需的文件:- FlashDev.c(设备参数)- FlashPrg.c(擦写 / 编程逻辑)- FlashStk.s(栈初始化,确保算法在 RAM 运行) |
| 输出产物 | .flm文件(Keil 专用的下载算法) |
二、Test 子目录工程(Test下的FlashTest.uvproj)
| 定位 | FLASH 算法测试工程(验证 FLM 算法正确性的工程) |
| 用途 | 运行在开发板上,测试主目录工程中FlashPrg.c的擦除、编程功能是否正常,避免 FLM 直接烧录时出错 |
| 代码结构 | 包含完整的芯片运行环境:- 启动文件(startup_stm32f10x_md.s)- 芯片底层驱动(system_stm32f10x.c)- 测试代码(FlashTest.c,调用算法接口做全流程测试) |
| 输出产物 | .axf/.hex文件(可下载到开发板运行的测试程序) |
三、关键区别总结
| 目标 | 生成 FLM 算法 | 验证 FLM 算法 |
| 运行位置 | 编译后生成 FLM,不直接运行 | 下载到开发板硬件运行 |
| 代码依赖 | 仅依赖 FLASH 擦写逻辑 | 依赖芯片底层驱动 + FLASH 算法逻辑 |
| 产物用途 | 供 Keil 烧录时选择 | 测试算法功能是否正常 |
简单说:主目录工程是 “生产 FLM 的工厂”,Test 子目录工程是 “检验 FLM 质量的质检站”—— 先在 Test 工程中验证算法正确,再用主目录工程生成的 FLM 做实际烧录。
二、根据模板生成自己的FLM下载算法
要基于这个NewDevice.uvproj模板工程制作自己的 FLM,需按 “模板修改→核心代码实现→编译转换” 的流程操作,以下是具体步骤:
步骤 1:准备工作
步骤 2:修改工程基础配置
- Device选项卡:选择你的目标芯片(如 STM32F407),匹配芯片内核;
- Output选项卡:修改 “Name of Executable” 为你的 FLASH 名称(如MySPI_Flash),取消 “Create HEX File”;
- User选项卡:确保 “Run #1” 勾选,指令为fromelf –bin -o "$L@L.flm" "#L"(用于将 AXF 转为 FLM)。
步骤 3:填充核心文件
3.1 配置FlashDev.c(设备参数)
打开FlashDev.c,修改FlashDevice结构体(以 “256KB SPI FLASH” 为例):
struct FLASH_DEVICE const FlashDevice = {
FLASH_DRV_VERS, // 算法版本,默认即可
"My 256KB SPI Flash", // FLASH名称(Keil烧录界面显示)
EXT_FLASH, // 片外FLASH(片内填INT_FLASH)
0x80000000, // FLASH映射地址(芯片SPI映射地址)
0x40000, // FLASH总大小(256KB = 0x40000)
256, // 写入页大小(单次写256字节)
0, // 保留参数,填0
0xFF, // FLASH擦除后默认值(多数为0xFF)
100, // 编程超时时间(ms)
2000, // 擦除超时时间(ms)
// 扇区分布(假设256KB FLASH按4KB分扇区)
0x1000, 64, // 扇区大小0x1000(4KB),共64个
SECTOR_END_MARKER // 扇区标记结束
};
3.2 实现FlashPrg.c(算法逻辑)
打开FlashPrg.c,补充 Keil 要求的5 个必选函数(以 SPI FLASH 为例):
#include "FlashOS.h"
#include "SPI_Driver.h" // 自己实现的SPI驱动头文件
// 1. 初始化FLASH(配置SPI、解锁FLASH)
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
SPI_Init(); // 初始化SPI总线(引脚、时钟)
SPI_WriteEnable(); // 发送“写使能”指令(如0x06)
return 0; // 0=成功,非0=失败
}
// 2. 反初始化FLASH(加锁、关闭SPI)
int UnInit (unsigned long fnc) {
SPI_WriteDisable(); // 发送“写禁止”指令(如0x04)
SPI_DeInit(); // 关闭SPI总线
return 0;
}
// 3. 擦除指定扇区
int EraseSector (unsigned long adr) {
SPI_WriteEnable();
SPI_SendCmd(0x20, adr); // 发送“扇区擦除”指令(如0x20)+ 扇区地址
SPI_WaitBusy(); // 等待FLASH忙状态结束
return 0;
}
// 4. 写入数据到FLASH
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
SPI_WriteEnable();
SPI_PageWrite(0x02, adr, sz, buf); // 发送“页写”指令(如0x02)+ 地址+数据
SPI_WaitBusy();
return 0;
}
// 5. 擦除整片FLASH(可选,可留空或实现)
int EraseChip (void) {
SPI_WriteEnable();
SPI_SendCmd(0x60); // 发送“整片擦除”指令(如0x60)
SPI_WaitBusy();
return 0;
}
- 需补充SPI_Driver.c:实现 SPI 初始化、指令发送、忙等待等基础功能;
- 函数返回值必须严格:0表示成功,非 0 表示失败。
步骤 4:编译生成 FLM
- MySPI_Flash.axf(编译后的算法文件);
- MySPI_Flash.flm(自动转换的 FLM 下载算法,即最终产物)。
步骤 5:验证 FLM(可选但推荐)
- 验证Init/EraseSector/ProgramPage的返回值是否为 0;
- 验证写入的数据与读取数据是否一致,确保算法正确。
步骤 6:在实际工程中使用 FLM
关键注意事项
通过以上步骤,即可基于模板工程生成适配自己硬件的 FLM 下载算法。
三、如何自定义名字和改后缀名为FLM


FLM 不是普通工程的 AXF 直接转换的,而是 FLASH 算法工程编译出的 AXF,按 Keil 规范转换而来—— 核心是 “AXF 的来源”,而非单纯的格式转换。
关键区分:普通 AXF vs FLASH 算法 AXF
| 代码内容 | 业务逻辑(如 GPIO、串口、应用功能) | 仅包含 FLASH 擦写 / 编程核心函数(Init/Erase/Program) |
| 运行方式 | 烧录到 FLASH 中运行 | 加载到 RAM 中运行(位置无关代码) |
| 转换为 FLM 的有效性 | 转换后 Keil 无法识别(无核心接口) | 转换后可被 Keil 识别为下载算法 |
具体过程(FLM 的生成链路)

简单说:
总结
你想知道如何让专门的 FLASH 算法工程输出.flm后缀的文件,核心是通过 Keil 工程的输出配置 + 链接脚本来实现,我会一步步告诉你具体操作(这是生成.flm文件的标准流程):
一、核心前提
先明确:.flm本质是 Keil 专用的 FLASH 编程算法二进制文件,不是直接改后缀名,而是通过工程配置让 Keil 编译输出该格式,且工程必须是FLASH 算法工程(而非普通应用工程)。
二、具体配置步骤(关键)
1. 新建 / 准备 FLASH 算法工程
- 按你之前看的文档,先在..\\ARM\\FLASH下新建子文件夹,复制现有 FLASH 算法工程(如LPC_IAP_256)作为模板;
- 打开模板工程(如LPC_IAP_256.UV2),先适配你的芯片型号。
2. 修改工程输出配置(核心步骤)
- 取消Create HEX File(不需要生成 hex);
- 确保Debug Information勾选(FLASH 算法需要调试信息);
- 勾选Run #1,并输入指令: fromelf –bin -o "$L@L.flm" "#L"
- 指令含义:fromelf是 Keil 自带的二进制转换工具,将编译后的.axf文件转换为.flm格式($L@L.flm表示输出和工程同名的.flm 文件)。
3. 配置链接脚本(保证算法文件格式正确)
- FLASH 算法工程的链接脚本(.sct)需按 Keil 规范编写:
- 代码段(Code)需放在0x00000000起始地址;
- 数据段(Data)需放在 RAM 地址(如0x20000000);
- 确保算法代码是位置无关代码(PIC),能在 RAM 中运行(FLASH 编程算法需先加载到 RAM 再执行)。
4. 编译工程生成.flm 文件
- 点击 Keil 的Rebuild编译工程:
- Keil 先编译生成.axf可执行文件;
- 自动执行fromelf指令,将.axf转换为.flm文件;
- .flm文件会出现在你指定的Objects文件夹中(和.axf同目录)。
三、验证是否生成成功
- 编译完成后,打开工程的Objects文件夹,能看到和工程同名的.flm文件(如MX25L128.flm);
- 将该.flm文件添加到 Keil 的Flash Download配置中,可用于对应芯片的 FLASH 烧录测试。
四、关键注意事项
总结
参考资料:
https://blog.csdn.net/wuhenyouyuyouyu/article/details/127898908?fromshare=blogdetail&sharetype=blogdetail&sharerId=127898908&sharerefer=PC&sharesource=2401_82762455&sharefrom=from_link

