stm32f103re iap 怎么烧录iap程序

查看: 1511|回复: 7
IAP实现,程序跳转疑问
主题帖子精华
初级会员, 积分 157, 距离下一级还需 43 积分
在线时间8 小时
最近在实现无线(WIFI)升级程序功能,看了相关资料后,发现程序跳转是通过获取并调用ResetHandler的函数指针来实现的,这样调用是属于中断调用还是普通调用,这里是简单的函数调用还是说有一系列其他隐含操作?从bootloader程序跳转到app程序时,栈和堆会不会被初始化,会的话是在什么时候,是怎么进行的?
谢谢您的解答!
这不是栈和堆初始化的问题,而是跳到应用代码后,栈和堆指向的就不是同一个地址。
我这正好有升级代码和应用代码,可以详细的举例
bootloder:
生成的二进制文件
小端模式,所以偏移0x00位的数据为0x,对比map表
就知道这儿放的是主堆栈顶地址(0x)。
在参考跳转后的application:
可以知道跳转后的主堆栈顶地址是(0x)
跳转代码里__set_MSP(*(__IO uint32_t*)USER_APPLICATION_F ...
持续而安静地投入
主题帖子精华
中级会员, 积分 471, 距离下一级还需 29 积分
在线时间57 小时
这不是栈和堆初始化的问题,而是跳到应用代码后,栈和堆指向的就不是同一个地址。
我这正好有升级代码和应用代码,可以详细的举例
bootloder:
生成的二进制文件
eccbecd15f6e44_877.png (0 Bytes, 下载次数: 0)
22:54 上传
小端模式,所以偏移0x00位的数据为0x,对比map表
90cddabadf4c1cf6ccbe2f8c9fe672c7_933.png (0 Bytes, 下载次数: 0)
22:54 上传
就知道这儿放的是主堆栈顶地址(0x)。
在参考跳转后的application:
364b32ba82a030d12c230_24.png (0 Bytes, 下载次数: 0)
22:54 上传
91f52f7f8428cacce.png (0 Bytes, 下载次数: 0)
22:54 上传
可以知道跳转后的主堆栈顶地址是(0x)
跳转代码里__set_MSP(*(__IO uint32_t*)USER_APPLICATION_FIRST_ADDRESS);
重新定义了栈顶地址,就已经修改了堆栈。
M3权威指南里说过,M3的堆栈是向下生长的满栈,那么就可以很清晰的明了,bootloader和application的栈顶地址不一样,也就是说用的堆栈根本就在内存的不同区域,也就没有什么初始化一说。
因为这个问题,我还想到既然bootloader也建立的堆栈,会不会这部分无法使用造成内存泄漏呢?
还是.map文件解决了这个问题:
34de27bf96dae9dcf6d430_538.png (0 Bytes, 下载次数: 0)
22:54 上传
这是应用代码的内存占用,也就是说和bootloder重叠的部分仍然被分配了数据。所以当跳转的application时,bootloder的那部分内存就被application的数据覆盖了,也就是原有堆栈已经没有意义,作为application的普通内存使用了。
主题帖子精华
中级会员, 积分 471, 距离下一级还需 29 积分
在线时间57 小时
我之前实现的web升级,你可以看一下
主题帖子精华
初级会员, 积分 157, 距离下一级还需 43 积分
在线时间8 小时
回复【2楼】zc123:
---------------------------------
之前看过你的实现,很受用!现在我的主要问题不是如何实现这个功能,而是对这个实现背后的原理有些不理解。
持续而安静地投入
主题帖子精华
金牌会员, 积分 1054, 距离下一级还需 1946 积分
在线时间101 小时
所见即所得,没有那么多自动的东西。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.
主题帖子精华
初级会员, 积分 157, 距离下一级还需 43 积分
在线时间8 小时
回复【4楼】emWin:
---------------------------------
哦哦,明白了,那就是说只是简单调用了ResetHandler函数。寄存器什么的都不会初始化。谢谢!
持续而安静地投入
主题帖子精华
初级会员, 积分 157, 距离下一级还需 43 积分
在线时间8 小时
回复【6楼】zc123:
---------------------------------
厉害!!分析得很深入,原来的堆栈确实不会有影响。在调用ResetHandler到进入main函数会执行一系列的操作,有位大神写了这个:/posts/list/20164.htm。我在实现过程中遇到了比较特殊的问题,在Bootloader中使用了ucos,ucos会使用PSP作为堆栈指针,所以在任务里跳转后还是使用PSP,如果在跳转前只设置了__set_MSP(*(__IO&uint32_t*)USER_APPLICATION_FIRST_ADDRESS);这样就会有问题。网上有人遇到跟我一样的问题,里面也有答案:/bbsview-29889.htm。
持续而安静地投入
主题帖子精华
初级会员, 积分 157, 距离下一级还需 43 积分
在线时间8 小时
回复【6楼】zc123:
---------------------------------
已关注你博客园!
持续而安静地投入
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
查看: 6558|回复: 15
STM32F103 的 IAP 程序怎么在ST官网下载?
&&已结帖(10)
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
求助,别人都说官网有,自己搜了半天都找不到,搜到的 全是PDF
满意回复+10
就是在官网上找的,
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
hptop 这个我见过, 不过不知道IAP程序是归类到哪里啊?&&找不到
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
你是想要样例程序吗?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
我这有stmf2的iap
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
是要UART的IAP ,不过我还是想知道怎么在官网下载啊!!?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
就是在官网上找的,
本帖子中包含更多资源
才可以下载或查看,没有帐号?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
hptop 好吧,谢谢你了, 这论坛人气真差
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 75, 距离下一级还需 25 积分
初级技术员, 积分 75, 距离下一级还需 25 积分
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级技术员, 积分 284, 距离下一级还需 16 积分
中级技术员, 积分 284, 距离下一级还需 16 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 284, 距离下一级还需 16 积分
中级技术员, 积分 284, 距离下一级还需 16 积分
官方不支持断点续传,不支持高低区,最好自己做个!
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级技术员, 积分 207, 距离下一级还需 93 积分
中级技术员, 积分 207, 距离下一级还需 93 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 207, 距离下一级还需 93 积分
中级技术员, 积分 207, 距离下一级还需 93 积分
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 948, 距离下一级还需 52 积分
高级技术员, 积分 948, 距离下一级还需 52 积分
hptop 谢谢~~
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
实习生, 积分 21, 距离下一级还需 29 积分
实习生, 积分 21, 距离下一级还需 29 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 21, 距离下一级还需 29 积分
实习生, 积分 21, 距离下一级还需 29 积分
hptop 发表于
就是在官网上找的,
请问你在哪个板块下载的?谢谢!
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 749, 距离下一级还需 251 积分
高级技术员, 积分 749, 距离下一级还需 251 积分
主题帖子积分
专家等级:结帖率:23%
主题帖子积分
高级技术员, 积分 749, 距离下一级还需 251 积分
高级技术员, 积分 749, 距离下一级还需 251 积分
hptop 发表于
就是在官网上找的,
谢谢大神:)
外包接项目,QQ:
主题帖子积分
中级技术员, 积分 223, 距离下一级还需 77 积分
中级技术员, 积分 223, 距离下一级还需 77 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 223, 距离下一级还需 77 积分
中级技术员, 积分 223, 距离下一级还需 77 积分
学习了,谢谢!
Cyberspace
我们游荡在赛博世界中,难道这一切都是虚拟的?
技术新星奖章
人才类勋章
时间类勋章
涓涓之细流
发帖类勋章
希望之星奖章
等级类勋章
技术奇才奖章
人才类勋章
时间类勋章
技术高手奖章
人才类勋章[STM32入门]---利用ST提供的USB例程实现USB IAP功能stm32 iap,stm32f0 iap例程,stm32 iap官方例程,stm32f429 iap例程,stm32 iap例程,stm32f4 iap例程,stm32 usb iap例程,stm32 f0 iap官方例程,stm32 iap升级例程,stm32f103入门例程
[STM32入门]---利用ST提供的USB例程实现USB IAP功能 我们知道ST推出的Cortex-M3平台STM32内部有两个Flash区域,一是System Flash,ST官方保留的一个区域,用于存放IAP代码。该区域不对用户开放,仅提供UART的通讯接口用于IAP升级;另一个区域是User Flash,这一部分是供用户自由使用的。STM32自带USB 2.0 Device接口,如果需要通过USB接口来实现IAP功能需要如何做呢?这里介绍如何利用ST STM32xx USB Development Kit提供的DFU代码来实现上述功能。我用STM3210EVB来演示这 个功能。
阅读前请下下载下列代码压缩包和应用软件: 1、STM3210B-EVAL demonstration software v1.1.zip STM3210B-EVAL demonstration software v1.1..zip(文件大小:2.15M)
ST官方的下载路径: /stonline/products/support/micro/files/um0435.zip
2、STM32F10xxx USB developer kit v1.0.zip STM32F10xxx USB developer kit v1.0.zip (文件大小:461K)
ST官方的下载路径: /stonline/products/support/micro/files/um0424.zip
3、DfuSe USB Device Firmware Upgrade v2.2.zip DfuSe USB Device Firmware Upgrade v2.2.zip (文件大小:7.85M)
ST官方的下载路径: /stonline/products/support/micro/files/um0412.zip
上述文档对于的用户参考手册,请自行到ST MCU网站下载。 /mcu/familiesdocs-110.html#Application%20Note
下列步骤将介绍如何通过ST官方的USB升级代码实现程序的下载更新的功 能(IAP)。
点击显示全文
厨师培训记录_学习总结_总结/汇报_实用文档。幼儿园厨师培训记录培训时间
培训对象 全体厨师 培训地点 培训主题 培训形式 餐饮炊事员食品安全知识 办公室...
为进一步提高农村厨师食品安全意识和业务技能, 加强对 农村家庭自办宴席食品安全的管理, 按照县食品药品监督管理局 的要求,今天我镇举行农村厨师培训。目的在于提升...
厨师培训协议甲方: 地址: 电话: 乙方: 地址: 电话: 因甲方业务需要 , 为提高乙方的专业技术水平 , 甲乙双 方就甲方为乙方提供专业技术培训事项达成如下协议: ...
厨师培训需要多长时间_学厨师需要多久?_职业技术培训_职业教育_教育专区。厨师的学习时间有两年的长期学习,也有一年、半年等短期培训。选择是长期班学习还是参加 短期...
厨师培训之厨师一定要考取国家职业资格证书吗?_职业规划_求职/职场_实用文档。厨师一定要考取国家职业资格证书吗?中国餐饮行业的考验越来越多, 这要求从业者的职业...
厨师培训教师年终总结发言 在这辞旧迎新的日子里,我迎来了学校的第一次年会,我心情特别激动,而且特别荣幸 的在这里发言,在学校工作半年有余,在职期间学校的各位...
厨师培训项目商业计划书 国统报告网《即中金企信国际咨询公司》拥有 10 余年项目商业计划书撰写经验《注:与 项目可行性报告同期开展的业务板块》, 拥有一批高素质编写...
学厨师学一个月多少钱 厨师培训一个月学 费学厨师学一个月多少钱 选择学一个月厨师的,大多数是出于兴 趣爱好或者有开店目的的, 这一类学习者更加关注一个月...
厨师培训教师年终总结发言 在这辞旧迎新的日子里,我迎来了学校的第一次年会,我心情特别激动,而且特别荣幸 的在这里发言,在学校工作半年有余,在职期间学校的各位...
厨师培训需要多长时间_学厨师需要多久?_职业技术培训_职业教育_教育专区。厨师的学习时间有两年的长期学习,也有一年、半年等短期培训。选择是长期班学习还是参加 短期...
厨师培训手册_企业管理_经管营销_专业资料
暂无评价|0人阅读|0次下载|举报文档厨师培训手册_企业管理_经管营销_专业资料。文档贡献者 我 贡献于2013-12...
餐厅厨师培训计划为进一步提高员工素质, 提高服务技能是当前夯实内力的迫 切需求.根据省局加大员工培训工作力度的指示精神,结合本单 位实际,努力做好 2010 年的厨师...
厨师培训记录_学习总结_总结/汇报_实用文档。幼儿园厨师培训记录培训时间
培训对象 全体厨师 培训地点 培训主题 培训形式 餐饮炊事员食品安全知识 办公室...
■ 24小时热门信息
学西餐厨师要多少钱 西餐厨师培训学 费多少学西餐厨师要多少钱,这是许许多多想学西餐厨师的学生比较关 注的话题,如果想要付出得到足够的回报,那么,找一所好的...
西餐培训教程_学习总结_总结/汇报_实用文档。西餐历史发展,西餐厅培训心内阁西餐培训第一阶段培训内容:对西餐的认识和西餐在我国的发展,世界流行的几大菜式 的特点...
想学西餐 哪里有较好的西餐培训学校_解决方案_计划/解决方案_实用文档。学西餐去哪里比较好?哪里的西餐培训学校比较好?想学西餐 哪里有较好的西餐培训学校 “西餐...
因此,西餐培训学校 怎么选择也显得尤为重要, 对于这个问题, 我们认为选择西餐培训学校可以参考的几个方面。 首先, 我们要看西点西餐培训学校的技术如何?所谓名师出...
西餐培训一年要多少学费西餐培训一年要多少学费,西餐培训学费,我们不妨来计算一下学习 西餐包括的费用: 1、学费,学费是每一个学生都不陌生的费用项目,不同学校不...
西餐厅培训方案_广告/传媒_人文社科_专业资料。培训方案简介 西餐厅新入职人员培训方案新入职员工统一由餐厅主管进行培训,培训时间为 1 周,1 周以 后进行考核。 ...
■ 精彩推荐
烘焙知识大全——新手必备_人文社科_专业资料。新手必备的烘焙知识大全。既有烘焙工具、材料、各类点心制作的方子和详细做法,更有烘焙的小技巧。实在是烘焙新手的入门...贡献者:lguanr17019408016
烘焙可能用到的材料 电烤箱《一般会配附件,可以另外多购置一个烤盘,如果饼干烤的多,多一个烤盘会方便一 点》 可制蛋糕、饼干、面包《家庭来说难度高一些》 、派...贡献者:wdl24456375375
择合适的烘烤温度和时间是制作出完美糕点的关键环节, 今天熊妈妈抽出点时间来, 与大家 一起分享一下烘焙过程中温度与时间的掌控技巧。 一、烘烤温度和时间掌控的...贡献者:qq17208262467
烘焙配方大全《二》最热门配方_广告/传媒_人文社科_专业资料。2013 烘焙配方大全 《2》烘焙必备 1、可可海绵蛋糕原料: 鸡蛋 600g、 白糖 300g、 低筋粉 290g、 ...贡献者:rzswyw23648143282
蛋黄并且能够增加食物色则,添加食物香味 烘培入门——烘焙用油脂全接触烘培入门——烘焙用油脂全接触 一、油脂的种类 1、天然油脂 《1》植物油 在豆油、棉子油、...贡献者:15585886335
家庭烘焙在海外是非常流行的, 很多家庭女主人都会做一些拿手的蛋糕和小点心给自己 的 Baby 和家人享用,也会常常作为招待客人的茶点,即温馨也充满了生活的情趣。 ...贡献者:厅其95336537912
烘焙入门必备基础常识-各种打法 来源:家庭烘焙网 发布时间: 我要评论 1 条 进入论坛 在制作西点时,除了掌握正确的材料、器具及步骤外,更要了解制作...贡献者:myx12862113253
烘焙的潮流让越来越多家庭乐此不疲地开启属于他们的烘焙领域, 同时也令烤箱渐渐成为众 多家庭里的重要厨房用具,时下,遇到节假日、喜庆的日子,人们总要拿出烤箱...贡献者:烘焙蜜语22610395203
声明:本站内容部分源于网络转载,出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,请咨询相关专业人士。
如果无意之中侵犯了您的版权,或有意见、反馈或投诉等情况, 请联系本站,
Copyright (C)
| 欢迎来到杭州厨师培训IAR环境下STM32+IAP方案的实现 | 快易购行业动态-这里有最新的科技动态
–基于STM32F103ZET6的UART通讯实现
一、什么是IAP,为什么要IAP
IAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给用户一个代码文件即可。
而IAP却能很好的解决掉这个难题,一片STM32芯片的Code(代码)区内一般只有一个用户程序。而IAP方案则是将代码区划分为两部分,两部分区域各存放一个程序,一个叫bootloader(引导加载程序),另一个较user application(用户应用程序)。bootloader在出厂时就固定下来了,在需要变更user application时只需要通过触发bootloader对userapplication的擦除和重新写入即可完成用户应用的更换。如图1-1所示
在程序执行初始进入bootloader,在bootloader里面检测条件是否被触发(可通过按键是否被按下、串口是否接收到特定的数据、U盘是否插入等等),如果有则进行对user application进行擦除和重新写入操作,如果没有则直接跳转到user application执行应用;如果有则进行擦除用户代码并重新写入新的用户代码。
二、STM32F103ZET6硬件条件
STM32F103ZET6的启动方式有三种:内置FLASH启动、内置SRAM启动、系统ROM启动,通过BOOT0和BOOT1引脚的设置可以选择从哪中方式启动,这里选择内置的FLASH启动。其FLASH的地址为0xx0807ffff,共512KB,这些都能从芯片数据手册中直接得到。而这里首要的一个问题是中断的问题。正常情况下发生中断的过程为:发生中断(中断请求)à到中断向量表查找中断函数入口地址à跳转到中断函数à执行中断函数à中断返回。也就是说在STM32的内置的Flash中有一个中断向量表来存放各个中断服务函数的入口地址,内置Flash的分配情况大致如下图2-1。
在只有一个程序的情况下,程序执行的走向应该如图2-2所示(借用网友的原图)。
STM32F10x有一个中断向量表,这个中断向量表存放在代码开始部分的后4个字节处(即0x),代码开始的4个字节存放的是堆栈栈顶的地址,当发生中断后程序通过查找该表得到相应的中断服务程序入口地址,然后再跳到相应的中断服务程序中执行。上电后从0x处取出复位中断向量的地址,然后跳转到复位中断程序的入口(标号①所示),执行结束后跳转到main函数中(标号②所示)。在执行main函数的过程中发生中断,则STM32强制将PC指针指回中断向量表处(标号③所示),从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号④所示),执行完中断函数后再返回到main函数中来(标号⑤所示)。
若在STM32F103x中使用IAP方案,则内置的Flash分配情况大致如下图2-3。
在内置的Flash里面添加一个BootLoader程序,BootLoader程序和user application各有一个中断向量表,假设BootLoader程序占用的空间为N+M字节,则程序的走向应该如图2-2所示(借用网友的原图并做改动,其中虚线部分为原图步骤④⑤的走向,本人改为指向灰色部分)。
上电初始程序依然从0x处取出复位中断向量地址,执行复位中断函数后跳转到IAP的main(标号①所示),在IAP的main函数执行完成后强制跳转到0x+N+M处(标号②所示),最后跳转到新的main函数中来(标号③所示),当发生中断请求后,程序跳转到新的中断向量表中取出新的中断函数入口地址,再跳转到新的中断服务函数中执行(标号④⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。
对于步骤④⑤,网友认为是:“在main执行的过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0x中断向量表处,而不是新的中断向量表,如图标号④所示,程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示”。我对此的理解是:“当发生中断后,程序从0x(旧)处的中断向量表中得到相应的中断服务函数入口地址,继而跳转到相应的中断服务程序”。但是旧的中断向量列表里边存放的是IAP程序中断函数的入口地址,它是如何得到user程序中断函数的入口地址呢?所以我觉得此种说法是错误的。“当发生中断时PC指针强制会跳转到0x处”这种说法并没有错,只是忽略了后续的一些知识要点而导致这个说法出现矛盾。
对于步骤④⑤我认为的是,在main函数的执行过程中,如果CPU得到一个中断请求,PC指针本来应该跳转到0x处的中断向量表,由于我们设置了中断向量表偏移量为N+M,因此PC指针被强制跳转到0x+N+M处的中断向量表中得到相应的中断函数地址(待求证),再跳转到相应新的中断服务函数,执行结束后返回到main函数中来。
三、实现过程
STM32F103ZET6的Flash地址为0xx0807ffff共512KB,把这512KB的空间分为两块,第一块大小为32KB存放BootLoader程序,剩余的空间存放用户程序(根据实际情况分配这两块空间的大小,BootLoader程序占用的空间越小越好,则BootLoader地址为0xx08007fff,用户程序地址为0xx0807ffff。BootLoader流程图大致应该如下:
1、初始化时钟。
2、初始化中断向量表地址。
3、初始化按键。
(使用按键触发方式,上电时如果按键被按下则进行用户程序更新操作)
4、初始化串口。
5、检测按键是否被按下,是则执行步骤6,否则执行步骤10。
6、擦除用户程序(擦除0xx0807ffff地址空间Flash)。
7、从串口读取新的用户代码数据,把代码写入用户程序空间。
8、检测串口数据接收完毕?是则执行步骤9,否则跳回步骤7。
9、用户程序更新完毕,等待重新上电或硬件复位。
10、跳转到用户程序(强制将PC指针跳转到0x处)。
到这里首先要解决的问题就有:
1、如何进行对STM32的Flash进行擦除和写入操作。
2、中断向量表偏移如何设置。
3、如何改变代码存放的地址空间(因为BootLoader要存放在0x处,用户程序要存放在0x处,而默认的代码存放的地址空间为0x)。
4、怎么进行PC指针的强制跳转,跳转时需要做些什么。
5、串口接收的用户代码数据是什么样的代码数据,是一种什么样的文件。
问题的解决:
1、使用STM32的固件库函数,只需调用几个库函数即可轻松解决,使用的固件库为stm32f10x_flash.c文件,对Flash的操作过程简要为:Flash解锁àFlash擦除àFlash写入àFlash上锁。(对Flash编程的更详细操作参考STM32F10xxx闪存编程手册)
FLASH_Unlock();
//解锁Flash
FLASH_SetLatency(FLASH_Latency_2);
//因为系统时钟为72M所以要设置两个时钟周期的延时
for(i=0;i&240;i++)
if(FLASH_ErasePage(FLASH_ADDR+i*2048) != FLASH_COMPLETE)
//一定要判断是否擦除成功
return ERROR;
说明:FLASH_ErasePage(uint32_t Page_Address)即为Flash擦除操作,按页擦除,每页2KB,Page_Address为页的起始地址,如0x是第一页起始地址,0x为第二页起始地址,这里的操作擦除了0xx0807ffff地址空间的Flash。
unsigned char buf[1024];
//假设待写入的代码数据
//临时数据
for(i=0;i&512;i++)
temp = (buf[2*i+1]&&8) | buf[2*i];
//2个字节整合为1个半字
if(FLASH_ProgramHalfWord(ADDR,temp) != FLASH_COMPLETE)
//判断是否写入成功
Return ERROR;
//地址要加2,因为每次写入的是2个字节(1个半字)
说明:因为STM32的Flash写入为双字节(1个半字)写入,FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)函数即为对地址为Address写入1个半字的Data,每次写入完成后地址要加2。
FLASH_Lock();
//Flash 上锁,一个固件库函数即可实现。
2、关于中断向量表的偏移设置,对于BootLoader程序只需设置中断向量表的指向在0x处,对于用户程序需要设置中断向量表的指向在0x处即可。
①在BootLoader程序的中断向量表指向设置中应有这么一句:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
//设置中断向量表指向
其中NVIC_VectTab_FLASH是个宏定义,的值为0x。
②在用户程序的中断向量表指向设置用应有这么一句:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
//设置中断向量表指向
3、确认代码存放的地址空间,在IAR和在Keil中的设置是不同的,网上有在Keil中设置的方法,设立介绍在IAR软件环境下的设置方法。
①在固件库目录\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\EWARM下找到一个stm32f10x_flash.icf文件,将其复制到工程目录中来,在打开IAR工程,将配置文件添加到工程中,如下图3-2所示
②在工程中打开stm32f10x_flash.icf该文件,修改两个参数即可改变代码存放的地址空间,图下图3-2所示。
4、关于PC指针的强制跳转,想在BootLoader程序中将PC指针跳转到用户代码处,可选择下面的操作
void (*pFunction)(void);
ApplicationAddress
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x)
//——–①
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
//——–②
Jump_To_Application = (pFunction) JumpA
//——–③
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
//——–④
Jump_To_Application();
//——–⑤
①因为用户程序开始位置(0x处)的前4个字节存放的是堆栈的地址,堆栈地址必定是指向RAM空间的,而STM32的RAM空间起始地址为0x,所以要进行判断。
②程序跳转地址的确认,前面已经说过0x处的4个字节存放的是复位函数的入口地址,该句的意思为获得(ApplicationAddress + 4)地址处的数据,即为获得新的复位函数入口地址。
③令Jump_To_Application这个函数指针指向复位函数入口地址。
④堆栈的初始化,重新设定栈顶代地址,把栈顶地址设置为用户代码指向的栈顶地址。
⑤跳转到新的复位函数。
5、通过串口来接收代码数据,就是PC机通过串口将代码数据发送到STM32中去。这里就涉及到两个问题:
①数据怎么得来。
②数据传输的过程需要遵循的协议,什么时候开始,什么时候结束。
解决①:一般我们就将*.hex文件使用JFlash-ARM打开再通过Jlink仿真器烧录到STM32芯片中,但是*.hex文件里边包含的数据不纯粹是代码数据还有一些别的东西,而*.bin文件数据就全部是代码数据。
在IAR软件环境中打开一个用户工程,先设置好中断向量表偏移和代码存放的地址空间后(前面已介绍过这两种方法)。设置工程如下图3-3所示,确认后重新编译工程,在工程的\Debug\Exe目录下会相应生成一个xxx.bin文件,这就是所需要的代码文件。
②数据通过串口来传输文件常用的协议有XModem、YModem、ZModem这三种协议,在PC端使用这些协议传输文件只需要PC的超级终端或者终端工具SecureCRT即可,但是在STM32这边的编程会增加一些困难(因为要先去读懂、解析这些协议,在通过编程来实现)。也可选择自己定义一套简单的传输协议,但同样会有一些困难(因为要在PC端进行文件和串口编程)。总之不管通过什么办法都行,只要能将xxx.bin文件数据通过串口全部发送到STM32并且STM32能够全部接收到这些数据并写入Flash即可(我选择后者,自定义传输协议并用VC进行文件和串口编程)。
四、结束语
总的来说STM32的IAP方案实现需要在进行用户程序之前加一段Bootloader程序,BootLoader程序的作用就是:
①什么都不做,直接跳转到用户程序。
②删除原有的用户程序,读取*.bin文件数据并将数据重新写入新的用户程序。
对于用户程序相比普通的编程只需要做三步改动即可
①改变中断向量表。
②改变代码存放的地址空间
③修改生成*.bin文件
使用通过UART的IAP方案并不是很好的选择,这只是IAP方案的一个机制,因为能使用PC机通过串口升级程序,同样能通过Jlink烧写程序,并且自定义的串口通讯协议在没有校CRC校验的情况下不能及时发现数据传输过程发生的错误。这里推荐使用SD卡(或U盘)进行用户程序更新,将*.bin文件复制到SD卡(或U盘)中,STM32再通过读取SD卡(或U盘)的*.bin文件进行用户程序更新,这也避免了STM32与PC笨重的通讯,只需插一个SD卡(或U盘)更显得人性化一些,但需要去弄懂STM32如何与SD卡(或U盘)的通讯。
免责申明:
本文部分内容来源互联网与快易购无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请自行核实相关内容,如果侵犯,请及时通知我们,我们将在第一时间做出处理
12月29日据外媒消息,英特尔今日正式完&}

我要回帖

更多关于 stm32f103 eeprom iap 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信