本文记录 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 烧录 hex

4. 新增的文件

4.1 keil\uniflash_mspm0g3507.ccxml

这个文件告诉 UniFlash:

芯片型号:MSPM0G3507
调试器:Texas Instruments XDS110 USB Debug Probe
接口:SWD

核心内容类似:

<instance desc="Texas Instruments XDS110 USB Debug Probe"
          href="connections/TIXDS110_Connection.xml" />

<instance desc="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.ccxml

5. 烧录脚本

新增文件:

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 调 UniFlash

10. 注意事项

不要再点 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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐