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盘升级固件的更多相关文章
- STM32+IAP方案 实现网络升级应用固件
关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案. 原理与网上流传的串口作为传输手段 一致:不同之处,无非我这里使用了网络设备传输.==(lwip ...
- STM32 IAP 在线升级详解(转)
源:http://blog.csdn.net/yx_l128125/article/details/12992773 (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP ...
- 基于IAP和网口升级固件
基于IAP和网口升级固件 一. 需求引入 现有嵌入式设备:基于ARM Cortex-M3处理器.带以太网通讯功能. 为减少设备维护成本节省宝贵的时间和金钱,须要设计网口升级固件功能. 本文描 ...
- 【转载】STM32 IAP 在线升级详解
(扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP 再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...
- STM32 IAP升级
STM32 IAP在线升级,用Jlink设置读保护后前5K字节是默认加了写保护的,导致IAP升级时擦除和写入FLASH不成功,可以做两个boot,前5k为第一个boot程序,上电时负责跳转到APP还是 ...
- JLINK固件丢失或升级固件后提示Clone的解决办法
J-LINK V8固件烧录指导 J-LINK 是使用过程中,如果内部固件意外损坏或丢失,请参考下面操作步骤说明,重新烧录JLINK固件. 安装固件烧录软件 请ATMEL官方网址下载AT91-ISP下载 ...
- 关于JLINK固件丢失或升级固件后提示Clone的解决办法
本人用的JLINK仿真器(某宝上买的),在使用新版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示.在网上找了许多关于修复的资料,都觉得不是很好.经过本人反复试验,总算找到比 ...
- stm32 IAP + APP ==>双剑合一
(扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级程序做了详细的分析http://blog.csdn.net/yx_l128125/article/details/12 ...
- stm32 IAP + APP ==>双剑合一(转)
源:http://blog.csdn.net/yx_l128125/article/details/13591743 (扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级 ...
随机推荐
- JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this
1.构造函数: 通常构造函数首字母需要大写,主要是为了区别ECMAScript的其它函数.(高程三 P145) 构造函数与其他函数的唯一区别,就在于调用它们的方式不同.只要通过new来调用,任何函数都 ...
- Compile Time Assertion..
The most seen assertion are during runtime, but this one is at compile time, to give the error more ...
- java中replace()和replaceAll()区别
replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharS ...
- 自定义Button成进度条
ProgressButton源码: package com.example.progressbutton; import android.content.Context; import android ...
- 关于GVIM的配置。
最近开始考虑从常用的 Dev-Cpp 和 Visual Studio 开发环境中转到gvim+gcc+gdb. 我一直觉得IDE很好方便,不是很明白别人这样的配置.但还是开始有意识的去尝试更换环境. ...
- 通过C++修改系统时间代码
#include <windows.h>#include <stdio.h>#include <iostream>using namespace std;int m ...
- Entity Framework技巧系列之七 - Tip 26 – 28
提示26. 怎样避免使用不完整(Stub)实体进行数据库查询 什么是不完整(Stub)实体? 不完整实体是一个部分填充实体,用于替代真实的对象. 例如: 1 Category c = new Cate ...
- shell之路【第一篇】shell简介与入门
shell简介 1.Shell 诞生于 Unix,Unix的第一个脚本语言,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,shell使用的熟练程度反映了用户对Unix/ ...
- 求最大公约数(GCD)的两种算法
之前一直只知道欧几里得辗转相除法,今天学习了一下另外一种.在处理大数时更优秀的算法--Stein 特此记载 1.欧几里得(Euclid)算法 又称辗转相除法,依据定理gcd(a,b)=gcd(b,a% ...
- velocity 教程
1,<title> $!{product.name} - $!{title} $!{about.title} - $!{title} $!{news.title} - $!{title} ...