OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8964|回复: 21

关于STM32F407 IAP程序升级,程序擦出成功,也写入成功,重新上电程序就没是没跑起来

[复制链接]

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
发表于 2017-8-29 16:54:52 | 显示全部楼层 |阅读模式
5金钱
各位前辈,小弟最近遇到一个关于IAP升级的问题,原子哥的IAP升级是采用串口一次性接收所有bin的数据,我的板子没有那么大缓存,只能接受一部分就写一部分,同样是接收2048字节再转换成512个4字节的数据,再写入flash中,地址每次偏移2048,直到写完就跳转到APP程序段。(目前我的APP段就是0x8000000,BOOT程序段是放后面的0X8040000),问题是写完flash(调试发现擦出flash成功了,写每次也成功了(看FLASH_ProgramWord函数返回值是成功的)),发现程序总是跑步起来(bin程序就是让一个灯闪烁的更快一些),发现写bin后程序跑步起来,我现在疑问的是,如何准确判断是我写flash到底成功了没,还是程序别的问题,(如果写成功了,理论上我重新上电就能正常,但是重新上电也没有反应,APP程序断是0x8000000)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-29 17:32:24 | 显示全部楼层
别沉下去啊,原子哥帮忙分析一下吧
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2017-8-29 17:40:10 | 显示全部楼层
大小端?
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-8-29 17:52:12 | 显示全部楼层
你的BIN程序加了偏移地址吗?
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-29 18:01:41 | 显示全部楼层
xlong_06 发表于 2017-8-29 17:52
你的BIN程序加了偏移地址吗?

写bin的时候直接写的就是APP首地址(0x8000000)
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-29 18:03:24 | 显示全部楼层
小枫叶 发表于 2017-8-29 18:01
写bin的时候直接写的就是APP首地址(0x8000000)

然后每次写了2048字节(每次收到4个字节会转换成1个int型的数据,所以一共是512个int数据就写一次,地址偏移4*512=2048)
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-29 18:04:39 | 显示全部楼层

收到的单字节会转换成4字节的数据,       
                temp=(u32)dfu[3]<<24;   
                temp|=(u32)dfu[2]<<16;   
                temp|=(u32)dfu[1]<<8;
                temp|=(u32)dfu[0];          
回复

使用道具 举报

2

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2016-7-9
在线时间
49 小时
发表于 2017-8-29 18:09:19 | 显示全部楼层
1.你直接把APP程序下载(下载的时候注意设置Flash地址)到MCU里面如果运行正常,说明可能是IAP写Flash的有丢失或者其他问题;如果运行不正常则可能是你的APP程序里面地址偏移的问题;2.如果是Flash写丢失的问题,你可以用STM32 ST-Link Utility工具对比一下写进Flash的程序和bin文件是否一样,就可以找出问题所在!
回复

使用道具 举报

16

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2013-12-4
在线时间
43 小时
发表于 2017-8-29 18:49:10 | 显示全部楼层
你写完后直接跳到0x80000000位置可以运行吗?  还是只是重新上电不能运行。如果是写完直接跳转都不能运行的话,你可以DEBUG一下,看程序走到哪里出了问题。
我当时做IAP升级的时候,跳转到APP运行跑飞是因为我编译优化了BIOS程序,具体原因没有查到。
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-30 08:50:47 | 显示全部楼层
liuliuliu 发表于 2017-8-29 18:09
1.你直接把APP程序下载(下载的时候注意设置Flash地址)到MCU里面如果运行正常,说明可能是IAP写Flash的有 ...

1.APP程序是没有问题的,只是让一个灯闪烁更快一些,已经验证过了(直接下载去验证的),验证ok。
2.目前发现IAP升级时,原来的APP程序已经被擦出了,因为重新上电后,程序旧已经不能执行了(当然新程序也不能执行,我这里为什么重新上电去验证,原因是,APP程序就是芯片FLASH的开始地址0x8000000所以可以不用使用跳转命令,直接用重新上电方式去验证)。
3.写falsh的地址肯定是APP的首地址的,就是0x8000000开始去写的。
4.写flash地址偏移是接收2048字节再转换成512个四字节的数据写入,每次写入地址偏移是2048,从写入函数的返回值来看每次都写入成功(但是我感觉并不能证明真正写进去了)
5.调试擦出和写入过程时很顺利,没有出现过错误
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-30 09:21:12 | 显示全部楼层
liuliuliu 发表于 2017-8-29 18:09
1.你直接把APP程序下载(下载的时候注意设置Flash地址)到MCU里面如果运行正常,说明可能是IAP写Flash的有 ...

刚刚用了一下STM32 ST-Link Utility工具我发现我生成的bin的地址和hex地址不一样,貌似是不是bin的地址有问题,附上截图。[img]C:\Users\hezhen\Desktop\11.jpgC:\Users\hezhen\Desktop\22.png[/img]
回复

使用道具 举报

2

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2016-7-9
在线时间
49 小时
发表于 2017-8-30 09:21:16 | 显示全部楼层
本帖最后由 liuliuliu 于 2017-8-30 09:25 编辑
小枫叶 发表于 2017-8-30 08:50
1.APP程序是没有问题的,只是让一个灯闪烁更快一些,已经验证过了(直接下载去验证的),验证ok。
2.目前 ...

写进Flash的程序(直接看MCU Flash里面的程序,用工具可以看到)和bin文件完全一样吗?有没有做过对比?用工具看到Flash里面的程序是这样的: 1.png
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-30 09:24:22 | 显示全部楼层
liuliuliu 发表于 2017-8-30 09:21
写进Flash的程序(直接看MCU Flash里面的程序,用工具可以看到)和bin文件完全一样吗?有没有做过对比?

这个图片
11.jpg
22.png
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-30 09:25:21 | 显示全部楼层
liuliuliu 发表于 2017-8-30 09:21
写进Flash的程序(直接看MCU Flash里面的程序,用工具可以看到)和bin文件完全一样吗?有没有做过对比?

刚刚做了下对比hex和bin发现bin的首地址好像不对呀,hex地址是对的
回复

使用道具 举报

15

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1766
金钱
1766
注册时间
2013-8-22
在线时间
128 小时
发表于 2017-8-30 09:27:47 | 显示全部楼层
里面好像有个效验码之类的一个long int数据,你读出能运行的文件,和你要IAP进去的bin文件比较一下,应该有4个字节不一样。
我不理财,财就不理我。
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-30 09:30:32 | 显示全部楼层
lhf_1230 发表于 2017-8-30 09:27
里面好像有个效验码之类的一个long int数据,你读出能运行的文件,和你要IAP进去的bin文件比较一下,应该有 ...

我现在就是发现我生成的bin和hex的起始地址好像不一样哦,上面两幅截图可以看见的,是不是bin本事就是0x0000000开始的
回复

使用道具 举报

2

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2016-7-9
在线时间
49 小时
发表于 2017-8-30 09:31:09 | 显示全部楼层
小枫叶 发表于 2017-8-30 09:25
刚刚做了下对比hex和bin发现bin的首地址好像不对呀,hex地址是对的

查找一下看是不是bin文件的问题!可以直接用工具把bin文件下载进去,如果运行正常说明不是bin文件的问题,如果不正常就可能是bin文件的问题,注意Flash地址要设置对,一步一步去验证是哪里的问题!
回复

使用道具 举报

2

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2016-7-9
在线时间
49 小时
发表于 2017-8-30 09:36:45 | 显示全部楼层
小枫叶 发表于 2017-8-30 09:30
我现在就是发现我生成的bin和hex的起始地址好像不一样哦,上面两幅截图可以看见的,是不是bin本事就是0x0 ...

不是,Flash的地址都是从0x08000000开始的,我设置的偏移地址是0x08004000,所以我截图上开始的地址是0x8004000
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-30 09:40:05 | 显示全部楼层
liuliuliu 发表于 2017-8-30 09:31
查找一下看是不是bin文件的问题!可以直接用工具把bin文件下载进去,如果运行正常说明不是bin文件的问题 ...

我现在是使用SWD下载的,实际上我对比APP程序的hex(SWD下载能正常执行),和生成后的bin去对比就可以了,如果两者一致,那问题可能就是写flash没写成功,如果不一致,那可能就是bin没有生成对,现在验证,待会回帖。
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-30 09:59:23 | 显示全部楼层
小枫叶 发表于 2017-8-30 09:40
我现在是使用SWD下载的,实际上我对比APP程序的hex(SWD下载能正常执行),和生成后的bin去对比就可以了, ...

目前发现hex和bin的数据时一致的,说明还是可能是flash擦除,写入有问题,附上代码,大伙分析下
1.png
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2014-12-20
在线时间
32 小时
 楼主| 发表于 2017-8-30 10:02:53 | 显示全部楼层
小枫叶 发表于 2017-8-30 09:59
目前发现hex和bin的数据时一致的,说明还是可能是flash擦除,写入有问题,附上代码,大伙分析下

上面这个截图的功能就是:用一个int的数组FlashData对接收的数据进行接收,用的是以太网读取bin文件发下来的。这部分验过了没有问题,然后循环对单字节数据进行转换成4字节数据,然后存够了512个4字节的数据就写入一次,如此循环的。
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-8-30 11:19:59 | 显示全部楼层
一般的用法是bootloader从0x08000000开始,然后APP再根据bootloader程序的大小往后偏移,但像你反过来设置的用法,很容易引起APP在运行的时候直接就跑到后面的bootloader的区域去了,建议你先按照bootloader在前,APP在后,然后每次上电时在bootloader检测是否需要跳转到APP,这样在以后编写APP时更方便,不用再去考虑在更换bootloader偏移地址的情况,而且在实际项目中也是这么用的
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 11:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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