单片机 IAP(在线升级)的 BOOT&APP 设计流程详解

工程项目上有时候需要为设备更新应用程序,如果不预留接口升级的话就需要拆除外壳,太麻烦了。一般会留下升级程序的接口,在需要升级设备的时候,给一个信号使程序进入BOOT区运行,然后进行在线升级。

我们一般把单片机flash空间划分为3块。
1、BOOT: 储存进行在线升级的驱动程序
2、APP : 储存应用程序
3、配置信息 : 储存需要保存的应用数据

以下是BOOT区以及APP区的配置方法。

1、设置BOOT程序的代码占用空间
根据BOOT功能来划分,这里我举个例子分配0x2000的空间给BOOT
在这里插入图片描述

2、BOOT区启动后要对APP区的代码进行校验
根据校验的结果来决定是停留在BOOT区等待,还是跳转APP程序运行。
可以把APP程序的校验和存在APP程序区的末尾,在烧录程序的时候烧录进去。在BOOT刚启动的时候,计算APP区代码的校验和进行对比。如果相同,就跳转到APP区,如果不同,就执行BOOT区接下来的程序进行远程升级。

3、APP区如何进入BOOT区
1、更改APP区校验信息
上面我们说到BOOT区启动的时候会校验APP区的代码来决定是否运行APP,所以APP区进入BOOT区之前,要破坏APP区的校验信息。在APP区进行操作,把校验信息改写,取反或者加1都是不错的选择。在BOOT区无法进行远程升级的时候,可以更改校验位回到APP区运行。

2、重启进入BOOT区
在更改APP区校验信息之后,需要重启单片机运行。
STM32的重启代码是:

NVIC_SystemReset();	

4、BOOT区在线升级

在确定了需要在线升级之后,就可以用预留的接口,来接收数据进行在线升级了。
我们将接收到的数据,写到APP的flash区内(不要覆盖了BOOT区和配置信息区),数据接收完后,还需要计算APP区内的校验信息并写入。然后重启BOOT区,这时校验信息正确,进入APP区。

5、BOOT区跳转到APP区流程
1、关闭一些可能会干扰到跳转的功能
STM32可以用这个来实现

EXTI_DeInit();
SYSCFG_DeInit();
RCC_DeInit();

2、检查栈顶地址是否合法.
APP_ROM_ADDR 为APP区的起始位置,比如0x08002000

 if (((*(uint32_t*)APP_ROM_ADDR) & 0x2FFE0000 ) == 0x20000000)

计算如果不为0x20000000,那就不进行跳转

3、初始化用户程序的堆栈指针

__set_MSP(*(__IO uint32_t*) APP_ROM_BASE_ADDR);

4、执行跳转
首先要获取跳转地址。
APP区的地址存在 APP_ROM_ADDR+4 (例如0x08002004)的位置,且有4个字节,
我们可以这样获取跳转地址以及执行跳转。

typedef void (*pFunction)(void);//定义了一个新类型,该类型是一个函数指针,
pFunction Jump_To_Application;  //定义程序地址指针
JumpAddress = *(__IO uint32_t*) (APP_ROM_ADDR + 4); 
Jump_To_Application = (pFunction)JumpAddress;
Jump_To_Application();

6、写APP程序所需注意的几个地方

程序并不是进入APP区就可以直接运行了,APP程序需要做一些处理才可以运行。

1、要划分好APP区的存放地址
比如我们设定BOOT区程序大小为0x2000,那么APP区程序就要从0X2000
在这里插入图片描述
2、需要重映射中断向量

__IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));
void iRemapIrqVector(void)
{
    uint8_t i = 0;
    for(i = 0; i < 48; i++)
        VectorTable[i] = *(__IO uint32_t*)(APP_ROM_ADDR + (i<<2)); //中断向量是一个指针,每个占4个字节
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //这个一定要有
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); //设置为RAM启动模式
}

要分配RAM

在这里插入图片描述

  • 22
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 51单片机iap(In-Application Programming)在线升级是一种在单片机系统中通过编程的方式对在线设备进行升级的技术。 通过IAP技术,在单片机系统运行的过程中,对内部存储器进行读取和修改,并将新的程序代码下载到内存中,从而实现在线升级IAP不需要擦除内存,能够有效地避免数据丢失,提高系统的稳定性和安全性。 51单片机IAP在线升级技术可以在系统运行时进行程序升级,更新新的功能,增强系统性能,并具有快速、灵活、方便的特点。但是,IAP技术需要对硬件进行支持,如双系统设计和FLASH存储器等。 因此,在进行51单片机IAP在线升级时,需要根据硬件支持条件选择不同的技术实现方案。同时,在进行在线升级时,需要注意保护程序的完整性和安全性,以免出现不良影响。 总之,51单片机IAP在线升级技术是一种便捷、灵活、高效、先进的升级方式,广泛应用于各类嵌入式系统中,有利于实现软件功能的快速升级和系统的优化。 ### 回答2: 51单片机指的是一种基于Intel 8051指令集的单片机,它是广泛应用于嵌入式系统中的一种芯片。而IAP(In-Application Programming)在线升级则是指在不需要任何外部设备的情况下,通过程序自身对芯片中的代码进行更新。 在51单片机中,实现IAP在线升级需要结合程序设计和硬件电路设计两个方面。首先,程序中需要预留出一定的存储空间,用于存储升级程序的代码。其次,需要设计一个与单片机相连的串行接口,如UART或SPI等,以便实现与外界通信,接收升级程序的数据。 整个IAP升级流程如下:首先,单片机在运行过程中通过串口接收到升级程序的数据,将数据暂存至内部存储器。然后,单片机停止当前程序执行,切换到专门的IAP程序,读取内部存储器中的升级程序数据,并将其写入到指定的程序存储区。最后,单片机重新启动程序执行,完成升级。 通过IAP在线升级技术,可以大大简化芯片升级的操作流程,并节省升级的时间和成本,适用于各种嵌入式场景的应用。 ### 回答3: 51单片机iap在线升级是通过网络或串口实现对51单片机程序的在线更新和升级。它可以通过服务器端的推送或客户端的请求,将新的程序固件通过网络传送到目标单片机,然后在单片机中通过IAP(In-Application Programming)实现程序的自我升级。这种在线升级方式可以极大地简化单片机的维护和升级,提升单片机的灵活性和可用性。它适用于广泛的应用场景,如远程设备控制、智能家居、远程医疗等。同时,为了保证在线升级的安全性和准确性,需要特别注意数据传输的可靠性和过程的安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值