【固件升级】之IAP(二)

【STM32】IAP升级01 bootloader实现以及APP配置(主要) STM32的IAP升级 阅读详情
AI摘要

本文详细介绍了嵌入式系统的几种固件升级技术,包括IAP、OTA、ICP和ISP,并阐述了它们的区别与联系。此外,还探讨了STM32启动模式及其在OTA流程中的应用,提供了具体的代码示例。

1. 概念混淆

1.1 IAP

IAP是In Application Programming的简写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
IAP主要包括BootLoader和应用程序两部分

而进行IAP升级最核心的两点是实现:

1.BootLoader程序的编写 存储在FLASH中,主要负责引导APP程序的升级

2.APP程序的编写 实现产品功能升级的程序或者对程序的修复

1.2 OTA

OTA是Over-the-Air的简写,即空中下载技术,通过网络远程给用户进行系统更新和升级
基于IAP的OTA设计思路是先通过OTA接收升级固件,再利用IAP进行固件搬移、校验和程序跳转,实现空中升级的目的。

1.3 ICP(In Circuit Programing)

使用硬件对应厂家的软件以及仿真器都可以烧录程序,目前主流的有JTAG和SWD接口。而ICP编程就是以SWD接口进行的。

执行ICP功能,仅需要三个引脚:RESET、ICPDA、和ICPCK。RESET用于进入或退出ICP模式,ICPDA为数据输入输出引脚,ICPCK为编程时钟输入引脚。用户需要在系统板上预留VDD、GND和这三个引脚。

大致的工作流程:PC上运行的软件(ICP编程工具)通过SWD的接口更新芯片内部APROM、LDROM、数据闪存(DataFlash)和目标用户配置字(Config)

1.4 ISP(In System Programing):

在系统编程,可借助MCU厂商预置的Bootloader 实现通过板载UART或USB接口烧录代码,比如STM32存储映射Code分区中的System memory可以预置厂商的Bootloader,让MCU支持通过UART下载(不限于UART,具体由厂商预置Bootloader实现而定);

写入器将code烧入,不过,芯片可以在目标板上,不用取出来,在设计目标板的时候就将接口设计在上面,所以叫"在系统编程",即不用脱离系统;

STM32 在出厂时由ST 在这个存储区间内部预置了一段BootLoader(也即ISP 程序),这段程序出厂后无法修改。厂家提供的BootLoader 一般支持UART 协议,可以让我们直接通过串口将程序代码烧录到Main Flash memory 中;

各自的烧录工具
1.ICP使用SWD接口进行烧录程序。常用的烧录工具为J-Link、ST-Link、Nu-Link。与之配套的烧录软件为J-Flash、NuMicro_ICP_Programming_Tool、st-link utility。

2.ISP是使用引导程序通过USB/UART等接口进行烧录的,首先就是需要有bootloader。最常见的烧录方式就是学习8051单片机时使用的STC-ISP烧录工具了。

3.IAP就是通过软件实现在线电擦除和编程的方法,没有使用任何工具,仅仅是通过软件的方法来更新Flash中的数据

1.5 SWD(Serial Wire Debug)

是一种两线调试接口,由 ARM 公司提出,用于替代 JTAG 接口,提高调试效率和降低成本。
SWD 接口只需要两根信号线,分别是:
SWCLK(Serial Wire Clock):串行时钟线,提供同步时钟信号;
SWDIO(Serial Wire Data Input/Output):串行数据输入输出线,用于双向数据传输。
需要注意的是,玩单片机的还会经常见到 STLink、JLink、DAPLink、CMSIS DAP 等名词,这些属于是仿真器的类型,而不是调试接口。

3. Bootloader

BootLoader就是一段单片机的引导加载程序,单片机出厂时就已经写好了,用户是无法访问更改的,但是我们可以在用户代码区域再自己写一个BootLoader程序用于更新固件。

BootLoader程序根据判断是否需要升级固件,并进行固件搬运,运行代码跳转。
APP工程中需要编写OTA数据包交互协议,将接收到的升级固件保存至FLASH,
校验一致性
然后设置升级标志位并重启

4. STM32启动模式分析

Cortex-M3 内核启动有3种情况:

  1. 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后 PC 指针位于0x2000000处。
  2. 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处。
  3. 通过boot引脚设置可以将中断向量表定位于内置Bootloader区

Cortex-M3内核规定,起始地址必须存放栈顶指针,
而第二个地址则必须存放复位中断入口向量地址,
在Cortex-M3内核复位后,
会自动从起始地址的下一个32位空间取出复位中断入口向量,
跳转执行复位中断服务程序。

Boot引脚设置见下表
在这里插入图片描述
STM32的启动文件(startup_stm32f103xb.s)和启动过程。

(1)首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,
其第一个表项是栈顶地址(32位),第二个表项是复位中断服务入口地址;
(2)然后执行复位中断,在复位中断服务程序中跳转 C/C++标准实时库的main函数(__main),
完成用户堆栈等的初始化后,跳转.c 文件中的main函数(真正的用户main函数)开始执行程序。

假设STM32被设置为从内部FLASH启动,
中断向量表起始地位为0x8000000,
则栈顶地址存放于0x8000000处,
复位中断服务入口地址存放于0x8000004处。
当STM32遇到复位信号后,
则从0x80000004处取出复位中断服务入口地址,
继而执行复位中断服务程序,
然后跳转__main函数,
最后进入main函数。

在这里插入图片描述

5.OTA流程示例

Step1:上电启动单片机,首先执行BootLoader程序。
Step2:BootLoader读取Parameter区参数,查看升级标志是否有升级任务,若没有升级任务,则进入 Step3,否则进入 Step4。
Step3: BootLoader程序跳转至APPA,执行用户代码,并判断是否收到升级任务请求,若有升级任务请求则进入 Step7。
Step4:根据Parameter区升级参数,校验APPB固件数据并将APPB升级固件拷贝到APPA区,执行 Step5 和 Step6。
Step5:将升级标志位清除。
Step6:重启,再次执行BootLoader。
Step7:将接受到的升级数据包存入APPB区,并将相关升级参数存入Parameter区,若接收数据完成,固件检验通过则写入Parameter区升级标志,并进入 Step8 。
Step8:重启,再次执行BootLoader

6. 工程设置示例:

Flash:
Bootloader :0x08000000-0x08004FFF = 20KB
APP1: 0x08005000-0x08017FFF = 50KB
APP2: 0x08018000-0x0801DFFF = 50KB


  • 由于BootLoader需要在上电复位后首先执行,因此,设置BootLoader存放在FLASH起始位置0x08000000,
  • 设置IROM1 Start = 0x08000000,Size = 0x5000(0x5000 = 20kB)
  • 在Flash Download中设置下载Flash位置,参数与IROM1中设置Start和Size相同

  • APP代码存放在紧挨着BootLoader之后,因此APP的起始位置应该为0x08000000+0x5000 = 0x08005000,占用内存大小为0xC800(50kB)
  • 设置IROM1 Start = 0x08005000,Size = 0xC800,在Flash Download中设置下载Flash位置,参数与IROM1中设置的Start和Size相同,
  • 由于APP代码运行的起始位置不在0x08000000,其栈顶地址发生偏移,对应的中断向量表地址也整体发生偏移
  • 具体的在system_stm32f1xxx.c中启动代码中可以看到定义的中断向量表偏移量宏定义

中断向量表设置偏移

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x5000 /*!< Vector Table base offset field. 
                                  This value must be a multiple of 0x200. */
                                  /*该指数必须为0x200的整数倍*/
                                  

KEIL配置编译后运行fromelf.exe生成.bin文件
fromelf.exe --bin -o “$L@L.bin” “#L”

7. 备注事项

  1. 如果bootloader里头有中断关闭它
    __disable_irq();建议先关闭中断在跳转,
    关闭之后千万要记得在APP函数中打开,
    不然可能会导致APP函数运行不下去的情况

  2. 判断栈顶地址
    在这里插入图片描述

  3. 代码示例:

  • 设置中断向量表的偏移量
    SCB->VTOR == ((volatile uint32_t) 0xE000ED08)
  • APP中要打开irq
void execute_firmware(uint32_t addr)
{
	USART1_DEBUG("execute_firmware\r\n");
	__disable_irq();
	if(((*(uint32_t*)addr)&0x2FFE0000)==0x20000000)
	{
		JumpAddress = *(uint32_t*) (addr);
		__set_MSP(JumpAddress);//把堆栈指针复位了,然后再跳转到APP。APP开始运行,APP也占有全部
		//RAM,它不用再关心IAP是否会占用堆栈或变量,因为IAP不会再运行了(当然可能有的RAM里面是还有数
		//据存在的,比如IAP中的变量和堆栈数据等,但APP运行时会重新初始化它自己的变量,不用关心之前的
		//数据是什么,同时堆栈的时候也会先入栈再出栈,先前的数据会被覆盖)
	}	
}

( 这边描述一下为什么if((((uint32_t)addr)&0x2FFE0000)==0x20000000)需要这一条?
答:这是为了保证app的数据执行是在0x20000000开始的,所以这句话的意思是保证app程序执行ram是有效的!
为什么是0x2FFE0000?
这是针对64K RAM的,保证ram在0x10000以内!

这个条件语句检查addr指向的地址是否位于一个以0x20000000为起始地址的内存区域。对于STM32,0x20000000通常是内部SRAM的基地址,因此这个条件语句常用于确认一个地址是否位于内部RAM内,这对于一些操作如堆栈指针(SP)的检查特别有用,以确保堆栈在正确的内存范围内

if(((*(volatile uint32_t *)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法

0x2FFE0000在二进制下是 0010 1111 1111 1110 0000 0000 0000 0000
0x20000000在二进制下是 0010 0000 0000 0000 0000 0000 0000 0000
要最后的值为0x2000000
那这个值要小于FFFF
0X0000FFFF
&
0X2FFE0000
结果符合

64K的大小16进制是0x10000
栈顶是
0x20010000
&
0x2FFE0000
结果
0x20000000

STM32微控制器通常具有多个内存区域,包括片上Flash、SRAM、外设寄存器区等。对于64KB的SRAM,其地址范围通常是从0x20000000开始,直到0x2001FFFF结束。64KB的大小意味着地址空间为0x10000(即64 * 1024字节)。

判断栈顶在SRAM范围内

  • “__set_MSP”函数原型为:
    __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack);

该函数是ARM定义好的内核功能函数之一:
设置主栈指针,该函数以存在于头文件(cmsis_armcc.h)的形式提供给各芯片厂商、IDE等使用(不是哪个芯片厂商或IDE特有的)。
简单说,一般需要包含形如“CMSIS\Include”的路径
(针对多IDE环境可能导致包含交叉而找不到定义)。可以搜索相关路径(在mdk-arm中)找到cmsis_armcc.h所在的路径,然后明显的包含该路径即可

  • 跳转APP运行需要三个步骤
    关闭外设和中断
    设置APP堆栈顶地址, 重新初始化堆栈
    运行复位中断服务函数

  • APP
    app程序在main函数开始需要设置中断向量表偏移,然后正常运行

8. 复位

  1. 系统复位
    直接调用 CMSIS 提供的接口NVIC_SystemReset()即可,该操作会把内核及所有外设重置

void reboot(void)
{
__set_FAULTMASK(1); // 关闭所有中断
NVIC_SystemReset(); // 系统复位,以上两个函数位于 core_cm3.h 文件或 core_cm4.h
}

  1. Bootloader跳转至APP代码片段
    主要工作流程为芯片上电->
    执行bootloader代码->
    初始化时钟和配置必要外设->
    检测是否需要进行固件更新,
    是-则将新固件从存储区拷贝替换至应用程序运行区,然后跳转至应用程序入口;
    否-则直接跳转至应用程序入口开始执行业务
  • 内部Flash和片外Flash的擦除单位可能不一致,2K、4K字节不等
  • 写内部Flash要以4的倍数字节写进,外部不限制
  • 写Flash须考虑4字节对齐
  • 内部Flash编程以一个字为单位,如果非4字节对齐,会导致硬件错误
  • 跳转复位需要关中断、清标志位
  • 另外在外设初始化时,需要deinit或者disable一下,否则可能会导致ADC、DMA配置失败
  • 看门狗的喂狗问题,即使在ymodem传输过程中,也要保证喂狗避免芯片复位

常规原因排查:

  • 跳转前未关中断;
  • 中断控制器没复位清零;
  • 中断向量表偏移未设置正确;
  • 部分会影响到程序运行的外设未关闭,如DMA会刷新SRAM,可能会影响到bootloader程序的运行,导致crash
  • 系统时钟配置不一致,bootloader与APP的系统时钟初始化应该保持一致
  • 可能的原因:bootloader与APP的编译链接选项尽可能保持一致,如硬件浮点、函数/数据编译分小节、所用C库、优化选项等

操作系统在线程中使用PSP堆栈指针,在中断中使用MSP主堆栈指针
设置CONTROL寄存器的bit[1]选择使用哪个堆栈指针。CONTROL[1]=0选择主堆栈指针;CONTROL[1]=1选择进程堆栈指针
直接PC跳转复位,实际上内核并不会自动切换MSP和PSP,因为此过程没有触发内核Handler模式,需要用户手动切换

9. 代码整理:

9.1 Bootloader跳转函数

在这里插入图片描述

//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(uint32_t addr) {
    MSR MSP, r0 			//set Main Stack value
    BX r14
}iapfun jump2app;
#include "sys.h"
typedef void (*iapfun)(void); //定义一个函数类型的参数.
#define FLASH_APP1_ADDR 0x08010000
void iap_load_app(u32 appxaddr); //跳转到 APP 程序执行

iapfun jump_app;

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
	if(((*(volatile uint32_t *)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
	{ 
		//栈顶地址存放于0x8000000处,
		//复位中断服务入口地址存放于0x8000004处
		//用户代码区第二个字为程序开始地址(复位地址)
		
		jump2app=(iapfun)*(volatile uint32_t *)(appxaddr+4);
		
		//MSR_MSP 函数(该函数在 sys.c 文件)设置栈顶地址
		//初始化 APP 堆栈指针(用户代码区的第一个字用于存放栈顶地址)
		MSR_MSP(*(volatile uint32_t *)appxaddr);
		
		__disable_irq();
		
		//跳转到 APP.
		jump_app(); 
	}
}
 __set_MSP(STACK_ADDR)的作用为重新初始化堆栈
	__set_MSP(JumpAddress);//把堆栈指针复位了,然后再跳转到APP。APP开始运行,APP也占有全部 //RAM,它不用再关心IAP是否会占用堆栈或变量,因为IAP不会再运行了(当然可能有的RAM里面是还有数
	//据存在的,比如IAP中的变量和堆栈数据等,但APP运行时会重新初始化它自己的变量,不用关心之前的
	//数据是什么,同时堆栈的时候也会先入栈再出栈,先前的数据会被覆盖)

9.2 APP中设置

对于 FLASH APP,
我们设置为 FLASH_BASE+偏移量 0x10000,
所以我们可以在 SystemInit 函数里面修改 SCB->VTOR 的值
当然为了尽可能不修改系统级别文件,
我们可以也可以在 FLASH APP 的 main 函数最开头处添加如下代码
实现中断向量表的起始地址的重设

SCB->VTOR = FLASH_BASE | 0x10000;

中断向量表设置偏移
app是主程序,启动后第一步就是设置中断向量表偏移。
这是为了打开跳转前关闭的中断,并且重定位向量表,否则APP程序里的与中断相关的程序会炸

BOOT1
void Reset_test(void)
{
	typedef  void (*iapfun)(void);
	uint32_t JUMP_ADDR = 0x08004000;
	uint32_t STACK_ADDR = 0x20000000;
	uint32_t RESET_IRQ_ADDR = JUMP_ADDR + 4;
	iapfun jump2app;
	jump2app = (iapfun)*(volatile uint32_t *)RESET_IRQ_ADDR;
	__set_MSP(STACK_ADDR);
	__disable_irq();
	jump2app();
}

APP
 int main(void)
{
  __enable_irq();
  SCB->VTOR = 0x8004000;
  
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  
  int count = 0;
  while (1)
  {
	HAL_Delay(1000);
	HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_7);
	printf("This is APP\n");
	if(count >= 5)
		HAL_NVIC_SystemReset();
	count++;
 }

BOOT2
#define APP_START_ADDR 		 		0x08020000 		
int main(void)
{
	uint32_t app_addr=0;
	start_app_fxn app_start;

	//init

	//do something in boot
	
	__disable_irq();
	
	app_addr = *(__IO  uint32_t*) (APP_START_ADDR + 4);

	app_start = (start_app_fxn) app_addr;
	
	__set_MSP( *(__IO  uint32_t*) (APP_START_ADDR));

	app_start();
	
}

/*!
* @brief 跳转到应用程序段
*        执行条件:无
* @param[in1] : 用户代码起始地址.
*
* @retval: 无
*/
void jump_to_app(uint32_t app_addr)
{ 
    
    pFunction jump_to_application;
    uint32_t jump_address;
    
    /* Check if valid stack address (RAM address) then jump to user application */
    if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      jump_address = *(__IO uint32_t*) (app_addr + 4);
      jump_to_application = (pFunction) jump_address;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) jump_address);
      jump_to_application();
    }    
    
}



typedef  void (*iapfun)(void);
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(uint32_t appxaddr)
{
	uint32_t STACK_ADDR = 0x20000000;//栈初始地址

	iapfun jump_app = NULL;

	LOG_OUT("appxaddr p =%x\r\n", appxaddr);
	LOG_OUT("appxaddr data=%x\r\n", *(volatile uint32_t *)appxaddr);
	LOG_OUT("IRQ addr=%x\r\n",      *(volatile uint32_t *)(appxaddr+4));

	if(((*(volatile uint32_t *)appxaddr)&0x2FFF0000)==0x20000000) //检查栈顶地址是否合法
    {

		jump_app=(iapfun)*(volatile uint32_t *)(appxaddr+4);//复位中断的地址

		LOG_OUT("jump_app=%x\r\n", jump_app);
		HAL_Delay(1000);

		__disable_irq();
		__set_MSP(*(volatile uint32_t *)appxaddr);//重新初始化堆栈
		jump_app();
    }
	else
	{
		LOG_OUT("jump_err\r\n");
	}
}

__set_MSP 是一个内联汇编函数,用于设置ARM Cortex-M微控制器的主栈指针(Main Stack Pointer,MSP)。在ARM Cortex-M系列处理器中,有两个栈指针:MSP和PSP(Process Stack Pointer)。MSP通常在系统启动时使用,以及在异常处理和中断服务例程中作为栈指针。PSP则在正常任务运行时使用。

__set_MSP 函数通常在Cortex-M微控制器的启动代码中被调用,以初始化MSP到一个预设的地址,通常是SRAM的高端地址,以便在复位或异常发生时,处理器能够正确地保存和恢复寄存器上下文。
下
__STATIC_INLINE void __set_MSP(uint32_t addr);
其中 uint32_t addr 参数是你要设置为主栈指针的地址。这个地址通常指向SRAM的一个特定位置,该位置将作为栈的顶部,所有后续的栈操作都会从这个地址向下扩展

__set_MSP(*(uint32_t *) ApplicationAddress);
这里的 ApplicationAddress 是一个指向存储区的指针,该存储区包含了初始化MSP所需的地址值。通常,这个地址值会在链接器脚本中被定义,以确保MSP被设置在一个安全且合适的位置。

在使用 __set_MSP 设置完MSP后,通常会有一个跳转指令,如 Jump_To_Application(),将控制权交给应用程序的主要入口点。
一篇

开始做BOOTloader

STM32 Bootloader基于ymodem传输协议串口IAP升级详解 最终我们需要使用的是bin文件,所以,这里需要使用将hex文件转成bin文件,本文使用。,在此基础上做了部分修改,增加了延时启动的功能,最终可以实现想要的效果。高密度系列,所以是128K,本文是CBT6,20K的RAM,则需要改成。的启动地址需要进行修改,另外还有其他需要修改的地方,下面会详细指出。该项为选配,与上述配置二选一即可,如果仍然想使用自己的链接脚本,在。启动文件的时候,我们可以知道,正常一个系统的启动流程,可以参考。可以知道,程序起始地址的第一个向量地址保存的栈顶的,因此,地址。 阅读详情

相关推荐

嵌入式开发<单片机软件升级>

本文介绍了单片机如何设计在线升级,同时,针对M0 MCU以及具有IAP功能的51单片机也提出了自己的设计方法。希望这里的设计方法对你及你公司所做的项目有帮助。

sunny的博客 4336

电子产品如何使用IAP方式升级程序

电子产品如何使用IAP方式升级程序

qq_44597856的博客 1841

IAP固件升级原理及实现详解

什么是IAP升级? IAP,即In Application Programming,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写。简单来说,就是开发者代码出bug了或者添加新功能了,能够利用预留的通讯接口,对代码进行升级 UART、SPI、IIC、USB等等,当然还有wifi、4G、蓝牙等无线通讯手段,都可以作为IAP升级的方式,今天主要介绍如何使用串口对固件进行升级 STM32的代码启动过程 要想设计IAP,首先需要对MCU的代码启动过程有个了解,先来看看STM32的

qq_16519885的博客 2万+

使用STM32F103的串口实现IAP程序升级功能

使用STM32F103的串口实现IAP程序升级功能

perseverance51博客 6297

STM32 IAP升级固件 + 上位机 例程

本例程实现功能: 1、IAP固件程序实现固件APP搬移,跳转至APP 2、APP固件程序实现自定义功能,接收上位机下发的bin文件 3、上位机加载APPbin文件,分割下发至APP固件程序(本例程使用QT开发) 一、IAP升级简单介绍 原理参见: 两种方式: 本例程采用方式二升级 二、 ...

white_loong的博客 8059

RS485接口的IAP固件升级工具

RS485接口的IAP固件升级工具 文章目录RS485接口的IAP固件升级工具前言一、概述二、IAP技术原理三、IAP编程实现1.bootloader程序2.APP程序四、上位机的编写五、总结 前言 当我们采用MCU设计的电子产品在出售后、安装在野外、固件存在BUG时或客户需求有变动, 都需要对固件进行维护和升级。由于距离远且需频繁调试测试, 不可能每次都安装人手去现场升级固件, 势必会造成巨大的成本开销, 这是非常不利于企业发展的。因此, 需要对产品可进行远程升级固件, 而远程升级固件就要使用到

chengzidun的博客 5933

【IAP】篇二 —— 自定义数据包传输协议实现固件升级

阅读本篇需要有bootloader和FLASH内存划分的知识,如果不了解可以看上一篇IAP篇一 —— FLASH内存划分 & Target设置 附Bootloader或者网上搜索。一、固件升级概念 及 传输信道在高级的应用开发中,产品发布后不是一成不变的,需要对产品不断的迭代升级,修正BUG,固件升级就是用来完成这个步骤的。固件升级将新的固件代码下载到设备的闪存中,并替换旧的代码。这个过程可以通过多种方式实现,如串口、USB、网络等。完成升级后,设备会重新启动并以新的固件版本运行。

weixin_63723467的博客 1474

STM32F103c8t6通过串口实现IAP在线升级固件

STM32f103c8t6 IAP在线升级设计思路:(自己理解的哈,如果有问题,欢迎大家提出来,一起学习哈)首先程序每次执行都会从基地址0x0800 0000开始执行。IAP程序升级最重要的就是写BOOTLOADER程序,进行引导升级,加载,跳转app程序。每次上电后进入bootloader判断是否升级如果需要升级,就就收bin文件进行升级,如果不升级直接跳入原app程序执行。bootloader...

QQ_1595386336的博客 1万+

IAP(二)SD卡固件升级流程与FatFS文件管理

本文介绍了基于STM32F407ZGT6的SD卡固件升级方案,通过IAP方式实现本地OTA功能。主要内容包括:1) 使用CubeMX配置SDIO接口与FatFS文件系统,实现SD卡初始化和文件管理;2) 开发固件查找功能,在指定目录中检索包含"ota"字样的bin升级文件;3) 利用内部Flash存储升级标志位,管理升级流程。该方案通过USB MSC模式简化固件传输,为无外部Flash的嵌入式系统提供了实用的OTA升级解决方案。

2301_77117901的博客 1742

STM32通过IAP实现固件升级的分析与示例

大部分MCU都可以通过IAP对片内flash进行读写来实现固件升级。 这里主要是STM32如何实现IAP升级。 不同内核的stm32方式可能略有不同.这里先说F1内核的IAP过程,这里以STM32F103C8T6做示例 一、片内FLASH读写 实现IAP,首先要实现片内FLASH读写 1、擦除程序区,调用库函数FLASH_ErasePage可以按页做擦除 int FlashErase(uint32_t addr) { uint8_t retry_time; uint8_t i; .

zhangfls的博客 4723

单片机IAP固件升级分几步?(Qt上位机)

这周一直想做一个IAP固件升级的上位机,然后把升级流程全都搞懂有纰漏请指出,转载请说明。学习交流请发邮件 1280253714@qq.com。

weixin_45817947的博客 2344

【IAP】篇二 —— 基于RS485自定义协议实现可靠固件升级

本文详细介绍了基于RS485自定义协议实现可靠固件升级(IAP)的完整方案。针对工业现场复杂环境,设计了包含帧头帧尾、长度字段、校验机制和重传策略的自定义数据包传输协议,并深入解析了BootLoader设计、FLASH分区操作及关键代码实现,确保升级过程的高可靠性。

kkk56的博客 706

stm32使用SD卡IAP固件升级笔记

最近开发了stm32用SD卡进行IAP固件升级用的bootloader,特整理一下笔记: 首先说一下升级原理,固件升级需要有2套程序,1套就是加载引导程序,也就是所谓的bootloader。另一套就是APP程序。 主要的难点就是bootloader程序了。下面讲解如何写基于SD卡的bootloader程序。 编写基于SD卡的固件升级bootloader,需要做...

qq_27726651的博客 3904

华大HC32F460_IAP固件升级中断处理全解析

本文详细解析了华大HC32F460在IAP固件升级过程中遇到的中断死机问题,提供了中断向量表偏移设置和中断注册清除的解决方案。通过实际案例和代码示例,帮助开发者快速定位并解决类似问题,提升固件升级的稳定性和可靠性。

weixin_30387339的博客 544

【云隐】STM32F103C8T6实现串口IAP方式升级固件

首先下载官方STM32F10X的IAP Bootloader源码,STM32F10x_AN2557_FW_V3.3.0。 源码包地址:http://download.youkuaiyun.com/download/yunyin_link/10151170 用Keil4打开工程代码STM32F10x_AN2557_FW_V3.3.0\Project\IAP\MDK-ARM\IAP.uvproj 第一步:因...

yunyin_link的博客 1万+

Windows 游戏 EXCEPTION_ACCESS_VIOLATION 修复:3类硬件问题与5步软件排查法

本文提供Windows游戏EXCEPTION_ACCESS_VIOLATION错误的终极修复指南,涵盖3类硬件问题(内存故障、显卡问题、超频不稳定)和5步软件排查法(文件验证、驱动更新、DEP调整等),帮助玩家彻底解决0xFFFFFFFFFFFFFFFF内存访问冲突问题。

weixin_31856057的博客 2427

STM32 IAP应用开发——通过USB实现固件升级

IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。在应用编程(IAP)是用户的应用代码对片内Flash存储器进行擦除/编程的方法。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到数据存储区,从而实现固件升级。

ShenZhen_zixian的博客 1万+

Git系列(一)、Git基础教程【建议收藏】

Git一、Git简介1.1、什么是Git? 一、Git简介 1.1、什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不用服务器端软件支持。 .........

一宿君 4万+

STM32固件升级设计——串口IAP升级(基于YMODEM协议)

摘要:本文介绍了基于STM32的串口IAP升级实现方案,采用YMODEM协议通过串口传输固件。系统将512K Flash划分为BootLoader区(12K)、标志位区(4K)和APP区(496K)。BootLoader负责检测升级标志,若需升级则持续发送字符"C"请求数据,接收完成后跳转至APP;APP程序可通过串口指令触发升级。

weixin_49030685的博客 8801

EPICS Phoebus手册1

EPICS客户端phoebus 手册

yuyuyuliang00的博客 3953

纯方位观测下的三维定位,IV-PLKF(Inverse Velocity-Weighted Pseudo-Linear Kalman Filter)

在现代定位系统中,纯方位观测因其无需测距设备的优势,在无线通信、无人机导航和室内定位等领域备受关注。本文深入探讨基于算法的三维定位方法,并提供完整的MATLAB仿真例程。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 672

STM32+IAP方案 实现网络升级应用固件

IAR环境下STM32+IAP方案的实现 STM32浅谈之IAP.pdf 基于IAP和Keil MDK的远程升级设计 keil MDK中如何生成*.bin格式的文件概况: 什么是IAP,为什么要IAP 可实现的原理 实现过程 细节及实现 向量表偏移后的程序是否能够正常运行? .hex转.bin

@角色扮演# 3万+

基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)

一、环境介绍 小车主控MCU: STM32F103ZET6 STM32程序开发IDE: keil5 STM32程序风格: 采用寄存器方式开发,注释齐全,执行效率高,方便移植 手机APP: 采用QT设计,程序支持跨平台编译运行(Android、IOS、Windows、Linux都可以编译运行,对应平台上QT的环境搭建,之前博客已经发了文章讲解) 硬件包含: 淘宝购买的完整一套4轮遥控小车(采用STM32F103ZET6作为主控板)、DHT11温湿度传感器、中科微GPS模块、ESP8266 ...

6万+
上一篇: 【固件升级】中断向量表(一)
下一篇: 【随手笔记】环形缓冲区之覆盖读写
Long-Run
博客等级 码龄3年 4600粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值