由于STM32H750的RAM是分段不连续,我只能将外部Flash程序分开搬到RAM中运行。测试只搬一两个简单函数是没有问题。程序量大后就不正常,仿真查看程序内容发现MCU跳转的地址和实际地址对不上。例如MCU调用函数地址为0x30000000,实际函数的地址可能是0x30000001或者是其他地址。
下面是RAM拷贝的程序和ICF的配置
RCC->AHB2ENR |= 0xE0000000; // 使能SRAM1、SRAM2、SRAM3
#if 1
src = (uint8_t *) __section_begin("USER_PRG1_RBLOCK");
dst = (uint8_t *) __section_begin("USER_PRG1_WBLOCK");
size = (uint32_t) __section_size("USER_PRG1_WBLOCK");
bsp_copy_4byte(src, dst, size);
RAM_Fault_Cnt_DW(src, dst, size);
#endif
#if 1
src = (uint8_t *) __section_begin("USER_PRG2_RBLOCK");
dst = (uint8_t *) __section_begin("USER_PRG2_WBLOCK");
size = (uint32_t) __section_size("USER_PRG2_RBLOCK");
//if (0 != ((uint32_t)src&0x01))
{
//src += 1;
}
bsp_copy_4byte(src, dst, size);
RAM_Fault_Cnt_DW(src, dst, size);
#endif
#if 1
src = (uint8_t *) __section_begin("USER_PRG3_RBLOCK");
dst = (uint8_t *) __section_begin("USER_PRG3_WBLOCK");
size = (uint32_t) __section_size("USER_PRG3_WBLOCK");
bsp_copy_4byte(src, dst, size);
RAM_Fault_Cnt_DW(src, dst, size);
#endif |