STM32CUBEIDE中修改FLASH起始地址的方法

若在MCU芯片中需要将程序分成两个部分(如同时包含DFU下载程序与正常的应用程序),则需要将其中一者的程序地址偏移至另一者之后。如,在STM32F103C8T6中,在最低优化等级下,使用USB-DFU约需要32KB的FLASH(从0x08000000-0x08007FFF),则用户的应用程序应当从0x08008000-0x08010000,故将程序偏移量应当设置成0x8000,程序起始地址变为0x08008000
keil的程序偏移地址如文章KEIL中设置程序偏移方法所述。
在STM32CUBEIDE中,程序偏移地址设置方法如下:

1.设置STM32F103C8TX_FLASH.ld文件,将40行代码:

FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 64K

与stm32f103xb.h文件中573行的代码:

#define FLASH_BASE            0x08000000UL /*!< FLASH base address in the alias region */

修改为(修改起始地址ORIGIN与可用FLASH长度LENGTH):

FLASH    (rx)    : ORIGIN = 0x8008000,   LENGTH = 32K

#define FLASH_BASE            0x08008000UL /*!< FLASH base address in the alias region */

在这里插入图片描述
在这里插入图片描述

设置程序的起始FLASH地址。(注意,要与USB-DFU程序中设置的程序烧录起始地址一致,否则可能会造成指针跳转错误)正常执行用户应用程序时只需要将MCU执行的函数指针指向0x08008000即可。

2. 开启中断向量表偏移,设置为跟FLASH偏移一致。若不修改,会无法正常执行中断。相关代码在system_stm32f1xx.c中,将97行至114行:

// #define USER_VECT_TAB_ADDRESS

#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 */

将注释消除,并将中断向量表偏移修改为与FLASH一致:

#define USER_VECT_TAB_ADDRESS

#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 */

在这里插入图片描述

3. 利用Notepad打开生成的HEX文件,检查程序地址如图所示。可见地址已经修改成功。而后就可以利用STM官方提供的dfu file manager将其转为dfu格式文件,并通过usb-dfu下载。即可正常执行程序。
在这里插入图片描述

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值