源:STM32 IAP 固件升级设计/U盘升级固件

固件升级的基本思路是: 将stm32 的flash划分为两个区域:

1.Bootloader区:存放bootloader的代码,bootloader代码完成的主要功能就是,判断外部条件,如果需要更新固件,则从指定位置(外接的U盘?板子上的外置存储器如 SD卡,NandFlash等)读取bin文件,然后写入到stm32 Flash的APP区,完成后跳转到APP区执行更新过的代码; 如果不需要更新,则直接跳转到APP区执行主程序代码。

2.APP区:存放应用程序代码,就是我们产品的固件了。

目做了两个升级方式,都是USB的:

一个是USB host:开机进boot,boot检测是否有U盘插入,U盘中是否包含APP的bin文件,包含则更新并跳转到APP;           一个是USB device:在APP区,做了usb device的代码,将板上的nandflash作为U盘的存储器,通过USB线链接PC,则PC显示U盘,将APP的bin文件复制到U盘里,并设置一个标志文件,下次开机进boot会判断nandfalash里是否有需要更新的固件,如果有,则将nandflash里存放的APPbin文件写入stm32 flash的APP区,完成更新后跳转。

bootloader代码要点:

1. 需要包含USB Host和 nandflash以及  fatfs文件系统的驱动代码。(这部分是需要仔细研究做好的,就不多说了)

2.关于Bootloader区: 我使用stm32f429,bootlaoder代码编译下来有50K左右,所以使用flash 0x80000000  ~ 0x8000FFFF这块共64K的区域,注意Bootloader代码一定要从 flash的起始地址0x80000000开始,这样一开机就首先运行boot程序。

具体在keil 中的设置是   target中设置好flash的起始地址和size; debug中settings,flash选择1M的(我的429是1Mflash)然后在下面的开始和结束地址中输入正确地址;

3.关于APP区: 使用剩下的0x80010000~0x800FFFFF 区域,keil具体设置和2一样。

4.关于读取并写入bin文件到flash:  如上面所说,这个比较灵活,可以从外部U盘中读取bin文件到 内存buf然后写入flash,也可以从板上已有的外设存储器读取bin文件到内存buf然后写入flash,具体代码可以参考官方固件库中的例子。

5.关于跳转: 可以看到官方代码

pFunction Jump_To_Application;

uint32_t JumpAddress;

JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);

Jump_To_Application = (pFunction) JumpAddress;

/* Initialize user application's Stack Pointer */

__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);

Jump_To_Application();

具体分析可以看网上别人的详细解释,这里我遇到的问题是:经常跳转之后就直接死机,可能有以下几种情况:

1. APP代码main函数中第一句必须要

NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x10000);

__enable_irq();

将向量表偏移地址设置为我们的0x10000;

2.关于中断,可能跳转之前,某些外设中断是开启的,跳转之后,中断产生了,但是APP代码中没有处理对应该中断的中断处理函数,所以就直接死机了;

对应网上的一些方法是  跳转之前,关闭所有中断:  __disable_irq();

在APP中偏移地址设置完毕后,再次开启所有中断:    __enable_irq();

有些人发现跳入APP之后,很多中断都不响应了,可能就是跳转之前,关了中断但是APP中没有再次开启。

我一开始这样用,每次从U盘更新完固件之后跳转就死机了,从nandflash跳转就不会有问题,参考了一些网上的资料,

推测可能还是 __disable_irq()没有把USB中断关闭,或者关闭之后,USB的某个中断仍旧是置位的,APP中再次开启中断后,直接寻找USB中断服务程序,找不到就死机了。

这里为了更加稳妥,我决定在跳转之前,将所有boot中用到的外设都关闭,但是只用了一句

NVIC_DisableIRQ(OTG_FS_IRQn);

之后,就一切OK了。

但是建议大家在写boot的时候,跳转之前还是把所有用到的外设时钟关闭,中断也禁止。

STM32 IAP 固件升级设计/U盘升级固件的更多相关文章

  1. STM32+IAP方案 实现网络升级应用固件

    关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案. 原理与网上流传的串口作为传输手段 一致:不同之处,无非我这里使用了网络设备传输.==(lwip ...

  2. STM32 IAP 在线升级详解(转)

    源:http://blog.csdn.net/yx_l128125/article/details/12992773 (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP   ...

  3. 基于IAP和网口升级固件

    基于IAP和网口升级固件 一.      需求引入 现有嵌入式设备:基于ARM Cortex-M3处理器.带以太网通讯功能. 为减少设备维护成本节省宝贵的时间和金钱,须要设计网口升级固件功能. 本文描 ...

  4. 【转载】STM32 IAP 在线升级详解

      (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP  再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...

  5. STM32 IAP升级

    STM32 IAP在线升级,用Jlink设置读保护后前5K字节是默认加了写保护的,导致IAP升级时擦除和写入FLASH不成功,可以做两个boot,前5k为第一个boot程序,上电时负责跳转到APP还是 ...

  6. JLINK固件丢失或升级固件后提示Clone的解决办法

    J-LINK V8固件烧录指导 J-LINK 是使用过程中,如果内部固件意外损坏或丢失,请参考下面操作步骤说明,重新烧录JLINK固件. 安装固件烧录软件 请ATMEL官方网址下载AT91-ISP下载 ...

  7. 关于JLINK固件丢失或升级固件后提示Clone的解决办法

    本人用的JLINK仿真器(某宝上买的),在使用新版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示.在网上找了许多关于修复的资料,都觉得不是很好.经过本人反复试验,总算找到比 ...

  8. stm32 IAP + APP ==>双剑合一

    (扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级程序做了详细的分析http://blog.csdn.net/yx_l128125/article/details/12 ...

  9. stm32 IAP + APP ==>双剑合一(转)

    源:http://blog.csdn.net/yx_l128125/article/details/13591743 (扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级 ...

随机推荐

  1. android配置文件详解

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...

  2. shell中的cat和文件分界符(<<EOF)

    在shell中,文件分界符(通常写成EOF,你也可以写成FOE或者其他任何字符串)紧跟在<<符号后,意思是分界符后的内容将被当做标准输入传给<<前面的命令,直到再次在独立的一行 ...

  3. C# Memcached缓存

    net/c#分布式缓存系统Memcached简介与实践--非常好 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是 ...

  4. nefu 196 让气球飞吧

    description 国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛,ACM-ICPC以团队的形式代表各学校参赛,每队由3名队员组成,一个队每做出来一个题该队就会获得该题对应颜色的气 ...

  5. Linux-ssh的rsa认证登录配置

    首先看一下实验环境: [root@localhost ~]# cat /proc/version #ip 192.168.254.130 Linux version 2.6.32-431.el6.x8 ...

  6. SQL Server不能通过外部IP访问,解决方法

    SQL Server不能通过外部IP访问,解决方法   版本:SQL server 2008 express with tools   打开配置管理器,开启 TCP,右键属性设置TCP端口:   设置 ...

  7. A*搜寻算法(A星算法)

    A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星 ...

  8. SQL 列拆分

    with CTE as( SELECT A.id, B.value FROM( SELECT id, value = CONVERT(xml,'<root><v>' + REP ...

  9. 基于Win32 SDK实现的一个简易线程池

    利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...

  10. 【dfs 回溯】 zoj 1004

    题意:给出一个源字符串和一个目标字符串,打出所有符合stack操作的i,o串使得对于源字符串的操作能变为目标字符串 思路:搜索,回溯. 之前想过是不是队列,觉得不对那样bfs是求最优解了:也想过用结构 ...