主页 > 开源代码  > 

从FLM获取算法进行DAP脱机烧录踩坑解决总结

从FLM获取算法进行DAP脱机烧录踩坑解决总结
1. FLM文件找不到的问题 问题描述

在使用Keil开发时,无法找到FLM文件(Flash加载算法文件),导致无法下载或调试程序。

原因分析

未安装芯片支持包(DFP):Keil针对不同芯片需要安装对应的Device Family Pack(DFP)。

路径配置错误:FLM文件可能未被正确引用,或安装路径中存在版本号差异。

解决方案

安装芯片支持包(DFP)

打开Keil,进入菜单栏 Pack -> Check for Updates,搜索并安装对应芯片的DFP(如STM32L0xx_DFP)。

若无法在线安装,可手动从Keil官网下载并导入。

手动查找FLM文件路径

安装完成后,FLM文件默认路径为:

Keil安装目录\ARM\PACK\Keil\芯片厂商_DFP\版本号\CMSIS\Flash

例如:

C:\Keil_v5\ARM\PACK\Keil\STM32L0xx_DFP\2.0.0\CMSIS\Flash

不确定版本号? 进入对应芯片系列的文件夹(如STM32L0xx),查看子目录中的Keil工程文件,通常以芯片型号命名(如STM32L073VZ),打开工程即可确认适用的FLM文件。

工程配置验证

右键Keil工程中的目标(Target) -> Options for Target -> Debug -> Settings -> Flash Download,检查是否已勾选正确的FLM文件。

注意事项

若路径中包含空格(如默认安装路径Program Files),建议将Keil安装到无空格目录(如C:\Keil_v5)。

自定义FLM文件需确保与芯片Flash型号匹配(参考芯片数据手册)。


2. Flash算法内存地址异常(如0x12XXXXXXX) 问题描述

使用flash_algo工具提取的算法文件出现高位地址(如0x12XXXXXXX),导致下载或调试失败。

原因分析

函数缺失或命名不匹配:不同芯片的Bootloader固件实现不同,若算法中调用了不存在的函数,工具可能生成错误地址。

地址映射异常:某些芯片(如Cortex-M7)的MMU/MPU可能将物理地址映射到高位虚拟地址。

解决方案

检查函数实现

使用反编译工具(如IDA Pro)或调试器查看算法文件(.FLM或.elf),确认函数名称与芯片Bootloader文档一致。

关键函数示例:

int Init(uint32_t addr, uint32_t freq, uint32_t mode); // 必须存在 int Erase_Chip(void); // 确认是否支持

修正内存基址

手动编辑算法文件(如.FLM),确保Flash基址正确(STM32通常为0x08000000)。

在MemoryMap段中定义物理地址:

"MemoryMap": [ { "name": "Flash", "start": 0x08000000, "size": 0x20000 } ]

更新工具链

使用最新版flash_algo工具,或联系芯片厂商获取官方算法文件。

注意事项

高位地址(如0x1xxxxxxx)可能是芯片的QSPI Flash或外部存储器地址,需结合数据手册确认。


3. erase_chip 无法擦除MCU 问题描述

调用erase_chip函数后,目标MCU的Flash未被擦除,日志显示操作成功但实际未生效。

原因分析

函数未实现:部分芯片(如STM32L0)不支持erase_chip,而是提供check_blank等替代函数。

Flash起始地址错误:某些芯片的Flash起始地址可能非0x08000000(如STM32L0的Option Byte区域在0x1FF80000)。

解决方案

验证函数存在性

使用elfparser工具解析算法文件(示例命令):

bash

elfparser.exe your_flash_algo.elf --symbols | find "erase_chip"

若无输出,则说明算法未实现该函数,需改用其他函数(如Erase_Sector)。

调整擦除策略

对于不支持全片擦除的芯片,遍历所有扇区逐个擦除:

c

for (int i=0; i<num_sectors; i++) { Erase_Sector(i); // 调用扇区擦除函数 }

确认Flash起始地址

查阅芯片数据手册,确认Flash基址(如STM32L071为0x08000000,但某些型号可能偏移)。

注意事项

擦除前需解除写保护(通过Unlock命令或工具链的Unlock Chip选项)。

若使用J-Link,可在J-Link Commander中执行:

Unlock Chip // 解除保护 EraseChip // 执行擦除
4. 确认固件是否烧录到SRAM中 问题描述

不确定程序是否被下载到SRAM中,需验证固件存储位置。

验证方法

检查IDE配置

Keil:Options for Target -> Target -> Read/Write Memory Areas,确认下载地址指向SRAM(0x20000000)。

IAR:右键项目 -> Options -> Linker -> Config,检查链接脚本中的内存分配。

通过代码读取SRAM内容

在程序中添加以下代码,读取并打印SRAM内容:

uint32_t *sram_start = (uint32_t*)0x20000000; for (int i=0; i<16; i++) { printf("SRAM[%d]: 0x%08X\n", i, sram_start[i]); }

若输出非全0xFF或0x00,则说明SRAM中已有数据。

使用调试器直接查看

在J-Link Commander中执行:

mem32 0x20000000,16 // 查看SRAM前64字节内容

若显示内容与固件的二进制文件一致,则表明固件已烧录至SRAM。

注意事项

SRAM断电后数据丢失,仅适用于临时调试。

Flash与SRAM的地址范围:

存储器类型起始地址用途Flash0x08000000持久化存储SRAM0x20000000临时数据
总结与扩展建议

FLM文件问题:优先通过DFP安装和路径排查解决。

地址异常问题:结合芯片手册检查函数和地址映射。

擦除失败问题:通过工具链命令和函数验证逐步排查。

烧录位置验证:灵活使用调试器和代码确认存储位置。

标签:

从FLM获取算法进行DAP脱机烧录踩坑解决总结由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“从FLM获取算法进行DAP脱机烧录踩坑解决总结