6791|1

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于keil调试时载入外部hex报err 61或全部是ff问题的解决 [复制链接]

先说一下环境,os:Windows 7 professional 32 bit,KEIL MDK-ARM 4.53,烧写程序STMicroelectronics Flash Loader Demonstrator 2.5.0,单片机芯片stm32f103RB。

本人大一,正在学习stm32开发。目的是想给一块stm32板重写个程序来驱动数码管显示时间,于是想参考原来老师写好的程序,但是又懒得要源码,于是产生了将mcu中的程序读出来再用keil进行模拟,来参考。将usb<->uart芯片接到mcu的uart1上,选好boot引脚开关,通过Flash Loader Demonstrator的确是能读出hex文件的,本以为读出来的hex与烧写时用的keil生成的hex一样,只要在keil中进入debug模式,load一下读出的hex就可以了,但直接load会报error 61: illegal hex module错误,通过比较发现读出来的hex与keil生成的hex不一样。

首先keil生成的hex只是链接出的程序大小,从mcu读出来的hex就会较大,我估计源程序不过4k,不过读取时由于无法判断程序大小,我索性把128k的flash全读了出来,通过观察,基本上hex后面的部分全都是ff,也就是空白。不过即使hex中有无用的部分,load进keil也应该不会有问题,于是比较发现keil生成的hex最后一行会有一句:00000001FF,读了intel的hex文件标准发现它是文件结束的标志,于是果断把读出的hex文件末尾加上这句,再load,发现不再报error 61错误,貌似load成功,再reset mcu,调试器无法工作,pc不对,程序也全都是ff,显然没有load进去,再看hex,发现读出的hex中间有较多的
:020000020000FC句,而keil生成的hex则没有,原来这句是设扩展段地址为0000,由于已经设置了扩展线性地址的高16位为0x0800(由于一共128k,而4位的低地址只能寻址64k,故中间又再次设为0x0801),而段地址始终没有变,于是考虑删掉:020000020000FC这句,直接复制,替换为空即可(注意整个hex中不能有空行,故最好直接带着前面一个换行复制)。再从keil中load,reset mcu,pc正确指向0x08000148 LDR r0,[pc,#24],程序可以开跑了。

估计没有太多人会像我这样闲来无事把mcu中的程序读出来,不过既然解决了问题,还是留下仅供参考。
此帖出自stm32/stm8论坛

最新回复

很有用的经验分享,谢谢  详情 回复 发表于 2012-7-9 09:06
点赞 关注
 

回复
举报

3836

帖子

19

TA的资源

纯净的硅(中级)

沙发
 
很有用的经验分享,谢谢
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表