Keil 编译后自动调用 UniFlash 烧录说明
本文记录 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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)