8H的OTA升级不能跳转的疑问
总体介绍:根据官方串口升级案例,我准备低地址作用户ISP区(0x0000~0x2800),设为10K的CODE区;高地址区作用户APP区(设为EEPROM),APP区为正常的业务逻辑代码区,本次功能是让一个灯闪光,还划分了20K地址存从串口来的OTA数据一、app代码keil设置如下:
设置APP代码放到0x2803开始的地址
设置中断入口到0x2800
之后其它按默认设置,再写好程序生成hex文件
将生成的hex文件用STCISP打开,代码最前的3个字节进行了设置
按上面两图设置了复位地址,修改后的APP文件如下:
然后将上图的文件另存为BIN文件,供OTA使用
二、用户ISP代码的下载设置如下:
按以上设置,能下载成功,用户ISP代码大概8K,所以没超0x2800的code空间
三、用户ISP代码的KEIL如下设置
在工程中添加中断跳转地址,其它按默认设置不动
四、用户ISP代码说明
用户ISP代码初始化时已添加IAP_CONTR = 0x80;IAP_TPS = 44;用户ISP代码没有使用中断服务程序,使用查询中断接收串口数据,
并从中解析出用户APP的bin文件,再将bin文件写入0x2800开始的flash地址,此地址刚好是EEPROM的0地址,写入BIN完成后,再执行以下代码
IAP_CONTR = 0x20;
while(1);
那么问题来了,运行以上两行代码后,芯片又去执行用户ISP代码,无法跳转到用户APP代码,请问各位大神,是哪里设置出现问题了吗?谢谢你的解答。
关于STC8H的OTA升级不能跳转的问题,以下是一些可能的原因和解决方案,供您参考:
1. 地址设置问题
APP代码地址设置:您将APP代码的起始地址设置为0x2803,但中断入口地址设置为0x2800。这可能导致中断向量表与代码起始地址不匹配。建议将APP代码的起始地址设置为0x2800,以确保中断向量表与代码起始地址一致。
中断向量表设置:在Keil中,确保中断向量表的起始地址与APP代码的起始地址一致。如果中断向量表未正确设置,可能导致中断无法正常跳转。
2. 复位地址设置
复位地址设置:您在STCISP中设置了复位地址,但需要确保复位地址与APP代码的起始地址一致。如果复位地址设置不正确,可能导致程序无法正确跳转到APP代码。
3. IAPCONTR寄存器设置
IAPCONTR寄存器设置:在用户ISP代码中,您设置了IAPCONTR = 0x20;,这表示跳转到用户代码区。但需要确保在执行此操作之前,所有必要的初始化操作已完成,并且Flash写入操作已正确完成。
4. Flash写入操作
Flash写入操作:在将BIN文件写入Flash时,确保写入操作正确完成,并且没有发生错误。如果Flash写入操作失败,可能导致程序无法正确跳转。
5. 中断处理
中断处理:在用户ISP代码中,您没有使用中断服务程序,而是使用查询中断接收串口数据。确保在跳转到APP代码之前,所有中断已正确关闭或处理,以避免在跳转后发生中断冲突。
6. 代码优化
代码优化:在Keil中,确保代码优化设置不会影响程序的正常运行。某些优化设置可能导致代码行为异常,特别是在跳转和中断处理方面。
7. 调试与验证
调试与验证:使用调试工具(如Keil的调试器)逐步验证程序的执行流程,确保在跳转到APP代码之前,所有操作已正确完成。通过调试工具,可以更容易地发现问题所在。
8. 官方文档与示例
官方文档与示例:参考STC8H的官方文档和示例代码,确保您的设置和操作符合官方推荐的最佳实践。官方文档通常提供了详细的说明和示例,可以帮助您更好地理解和解决问题。
9. 硬件问题
硬件问题:检查硬件连接和电源稳定性,确保硬件没有故障。硬件问题也可能导致程序无法正常跳转。
10. 代码兼容性
代码兼容性:确保用户ISP代码和APP代码之间的兼容性,特别是在中断处理和内存使用方面。不兼容的代码可能导致程序无法正常跳转。
通过以上步骤,您可以逐步排查和解决STC8H的OTA升级不能跳转的问题。如果问题仍然存在,建议进一步详细分析代码和硬件配置,或寻求官方技术支持。
[本文内容由国芯人工智能辅助生成,仅供参考]
你的代码是ISP跳ISP?
ISP跳APP
APP跳ISP,即复位
页:
[1]