ARM片外Flash存储器IAP解决办法
- 格式:doc
- 大小:7.27 KB
- 文档页数:3
LPC2214的IAP实现方案引言 IAP即在应用中编程,对于嵌入式产品,指在不影响产品正常运行的情况下实现应用程序的更新。
许多ARM芯片都提供该操作接口,相对于ISP(在系统编程)方式,具有方便灵活且不需要借助专用boot装载程序或工具的特点,而且在不影响嵌入式产品正常运行的情况下即可完成应用程序的动态升级。
在工业控制领域尤其是电力系统控制领域中,嵌入式产品必须保证连续、稳定、可靠地运行,由各种原因导致的应用程序的更新都必须在产品正常运行过程中完成,因此许多用户对相关产品的IAP功能都有明确的要求。
LPC2214是Philips公司推出的一款32位ARM7TDMI-S工业用微控制器。
内置25 6 KB 高速Flash,128位宽度接口/加速器可以实现60 MHz的操作频率;配置有2个UART接口、4个外部片选,支持8、16、32外部总线;片内boot下载程序可以实现在系统编程(ISP)和在应用中编程(IAP)。
由于该芯片的内置Flash速度很快,并且支持128位宽度接口/加速,应用程序存储并运行在片内Flash中可以获得较快的执行速度。
本文提供一种基于LPC2214的在应用编程方案,可以实现应用程序方便、可靠的升级,以及当地维护串口或远方GPRS方式的代码更新。
更新过程中,通信中断、装置异常复位、装置停电等异常情况的发生,都不会导致因程序更新而造成的产品死机。
1 嵌入式产品应用程序启动方式在嵌入式产品中,应用程序可以运行在RAM或Flash中。
对于中高端产品,由于要求较高的执行速度和效率,一般采用Coldfire、x86、PowerPC、ARM9等CPU。
此类CPU一般都有DRAM控制器,支持DRAM操作,为了获得较快的执行速度,将应用程序从代码Flash中复制到DRAM的代码空间后才开始执行。
对于x86模式,应用程序以文件方式保存在硬盘或电子盘上。
在不同的嵌入式操作系统上,应用程序在DRAM上的展开方式存在一定差异,例如VxWorks系统可以完成对压缩应用程序的展开,而早期的PSOS操作系统则是直接展开,但其基本过程类似。
基于STM32处理器的存储器IAP编程技术陈亮【摘要】In order to solve the problem of memory software update, this paper proposed an IAP program update method that based on STM32-access the NOR Flash controller by the FSMC interface of STM32 processor.And the paper illustrated with an example of JFM-F512K32 chip, analyzing configuration way of FSMC interface, realized the function of data of flash memory by run IAP program.This design have successful realized the purpose of automatic update of flash program, easy to use, and also have rapid speed and high validity.%本文针对存储器程序更新的问题,提出一种基于STM32的IAP程序更新方法-通过STM32的FSMC接口实现NOR Flash访问,并以JFM-F512K32芯片为例,说明FSMC接口的配置方法,通过IAP程序运行实现Flash存储器数据的更新.该设计成功实现Flash程序的自动更新功能,操作简单、速度快、正确率高.【期刊名称】《电子测试》【年(卷),期】2017(000)010【总页数】2页(P77-78)【关键词】STM32;FSMC;NORFlash;IAP【作者】陈亮【作者单位】中航工业计算所,陕西西安,710068【正文语种】中文对于嵌入式系统,产品发布后更新升级是一个重要的需求。
STM32 IAP 调试经验一、基本方法描述:将flash划分成3个扇区(可以单存用单片机内部flash,对于中大型容量MCU,且用户较小的案例,可以外挂片外flash应用于程序较大的工程),引导区、用户app区和程序存储备份区。
程序启动时先从引导区启动,查询备份区是否有升级程序标志,如果有,则将备份区的程序填充到用户app区,覆盖掉原先的程序,然后跳转到app区执行应用程序;如果没有升级标志,则直接跳转到用户app区地址,执行应用程序。
二、从引导区跳转到app区的函数定义需要添加以下两个函数1、void JumpToSpecifiedAddress(u32 EntranceAddress){u32 JumpAddress;pFunction Jump_To_Application;JumpAddress = *(vu32*) (EntranceAddress + 4);Jump_To_Application = (pFunction) JumpAddress;__set_MSP(*(vu32*) EntranceAddress); //Initialize Stack PointerJump_To_Application();}入口参数即是用户划分的app区地址,调用该函数后便可跳转执行app程序,例如分配app 区地址从0x8002000(引导区从0x8000000开始,8k空间)则,入口参数即0x8002000 2、void NVIC_Configuration(void){#ifdef VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);#elseNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);#endif}此处使用NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);重新定义程序的中断向量链表,因为引导区8k,所以长度0x2000,从起始地址开始外呼0x2000地址的就是用户app 的中断向量链表,这里需根据实际分配的引导区长度填充,本例用用8k,填入0x2000. 注:#define NVIC_VectTab_FLASH ((uint32_t)0x08000000)三、引导区-用户应用区启动跳转简易实例引导区程序:int main(void){RCC_Configuration(); //系统时钟配置NVIC_Configuration(); //中断向量映射配置JumpToSpecifiedAddress(0x8002000)//跳转至用户app区}用户应用程序:int main(){//根据用户需要编写自己的程序}编译器设置:1、引导区程序工程设置其实地址0x8000000 长度8k(0x2000)2、用户应用程序其实地址0x8002000 长度60K(0x1E000)程序下载过程:需要烧写两个程序,才能运行,下载时先烧写引导程序,然后烧写应用程序。
STR912--IAP问题默认情况下,bank0 是映射到地址0x00.考虑到,IAP 程序需存储在bank1,而用户程序需存储在bank0.因此须使用CAPS 工具,将bank1 映射到地址0x00.另外,在IAP 程序运行期间,必须在执行用户程序跳转之前,通过程序将bank0 重映射到地址0x00(注:IAP 程序已经实现了bank0 重映射到地址0x00,用户不需要自己来编写代码).ARM 处理器产生的地址叫虚拟地址,把这个地址按照某种规则转换到另一个物理地址去的方法称为地址映射。
banko,bank1 就是物理地址,而ARM 处理器(例如KEIL 下就是虚拟地址),通过CAP 可以将bank1 物理地址映射到虚拟地址0x00, 然后通过软件设置将bank0 物理地址映射到虚拟地址0x00,bank1 映射到虚拟地址0x80000//RAM_exevoid Execute_STR9Application(void)void Execute_STR9Application(void){ pFunction Jump_To_Application;/* -------------------------------------------------------------------------- */ /* Configurebank 0 as 512KB and bank 1 as 32KB */ /* Remap bank 0 at address 0x0 and bank 1at address 0x80000 */ /* -------------------------------------------------------------------------- */ FMI->BBSR = 0x0;//之前相同FMI->NBBSR = 0x6;//之前相同FMI->BBADR = 0x80000 >> 2;//FMI->BBADR=0(之前) FMI->NBBADR = 0x0 ;//FMI->NBBADR = 0x8000>>2 (之前) /* Jump to the user application and execute it */ Jump_To_Application = (pFunction) 0x00; Jump_To_Application();}引导块(跳转之前)----地址:0x00000 大小32K非引导块(跳转之前)--地址:0x80000 大小512K。
J-LINK烧IAP烧录文件指导一、安装Setup_JLinkARM_V408h二、打开J-Flash三、在软件里选择Options-Project settings四、在Target Interface栏中选择如下五、在CPU栏选择如下:Device ST STM32F103VC六、设置OK点击确定七、在File->Open选择要烧录程序,是以.hex或.bin后缀八、选择烧录目标文件后打开文件九、连接设备:红线段对应J1的圈十、点击F7,进行烧录,当提示如下即为烧录成功十一、如果遇到烧录失败,首先确定软件配置,然后是看JLINK是否插好,重新插好后再上电,基本上都能烧录成功IAP烧录应用软件指导文件一、IAP简介IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
实现IAP功能,需要将设备程序做成两个项目程序,第一个项目程序仅提供IAP引导和接收数据和程序。
其不提供正常功能操作。
第二个项目程序即为用户程序。
其可提供正常的功能操作。
二、IAP优点采用IAP方式烧录程序可以远程烧录程序,不需要拆壳,不需要编程器,仅需要网线就可以更新程序。
无需守护。
三、进入IAP方式:设备有两种模式进入IAP程序流程1 开机启动按3键2 网络远程控制进入IAP程序流程进入IAP流程状态提示:液晶会提示进入IAP流程绿灯会不停闪烁(ME20可参考)四、烧录步骤:1 若当前设备正在应用程序,可以通过烧录软件点击Upload Program进入IAP程序2 检测设备是否在线点击Test Online按钮,检测设备是否在线,若不在线则请检测是否网络是否连通或者设备是否在IAP程序中3 打开程序点击,选择要烧录的文件4 点击进行下载程序,当设备下载好应用程序后会自动进入应用程序流程。
1:刚开始研究ARM的时候不知道为知道为什么ARM就仿真不了.从网上找到很多方法最有效的就是isp擦除flash下面就把步骤详细的说明一个.
2:擦除步骤
1)安装lpc 2000 flash utility 没有的话去网上搜,迅雷里面有
2)把ARM的p0.14 拉低,这个很重要,使DSP进入ISP模式
3)使用ARM的串口0,必须得有232转TTL 模块
4)RX 接到arm的TX,TX接到arm的RX,当然如不确定的话到时换一下就可以了
5)做擦除时是不连仿真器的
6)设备加电,启动lpc 2000 flash utility
7)把串口根据自己计算机的串口设置串口号,波特滤为9600
8)选择芯片,外部晶振,然后点击read device id
9)出现此对话框后,重启设备,点
击确定
10)就认出这两个选项了,正确,否则换一下RX,TX试
一下.
11)擦除
12)若成功状态栏会显示
作者:于林勇。
一种单片机固件IAP方案导言基于FLASH存储器的微处理器,一个重要的需求是安装到产品中后,仍具有升级固件(firmware)的能力。
这种能力称为“在应用中编程”(In-application-programming,IAP)。
这篇应用笔记以STM32F 32位cortex-M3为例,阐述了构建IAP系统的一些通用概念。
并提出了一种新的技术,有助于单片机开发人员更好的构建IAP系统。
STM32系列微处理器基于FLASH存储器。
在FLASH中运行的固件可以擦写FLASH 本身。
FLASH的头4KB具有写保护,适合存储IAP固件(IAP BootLoader)。
1IAP 概览:1.1 IAP(In-application-programming)、ICP(In-circuit-programming)、ISP(In-system-programming):ICP 是在电路板编程,IAP 是在应用编程。
ISP 大部分时候指ICP ,但少数MCU 厂家将IAP 称为ISP 。
1.2IAP 系统的硬件组成:1.3IAP 系统的固件组成:1.4IAP BootLoader 的流程:1.4.1BootLoader的激活条件,通常在复位后,首先进入BootLoader,并检查某些条件,以选择激活BootLoader还是跳转到Application。
一般有以下几类条件:1.4.1.1检测IAP Port上某个GPIO的状态。
1.4.1.2检测IAP Port上某条输入线的信号序列。
1.4.1.3检测Application Code的有效性、标志。
1.4.2本地存储器的使用:1.4.2.1在远程IAP系统中,经常使用本地存储器来存储升级代码。
便于升级代码的分包传输、完整性校验。
1.5IAP系统的要求:1.5.1Safety(安全性):升级代码需要完整的、正确的写到Application Area。
另外需要考虑到升级过程中断电、强干扰等意外事件。
STM32 IAP 无法运行用户程序的解决方法IAP 程序:主要是设置用户程序的起始地址APPLICATION_ADDRESS,如0x08004000,通过外设把用户代码写入FLASH 的用户区。
满足条件后,跳转至用户区起始地址。
解释一下跳转部分代码:/* Test if user code is programmed starting from address “APPLICATION_ADDRESS”*/if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)// 判断栈顶地址是否在0x2000 0000 - 0x2000 2000 之间// 通过判断栈顶地址值是否正确来判断是否已经下载用户应用程序。
因为用户程序的启动文件开始会初始化栈空间,如果栈顶地址正确,说明用户程序已经下载。
{__set_PRIMASK(1);// 关闭全局中断。
注意,在跳转前,必须先关闭全局中断,进入用户程序后,在中断向量表地址设置完成后再开中断。
printf(“Jump to the new program.\r\n”);/* Jump to user application */JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);// 前4 字节为中断向量表Jump_To_Application = (pFunction) JumpAddress;// 指向用户程序复位函数所在的地址/* Initialize user applications Stack Pointer */__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);// 设置用户程序的栈指针Jump_To_Application();// 执行用户程序}需要注意的是,在IAP 程序中,跳转用户程序前,需要先关闭全局中断。
ARM片外Flash存储器IAP解决办法
0 引言
以ARM芯片为处理器核的嵌入式应用系统,以其小体积、低功耗、低成本、高性能、丰富的片内资源以及对操作系统的广泛支持,得到了人们越来越多的青睐。
在应用编程IAP (InApplicatAiONProgram)就是这样的自修改程序。
它先在RAM存储器中写人数据值,然后使PC指向该存储段,把该段作为程序段来执行。
很多ARM7芯片自带IAP处理器,应用其自带的IAP处理器可以方便地对其片内集成的Flash存储器进行在应用编程,但几乎所有的ARM 核芯片均不支持片外IAP处理,因为片外Flash存储器是用户选型的,芯片生产厂家无法先知先觉,而不同Flash存储器其编程时序也不尽相同,导致芯片生产厂家无法提供通用的IAP 代码。
那么,如何对嵌入式系统的片外Flash存储器进行在应用编程呢?这里分两种情况:一是普通代码存放在片外单独1片Flash中,IAP代码在另一片Flash中完成,此时只要依据Flash的操作时序执行IAP代码,完成擦除或写入操作即可。
这种情况虽然简单,但应用了2片Flash;而IAP代码很小,一般完全可以集成到1片中,所以这里对这种情况不予考虑。
另一种情况是1片Flash中既要存储普通代码,又要实现IAP。
针对嵌入式应用系统片外Flash存储器IAP无现成方案的问题,介绍一种基于代码重入思想的片外存储器IAP解决方案。
结合LPC2210及SST39VFl60芯片,简介两款芯片特点,给出应用连接框图;分析IAP实现要点,并给出IAP的实现代码。
下面以Phnips公司的LPC2210 和 Silicon storageTechnology 公司的SST39VFl60为例,详细讨论这种情况IAP的解决方案。
1 硬件结构
1.1 LPC2210介绍
Philips公司的LPC22lO是一款基于支持实时仿真和嵌入式跟踪的16/32位ARM7TDMI-SCPU的微控制器。
芯片采用144脚封装,有16 KB片内静态RAM,开放外部总线;通过外部存储器接口可将外部存储器配置成4组,每组的容量高达16 Mb,数据宽度8/16/32位均可;具有多个32位定时器、8路lO位PWM输出、多个串行接口(包括2个16C550工业标准UART、高速I2C接口和2个sPI接口)以及9个外部中断、多达76个可承受5 V电压的通用I/O口,同时内嵌实时时钟和看门狗,片内外设功能丰富强大;片内晶振频率范围l~30 MHz,通过片内PLL可实现最大为60 MHz的CPU工作频率,具有2种低功耗模式——空闲和掉电,通过外部中断将处理器从掉电模式中唤醒,并可通过个别使能/禁止外部功能来优化功耗。
以上特性,使其特别适用于工业控制、医疗系统、访问控制和POS 机,同时也非常适合于通信网关协议转换器,嵌入式软Modem,以及其他各种类型的应用。
1.2 SST39VFl60介绍
SILICON StoraLge Technology公司的SST39VFl60是一个lM×16b的CMOS多功能Flash器件,单电压的读和写操作,电压范围3.O~3.6 V,提供48脚TSOP和48脚TFBGA 两种封装形式。
该器件主要操作包括读、字编程、扇区/块擦除和芯片擦除操作。
擦除和字编程必须遵循一定的时序,表l列出了扇区擦除和字编程过程及时序。
擦除或编程操作过程中读取触发位DQ6将得到“1”和“O”的循环跳变;而操作结束后读DQ6,得到的是不变的固定值。
这是器件提供的写操作状态检测软件方法。
1.3 硬件连接
SST39VF160作为系统的程序存储器,以LPC2210的CSO作为Flash的片选信号,处理器配置Boot引脚为16位数据总线宽度后,上电可直接执行SST39VFl60中代码。
此Flash芯片为16位数据宽度,无字节控制总线,所以应用中不使用LPC2210的BLS引脚。
系统结构示意图。
2 软件实现
2.1 IAP实现要点分析
在嵌入式应用系统中,通常要求记录一些现场的传感、交互输入数据,通常把数据记录在Flash存储器中,以便下次上电能获取以前的数据。
如果系统程序和数据分开存储,那么只要对存放数据的Flash器件进行编程即可。
然而大多数嵌入式系统,程序和需保存的数据都共存于同一Flash存储器中,那么是否也如前所述,可对Flash存储器直接编程呢?理论和实践都表明不可以。
先从理论上计算:LPC22lO允许的芯片核工作频率(CCLK)范围是10~60 MHz,存储器读访问长度由存储器组配置寄存器BCFG中读访问的长度域控制WSTl控制,其最大可用长度为35个CCLK,而SST39VFl60的扇区擦除典型时间为18 ms。
下面是计算算式:
TRDmax=RDLenmax/CCLKmin=35/10×10一6=3.5 μs.TD=18 ms》3.5μs其中:TRDmax—最大读访问时间;RDLenmix——最大读访问可用长度;CCLKmin——最小核工作时钟频率;Tp——扇区擦除典型时间。
算式得出扇区擦除典型时间远大于最大读访问时间。
这样一来,如果再给某Flash写数据,同时于其中预取指,那么因F1ash在执行命令期间,对其他操作不响应,预取出的必定是其数据引脚上的不确定数据,预取指失败。
实践也表明,如果在程序执行过程中,对同一Flash进行扇区擦除,必定引起预取指中断。
为了解决在同一Flash芯片存放程序并IAP这一问题,引进代码重映射的思想。
所谓重映射就是代码先自复制到指定存储区,然后跳转到指定区的起点开始执行。
这里,lAP程序先自复制到LPC2210片内SRAM中,然后跳转到SRAM执行lAP代码。
前面说过,ARM7为冯·诺依曼结构,这就为IAP程序重映射提供了可能。
编写可重映射代码的关键是要解决程序中相对偏移的问题,ARM7指令系列中涉及相对偏移的指令主要有LDR/STR以及跳转指令。
这里的解决方案是:凡涉及偏移值的指令通通采用基址变址寻址方式,以PC寄存器作基址寄存器,以立即数为变址,这样当程序块整块移动时,要加载的数据或跳转的地址与当前Pc值的偏移值固定,解决了相对偏移问题。
2.2 扇区擦除
事先编程在Flash中的程序先自复制到SRAM指定的位置,然后,赋PC为SRAM中扇区编程代码段的起点ERASEPART。
程序于SRAM中的ERASEPART起点开始执行,按照SST39VF160扇区擦除的时序要求开始擦除。
按照ARM公司提出的ATPCS规定,C语言程序调用汇编程序时,寄存器R0一R3传递参数,返回值由寄存器RO传递原则,扇区擦除程序的一个参数,要擦除的扇区号,由RO传递;返回参数置于R0,扇区擦除成功返回“1”,否则返回“0”。
2.3 字编程
程序于SRAM中的PROGRAMPART起点开始执行,按照SST39VFl60字编程的时序要求开始编程。
入口参数有三个,依次为编程地址、数据起始地址、编程数据长度。
字编程成功返回“1”,否则返回“0”。
3 结论
文中提出的IAP代码重入到SR—kM执行的方法,有效地解决了应用无片内程序存储器的32位ARM处理器的嵌入式系统IAP难题,有很大的应用价值。