OpenEdv-开源电子网

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

关于DFU的一些问题和心得

[复制链接]

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-12
在线时间
13 小时
发表于 2016-6-13 12:48:11 | 显示全部楼层 |阅读模式
首先感谢 八度空间 的帖子 http://www.openedv.com/posts/list/0/28532.htm,一开始什么都不会的时候,就是看这个帖子开始的。现在尘埃落定,在这个基础上,再谈谈自己的一些心得。
1、在APP程序的这句偏移中断向量的代码   SCB->VTOR = FLASH_BASE | 0X30000;  感觉也可以放在 boot 代码中。对于做练习的,这句代码放在哪里都无所谓,但是对于实际生产来说,这句代码放在APP,无疑增加了维护难度,对APP代码来说,就像眼里揉进了一粒沙子般让人不爽,所以我决定将其放到boot代码中(放在Jump_To_Application();这句前面),实际测试是没问题的,而且放到boot代码中时,这句可以这样写 SCB->VTOR = ApplicationAddress,简洁明了,ApplicationAddress 有变动时不需做任何修改。


2、八度空间 把官方代码中关于 SPI Flash 和 NOR Flash 部分的代码删除了,但是运行后,上位机程序中仍然显示出 SPI 和 NOR 的选项,对于追求完美的人来说,这两个项目显然很碍眼。而且这两个选项不是上位机来的,不需要研究上位机程序,所以很容易把它删除了,删除方法是:
(1)、找到 DFU_ConfigDescriptor[DFU_SIZ_CONFIG_DESC] 这个数组,把里面注释块 “Descriptor of DFU interface 0 Alternate setting 1” 和 “Descriptor of DFU interface 0 Alternate setting 2” 共18个元素删除,DFU_SIZ_CONFIG_DESC 这个元素个数定义相应改为 27.
(2)、找到 DFU_String_Descriptor[7] 这个数组,删除最后面两个元素,数组个数相应改为 5。
运行程序后,就会发现界面中间那个列表中只有internal flash 一行了。

3、特别说明一下(原帖也已经有人回复了),MAL_GetStatus这个函数的内容必须有的。没有这个函数,erase 和 write 速度超快,显然已经忽略了flash的读写延时了,所以基本是无法烧录成功的,只有极其短小的代码才能侥幸成功。这个事情因为八度空间老大没有写入那个PDF文件,我一开始又只保留了那个文件,论坛也没怎么来逛,折腾了好久,后来才隐约想起在哪里见过一句话,说如果代码较大时要注意什么,才自己把MAL_GetStatus这个函数补全的,然后才发现这句话原来就是八度空间自己说的,建议八度老大把这句话也写入PDF文件吧,或者例子中补全这个函数,小弟被你害苦了~


4、如果您不是使用eclipse写代码,这一段就不用看了。关于如何在eclipse中设置flash地址,也颇费一番心思,利用Jflash软件修改hex文件地址,不成功;利用bin文件再修改地址,也不成功。后来终于发现,按照网上提供的方案,在eclipse项目中,有个mem.ld文件,里面就可设置flash起始地址。还有要注意,设置后必须清理工程重新编译,否则如果其他文件没改动,再编译还是原来的hex文件的。这个东西网上很难找到资料,这里也顺带共享一个。


5、关于hex合并的问题,如果使用jLink,你的电脑里必定有jflash这个软件,这个软件就有合并hex文件的功能。这样,你就可以把boot代码和app代码合并成一个hex文件,一次性用仿真器烧录进去了。经测试是成功的。jFlash是很强大的,比如原子哥的光盘中提供的ISP软件,里面有个功能是读取芯片的flash,那个功能是要注册才能使用的,但是jFlash就有这个功能,免注册的。


6、最后,聊聊关于bin和hex的区别问题。先说一下hex,刚开始我以为,在编译时设置flash起始地址,和编译后用jFlash修改hex文件的地址偏移量是一样的效果,但是我错了。对比两个不同起始地址的hex文件就知道,内容完全不同。想想也是,比如里面的函数地址,起始地址不一样,函数的地址也不一样,jFlash软件只是将整个文件的地址偏移了,里面的函数地址他怎么知道如何偏移?然后就扯到bin文件了,传说中,bin和hex的区别,就是bin不带地址。然后问题来了,如果bin不带地址,那靠外部的转换软件强行指定地址,是不是一样有问题?DFU软件中有将bin文件转为dfu文件的功能,但是里面显然是要我们提供一个bin文件集合,这是怎么回事呢?我的本意是,我想原来的APP代码整体原封不动,地址总是从0开始,仅靠外部工具将其转换为对应于dfu所需的文件,这样我的APP代码可以兼容所有情况,减少维护难度。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2016-6-13 15:30:47 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2019-11-15 17:40:57 | 显示全部楼层
完美解决
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 00:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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