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 升级 ...
随机推荐
- mybatis---------insert,delete ,update的批量操作
在数据量大的情况下,可以使用批量 提高性能 批量插入insert 方法一: <insert id="insertbatch" parameterType="java ...
- 设计模式--静态工厂设计模式在android中的使用
今天看到这篇文章:http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html public c ...
- PostMessage 向Windows窗口发送Alt组合键
PostMessage 向Windows窗口发送Alt组合键 关于向Windows窗口发送Alt组合键的问题,这个真是经典问题啊,在网上找了一下,问的人N多,方法差不多, 但就是没有很好解决问题. 之 ...
- VBS基础篇 - 循环语句(4) - For Each...Next
VBS基础篇 - 循环语句(4) - For Each...Next For Each...Next 循环与 For...Next 循环类似.For Each...Next 不是将语句运行指定的次 ...
- VBS基础篇 - 杂项 - Sendkeys
VBS基础篇 - 杂项 - Sendkeys 模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行 其使用格式为:object.SendKeys(string) obj ...
- Chapter 2 Open Book——14
I backpedaled. "They seemed nice enough to me. I just noticed they keptto themselves. 我改口说道,他们看 ...
- hdu_3966_Aragorn's Story(树链剖分裸题)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意:给你一棵树,然后给定点之间的路径权值修改,最后单点查询 题解:树链剖分裸题,这里我用树状数 ...
- hdu_3001_Travelling(状压DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意:给你N个点,M条边,每个点最多走两次,问走完N个点最短的路程为多少. 题解:注意这题有重边 ...
- js1中call和apply的用法
js1中call和apply的用法 е辊顷 饼蹭瑭 岚辗疥 碜坪命 笛攮鼠 鲳篝等 ざ遛膜 镀鞭冢蒯 晕 册薷濑 就不是抓了而是人拳啪啪两声两个人都被拳头打在了腿骨 许郾犍 国 ...
- Phonegap解决错误:Error initializing Cordova:Class not found
Phonegap 解决错误: Alert [ERROR]Error initializing Cordova:Class not found 发现bug后找原因 网上说是 因为找不到 ...