STM32系统和自定义bootloader的实现和应用

这篇具有很好参考价值的文章主要介绍了STM32系统和自定义bootloader的实现和应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01 bootloader

简介

bootloader其实就是一段启动程序,它在芯片启动的时候最先被执行,可以用来做一些硬件的初始化或者用作固件热更新,当初始化完成之后跳转到对应的应用程序中去。

bootloader程序需要通过下载器烧写到芯片中,而APP则可以通过有线方式的UART、IIC、USB、SPI等总线来通过bootloader来更新,视所设计的bootloader程序而定。另外,对于无线方式热更新APP,一般是用WiFi、bluetooth通过UART透传的方式烧写芯片APP程序。

另外,也可以合并bootloader的bin文件和APP的bin文件,一次过烧写到芯片中。

功能

1.在一定时间内判断是否需要更新 APP,如果需要则接收APP程序并将其烧写到指定地址的 flash 空间里。并从该bootloader中获取栈顶指针和 Reset_Handler 指针,然后跳转执行程序。

2.等待超时后,则在该bootloader地址直接获取之前的栈顶指针和 Reset_Handler 指针并跳转执行。

02 STM32系统bootloader

简介

STM32系统bootloader在《AN2606》有详细介绍及各系列MCU在不同bootloader peripherals方式下所使用的引脚。

整体程序执行过程

flash分配情况

当我们将存储器映射到系统bootloader时(跳转到系统bootloader),代码空间中只有系统bootloader时的内存分配情况如下图所示。
STM32系统和自定义bootloader的实现和应用

执行过程

进入系统存储器并在程序启动后,先从0x1FFF0004处取出复位中断向量地址,执行完复位中断函数后跳转到系统bootloader程序main函数中执行[①]。

当发生中断请求后,程序跳转到中断向量表中取出中断函数入口地址,再跳转到中断服务函数中执行[②],执行完中断函数后返回main函数中[③],然后执行系统bootloader过程,成功后跳转到主Flash区(执行跳转指令),或者复位(BOOT0 = 0时)[④]。

从主Flash的中断向量表处(0x0800 0004)得到相应中断函数地址,执行相应的中断服务函数后,回到APP的main函数中[⑤]。后面[⑥⑦⑧]的过程和前述一致,不再赘述。

STM32系统和自定义bootloader的实现和应用

bootloader地址

不同系列芯片的bootloader的地址不一样,F10x和F4xx在0x1FFF0000地址,而H7x3系列的在0x1FF09800地址。

MSP:主堆栈
PSP:线程堆栈

bootloader程序执行流程

F4和H7系列的执行流程要注意的一点是,如果在MCU进入系统BootLoader前就接入了USB信号线,会导致进入系统BootLoader后优先执行USB DFU方式,导致无法执行其他接口方式。

F10x(x:0,1,2,3)系列

下面是10x系列的BootLoader程序执行流程。

STM32系统和自定义bootloader的实现和应用

F4xx系列

下面是F4xx系列的BootLoader程序执行流程。

STM32系统和自定义bootloader的实现和应用

H7x3系列

下面是H7x3系列的BootLoader程序执行流程。

STM32系统和自定义bootloader的实现和应用

进入bootloader的方法

STM32进入系统的bootLoader有两种方法。

1.设置boot引脚(部分系列会结合选项字节组合成不同模式)

F10x系列

F10x系列支持以下几种启动方式。

STM32系统和自定义bootloader的实现和应用

F4xx系列

F4xx系列支持以下几种启动方式。

STM32系统和自定义bootloader的实现和应用

H7x3系列

H7x3系列支持以下几种启动方式。H7系列没有BOOT1,但增加了专门的option bytes来设置存储器地址。通过BOOT_ADD0和BOOT_ADD1这两个选项字节,可以设置bootloader的首地址为0x0000 0000到0x3FFF 0000。

STM32系统和自定义bootloader的实现和应用

2.应用程序直接跳转到系统bootLoader。

注意几个问题

  • 禁用所有外设时钟
  • 禁止使用的PLL
  • 禁止所有中断
  • 清除所有中断挂起标志

跳转流程

STM32系统和自定义bootloader的实现和应用

示例代码

void System_Jump2Bootloader(void)
{
    uint32_t i = 0;

    /** 声明一个函数指针 */
    void (SysJump2Boot)(void); 

    /** STM32F4的系统BootLoader地址 */
    __IO uint32_t BootloaderAddr = 0x1FFF0000; 

    /** 关闭全局中断 */
    __disable_irq();

    /** 关闭滴答定时器,复位到默认值 */
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    /** 设置所有时钟到默认状态,使用HSI时钟 */    
    HAL_RCC_DeInit();

    /** 关闭所有中断,清除所有中断挂起标志 */
    for (i = 0; i < 8; i++)
    {
        NVIC->ICER[i] = 0xFFFFFFFF;
        NVIC->ICPR[i] = 0xFFFFFFFF;
    } 

    /** 使能全局中断 */
    __enable_irq();

    /** 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
    SysJump2Boot = (void (*)(void)) (*((uint32_t *) (BootloaderAddr + 4)));

    /** 设置主堆栈指针 */
    __set_MSP(*(uint32_t *)BootloaderAddr);

    /** 如果使用了RTOS工程,需要用到这条语句,设置为特权级模式,使用MSP指针 */
    __set_CONTROL(0);

    /* 跳转到系统BootLoader */
    SysJump2Boot(); 

    /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
    while (1)
    {
        printf("Jump to bootloader fail\r\n");
        break;
    }
}

退出bootloader的方法

USB DFU方式

更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,完成bootloader后一般会拔除USB线,这样就可以使芯片复位。所以是否支持自动退出,并不影响。

UART IAP方式

更新完毕程序后,可以自动退出。所以基于串口来使用系统bootloader比较方便,一般我们也是使用这种方式。

bootloader擦写flash问题

  • flash写操作只能字(32位)对齐,地址应该是4的倍数。要写入的数据数量也必须是4的倍数但接受未对齐的半页写地址。如果写入地址为非对齐,则会出现擦写对齐错误。
  • 写数据之前需要擦除对应地址数据才能正常写入,否则会出现失败。通常的做法是读出整页(或扇区)数据并缓存,然后再擦除整页,最后写入。
  • STM32内部Flash在进行写或擦除操作时,总线处于阻塞状态,此时读取Flash数据就会出现失败。需要通过标志判断写/擦除操作是否完成,再进行操作。

USB DFU方式固件升级

以F4系列为例,F4的系统bootloader地址是0x1FFF0000。注意要将系统bootloader的地址映射到0x00000000。

跳转bootloader程序设计

在APP程序中利用板载按键来调用下面的函数进入系统bootloader,不需要配置boot0脚为高电平。

void System_Jump2Bootloader(void)
{
    uint32_t i = 0;

    /** 声明一个函数指针 */
    void (SysJump2Boot)(void); 

    /** STM32F4的系统BootLoader地址 */
    __IO uint32_t BootloaderAddr = 0x1FFF0000; 

    /** 关闭全局中断 */
    __disable_irq();

    /** 关闭滴答定时器,复位到默认值 */
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    /** 设置所有时钟到默认状态,使用HSI时钟 */    
    HAL_RCC_DeInit();

    /** 关闭所有中断,清除所有中断挂起标志 */
    for (i = 0; i < 8; i++)
    {
        NVIC->ICER[i] = 0xFFFFFFFF;
        NVIC->ICPR[i] = 0xFFFFFFFF;
    } 

    /** 使能全局中断 */
    __enable_irq();

    /** 
    * 重映射到系统flash
    * 将系统bootloader的地址映射到0x00000000
    */
    __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();

    /** 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
    SysJump2Boot = (void (*)(void)) (*((uint32_t *) (BootloaderAddr + 4)));

    /** 设置主堆栈指针 */
    __set_MSP(*(uint32_t *)BootloaderAddr);

    /** 如果使用了RTOS工程,需要用到这条语句,设置为特权级模式,使用MSP指针 */
    __set_CONTROL(0);

    /* 跳转到系统BootLoader */
    SysJump2Boot(); 

    /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
    while (1)
    {
        printf("Jump to bootloader fail\r\n");
        break;
    }
}
固件升级操作

以F4xx系列,用STM32CubeProgrammer升级固件为例。首先将带有USB_OTG_FS_DM(PA11)和USB_OTG_FS_DP(PA12)两个信号脚的USB接入电脑端,然后根据所需方式触发以上述跳转程序。跳转成功后,在电脑设备管理器里就会看到bootloader的标识。

STM32系统和自定义bootloader的实现和应用

打开STM32CubeProgrammer并选择USB模式,然后选择Connect

STM32系统和自定义bootloader的实现和应用

最后在Erasing & Programming中加载hex文件并点击Start Program…升级固件即可。

STM32系统和自定义bootloader的实现和应用

UART IAP方式固件升级

使用系统bootloader做串口IAP升级时,USB接口不要接线到电脑端。

跳转bootloader程序设计

在APP程序中利用板载按键来调用下面的函数进入系统bootloader,不需要配置boot0脚为高电平。

void System_Jump2Bootloader(void)
{
    uint32_t i = 0;

    /** 声明一个函数指针 */
    void (SysJump2Boot)(void); 

    /** STM32F4的系统BootLoader地址 */
    __IO uint32_t BootloaderAddr = 0x1FFF0000; 

    /** 关闭全局中断 */
    __disable_irq();

    /** 关闭滴答定时器,复位到默认值 */
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    /** 设置所有时钟到默认状态,使用HSI时钟 */    
    HAL_RCC_DeInit();

    /** 关闭所有中断,清除所有中断挂起标志 */
    for (i = 0; i < 8; i++)
    {
        NVIC->ICER[i] = 0xFFFFFFFF;
        NVIC->ICPR[i] = 0xFFFFFFFF;
    } 

    /** 使能全局中断 */
    __enable_irq();

    /** 
    * 重映射到系统flash
    * 将系统bootloader的地址映射到0x00000000
    */
    __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();

    /** 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
    SysJump2Boot = (void (*)(void)) (*((uint32_t *) (BootloaderAddr + 4)));

    /** 设置主堆栈指针 */
    __set_MSP(*(uint32_t *)BootloaderAddr);

    /** 如果使用了RTOS工程,需要用到这条语句,设置为特权级模式,使用MSP指针 */
    __set_CONTROL(0);

    /* 跳转到系统BootLoader */
    SysJump2Boot(); 

    /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
    while (1)
    {
        printf("Jump to bootloader fail\r\n");
        break;
    }
}
固件升级操作

以F4xx系列,用STM32CubeProgrammer升级固件为例。首先将带有USART1_TX(PA9)和USART1_RX(PA10)两个信号脚的串口线接入电脑端,然后根据所需方式触发以上述跳转程序。跳转成功后,在电脑设备管理器里就会看到bootloader的标识。

STM32系统和自定义bootloader的实现和应用

打开STM32CubeProgrammer并选择UART模式,然后选择Connect

STM32系统和自定义bootloader的实现和应用

看到系统bootloader信息即代表连接成功。

STM32系统和自定义bootloader的实现和应用

最后在Erasing & Programming中加载hex文件并点击Start Program…升级固件即可。

STM32系统和自定义bootloader的实现和应用

03 自定义bootloader实现IAP功能

简介

IAP( In Application Programming)在线应用编程,即是用户可以使用自定义程序对单片机用户Flash的某一区域进行烧写,通过BootLoader来完成对App程序的更新升级。实际工作中,是为了产品发布后,可以方便的使用预留的通信接口(串口、USB、网口、蓝牙等)来完成程序的升级,避免需要把产品拆开,再使用仿真下载器来更新应用程序。

而要实现IAP功能,要做两部分工作。

1.Bootloader程序

2.App程序

总体架构

以F407IG为例,芯片flash空间为1MB大小,定义bootloader架构如下。包括Ymodem协议,USART1收发和菜单,flash操作,bootloader空间配置及应用程序跳转等部分。

STM32系统和自定义bootloader的实现和应用

地址划分

Bootloader 程序区设置于0x8000000 ~ 0x8004000地址范围内。Application程序区设置于0x8004000 ~ 0x8100000地址范围。

注意以1024 bytes的倍数划分地址,其他特殊地址会发生异常。

STM32系统和自定义bootloader的实现和应用

整体程序执行过程

flash分配情况

加入自定义IAP程序时的内存分配情况。

STM32系统和自定义bootloader的实现和应用

执行过程

程序启动后,先从0x08000004处取出复位中断向量地址,执行完复位中断函数后跳转到IAP程序main函数中执行[①]。

当发生中断请求后,程序跳转到中断向量表中取出中断函数入口地址,再跳转到中断服务函数中执行[②],执行完中断函数后返回main函数中[③],然后执行IAP过程,成功后跳转到APP程序[④]。

从偏移后的中断向量表得到相应中断函数地址,执行相应新的中断服务函数后,回到APP的main函数中[⑤]。后面[⑥⑦⑧]的过程和前述一致,不再赘述。

STM32系统和自定义bootloader的实现和应用

IAP程序执行流程

STM32系统和自定义bootloader的实现和应用

中断向量表

什么是中断向量表

如执行过程中所示,中断向量表是存放在Flash区从0x00000004地址(默认)开始的一个数组,数组元素的大小为4个字节,即每一表项的大小为4个字节,这些数组在启动文件中已经初始化好。不同系列根据中断向量的多少,有不同的数组长度。

STM32根据内核和外设中断的优先级,把内核和外设的中断服务函数的地址放在这个数组里面,数组的下标跟中断的优先级对应,也把这个中断的编号叫做中断向量,标号越小,优先级越高。

在启动文件执行的时候,内核和外设的中断服务函数地址都是确定的,地址就在中断向量表中,并且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义。

如果使用到相关中断则需要在用户程序里重新实现对应的中断服务函数,而且重写这个中断服务函数的时候,函数名必须跟启动文件里定义好的中断函数名对应,这是因为函数名对应的就是中断服务函数的地址。

当中断发生时,因为每个中断的中断向量不一样,CPU会首先去取向量。然后根据向量来查询中断向量表,最后根据对应的地址找到对应的中断服务函数,从而实现整个中断的响应过程。

中断向量表的设置

如前面介绍所属,中断向量表是默认存放在Flash区从0x00000004地址的。而我们在flash分配时改变APP程序的起始地址为0x08004000,所以我们要设置新的中断向量表的地址。

M0+、M3、M4和M7内核系列的芯片在system_xxx32xxx.c文件中可以找到VECT_TAB_OFFSET这个向量表偏移量宏定义来重新设置中断向量表的地址,也即是修改SCB->VTOR向量表偏移量寄存器。这里我们改成

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET

其中
FLASH_BASE = 0x08000000
VECT_TAB_OFFSET = 0x4000。

STM32系统和自定义bootloader的实现和应用

相应的APP工程文件中ROM起始地址也修改为0x08004000。

STM32系统和自定义bootloader的实现和应用

至于M0系列芯片比较特殊,这个系列的芯片是没有SCB->VTOR这个寄存器的。那么M0系列芯片怎么修改中断向量表呢?我们在官方参考手册中可以找到以下一段描述:

Physical remap

Once the boot mode is selected, the application software can modify the memory accessible in the code area.This modification is performed by programming the MEM_MODE bits in the SYSCFG configuration register 1 (SYSCFG_CFGR1). Unlike Cortex® M3 and M4, the M0 CPU does not support the vector table relocation. For application code which is located in a different address than 0x0800 0000, some additional code must be added in order to be able to serve the application interrupts. A solution will be to relocate by software the vector table to the internal SRAM:

• Copy the vector table from the Flash (mapped at the base of the application load address) to the base address of the SRAM at 0x2000 0000.

• Remap SRAM at address 0x0000 0000, using SYSCFG configuration register 1.

• Then once an interrupt occurs, the Cortex®-M0 processor will fetch the interrupt handler start address from the relocated vector table in SRAM, then it will jump to execute the interrupt handler located in the Flash.

This operation should be done at the initialization phase of the application. Please refer to AN4065 and attached IAP code from www.st.com for more details.

简单说就是要重定义中断向量表到SRAM中,以L072VB为例,可以用进行重定义。

/** APP程序起始地址*/
#define APPLICATION_ADDRESS    ((uint32_t)0x08004000)
#define SRAM_ADDRESS		   ((uint32_t)0x20000000)
#define VECTOR_NUM			   48
#define VECTOR_SIZE			   VECTOR_NUM * 4

void APP_SetVectorTable(void)
{ 
	uint8_t i;
 
	uint32_t *pVecTab = (uint32_t *)(SRAM_ADDRESS);
	/** 复制中断向量表到SRAM首地址*/
	for(i = 0; i < VECTOR_NUM; i++)
	{
		*(pVecTab++) = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i << 2));
	}
	/** 开启 SYSCFG 时钟*/
	__HAL_RCC_SYSCFG_CLK_ENABLE();
	/** 重映射 SRAM 地址到 0x00000000*/
	__HAL_SYSCFG_REMAPMEMORY_SRAM();
}

重定义后,若发生中断,CPU就会去SRAM(即0x2000 0000处)取中断向量。那么从0x2000 0000作为起始地址之后的VECTOR_SIZE个字节就不能被改动了。所以需要对工程SRAM起始地址及长度进行配置,如下图。

STM32系统和自定义bootloader的实现和应用

注意:
1.向量表的偏移是有要求的,必须先求出系统中共有多少个向量(在.s启动文件中可以找到定义的向量),再把这个数字向上增大到是2的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有45个向量,则要向上增大到2的整数次幂的值64,因此起始地址必须能被64 * 4 = 256整除。

2.M0+系列的中断向量表偏移量必须是0x100的倍数,M3、M4、M7系列的中断向量表偏移量必须是0x200的倍数。

APP更新文件

APP是主用户程序,在完成IAP程序的设计后,就要把APP的更新文件生成,然后通过一定的协议传输给IAP程序来进行APP固件的更新。

一般来说APP更新文件的文件类型为.bin文件,该文件可以直接拷贝到flash中运行。

文件生成方式

配置Output,生成STM32L072.axf可执行文件。

STM32系统和自定义bootloader的实现和应用

配置User,使用fromelf.exe生成bin文件,默认生成在工程目录,命令如下:

/** 命令1 适用于单个ROM*/
fromelf.exe --bin -o ./out.bin !L
/** 命令2 适用于单个或多个ROM*/
fromelf.exe --bin --bincombined --bincombined_padding=1,0xff --output outfile.bin  !L

STM32系统和自定义bootloader的实现和应用

文件传递方式

生成bin文件后,就可以根据bootloader程序选择某种传输方式进行bin文件的传递了。这里我们选择Ymodem协议。

文件传输协议

在进行文件传输时,为使文件能被正确识别和传送,需要在两台计算机之间建立统一的传输协议,协议需要包括文件的识别、传送的起止时间、错误的判断与纠正等内容。

常用的文件传输协议

1.ASCII
传输速度快最快,但只能传送文本文件。

2.Xmodem
输速度较慢,采用了CRC校验算法,传输的准确率可高达99.6%;每次传输信息块为128字节。

3.Ymodem
Ymodem是Xmodem的改进版,每次传输信息块最大1024字节,速度比Xmodem快,同时还支持传输多个文件。

4.Zmodem
Zmodem采用了串流式(streaming)传输方式,传输速度较快,而且还具有自动改变区段大小和断点续传、快速错误侦测等功能。Zmodem是目前最流行的文件传输协议。

Ymodem协议

Ymodem协议用于计算机间传输文件,同样适用于嵌入式领域,如MCU升级固件时,可以使用Ymodem协议传输固件文件,传输总线也不限于USB、UART、CAN等。

SecureCRT升级固件的方法

部分版本对CH340支持不好,会出现数据接收不到的问题出现。

安装 SecureCRT 软件。

STM32系统和自定义bootloader的实现和应用

使用串口将目标板与电脑连接。

打开 SecureCRT 软件,并从左边找到 Session Manager 窗口展开。

STM32系统和自定义bootloader的实现和应用

选择"+"号,添加串口。

STM32系统和自定义bootloader的实现和应用

选择目标板串口并配置参数。

STM32系统和自定义bootloader的实现和应用

或者直接选择快速连接,然后配置串口和参数也可以。

STM32系统和自定义bootloader的实现和应用

数据传输界面窗口闪烁,则表示可以发送数据。

STM32系统和自定义bootloader的实现和应用

给目标板上电或者按复位键,即可显示串口菜单。

STM32系统和自定义bootloader的实现和应用

发送‘1’选择下载固件,并等待目标板返回‘c’

STM32系统和自定义bootloader的实现和应用

从 Transfer 中选择 Send Ymodem选项,进入如下界面,选择需要下载的 bin 文件并添加到发送窗,最后 点击OK 即可。

STM32系统和自定义bootloader的实现和应用

此时可以看到正在传输 bin 文件,传输到 100% 时,传输完成。视bootloader程序的设定而定,程序进入更新好的程序中执行或者返回串口菜单再次选择。

STM32系统和自定义bootloader的实现和应用

参考文献

1.AN2606应用笔记
2.STM32 Bootloader原理分析
3.AN3965 使用USART进行STM32F4应用内编程(IAP)
4.AN4065 使用USART进行STM32F0应用内编程(IAP)
5.Keil生成bin文件
6.Ymodem协议文章来源地址https://www.toymoban.com/news/detail-410733.html

到了这里,关于STM32系统和自定义bootloader的实现和应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32深入系列02——BootLoader分析与实现

    ==== 文章汇总 ==== 这个应该是最基本的方法,只要自己写过程序的应该都会,将编译生成的 hex 文件使用 ST-Link 工具或者 J-Link 工具直接下载进 Flash 即可。Keil中点击下载也能一键下载。 下载时可以看到地址是从 0x0800 0000 ,即 Flash 的起始地址开始下载的。 优点 :简单,插上下

    2024年02月02日
    浏览(48)
  • stm32利用bootloader与app实现远程升级

    1、flash空间分配: 事先在flash开辟好空间,假设flash为128k,我这边给它分为五个区,分别为bootloader、标志位、application、application backup、标签ID。 (注:升级之前,app的代码烧录于application的flash存储区域内。用于app升级的 bin文件 大小一定要小于自己开辟的flash空间大小)

    2024年02月13日
    浏览(50)
  • STM32 BOOTLOADER配置以及APP跳转实现(裸机)

    Bootloader:  Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。 APP: APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行 拓展:

    2024年02月06日
    浏览(38)
  • 【STM32】IAP升级01 bootloader实现以及APP配置(主要)

    通过之前的了解 之前的了解,我们知道实现IAP升级需要两个条件: 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始; 2.APP程序的中断向量表相应的移动,移动的偏移量为 x; 默认条件下的起始地址 默认的条件下,图中 IROM1 的起始地址(Start)一般为 0x08000000,大小

    2024年02月03日
    浏览(46)
  • 单片机(STM32,GD32,NXP等)中BootLoader的严谨实现详解

    Bootloader( 引导加载程序 )的主要任务是引导加载并运行应用程序,我们的软件升级逻辑也一般在BootLoader中实现。本文将详细介绍BootLoader在单片机中的实现,包括 STM32、GD32、NXP Kinetis 等等的所有单片机,因为无论是什么样的芯片,它实现的逻辑都是一样的。 注意,本篇文章主

    2024年02月02日
    浏览(60)
  • Java实现钉钉企业内部应用机器和自定义机器人发送消息

     公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义

    2024年02月12日
    浏览(59)
  • STM32 usart bootloader 源代码 STM32 usart bootloader 源代码 STM32 usart bootloader 原代源码

    STM32 usart bootloader 源代码   STM32 usart bootloader 源代码  STM32 usart bootloader 原代源码,上位机C#,下位机c。 简单修改可以支持stm32全系列芯片。 支持串口升级 该版本为优化过的版本, 1.支持代码段保护; 2.支持烧写失败重置; 3.兼容我公司生产的配套wifi模块和w5500模块远程更新

    2024年01月23日
    浏览(47)
  • STM32duino-bootloader:STM32的开源Bootloader深入解析

    STM32微控制器广泛应用于各种嵌入式系统。一个常见的需求是能够远程更新固件,而这通常是通过Bootloader来实现的。在本文中,我们将深入解析一个叫做STM32duino-bootloader的开源项目,它为STM32微控制器提供了一个USB DFU (Device Firmware Upgrade) bootloader。 STM32duino-bootloader简介 STM32d

    2024年02月11日
    浏览(43)
  • STM32 简易Bootloader

    目录 前言: 一、flash分配 二、起始地址设置方法 三、设置app生成bin文件 四、下载程序  五、合并hex         主要实现bootloader串口读取app程序 ,将app程序拷贝到对应运行的flash区域,跳转到对应的区域执行代码。本文没有复杂的显示,app只点亮一个灯做测试用。        

    2024年02月13日
    浏览(33)
  • STM32 Bootloader开发记录

    编写一个基础的Bootloader,记录一下开发过程及遇到的问题。 1、基本思路 作为一个Bootloader,它首先需要具备跳转功能,能够跳转到我们的APP地址空间中运行APP。 其次,它还需要有能够读写FLASH的能力。除了启动APP,另外还有对APP进行升级的操作,这个功能需要用到读写FLAS

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包