微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32存储器知识的相关应用“>STM32存储器 — STM32存储器知识的相关应用

STM32存储器知识的相关应用“>STM32存储器 — STM32存储器知识的相关应用

时间:11-28 来源:互联网 点击:

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

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

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

3)执行更新操作

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

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

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

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

如果IAP程序被破坏,产品必须通过JTAG或ISP重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,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_Flag为OK,则直接跳转到5)User App;

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

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

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

以上6个步骤能够保证IAP和User App之间的良好关系,实现STM32的IAP功能。

如图所示:

5.3 IAP例程

IAP程序设计思路:

1)IAP程序设计放置在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存储器知识的相关应用(IAP、Bit Banding)》知识已经结束.


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top