导言
嵌入式体系的开发终究需求将编译好的代码下载到具体的微控制器芯片上,而不同厂家的微控制器芯片有不同的下载办法。跟着技能的开展和运用需求的更新,用户程序加载趋向于在线编程的办法,越来越多的芯片公司供给和开放了用户更新程序的接口与办法,以进步整个体系的可靠性和可保护性。ST公司依据 CortexM3内核的STM32系列产品得到了广泛运用,在许多依据STM32系列产品的开发进程中不可防止要进行用户程序的加载。本文在介绍IAP技能原理基础上,具体论说运用该技能在STM32F103ZE芯片上完结用户在线更新功用的办法,并具体剖析其间可能产生反常的原因。
1 布景总述
1.1 首要程序更新办法
现在,除了直接经过仿真器或烧录器进行程序更新办法外,首要有Bootloader技能、ISP技能以及IAP技能3种更新程序的办法。
(1) Bootloader技能
引导加载程序,是指体系加电时,控制器将一段存储在外部非易失性存储器中的代码载入到内部高速存储器单元(如片内RAM)中履行的进程。
(2) ISP(In System Programming)技能
MCU内部自带Bootloader,经过指定的办法激活,经过通讯接口下载或擦除用户代码。需求有外部介入,静态的,在用户代码没有运转时进行下载。
(3) IAP(In Application Programing)技能
单片机内部具有一些可擦写的非易失存储器,如Flash。在微控制器独立运转时,用户运用自己编写的烧写程序经过通讯下载或擦除自己的代码。留意不具备IAP功用的单片机并不能对Flash的数据进行修正。无需外部介入,动态的,在用户代码运转时进行下载。
1.2 STM32系列简介
STM32系列微控制器依据CortexM3内核,并在其架构进步行了多项改善,包含在进步功用的一起进步了代码密度的Thumb2指令集,以及大幅度进步中止呼应的紧耦合嵌套向量中止控制器,然后大大进步了处理速度,下降了体系功耗。运用新内核的Thumb2指令集,规划人员能够把代码容量下降 45%,简直把运用软件所需内存容量下降了一半。此外,STM32供给丰厚的外围接口,现在广泛运用到工业用及家用安全设备、消防和暖气通风空调体系等,以及家电、消费电子、低功耗的可便携式设备等。本文以STM32F103ZE为例来研讨及运用IAP技能。
2 IAP技能
2.1 IAP技能原理
首要人为设定单片机内部存储区分为两块:其间一块称为Boot区,用于存储IAP功用程序代码;别的一块称为常态存储区,用于存储除IAP功用外的一切程序代码。IAP技能指的是, MCU在运转的状态下,经进程序(PC)指针不断读取需求履行的程序指令。正常状况下,PC指针只在常态存储区内移动,并读取指令,如图1所示。当用户需求更新或晋级程序时,程序指令会将PC指针跳转至Boot区。这段存储区的指令代码的功用是,经过通讯等办法接纳用户需求更新的程序数据,并经过校验承认接纳到的程序数据正确后,依据约好的办法写入常态存储区,如图2所示。当完结用户程序更新后,PC指针再跳回到常态存储区,开端履行存储在其上的用户程序,这样便完结了IAP功用。
图1 经过PC指针读取程序指令 图2 更新存储区代码
2.2 IAP技能要害点
经过研讨IAP技能完结用户程序更新的进程,不难发现,在更新进程中有必要确保PC指针在Boot区移动,而不能随意跳转至常态存储区。依据这个要求,结合微控制器原理能够得出需求特别留意的几个要害点。
(1) 制止中止
毫无疑问,中止会使得PC指针跳转至中止服务程序进口地址,因而,在进入Boot区前需求制止一切中止。
(2) 禁用底层外围接口
关于有些外围接口,比方当选用ADC+DMA的办法进行多通道A/D采样时,采样进程会依照预先设置的通道次序进行A/D采样。若在PC指针跳转至Boot区前没有禁用,则更新完程序跳回常态存储区时,其存储A/D通道值就可能产生错位的状况。
(3) 运用实时操作体系
假如运用具有抢占式RTOS(即硬实时操作体系),则需求制止一切使命,并且屏蔽一切的信号量及邮箱,以防止激活某个使命,导致PC指针跳转至常态存储区。
(4) 运用看门狗
在考虑导致PC指针跳转的原因时,看门狗很简单被疏忽,并且许多芯片的看门狗一旦使能就不能禁用,所以不能经过禁用的办法到达意图。最安全的办法是,在Boot区中也参加看门狗的喂狗指令。特别要留意的是,当需求擦除、写入很多Flash数据时,需求对其进程所需时刻进行定量的估量,有必要时能够在这个进程中屡次喂狗。
(5) 存储空间分配
Boot区以及常态存储区的巨细能够人为分配,一般来说,尽可能使常态存储区最大化,由于产品的功用是在该区域得到表现;而Boot区尽可能使其代码简练,防止运用中止以及杂乱的底层驱动及算法。
2.3 IAP技能完结
(1) 封闭相关中止及禁用相关外围接口
如定时器中止、SysTick中止、A/D中止、外部I/O中止等。
(2) 设定跳转地址
typedef void (*pFunction)(void);
INT32U JumpAddress;//界说IAP进口地址pFunction Jump_To_Application;//界说指向IAP进口地址程序的函数指针
JumpAddress=*(vu32*)(IAP_ADDR + 4);
Jump_To_Application=(pFunction) JumpAddress;
(3) 喂狗并履行跳转
IWDG_ReloadCounter();//喂狗
__set_MSP(*(__IO uint32_t*) IAP_ADDR);//初始化用户运用程序的仓库指针
Jump_To_Application();
(4) IAP代码(Boot区代码)
只需求驱动用到的底层接口,尽量不运用中止,尽可能少地占用存储空间,一起需求适时地喂狗。别的对该系列Flash操作会有所不同,比方 STM32F103ZE履行擦除操作时,一页为2 KB,而SMT32F103VC6等芯片一页为1 KB,运用其他类型芯片时需求具体查阅相关数据手册。
3 总结
本文从剖析IAP技能原理下手,具体论说了运用IAP技能完结用户程序更新的关键。别的,能够幻想,假如Boot区参加TCP/IP协议连入互联网,即可凭借网络对产品进行在线晋级,既可进步体系的可保护性,又可下降产品的保护本钱,必将在未来得到更为广泛的运用。