kongst的Xplorer https://bbs.21ic.com/?563875 [收藏] [复制] [RSS] 我的征程开始 ... ...

日志

STM32的存储器相关——Note2_STM32存储器相关应用(IAP和BitBanding)(下)

已有 1088 次阅读2011-5-7 02:59 |个人分类:kongst-ARM学习|系统分类:ARM| IAR, STM32, 存储器, ROM, RAM

5 STM32IAP


In Application Programming,在应用编程。


5.1 什么是IAP


IAPIn Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(USBUSART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:


1)检查是否需要对第二部分代码进行更新


2)如果不需要更新则转到4


3)执行更新操作


4)跳转到第二部分代码执行


第一部分代码必须通过其它手段,如JTAGISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。


对于STM32来说,因为它的中断向量表位于程序存储器的最低地址区,为了使第一部分代码能够正确地响应中断,通常会安排第一部分代码处于Flash的开始区域,而第二部分代码紧随其后。


在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。


如果IAP程序被破坏,产品必须通过JTAGISP重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序(第一部分代码)区域不会被意外地破坏。


如图为IAP示意图:




5.2 设计自己独特的IAP


IAP程序可以自己设计,这样能够符合自身对在先下载的特殊需求。针对这一要求,本文进行了一个IAP程序的结构设计,并已经通过测试。


IAP的系统由两个工程需要编写,一个是IAP工程,一个User App工程。


设计将IAP程序放在0x0800 0000——0x0800 2000这段空间中,User App放在0x0800 2000之后的余下空间;


下面描述如何友好的处理着两个工程之间程序运行的关系,达到IAP这个功能:


1)  设置系统为Boot from main flash memory 启动模式;


2)  系统上电之后PC指向0x0800 0000处,进而运行到IAP工程的main()入口处;


3)  IAP中:检测标志,如果UserApp_FlagOK,则直接跳转到5User App


4)  IAP中:检测标志,如果UserApp_Flag不为OK,则继续IAP历程,等到更新好User App后,设置UserApp_FlagOK,然后跳转到5User App


5)  跳转到User App,运行系统功能;


6)  User App中,如果检测到现在需要更新User App,先设置UserApp_FlagOK然后跳转到3IAP中;


以上6个步骤能够保证IAPUser App之间的良好关系,实现STM32IAP功能。


如图所示:




5.3 IAP例程


IAP程序设计思路:


1IAP程序设计放置在Flash的起始地址,当用户选择从Main Flash memory启动时,系统进入了0x0800 0000地址,也就是进入了IAP程序;


2)在IAP中,判断UserApp程序是否有效(通过对标志地址内容的判断),若有效则直接跳转到UserApp程序地址0x08002000,也就是进入了UserApp程序(跳转到4);若UserApp程序标志无效,则更新UserApp


3)在IAP中,需要更新的UserApp程序数据来自于USART,将从USART接收到的数据写入到UserApp程序地址中去,达到更新UserApp程序的目的;当UserApp程序完成更新之后,设置UserApp程序有效标志,然后跳转到UserApp程序地址0x08002000


4)在UserApp程序中,可以实现系统功能;当有需要IAP信号产生之后,首先设置UserApp程序为无效,然后跳转到IAP程序首地址0x0800 0000,程序又进入IAP(跳转到2));



 


 


至此,关于《STM32存储器知识的相关应用(IAPBit Banding)》知识已经结束.


完成STM32存储器知识过程中,一共参考了以下官方文档:


RM0008 Reference manual


Cortex-M3技术参考手册》


PM0042 Programming manualSTM32F10xxx Flash programming


AN2557 Application noteSTM32F10x in-application programming using the USART


等等;


另外也参考了很多无私网友的奉献,在此感谢。


 


关于我的STM32存储器知识共有三篇文章,分别是:


stm32的存储器》


STM32存储器知识的相关应用(IAPBit Banding)》


STM32实现IAP(上位机和IAP程序设计)》


如果有需要另外两篇篇笔记,可以联系我:kongst@163.com


 


如果有不足、需要改进的地方,请联系我:kongst@163.com


 



谢谢!



 



If an error, please contact author, to be corrected.


For other uses, indicate the source, to express my recognition of the results.


Thank you.


 


       kongst@163.com


 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)