STM32CubeIDE实现Bootloader

本文介绍了如何使用STM32CubeIDE开发Bootloader并实现从Bootloader跳转到APP程序。内容包括Bootloader中利用函数指针的三种跳转方案,设置Flash大小以防止擦除APP程序,以及在APP部分配置中断向量表偏移量和修改应用程序的Flash首地址和大小。
摘要由CSDN通过智能技术生成

一、简介

1.1、开发环境

STM32CubeIDE软件版本:V1.9.0。

单片机型号:STM32F103ZETx。

1.2、主要内容

使用STM32CubeIDE实现Bootloader跳转到APP程序。需分别建立Bootloader和APP两个工程。

二、Bootloader工程

Bootloader的CubeMX无需设置,直接生成程序。

2.1、Bootloader跳转程序

Bootloader跳转程序,主要是利用函数指针,让程序跳转到指定的应用程序地址。以下3种方案殊途同归,选择其一即可。

方案1:用typedef定义跳转函数指针的别名。


typedef void (*p_APP)(void);

/*
 * 功能:运行应用程程序
 * 输入:app_address:应用程序起始地址
 * 输出:
 * 备注: 
 */
void StartApplication(uint32_t app_address)
{
    p_APP application;
    uint32_t jump_address;

    if (((*(__IO uint32_t*)app_address) & 0x2FFE0000 ) == 0x20000000)
    {
        jump_address = *(__IO uint32_t*) (app_address + 4);
        application = (p_APP) jump_address;

      __set_MSP(*(__IO uint32_t*) app_address);

      application();
    }
}

方案2:直接定义函数指针。


/*
 * 功能:运行应用程程序
 * 输入:app_address:应用程序起始地址
 * 输出:
 * 备注: 
 */
void StartApplication(uint32_t app_address)
{
    void (*p_APP)(void);
    uint32_t jump_address;

    if (((*(__IO uint32_t*)app_address) & 0x2FFE0000 ) == 0x20000000)
    {
        jump_address = *(__IO uint32_t*) (app_address + 4);
        p_APP = (void(*)(void))jump_address;

        __set_MSP(*(__IO uint32_t*) app_address);

        (*p_APP)();
    }
}

方案3:跳转时,强制类型转换为函数指针。


/*
 * 功能:运行应用程程序
 * 输入:app_address:应用程序起始地址
 * 输出:
 * 备注: 
 */
void StartApplication(uint32_t app_address)
{
    uint32_t jump_address;

    if (((*(__IO uint32_t*)app_address) & 0x2FFE0000 ) == 0x20000000)
    {
        jump_address = *(__IO uint32_t*) (app_address + 4);

        __set_MSP(*(__IO uint32_t*) app_address);

        (*(void(*)(void))jump_address)();
    }
}

2.2、设置Flash大小

打开Bootloader工程下的文件STM32F103ZETX_FLASH.ld。

本文分配给Bootloader的程序空间为8K,因此将Flash的大小改为8K,具体如下:


/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 8K
}

注:用编译器烧录程序时,只会根据当前程序大小,以Flash页或扇区为最小单位,擦除需要用到的Flash页或扇区。因此只要Flash分区合理,用编译器烧写Bootloader程序时,也不会擦除已经烧录的APP程序。修改的目的,只是为了在Bootloader的程序大小超过8K后,编译时,软件会报错提醒。

2.3、跳转示例


#define ApplicationFlashAddress 0x08002000  //定义应用程序地址

int main(void)
{
    StartApplication(uint32_t app_address);
    while();
}

注:此处的应用程序地址,要和“3.2修改应用程序Flash首地址和大小”设置的APP程序Flash起始地址一致。

三、APP部分

APP根据需求,配置完CubeMX,再生成程序。

3.1、设置中断向量表偏移量

打开文件system_stm32f1xx.c。

找到如下位置:


#if defined(USER_VECT_TAB_ADDRESS)
/*!< Uncomment the following line if you need to relocate your vector Table
     in Sram else user remap will be done in Flash. */
/* #define VECT_TAB_SRAM */
#if defined(VECT_TAB_SRAM)
#define VECT_TAB_BASE_ADDRESS   SRAM_BASE       /*!< Vector Table base address field.
                                                     This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET         0x00000000U     /*!< Vector Table base offset field.
                                                     This value must be a multiple of 0x200. */
#else
#define VECT_TAB_BASE_ADDRESS   FLASH_BASE      /*!< Vector Table base address field.
                                                     This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET         0x00000000U     /*!< Vector Table base offset field.
                                                     This value must be a multiple of 0x200. */
#endif /* VECT_TAB_SRAM */
#endif /* USER_VECT_TAB_ADDRESS */

主要修改内容:

(1)在语句“#if defined(USER_VECT_TAB_ADDRESS)”前面增加“#define USER_VECT_TAB_ADDRESS”;

(2)将“#define VECT_TAB_OFFSET 0x00000000U”改为“#define VECT_TAB_OFFSET 0x00002000”。

中断向量表偏移地址(0x00002000) = APP起始地址(0x08002000) - Flash起始地址(0x08000000)。

改后程序如下:


#define USER_VECT_TAB_ADDRESS                   //增加处1
#if defined(USER_VECT_TAB_ADDRESS)
/*!< Uncomment the following line if you need to relocate your vector Table
     in Sram else user remap will be done in Flash. */
/* #define VECT_TAB_SRAM */
#if defined(VECT_TAB_SRAM)
#define VECT_TAB_BASE_ADDRESS   SRAM_BASE       /*!< Vector Table base address field.
                                                     This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET         0x00000000U     /*!< Vector Table base offset field.
                                                     This value must be a multiple of 0x200. */
#else
#define VECT_TAB_BASE_ADDRESS   FLASH_BASE      /*!< Vector Table base address field.
                                                     This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET         0x00002000     //修改处1,0x00002000 = 应用程序地址 - 0x08000000
                                               /*!< Vector Table base offset field.
                                                     This value must be a multiple of 0x200. */
#endif /* VECT_TAB_SRAM */
#endif /* USER_VECT_TAB_ADDRESS */

注:若找不到以上程序段,可全局搜索“VECT_TAB_OFFSET”。

3.2、修改应用程序Flash首地址和大小

打开APP工程下的文件STM32F103ZETX_FLASH.ld。

APP程序Flash起始地址(ORIGIN)改为0x08002000。注意与Bootloader设置的跳转地址一致。

APP程序Flash空间大小(LENGTH)改为32K。

具体如下:


/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8002000,   LENGTH = 32K
}

### 回答1: STM32 bootloader开发是指开发一种程序,可以在STM32芯片上运行,用于更新或烧录芯片的固件。这种程序通常会在芯片上预留一部分空间,用于存储新的固件,同时还需要实现一些协议,如UART、USB等,以便与外部设备进行通信。STM32 bootloader开发需要熟悉芯片的硬件架构和编程语言,同时还需要了解bootloader的工作原理和实现方式。 ### 回答2: STM32是一款嵌入式系统开发的重要平台之一,它具有功能强大、易用性高等特点,因此备受广大开发者的青睐。在STM32的开发过程中,bootloader作为一个重要的组件,起到相当关键的作用。本文将介绍如何进行STM32 bootloader的开发。 STM32 bootloader是一种能够通过UART、USB等接口对设备进行Firmware升级的程序,它能够实现固件的安全升级,降低了使用者对升级的错误操作,大大提高了使用者的体验。STM32 bootloader的开发需要了解以下几个关键点: 1. 确认升级接口:STM32 bootloader可以通过UART、USB(HID、DFU、CDC等)等接口进行升级,我们需要确定升级接口的种类以便进行后续的开发工作。 2. 确认升级方式:开发者需要确认升级方式,是通过串口、USB等等接口进行升级,还是通过文件传输、FAT等其他方式进行升级。 3. 确认开发环境:STM32 bootloader的开发需要编写一些底层驱动代码,因此需要了解开发环境、开发工具的使用方法,选择合适的开发工具。 4. 编写底层驱动代码:基于底层硬件驱动代码的编写,我们需要进行串口、USB等驱动代码的编写,构建出与硬件相匹配的驱动层。 5. 编写app:在编写好底层驱动代码后,我们需要编写app程序,即STM32的主程序,负责进行芯片的初始化、引导等操作。 6. 确认程序跳转方法:编写完成app程序后,我们需要确保程序能够跳转,使设备能够在下次启动时通过bootloader引导进行程序更新。 7. 调试及测试:整个开发过程中需要进行调试、测试,以确保程序的兼容性、稳定性等。 在开发过程中,我们需要注意一些细节问题,比如启动时序稳定、bootloader容量大小、bootloader代码质量、芯片引脚分配等。只有在这些细节问题都得到妥善解决后,才能保证STM32 bootloader的正常运转。 总之,STM32 bootloader开发涉及到的问题较多,需要我们了解开发环境、编写底层驱动代码、编写app程序等,还需要进行严谨的调试及测试,只有这样才能保证bootloader的可用性和安全性,让使用者能够更加方便、安全、可靠地使用设备。 ### 回答3: STM32是一款高性能的ARM处理器,它有着广泛的应用,例如嵌入式系统、航空航天、汽车电子、通信设备等领域。STM32还具有标准化的开发板和强大的软件支持,这让开发者们更加便捷地进行STM32的开发。在STM32的开发过程中,Bootloader是很重要的一环,它可以帮助STM32进行自身的固件更新、系统升级、程序修改等操作。 开发一个STM32Bootloader,通常可以分为以下几个步骤: 第一步,了解STM32的Flash存储器。在STM32中,Flash存储器是用来存储程序代码的。开发者们需要在开发过程中了解Flash存储器的结构和特性,以及如何在程序中对Flash进行读写操作。 第二步,设计Bootloader的固件升级流程。开发者们需要考虑如何让系统在启动过程中进入Bootloader的状态,如何从外部介质(例如SD卡、串口等)中获取新的固件,并将它烧入Flash存储器。这一部分需要对STM32的系统启动和中断处理有一定的了解。 第三步,实现Bootloader的代码。在这一步中,开发者们需要根据所设计的固件升级流程,编写对应的代码。代码中应该包括读取外部介质的函数、写数据到Flash存储器的函数、检查固件的合法性等功能。 第四步,测试Bootloader的功能。在开发过程中,是必须经过实际测试才能确认Bootloader的功能是否正常。开发者们需要考虑多种情况,例如在升级固件期间是否存在断电等异常情况。 总的来说,开发STM32Bootloader需要有一定的硬件和软件开发经验,需要对STM32的Flash存储器、系统启动和中断处理有一定的了解,并且需要通过实际测试来确认代码的正确性。当然,STM32Bootloader也可以通过现有的开源代码进行修改和使用,这可以节省开发者的时间和精力。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪恒远

感君意气无所惜,一为歌行歌主客

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值