
本文记录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核心内容类似instancedescTexas Instruments XDS110 USB Debug Probehrefconnections/TIXDS110_Connection.xml/instancedescMSPM0G3507hrefdevices/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 UNIFLASHC:\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改成AfterMakeRunUserProg11/RunUserProg1RunUserProg20/RunUserProg2UserProg1Namecmd.exe /C call C:\Ti\Project\empty\keil\uniflash_download.bat/UserProg1NameUserProg2Name/UserProg2NameUserProg1Dos16Mode0/UserProg1Dos16ModeUserProg2Dos16Mode0/UserProg2Dos16ModenStopA1X0/nStopA1XnStopA2X0/nStopA2X/AfterMake重点是RunUserProg11/RunUserProg1表示启用 After Build 用户命令。以及UserProg1Namecmd.exe /C call C:\Ti\Project\empty\keil\uniflash_download.bat/UserProg1Name表示编译完成后执行这个 bat 脚本。7. 关闭 Keil 的 Debug 前自动下载同一个.uvprojx里找到UpdateFlashBeforeDebugging1/UpdateFlashBeforeDebugging改成UpdateFlashBeforeDebugging0/UpdateFlashBeforeDebugging原因如果这里还是 1Keil 进入 Debug 前仍然会尝试走自己的 Flash Algorithm 下载链路。 这个链路正是当前不稳定的地方。8. 验证是否成功点击 KeilRebuild输出里应该能看到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 UNIFLASHC:\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