找回密码
 立即注册
查看: 40|回复: 7

IAP_10_跟着教程"简单合并isp和app程序"测试

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-09-13 09:49:07
已绑定手机

18

主题

45

回帖

596

积分

高级会员

积分
596
发表于 前天 11:05 | 显示全部楼层 |阅读模式
1、获得app.hex文件

在stc_app工程中设置keil,然后编译得到app.hex
截图202509121054521882.jpg 截图202509121055062297.jpg

2、加载app.hex,将APP程序文件前三字节复制到ISP区域后面
截图202509121058528929.jpg 截图202509121059529452.jpg

3、打开isp.hex
截图202509121102385211.jpg

4、烧录

在第3步的情况下直接点击烧录

截图202509121103356294.jpg

5、重新上电,单片机还是在isp mode
截图202509121105112692.jpg
花有重开日,人无再少年
回复

使用道具 举报 送花

3

主题

1989

回帖

826

积分

等待验证会员

积分
826
发表于 前天 11:08 | 显示全部楼层
从您提供的信息来看,您正在尝试将ISP(在系统编程)程序和APP(应用程序)合并,并通过烧录后让单片机在上电后自动运行APP程序,而不是停留在ISP模式。根据您描述的操作流程和最终结果(单片机仍然停留在ISP模式),我们可以分析可能存在的问题并提供改进建议。

一、问题分析

您已经按照“简单合并ISP和APP程序”的教程进行了操作,主要包括以下几个步骤:

1. 编译APP工程,生成apphex文件;
2. 将APP程序的前三个字节复制到ISP程序的末尾;
3. 打开isphex文件进行合并;
4. 烧录;
5. 上电测试,但单片机仍停留在ISP模式。

从现象来看,说明APP程序未能正常跳转执行,系统仍然停留在ISP模式。这通常意味着:
合并方式不正确;
跳转地址未设置正确;
ISP程序未正确识别APP存在;
程序入口地址配置错误;
烧录地址偏移错误;
程序校验失败或跳转标志未清除。

二、关键点分析与建议

1. APP程序前三个字节的复制

您提到“将APP程序的前三字节复制到ISP区域后面”,这个操作可能是为了在ISP程序末尾插入一个跳转指令,引导程序跳转到APP程序的起始地址。

但需要注意:
前三个字节是否为有效的跳转指令(如LJMP);
跳转地址是否计算正确(APP程序的起始地址);
是否考虑了ISP程序的最终地址对齐问题;
是否使用了正确的汇编或机器码进行跳转。

建议:
请确认这三个字节是否为如下形式的跳转指令(以8051为例):
  1. assembly
  2. LJMP 0x3000   ; 假设APP程序的起始地址为0x3000
复制代码
对应的机器码为:
  1. 0x02 0x30 0x00
复制代码
确保这三个字节是跳转到APP程序入口的正确指令,而不是APP程序的开头代码。

2. APP程序起始地址设置

在Keil中编译APP程序时,必须设置正确的起始地址,通常为ISP程序结束地址之后。例如:
ISP程序占用地址范围:0x0000 ~ 0x2FFF;
则APP程序起始地址应为:0x3000。

建议:
在Keil中设置APP工程的Target选项如下:
Code起始地址设置为0x3000;
若使用C语言,还需设置INVOKE段的地址为0x3000;
确保APP程序中没有与ISP程序地址冲突的中断向量或代码段。

3. ISP程序是否具备跳转逻辑

某些ISP程序在上电后会检测特定标志位(如某个寄存器、Flash标志、GPIO状态)来决定是否跳转到APP程序。如果这些标志未被清除或未满足条件,ISP程序将不会跳转。

建议:
检查ISP程序中是否有跳转到APP的判断逻辑;
确保在烧录完成后该跳转标志已设置为有效;
若有跳转延时,请确认是否需要等待足够时间;
检查是否有硬件条件(如按键)控制跳转。

4. 合并HEX文件的方式是否正确

手动复制前三个字节的方式虽然可行,但容易出错。建议使用专业的HEX合并工具(如Hex Editor、sreccat)来确保地址对齐和内容完整性。

建议:
使用sreccat命令合并两个HEX文件:
  1. bash
  2.   sreccat isphex.hex -intel apphex.hex -intel -offset 0x2FFF --fill 0xFF 0x2FFF 0x3000 -o merged.hex
复制代码
或者使用Keil自带的fromelf工具合并;
使用专业工具可避免地址重叠、数据错位等问题。

5. 烧录过程是否正确

烧录时需要注意:
是否选择了正确的烧录地址;
是否启用了“擦除芯片”选项;
是否启用了“校验”功能;
是否启用了“写入后运行”或“复位后运行”等选项。

建议:
烧录前清空芯片;
确认烧录地址从0x0000开始;
烧录完成后进行校验;
确保烧录器支持跳转地址设置。

6. 调试建议

为了进一步排查问题,建议您进行以下操作:
使用调试器(如STC-ISP的调试模式)查看程序执行流程;
查看PC指针是否进入APP区域;
在APP程序入口处添加LED闪烁或串口输出,确认是否执行;
在ISP程序末尾插入跳转前打印调试信息,确认是否满足跳转条件;
使用逻辑分析仪检查复位引脚、晶振是否正常工作。

三、总结

根据您目前的操作流程和结果,主要问题可能集中在以下几个方面:

| 问题点 | 可能原因 | 建议 |
|--------|----------|------|
| 跳转指令错误 | 三个字节不是跳转指令或地址错误 | 使用LJMP指令并验证地址 |
| APP地址冲突 | APP程序起始地址与ISP重叠 | 设置APP程序起始地址为ISP之后 |
| ISP跳转逻辑 | 没有正确跳转或标志未清除 | 检查ISP程序中的跳转逻辑 |
| HEX合并错误 | 手动合并导致地址错乱 | 使用专业工具合并HEX文件 |
| 烧录配置错误 | 地址偏移或未擦除芯片 | 确认烧录器设置和操作流程 |
| 硬件/时序问题 | 复位异常或晶振未起振 | 检查硬件连接和启动时序 |

四、结语

如果您能提供ISP程序的源码、APP程序的链接脚本、以及烧录器的具体型号和设置,将有助于更精确地定位问题。此外,建议尝试使用标准的双Bank架构或使用STC官方提供的合并工具进行操作,以减少人为错误。

如需进一步协助,请提供以下信息:

1. ISP程序的主循环或跳转逻辑代码;
2. APP程序的起始地址设置;
3. 使用的烧录器型号及设置;
4. 合并后的HEX文件截图或内容;
5. 是否有串口输出或LED指示灯用于调试。

祝您测试顺利,期待您的进一步反馈!

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 前天 11:19 | 显示全部楼层

日志里已经提醒两个跳转条件都不满足。
可以加一行强制跳转测试。
截图202509121117179985.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-09-13 09:49:07
已绑定手机

18

主题

45

回帖

596

积分

高级会员

积分
596
发表于 前天 11:19 | 显示全部楼层
在isp中,将DfuFlag设置未DFU_TAG,能实现跳转:
截图202509121119209850.jpg
花有重开日,人无再少年
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-09-13 09:49:07
已绑定手机

18

主题

45

回帖

596

积分

高级会员

积分
596
发表于 前天 11:22 | 显示全部楼层
zho*** 发表于 2025-9-12 11:19
在isp中,将DfuFlag设置未DFU_TAG,能实现跳转:

这么看来,应该是我的bin文件损坏了导致的
花有重开日,人无再少年
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 前天 11:23 | 显示全部楼层
注意自定义的的ISP升级逻辑,例程里是判断“DfuFlag != DFU_TAG && DFU_FORCEPIN != 0”

即没有 按键强制需求 也没有 标识为升级模式 就默认进行后续判断的。这里是个差异

截图202509121121487444.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 前天 11:35 | 显示全部楼层
一种简单合并ISP和APP程序文件的方法 - ISP下载/做自己的ISP 国芯人工智能技术交流网站 - AI32位8051交流社区


帖子里更新了第二种烧录方式,只固化ISP区,这样就可以在这个基础上继续测试上位机逻辑,可以参考。
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-09-13 09:49:07
已绑定手机

18

主题

45

回帖

596

积分

高级会员

积分
596
发表于 前天 11:37 | 显示全部楼层
erci*** 发表于 2025-9-12 11:23
注意自定义的的ISP升级逻辑,例程里是判断“DfuFlag != DFU_TAG && DFU_FORCEPIN != 0”

即没有 按键强制 ...

这个是确认的,因为我的isp默认DfuFlag = 0,在接收完固件后,会设置DfuFlag = DFU_TAG,然后单片机软复位,复位后,如果DfuFlag == DFU_TAG,则证明接收了app.bin,所以要跳转到app
花有重开日,人无再少年
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-14 06:28 , Processed in 0.135662 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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