Linker 将应用程序编译为非从flash stm32L4R9I开始运行

Linker 将应用程序编译为非从flash stm32L4R9I开始运行,linker,usb,stm32,flash-memory,dfu,Linker,Usb,Stm32,Flash Memory,Dfu,我有一个steval-stwinkt1板,我正在尝试支持DFU模式 我将引导加载程序固件闪存到闪存(0x8000000)的开始处,该闪存允许您加载到通过DFU模式上载的另一个固件中,或保留在当前程序中以闪存新固件并抛出USB 我用了这个st教程- 我尝试了STM32Cube附带的.dfu包,发现程序运行成功,所以我假设引导加载程序可以工作 但是,当我试图用我的软件制作我自己的DFU包时,软件从未加载,我遇到了严重的错误。我根据ST totorial和Changing对0x800C000所做的一些

我有一个steval-stwinkt1板,我正在尝试支持DFU模式

我将引导加载程序固件闪存到闪存(0x8000000)的开始处,该闪存允许您加载到通过DFU模式上载的另一个固件中,或保留在当前程序中以闪存新固件并抛出USB

我用了这个st教程-

我尝试了STM32Cube附带的.dfu包,发现程序运行成功,所以我假设引导加载程序可以工作

但是,当我试图用我的软件制作我自己的DFU包时,软件从未加载,我遇到了严重的错误。我根据ST totorial和Changing对0x800C000所做的一些研究移动了软件,如下所示:

在FLASH.ld文件中:

FLASH(rx):原点=0x8000000,长度=2048K
致:

闪烁(rx):原点=0x800C000,长度=2048K 在stm32l4r9xx.h中,将FLASH_BASE更改为:

#定义闪存基础(0x0800C0000UL)
在另一次尝试中,我尝试将
FLASH\u BASE
更改为
VECT\u TAB\u OFFSET
,但仍然不起作用

要制作dfu包,我使用dfu工具(我使用linux)并使用以下命令:

dfu工具转换dfuse software.bin software.dfu
我还尝试使用我使用的教程中使用的官方工具转换hex int-dfu包,但仍然不起作用

当我加载dfu包时,我需要更改什么才能使我的软件正常工作

谢谢


itay

在我看来,您似乎忽略了一个事实,即您的应用程序专用闪存大小不再是2048K,因为您的自定义引导加载程序现在放置在闪存的开头。因此,您需要从总闪存大小中减去应用程序的闪存源:

 FLASH    (rx) : ORIGIN = 0x800C000,    LENGTH = 2048K - (ORIGIN(FLASH) - 0x8000000)

在这种情况下,建议尝试使用
HardFault\u Handler()
和一些编码来调试硬故障。然后,您将能够提取和分析链接寄存器、程序计数器、程序状态寄存器、,等硬故障发生时。

根据openocd程序员的输出,当我得到硬故障时,寄存器是:xPSR:0x00000003 pc:00000000 msp:0x464c4560,将相似的更改为您编写的没有repair@Finci-我猜我也算错了闪光的长度。我刚刚编辑了答案。试着看看这是否适合你。请记住,您仍然需要将
VECT_TAB_OFFSET
定义为中断向量表的当前地址。我已将VECT_TAB_OFFSET设置为0xC000,并将闪存行设置为注释中的精确行,现在我不会从程序员那里得到硬错误,但经过更多测试后,程序仍然不会加载(没有改变任何东西)我仍然每次都会遇到5个硬错误,看起来电路板仍然尝试从0开始,而不是从正确的位置开始。如果我尝试使用DFU引导加载程序运行,或者只是尝试直接编程,这都很重要-这两种方式都会导致死机程序仍然需要帮助,如果有人有过这种经历,请需要帮助