本文记录C:\Ti\Project\empty工程里把 Keil 下载改成 UniFlash 烧录的原因和配置方法。
1. 问题现象
Keil 点击Download时反复出现:
Cannot Load Flash Programming Algorithm! Cannot Write to RAM for Flash Algorithms ! Flash Download failed - "Cortex-M0+"但同一个程序用 UniFlash 可以正常烧录。
这说明:
程序没坏 hex 没坏 板子没坏 线也没坏 主要问题在 Keil 自己的 Flash Download 链路2. 为什么 Keil 会失败
Keil 下载程序时,不是直接把 hex 写进 Flash。
它的流程大概是:
1. 连接芯片 2. 把 Flash Programming Algorithm 加载到芯片 RAM 3. 在芯片 RAM 里运行这个算法 4. 由这个算法擦除 Flash、写入 Flash、校验 Flash如果 Keil 不能把这个算法写进 RAM,就会报:
Cannot Write to RAM for Flash Algorithms !这个工程当前在做 ADC + DMA 实验,程序运行后 DMA 会持续写 RAM。Keil 再次下载时,需要重新接管正在运行的芯片,这时就容易失败。
而 UniFlash 使用的是 TI 自己的 DebugServer 下载链路,对 MSPM0 的接管更稳定。所以最终采用:
Keil 只负责编译 UniFlash 负责烧录3. 最终使用方式
以后不要点 Keil 的:
Download改为点:
Build或者:
Rebuild因为工程已经配置成:
Keil 编译完成后,自动调用 UniFlash 烧录 hex4. 新增的文件
4.1keil\uniflash_mspm0g3507.ccxml
这个文件告诉 UniFlash:
芯片型号:MSPM0G3507 调试器:Texas Instruments XDS110 USB Debug Probe 接口:SWD核心内容类似:
<instancedesc="Texas Instruments XDS110 USB Debug Probe"href="connections/TIXDS110_Connection.xml"/><instancedesc="MSPM0G3507"href="devices/MSPM0G3507.xml"/>这个文件可以从 UniFlash 自带示例里复制:
C:\Ti\uniflash_9.5.0\deskdb\content\TICloudAgent\win\scripting\examples\debugger\mspm0g3507\mspm0g3507.ccxml然后放到工程里:
C:\Ti\Project\empty\keil\uniflash_mspm0g3507.ccxml5. 烧录脚本
新增文件:
C:\Ti\Project\empty\keil\uniflash_download.bat内容如下:
@echo off setlocal set "UNIFLASH=C:\Ti\uniflash_9.5.0\dslite.bat" set "CCXML=%~dp0uniflash_mspm0g3507.ccxml" set "HEX=%~dp0Objects\empty_LP_MSPM0G3507_nortos_keil.hex" set "TI_APPDATA_DIR=%~dp0_ti" set "TEMP=%TI_APPDATA_DIR%\temp" set "TMP=%TEMP%" set "LOG=%~dp0Objects\uniflash_download.log" if not exist "%UNIFLASH%" ( echo UniFlash not found: "%UNIFLASH%" exit /b 1 ) if not exist "%HEX%" ( echo HEX not found: "%HEX%" exit /b 1 ) if not exist "%TI_APPDATA_DIR%" mkdir "%TI_APPDATA_DIR%" if not exist "%TEMP%" mkdir "%TEMP%" call "%UNIFLASH%" --config="%CCXML%" -e -f -u -g "%LOG%" "%HEX%" exit /b %ERRORLEVEL%关键命令是:
call "%UNIFLASH%" --config="%CCXML%" -e -f -u -g "%LOG%" "%HEX%"含义:
--config 指定 ccxml 芯片/调试器配置 -e 输出详细信息 -f flash 烧录 -u 烧录后运行程序 -g 保存日志 "%HEX%" 要烧录的 hex 文件6. Keil 工程怎么配置
修改文件:
C:\Ti\Project\empty\keil\empty_LP_MSPM0G3507_nortos_keil.uvprojx找到:
<AfterMake>改成:
<AfterMake><RunUserProg1>1</RunUserProg1><RunUserProg2>0</RunUserProg2><UserProg1Name>cmd.exe /C call "C:\Ti\Project\empty\keil\uniflash_download.bat"</UserProg1Name><UserProg2Name></UserProg2Name><UserProg1Dos16Mode>0</UserProg1Dos16Mode><UserProg2Dos16Mode>0</UserProg2Dos16Mode><nStopA1X>0</nStopA1X><nStopA2X>0</nStopA2X></AfterMake>重点是:
<RunUserProg1>1</RunUserProg1>表示启用 After Build 用户命令。
以及:
<UserProg1Name>cmd.exe /C call "C:\Ti\Project\empty\keil\uniflash_download.bat"</UserProg1Name>表示编译完成后执行这个 bat 脚本。
7. 关闭 Keil 的 Debug 前自动下载
同一个.uvprojx里找到:
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>改成:
<UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>原因:
如果这里还是 1,Keil 进入 Debug 前仍然会尝试走自己的 Flash Algorithm 下载链路。 这个链路正是当前不稳定的地方。8. 验证是否成功
点击 Keil:
Rebuild输出里应该能看到:
After Build - User command #1: cmd.exe /C call "C:\Ti\Project\empty\keil\uniflash_download.bat"然后看到 UniFlash 输出:
Loading Program: C:\Ti\Project\empty\keil\Objects\empty_LP_MSPM0G3507_nortos_keil.hex Finished Running... Success看到Success就表示:
Keil 编译成功 UniFlash 烧录成功 程序已经运行9. 以后遇到类似问题怎么判断
如果 Keil 报:
Cannot Load Flash Programming Algorithm Cannot Write to RAM for Flash Algorithms Flash Download failed按这个顺序判断:
1. 先确认 Build 是否 0 Error 2. 确认 hex 是否生成 3. 用 UniFlash 单独烧同一个 hex 4. 如果 UniFlash 成功、Keil Download 失败,说明不是程序和板子问题,是 Keil 下载链路问题 5. 可以改成 Keil After Build 调 UniFlash10. 注意事项
不要再点 Download
当前工程建议使用:
Build / Rebuild不要使用:
Download如果换了工程名
如果 Keil 输出 hex 的文件名变了,需要同步修改:
set "HEX=%~dp0Objects\empty_LP_MSPM0G3507_nortos_keil.hex"例如工程输出名变成test.axf/test.hex,就要改成:
set "HEX=%~dp0Objects\test.hex"如果 UniFlash 安装路径不同
当前脚本写的是:
set "UNIFLASH=C:\Ti\uniflash_9.5.0\dslite.bat"如果你的 UniFlash 装在别的位置,需要改这里。
11. 当前工程最终状态
当前工程采用:
Keil 编译 UniFlash 烧录相关文件:
C:\Ti\Project\empty\keil\uniflash_download.bat C:\Ti\Project\empty\keil\uniflash_mspm0g3507.ccxml C:\Ti\Project\empty\keil\empty_LP_MSPM0G3507_nortos_keil.uvprojx推荐操作:
打开 Keil 点击 Rebuild 等待 Output 里出现 Success