搜索
bottom↓
回复: 42

程序更新之(ISP 和IAP)----基于STM32

  [复制链接]

出0入0汤圆

发表于 2010-8-5 01:21:41 | 显示全部楼层 |阅读模式
ISP:in system programming                   在系统中编程,在设计系统的时候留出编程接口在出厂前或者在系统出现问题的时候可以通过编程接口更新固件
IAP:in applicatin  programming       在应用中编程,这个是在设计的时候通过应用软件本身对自己编程,更新固件

isp 一般由厂家固化的一段程序,一个固定的协议和一个或多个固定的外设通讯端口将代码重新烧写,以达到更新的目的

下面我们来说一下STM32的ISP

首先来看一下AN2606中怎么说:
The bootloader is stored in the internal boot ROM memory (system memory), and its main
task is to download the application program to the internal Flash memory through a
USART1 communication interface.
从系统内存启动bootloader然后通过USART1接口外设下载应用程序并编程到用户flash区

那么,怎么启动这个vootloader呢?看下面:
Boot mode selection pins             Boot mode Aliasing
BOOT1 BOOT0
   X              0                                   User Flash memory User Flash memory is selected as the boot space
   0              1                                   System memory System memory is selected as the boot space
   1              1                                   Embedded SRAM Embedded SRAM is selected as the boot space
说的很清楚,当boot1=0 boot0=1的时候从系统存储区启动,也就是启动bootloader,当启动后就可以通过ST的一个官方工具,或者其他的辅助工具烧写代码进flash了

下面来看看stm32的内存映射


(原文件名:memory.jpg)

这只是部分截图,stm32存储系统采用统一编址的方式,程序存储器、数据存储器、寄存器被组织在4 GB的线性地址空间内  启动时CPU从地址0处读取代码并执行,在0x1FFFF000-0x1FFFF7FF这段旧事系统存储了,这个地方是不允许用户操作的,因为这里存放的就是ST所谓的bootloader程序,就是ISP,在ourdev上有个帖子,帖子名字不记得了,只记得内容这样说:让stm32挥刀自宫,正常运行的时候通过指令让cpu复位,通过外部电路让两个启动引脚boot1=0 boot0=1,这样就会执行isp程序,这固然是个好办法,可是这里还有个更好的办法,既然程序执行时按照循序的,且能修改PC指针,那么我们可不可以直接修改PC指针到系统存储区呢?
经过验证,此法可行,下面是部分代码(代码未经严格验证,使用后果自负):
#define SystemAddress    0x1FFFF000
pFunction Jump_To_Application;
uint32_t JumpAddress;
                  

{                       
  JumpAddress = *(__IO uint32_t*) ( SystemAddress + 4);
  Jump_To_Application = (pFunction) JumpAddress;
  /* Initialize Stack Pointer */
  __set_MSP(*(__IO uint32_t*) SystemAddress);
  Jump_To_Application();
}
还有一点需要提醒,当在你的程序中开启了看门狗的话就会有问题,因为当跳到system memory后控制权全在内置的isp程序了,你就没有办法喂狗了,就会引起芯片的复位。。。
好了,就这么多,重点在iap下次会有以个iap的示例说说iap。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-8-5 08:27:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-5 08:45:21 | 显示全部楼层
mark!~~

出0入0汤圆

发表于 2010-8-5 08:51:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-5 11:24:12 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2010-8-10 10:16:05 | 显示全部楼层
谢谢,我正要这方面的方案

出0入4汤圆

发表于 2010-8-10 11:36:18 | 显示全部楼层
等iap的

我有一个08年freescale FTF赠送的胸牌开发板
是coldfire V2的mcu
IAP升级的方式很特别,usb连接电脑后,在电脑上虚拟出一个U盘来,只要把S19的文件拖进这个U盘,再重新开机就升级完成了
能在stm32上实现就好了

出0入0汤圆

发表于 2010-8-22 00:40:45 | 显示全部楼层
各位老大

我试过这方法是可行的

但最近不行了,先发给个指令给程序,跳转到system mem

再开 ISP上位机程序,可以成功连上,当刷写程序时,提示失败,因为读保护了

可根本没读保护啊,

于是我老老实实的跳线,然后重启stm32,再开isp上位机程序,就可以直接刷写,而且成功

就说是,直接用楼主代码跳转到system mem ,isp程序会误认为flash读保护了

出0入0汤圆

发表于 2010-9-19 10:31:50 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-9-19 22:12:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-26 23:45:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-9 08:14:47 | 显示全部楼层
mark

出10入0汤圆

发表于 2010-10-10 02:06:38 | 显示全部楼层
mask~!

出0入0汤圆

发表于 2010-10-10 09:13:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-3 12:15:00 | 显示全部楼层
下一贴IAP在哪呢?

出0入0汤圆

发表于 2011-9-23 21:58:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-13 15:51:56 | 显示全部楼层
mark ISP,IAP解释

出0入0汤圆

发表于 2011-10-13 16:11:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-8 12:14:20 | 显示全部楼层
没看到楼主的IAP的帖子,关于IAP还有好多不明白,哎

出0入0汤圆

发表于 2012-4-26 20:57:16 | 显示全部楼层
{                        
  JumpAddress = *(__IO uint32_t*) ( SystemAddress + 4);
  Jump_To_Application = (pFunction) JumpAddress;
  /* Initialize Stack Pointer */
  __set_MSP(*(__IO uint32_t*) SystemAddress);
  Jump_To_Application();
}

该函数 不能正确执行内部BOOTLOADER

出0入0汤圆

发表于 2012-4-26 21:48:55 | 显示全部楼层
这个办法好,但不知是否真的可行?8楼和20的测试的问题啊

出0入0汤圆

发表于 2012-5-29 15:54:26 | 显示全部楼层
不知道  内置的IAP有没有用到中断,如果用到中断还需要重映射向量表

出0入0汤圆

发表于 2012-5-29 16:26:33 | 显示全部楼层
想法非常好!可以尝试下

出0入0汤圆

发表于 2012-6-11 16:58:31 | 显示全部楼层
思路比较好

出0入0汤圆

发表于 2012-6-12 16:41:49 | 显示全部楼层
楼主什么时候出例说IAP版本啊。。。

出0入0汤圆

发表于 2012-6-18 23:34:27 | 显示全部楼层
OK,讲得不错

出0入0汤圆

发表于 2013-6-24 10:06:14 | 显示全部楼层
很不错的想法,这样子就在升级时,不用去改动电路中的跳针了!强悍!顶!!!

出0入0汤圆

发表于 2013-6-24 10:08:02 | 显示全部楼层
physis 发表于 2010-8-10 11:36
等iap的

我有一个08年freescale FTF赠送的胸牌开发板

NXP的1768也有这么一个例子的

出0入0汤圆

发表于 2013-12-13 14:57:04 | 显示全部楼层
pFunction是怎么定义的

出0入0汤圆

发表于 2014-9-28 17:24:03 | 显示全部楼层
回头看看

出0入0汤圆

发表于 2014-10-14 15:57:30 | 显示全部楼层
mark
mark
非常好!原来我开了看门狗,难怪我一直写不进去

出0入10汤圆

发表于 2015-9-2 16:41:01 | 显示全部楼层
楼主是怎么验证进行了system memory的?

出0入4汤圆

发表于 2015-9-2 17:04:16 | 显示全部楼层
感谢楼主!解释的很详细!

出0入0汤圆

发表于 2016-5-30 10:50:46 | 显示全部楼层
这个方法在F1系列是可行的,经过测试,F4也是支持的,但是需要在超级用户模式下运行这段代码才行!

出0入0汤圆

发表于 2016-8-16 19:30:35 | 显示全部楼层
楼主讲的比较清晰呀。

出0入0汤圆

发表于 2016-8-16 21:49:24 | 显示全部楼层
多谢分享了

出0入0汤圆

发表于 2016-10-28 10:57:26 | 显示全部楼层
楼主讲的比较清晰呀,很好

出0入0汤圆

发表于 2016-11-8 07:19:09 | 显示全部楼层
厉害了我的歌

出0入0汤圆

发表于 2016-11-8 16:28:58 | 显示全部楼层
IAP没讲啊

出0入0汤圆

发表于 2016-12-15 09:03:10 | 显示全部楼层
mark~~~           

出0入0汤圆

发表于 2017-6-19 09:32:01 | 显示全部楼层
mark  程序更新之(ISP 和IAP)----基于STM32

出0入0汤圆

发表于 2018-8-2 15:26:29 来自手机 | 显示全部楼层
试过f103可行~ 可是030不行~郁闷了~

出0入0汤圆

发表于 2020-10-23 23:17:08 | 显示全部楼层
好方案
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 06:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表