找回密码
 立即注册
查看: 142|回复: 12

Keil 多工程一键全编译 + 产物自动归集 + HEX合并 + Hex2Bin 单文件神器

[复制链接]
已绑定手机

18

主题

649

回帖

1919

积分

荣誉版主

积分
1919
发表于 2026-9-4 16:32:46 | 显示全部楼层 |阅读模式

做嵌入式开发的兄弟们,有没有天天被折磨成这副德行的:

  • 代码早在 VS Code 里写爽了,但编译还得切回那个十几年UI不换的 Keil;

  • 手里管着 Bootloader + App 多个工程,改完代码得一个个打开、一个个点编译;

  • 编译完了,还得满世界去深不见底的

  • 翻出来再找外部工具把 Boot 和 App 合并,再转成 .bin 扔给烧录器或 OTA;

  • 每次编译完都要眯着眼睛找 Flash/RAM 到底超了没有……


天下苦 Keil 久矣!为了彻底终结这种繁琐的牛马操作,我自己搓了这个**【Keil 多工程编译 & 固件集散流水线工具】**。
现在我的日常工作流已经变成了:敲完代码,点一下【一键全编译】,泡杯茶回来,产线直接能烧的合并固件就已经躺在文件夹里了。

独乐乐不如众乐乐,打包成单文件绿色版送给大家尝尝鲜!

截图202609041634066872.jpg


🔥 核心特色与硬核功能
  • 多工程 / 多 Target 集中管理


    • 自动解析 .uvprojx,不管是 ARM (M0/M3/M4/M7),还是 传统 C51 / 增强型 C251,工具链平台自动识别。

    • 支持多工程上下移动排序、一键在 Windows 资源管理器中定位工程目录。


  • ⚡ 一键流水线批量编译(带安全中止)


    • 轻轻一点,后台自动按顺序依次编译全部工程,全自动化出包;

    • 编译前可选自动关闭卡死的 UV4 进程;支持随时点击【中止编译】。


  • 📦 编译产物自动归集与防重名(杀手级特性!)


    • 再也不用去 Objects 目录翻找 Hex 了! 工具会自动从 Keil 配置里挖出输出路径。

    • 编译成功后,自动重命名为 归集到同级 ./hex/ 目录,彻底杜绝两个工程都叫 project.hex 相互覆盖的惨剧!


  • ⚡ 单页面直出:HEX 列表一键批量转 BIN + 任意多项合并


    • 彻底干掉反人类的多标签切换! 所有固件在同一屏里看得到摸得着。

    • 固件列表自动刷新,按住 Ctrl 多选,点一下即可批量转成 (支持自定义 0xFF 填充)。

    • 勾选 Boot 和 App,一键合并为 ,并贴心提示连带生成 merged.bin!


  • 🧠 算力焦虑终结者(Flash / RAM 内存自动核算)


    • 彻底告别心算!编译完日志直接以醒目青色高亮打印真实内存占用


      • ARM 架构:秒算 Flash (Code+RO+RW) 与 RAM (RW+ZI),带百分比详情;

      • C51 / C251 架构:自动识别 Code + Const 合并计算真实 Flash,准确区分 data 与 xdata。



  • 🖥 极客级 UI 体验


    • 黑底控制台,Error 标红、Warning 标黄、Success 标绿,查错一目了然;

    • 列表区与日志区高度支持鼠标自由拖拽调节,拖动后的布局比例自动保存到配置文件,下次打开依然是你调好的黄金视觉比例。




📷 软件截图

(在这里放 1~2 张你电脑上软件运行的帅照,尤其是彩色日志高亮、固件列表归集的界面,吸睛效果翻倍!)


💡 使用说明与温馨提示(老油条防喷说明)
  • 关于杀毒软件误报(提前说明):


    • 本工具由纯底层 C 语言机器码编译而成(无 Python 运行环境依赖,纯单文件绿色便携,不写注册表);

    • 个人作品未购买微软几千块一年的企业数字证书,部分杀软(如 360/火绒/Defender)对未签名的独立 exe 可能会弹窗报警,纯属误报,请放心添加信任,绝无任何后门与联网行为。


  • 初次启动 Keil 路径:


    • 软件启动会自动扫描常见盘符定位 UV4.exe;如果你的 Keil 装在非常规盘符,点一下顶部的【浏览…】选一下你的 UV4.exe 即可(选一次终身记住)。


  • 配置文件说明:


    • 软件配置自动存盘在同级目录下的 keil_build.json,换电脑直接拷走这一个文件夹即可无缝迁移。




📥 附件下载 keilTargetTool.rar (7.78 MB, 下载次数: 6)

觉得好用的兄弟欢迎回帖顶一下,祝各位兄弟编译永远 0 Error(s), 0 Warning(s)!🍻

【运行环境】:原生支持 64 位 Windows 10 / Windows 11
回复

使用道具 举报 送花

3

主题

26

回帖

115

积分

注册会员

积分
115
发表于 2026-9-4 17:56:13 | 显示全部楼层
修改代码都是一份修改,编译不需要全部工程编译,编译只是修改的那个工程编译。

点评

没听懂呢  详情 回复 发表于 2026-9-4 23:39
回复

使用道具 举报 送花

已绑定手机

32

主题

416

回帖

2717

积分

金牌会员

积分
2717
发表于 2026-9-4 18:52:43 | 显示全部楼层
能分享出来,先给个
学习MCU
回复

使用道具 举报 送花

已绑定手机

18

主题

649

回帖

1919

积分

荣誉版主

积分
1919
 楼主| 发表于 2026-9-4 23:39:55 | 显示全部楼层
缘分*** 发表于 2026-9-4 17:56
修改代码都是一份修改,编译不需要全部工程编译,编译只是修改的那个工程编译。 ...

没听懂呢
回复

使用道具 举报 送花

3

主题

26

回帖

115

积分

注册会员

积分
115
发表于 2026-9-5 10:39:18 | 显示全部楼层

修改都是单独一个工程修改,基本没有多个工程同时修改的。

点评

哦,我喜欢一个工程几个target,然后宏约束,方便统一管理,当然是一个产品衍生不同功能,肯定不是多个产品.  详情 回复 发表于 2026-9-5 16:58
回复

使用道具 举报 送花

51

主题

186

回帖

1245

积分

金牌会员

积分
1245
发表于 2026-9-5 13:15:12 | 显示全部楼层
满怀激情搞出来的东西总希望流行开来!是不是金子还要看大家能不能接受才能发光!

点评

本来回复您了,删了,又忍不住回复,你这语气是安慰,还是说教.做出来的东西,拿给大家分享,这是求流行,求发光?? 至于你说的接受才发光,,我实在无法理解,这是什么心态.想用,下载回去用,有心点个赞,不点我也没有跪下索要,  详情 回复 发表于 2026-9-6 20:55
回复

使用道具 举报 送花

已绑定手机

18

主题

649

回帖

1919

积分

荣誉版主

积分
1919
 楼主| 发表于 2026-9-5 16:58:43 | 显示全部楼层
缘分*** 发表于 2026-9-5 10:39
修改都是单独一个工程修改,基本没有多个工程同时修改的。

哦,我喜欢一个工程几个target,然后宏约束,方便统一管理,当然是一个产品衍生不同功能,肯定不是多个产品.
回复

使用道具 举报 送花

已绑定手机

18

主题

649

回帖

1919

积分

荣誉版主

积分
1919
 楼主| 发表于 2026-9-5 17:00:37 | 显示全部楼层
回复

使用道具 举报 送花

已绑定手机

19

主题

1442

回帖

5693

积分

论坛元老

积分
5693
发表于 2026-9-6 07:28:32 | 显示全部楼层
需要依赖系统上安装号的Keil环境。能否分享下各个功能实现的命令行代码。

点评

def run_uv4(uv4, proj_path, target, rebuild=False, timeout=900): fd, logfile = tempfile.mkstemp(prefix='keil_build_', suffix='.log') os.close(fd) cmd = [uv4, '-r' if rebuild else '-b', pro  详情 回复 发表于 2026-9-6 20:47
回复

使用道具 举报 送花

已绑定手机

18

主题

649

回帖

1919

积分

荣誉版主

积分
1919
 楼主| 发表于 2026-9-6 20:47:17 | 显示全部楼层
21cns*** 发表于 2026-9-6 07:28
需要依赖系统上安装号的Keil环境。能否分享下各个功能实现的命令行代码。

def run_uv4(uv4, proj_path, target, rebuild=False, timeout=900):
    fd, logfile = tempfile.mkstemp(prefix='keil_build_', suffix='.log')
    os.close(fd)
    cmd = [uv4, '-r' if rebuild else '-b', proj_path, '-t', target, '-j0', '-o', logfile]
    try:
        subprocess.run(cmd, timeout=timeout, creationflags=subprocess.CREATE_NO_WINDOW)
    except subprocess.TimeoutExpired:
        subprocess.run(['taskkill', '/F', '/IM', 'UV4.exe'],
                       stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
                       creationflags=subprocess.CREATE_NO_WINDOW)
        text = (_read_log(logfile) or '') + '\n[编译超时, 已强制结束 UV4]'
        try: os.remove(logfile)
        except Exception: pass
        return False, text, 1, 0
    except Exception as ex:
        try: os.remove(logfile)
        except Exception: pass
        return False, f'[启动 UV4 失败: {ex}]', 1, 0

    text = _read_log(logfile) or ''
    try: os.remove(logfile)
    except Exception: pass
    e, w = count_errors(text)
    return (e == 0), text, e, w
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-22 10:30 , Processed in 0.077882 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表