关于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中的程序读出来,不过既然解决了问题,还是留下仅供参考。
|