[转载] 基于STM32F072来使用SD卡进行IAP升级
1388 查看
5 回复
 楼主 | 发布于 2017-11-30 | 只看楼主
分享到:

该板子上有SD卡,就想着写个Bootloader程序,通过读取SD卡中的Bin文件进行IAP升级,这样可以大大简化以后的升级。



Bootloader程序设计


Bootloader程序的设计思路很简单,流程图如下:


初始化程序就不介绍了,比较简单。主要介绍下Bin文件检测以及IAP过程。

作者将IAP过程分为5个步骤,如下:

※Step1※

检查是否存在升级文件,若存在,打开后跳至Step2,若不存在或者打开失败,跳至Step5

※Step2※

擦除App程序对应的扇区,擦除成功后跳至Step3,若擦除失败,跳至Step5

※Step3※

使用f_read()函数读取Bin文件,每次读取2048个字节,并写入Flash。当文件全部被写入flash后跳至Step4,若中间出现写入错误,跳至Step5

※Step4※

检查栈顶地址,跳转至App程序。若栈顶地址非法,跳至Step5

※Step5※

此步表示本次升级失败,死循环,同时LED提示升级失败,等待重新上电

查找升级文件时我固定从Update文件夹查找,所以只要将Bin文件拷贝至Update文件夹就行了。五个步骤的转换是通过switch函数实现的。




特别要注意形参uint16_tDatalength是指的字数,就是uint32_t类型变量的数量,而f_read读取的是字节数,要除以4进行转换,刚开始就是没有转换导致写的flash数据不正常,跳转后死机。

 

跳转程序也是参考的官方例程。我设置的App程序起始地址为:0x0800A000,此外bootloader程序的IAR工程配置如图,flash地址范围:0x08000000 - 0x0800 9FFF,占用40K.




App程序设计


1App程序主要在原来的程序基础上修改flash起始和结束地址,以及中断向量偏移。Flash地址范围我设为:0x0800A000 0x0801 FFFF,占用88K.

2、由于STM32F0没有像F1F4那样的中断向量偏移寄存器,需要通过进行内存地址映射来实现。

所以在App程序main函数开始的地方加如下代码:(参考官方例程修改)

其实在官方例程中为RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);这并没有打开系统配置时钟,应该改为RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE)。


本帖有更多资源,需 登录 才可以下载,没有帐号?立即 注册

(0 ) (0 )
回复 举报

回复于 2017-11-30 沙发

SD卡升级程序不错;

支持下;

(0 )
评论 (0) 举报

回复于 2017-11-30 2#

可惜微信公众号的那几个图片看不到;

(0 )
评论 (1) 举报

回复于 2020-02-18 3#

感谢分享
(0 )
评论 (0) 举报

回复于 2020-02-18 4#

感谢分享,欢迎关注我,资料持续更新中。有需要机械臂,电源,硬件电路设计,软件编程,开发板等各种定制的可以私聊我哦,相互学习,共同进步。
(0 )
评论 (0) 举报

回复于 2020-03-29 5#

感谢分享
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部