rui911 发表于 2024-11-4 14:21

GD32 Embedded Bulider怎么设置程序偏移地址

#技术资源#如题,GD32 Embedded Bulider怎么设置程序偏移地址?

我使用的是GD32D303RE,需求是OTA升级。目前使用keil的程序都能跑通,但是转到GD的IDE就不行。
我已修改(1)flash.ld中的 FLASH (rx)      : ORIGIN = 0x0800E000, LENGTH = 456K;(2)system_gd32f30x.c中加了
#define VECT_TAB_OFFSET(uint32_t)0xE000            /* vector table base offset */   
#ifdef VECT_TAB_SRAM
    nvic_vector_table_set(NVIC_VECTTAB_RAM, VECT_TAB_OFFSET);
#else
    nvic_vector_table_set(NVIC_VECTTAB_FLASH, VECT_TAB_OFFSET);
#endif
请问我还需要修改哪些部分?

tpgf 发表于 2024-11-5 10:21

在启动文件中(如startup_gd32f30x.s或类似文件),需要定义向量表的偏移量

rui911 发表于 2024-11-5 11:04

本帖最后由 rui911 于 2024-11-5 11:15 编辑

你好,我看md_S文件中已经调用SystemInit了,我在该函数中已设置向量表偏置。我这样设置过了,请问该程序还是不能启动(在0x0800E000地址上。(我有bootloade程序跳转至该地址)


void SystemInit (void)
{
/* FPU settings */
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));/* set CP10 and CP11 Full Access */
#endif
    /* reset the RCU clock configuration to the default reset state */
    /* Set IRC8MEN bit */
    RCU_CTL |= RCU_CTL_IRC8MEN;
    while(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){
    }
    RCU_MODIFY(0x50);

    RCU_CFG0 &= ~RCU_CFG0_SCS;

#if (defined(GD32F30X_HD) || defined(GD32F30X_XD))
    /* reset HXTALEN, CKMEN and PLLEN bits */
    RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN);
    /* disable all interrupts */
    RCU_INT = 0x009f0000U;
#elif defined(GD32F30X_CL)
    /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */
    RCU_CTL &= ~(RCU_CTL_PLLEN |RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN);
    /* disable all interrupts */
    RCU_INT = 0x00ff0000U;
#endif

    /* reset HXTALBPS bit */
    RCU_CTL &= ~(RCU_CTL_HXTALBPS);

    /* Reset CFG0 and CFG1 registers */
    RCU_CFG0 = 0x00000000U;
    RCU_CFG1 = 0x00000000U;

    /* configure the system clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */
    system_clock_config();
               
#ifdef VECT_TAB_SRAM
    nvic_vector_table_set(NVIC_VECTTAB_RAM, VECT_TAB_OFFSET);
#else
    nvic_vector_table_set(NVIC_VECTTAB_FLASH, VECT_TAB_OFFSET);
#endif               
               
}


rui911 发表于 2024-11-5 11:14

tpgf 发表于 2024-11-5 10:21
在启动文件中(如startup_gd32f30x.s或类似文件),需要定义向量表的偏移量

你好,我这样设置过了,请问该程序还是不能启动(在0x0800E000地址上)。
(我有bootloade程序跳转至该地址)

rui911 发表于 2024-11-5 11:15

tpgf 发表于 2024-11-5 10:21
在启动文件中(如startup_gd32f30x.s或类似文件),需要定义向量表的偏移量

你好,我这样设置过了,请问该程序还是不能启动(在0x0800E000地址上
(我有bootloade程序跳转至该地址)

paotangsan 发表于 2024-11-6 11:46

使用nvic_vector_table_set函数来设置向量表的基址

onlycook 发表于 2024-11-6 13:15

在GD32 Embedded Builder中设置程序偏移地址,通常涉及对链接脚本(Linker Script)的修改。链接脚本用于定义程序的内存布局,包括代码、数据、堆栈等区域的起始地址和大小。

renzheshengui 发表于 2024-11-6 15:12

在系统文件中,添加与启动文件中相同的向量表偏移量定义

wakayi 发表于 2024-11-6 18:32

如果需要更细粒度的控制,可以修改链接器脚本文件

wowu 发表于 2024-11-6 20:22

链接器脚本中,需要根据MCU的具体型号和内存布局来设置FLASH的基地址和长度

xiaoqizi 发表于 2024-11-6 22:08

建议参考GD32官方文档和示例代码,以确保正确性和兼容性
页: [1]
查看完整版本: GD32 Embedded Bulider怎么设置程序偏移地址