您的位置 首页 知识

根据IAP和Keil MDK的长途晋级规划

写在前面:三个周之前,我突然想写一个远程升级的程序。那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知。我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问

  写在前面:三个周之前,我忽然想写一个长途晋级的程序。那个时候我仅仅大约知道IAP的意思是在运用编程,但怎样编,我还一窍不通。我给自己定下一个个阶段方针,从最根底的代码一点点写起,处理一个又一个的问题。三个周之后,我用自己规划的办法试验了50屡次,无一例晋级失利。

  三个周来,遇到了许多的不解、困惑,乃至是想抛弃,但我现在想说的是:许多不知道的困难会挡在咱们面前,咱们会感觉毫无条理乃至觉得毫无出路不由得要抛弃,但多坚持一下,那些困难不但能云消雾散还能带给咱们前进。

  本规划是依据LPC2114和Keil MDK(V4.10),但一切支撑IAP的处理器都可学习本计划,重要的是思维,而不是用什么。

  0 导言

  在运用编程(IAP)技能为体系在线晋级和长途晋级供给了杰出的处理计划,也为数据存储和现场固件的晋级都带来了极大的灵活性。一般可利用芯片的串行口接到计算机的RS232口、经过现有的Internet或、无线网络或许其他通讯办法很方便地完结在线以及长途晋级和维护。

  本文以NXP的LPC2114 ARM微处理器为渠道,以Keil MDK为开发东西,论述IAP的原理、Flash的区分、涣散加载机制、中止重映射以及在线晋级的完结计划及其优化。本计划运用多种校验技能,最大极限的确保传输数据的正确性;运用bootloader机制,即便因意外事件(断电,编程Flash失利等)形成晋级失利后,程序也能回来到晋级前的状况。

  1 LPC2114的Flash规划

  1.1 扇区描绘

  LPC2114共有128KB片内Flash,共分为16个扇区,分别为0扇区~15扇区,每个扇区为8KB存储空间。其间第15扇区出厂时被固化为Boot Block区,操控复位后的初始化操作,并供给完结Flash 编程的办法。所以用户可用的Flash空间只要120KB。IAP程序固化于Boot Block中,IAP操作是以扇区为单位,并占用片内RAM的高32字节。下表列出LPC2114器材所包括的扇区数和存储器地址.

  表1.1 LPC2114 Flash 器材中的扇区

image

  1.2 Flash的扇区区分

  本规划将Flash区分为四个区,扇区0寄存跳转程序和晋级引导程序(Bootloader)。分站上电后履行跳转程序,跳转到用户程序处。用户程序运转进程中,假如接纳到晋级指令,会从用户程序跳转到引导程序区(Bootloader),接纳新程序数据包,完结Flash编程并跳转到新程序区履行程序。扇区1~扇区7为程序存储低区;扇区8~扇区13为程序存储高区;扇区14寄存当时程序运转区域标志,假如当时程序运转在高区,该标志区的最低四个字节为0x00010000,假如当时程序运转在低区,该标志区的最低四个字节为0x00008000。

  2 IAP的原理与软件规划

  2.1 IAP的原理

  IAP函数是固化在微处理器内部flash上的一些函数代码,终究的用户程序能够直接经过调用这些函数来对内部flash进行擦除和编程操作。LPC2114微处理器的内部flash有一个块称为Boot Block,坐落flash的顶端,可供调用的IAP函数就坐落该块中。上电后Boot Block被映射到内部地址空间的顶端,相同IAP函数人口地址也被映射到地址0x7ffffff0处。用户可经过跳转到该地址来调用相应的lAP函数。

  2.2 IAP 指令

  关于在运用编程来说,应当经过寄存器r0 中的字指针指向存储器(RAM)包括的指令代码和参数来调用IAP 程序。IAP 指令的成果回来到寄存器r1 所指向的回来表。用户可经过传递寄存器r0 和r1 中的相同指针重用指令表来得到成果。参数表应当大到满足保存一切的成果以防成果的数目大于参数的数目。参数传递见图2-1。参数和成果的数目依据IAP指令而有所不同。参数的最大数目为5,由“将RAM 内容仿制到Flash”指令传递。成果的最大数目为2,由“扇区查空”指令回来。指令处理程序在接纳到一个未界说的指令时发送状况代码INVALID_COMMAND。IAP 程序是thumb 代码,坐落地址0x7FFFFFF0。

    

clip_image005

  图2-1 IAP的参数传递

  表2-1描绘了IAP的指令。

  表2-1 IAP 指令汇总

  IAP指令指令代码描绘

  预备编程扇区50该指令有必要在履行“将 RAM 内容仿制到Flash”或“擦除扇区”指令之前履行。这两个指令的成功履行会导致相关的扇区再次被维护。该指令不能用于boot 扇区。要预备单个扇区,可将开端和完毕扇区号设置为相同值。

  将RAM内容仿制到Flash51该指令用于编程 Flash 存储器。受影响的扇区应领先经过调用“预备写操作的扇区”指令预备。当成功履行仿制指令后,扇区将主动遭到维护。该指令不能写boot 扇区。

  擦除扇区52该指令用于擦除片内 Flash 存储器的一个或多个扇区。boot 扇区不能由该指令擦除。要擦除单个扇区可将开端和完毕扇区号设定为相同值。

  扇区查空53该指令用于对片内 Flash 存储器的一个或多个扇区进行查空。要查空单个扇区可将开端和完毕扇区号设定为相同值。

  读器材ID54该指令用于读取器材的 ID 号。

  读Boot版别55该指令用于读取 boot 代码版别号。

  IAP比较56该指令用来比较两个地址单元的存储器内容。当源或方针地址包括从地址0 开端的前64字节中的恣意一个时,比较的成果不一定正确。前64字节从头映射到Flash boot 扇区。

  2.3 IAP 编程函数接口

  IAP 功用可用下面的C 代码来调用。

  界说 IAP 程序的进口地址。因为IAP 地址的第0 位是1,因而,当程序计数器转移到该地址时会引起Thumb 指令集的改变。

  #define IAP_LOCATION 0x7ffffff1

  界说数据结构或指针,将IAP 指令表和成果表传递给IAP 函数

  unsigned long command[5];

  unsigned long result[2];

  界说函数类型指针,函数包括2 个参数,无回来值。留意:IAP 将函数成果和R1 中的表格基址一起回来。

  typedef void (*IAP) (unsigned int [ ] , unsigned int [ ]);

  IAP iap_entry;

  设置函数指针

  iap_entry=(IAP) IAP_LOCATION;

  运用下面的句子来调用IAP。

  iap_entry (command , result);

  Flash 存储器在写或擦除操作进程中不可被拜访。履行Flash 写/擦除操作的IAP 指令

  运用片内RAM 顶端的32 个字节空间。假如运用程序中答应IAP 编程,那么用户程序不该

  运用该空间。

  3 LPC2114晋级完结进程

  因为在晋级程序软件规划中,涣散加载机制、中止向量的重映射、软中止等的完结还与所运用的编译器严密相关,因而,本文结合Keil MDK(V4.10)编译东西,来具体论述晋级程序的完结进程。

  3.1 整体思路

  分站上电后,首要运转坐落Flash 0x000~0x3FF中的跳转程序。跳转程序会读取坐落14扇区的当时程序运转标志,假如该扇区的最低四个字节为0x00010000,表明当时程序运转在高区,跳转程序会跳转到Flash的0x00010000处履行用户程序;假如该标志区的最低四个字节为0x00008000,表明当时程序运转在低区,跳转程序会跳转到Flash的0x00002000处履行用户程序。用户程序正常履行后,会依照规划进行正常的程序收集、数据处理传送。当接纳到晋级指令后,用户程序会跳转到Flash的0x00000400处的Bootloader处进行晋级的一些操作。当晋级成功后,Bootloader程序更新当时程序运转区标志,程序跳转到新程序处运转,假如晋级不成功,回来晋级前的程序。

  流程图如下所示:

clip_image006

  3.2 跳转程序的规划

  跳转程序是分站上电后最早运转的程序,依据当时程序运转区标志,跳转到相应的用户程序区履行。本段程序占用Flash的最低1K字节空间,与Bootloader同在第0扇区。

  跳转程序的发动代码仅初始化仓库,不运用PLL和存储加快功用。代码1描绘了跳转程序的首要发动代码。

  ; Enter User Mode and set its Stack Pointer

  MSR CPSR_c, #Mode_USR

  MOV SP, R0

  SUB SL, SP, #USR_Stack_Size

  ; Enter the C code

  IMPORT __main

  LDR R0, =__main

  BX R0

  代码1:跳转程序发动代码

  当跳转程序确定要跳转到高区用户程序或许低区用户程序后,运用函数指针跳转到0x00010000处(高区用户函数进口地址)或0x00002000处(低区用户函数进口地址)。

  界说函数指针:

  void (*UserProgram)() ;

  指定进口地址:

  UserProgram = (void (*)()) (0x00010000);

  UserProgram = (void (*)()) (0x00002000);

  完结跳转:

  (*UserProgram)() ;

  要将用户代码准确定位到Flash的0x00010000处(高区用户函数进口地址)或0x00002000处(低区用户函数进口地址),需求运用编译器的涣散加载机制,将在Bootloader中具体描绘完结进程。

  别的,跳转程序还在烧录代码的一起初始化当时程序运转区标志,即对Flash的0x0001C000地址处写入0x00008000,表明当时用户程序在低区。首要运用了编译器的__at关键字:准确定位变量。需求留意的是,运用该关键字有必要包括头文件absacc.h。

  const uint32 x __at(0x0001C000)=0x00008000; //初始化用户程序标志区,默许运转低区

  3.3 晋级程序Bootloader的规划

  晋级程序的好坏,在很大程度上取决于Bootloader规划的好坏。

  一个优异的IAP晋级Bootloader,有必要做好晋级中呈现毛病等反常的处理。确保体系不会溃散,即便晋级失利,也能回来晋级前的程序。

  Ø 有晋级指令,进行初始化作业(串口、定时器、看门狗)

  Ø 接纳晋级数据包,检测帧头、长度、帧号、数据区校验,最大程度的确保晋级数据的完整性、正确性。

  Ø 实时检测接纳状况,10 S内没有接纳到数据或接纳到的数据包都是错的,则退出晋级,回来原程序。

  Ø 接纳的数据依照512字节一组写入Flash,写入后再读出与原数据进行比照校验,校

  验成功后,本次编程Flash成功。答应接连3次编程Flash,三次都不成功,退出晋级程序,履行原程序。

  Ø 晋级成功后,更新当时程序运转区标志,跳转到新程序,一起原程序保存。

  本规划的Bootload坐落Flash的0x400开端的扇区0存储区内,运用涣散加载机制,将程序的进口地址定位到0x00000400处。当用户程序接纳到晋级指令后,就会运用函数指针跳转到这个进口处。

  3.3.1 运用IAP

  图3-1 描绘了运用IAP编程Flash所有必要的过程。

clip_image007

  3.3.1.1 界说体系参数

  在运用IAP前,需求界说一些体系参数,比方体系时钟、IAP中止进口、输入输出缓存。

  #define IAP_CLK 11059200UL

  #define IAP_LOCATION 0x7FFFFFF1

  typedef void(*IAP)(uint32 [],uint32 []); //界说函数类型指针

  IAP iap_entry=(IAP)IAP_LOCATION; //设置函数指针

  unsigned long command[5] = {0,0,0,0,0};

  unsigned long result[2]= {0,0};

  代码3-1:界说体系参数

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/229722.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部