评论
应该将设置移至 0x08008000 处的扇区 2?为此必须修改.ld 文件。如果你能试一试就好了,因为我没有可以测试的板。 |
扇区 2 是引导加载程序寻址的程序开始。我将最后一个扇区 11 用于 EEPROM_EMUAL(该扇区为 128k,但我们总共有 1M)。现在它似乎工作!我必须做一些测试才能真正确定…… 我的改变是:
/* 内存定义 */
#define FLASH_SECTOR 11 我将在接下来的几天内留下确认信息。感谢您的快速回复 射线 |
这也是我列表中的一个问题。我不知道加载程序脚本是否可以接受预处理器指令。有没有办法使起始地址有条件,以便只有 skr-2 在引导加载程序之外启动? |
这是一个新的加载程序脚本STM32F407VGTX_BL32K_FLASH.ld和修改后的flash.c,它使用加载程序脚本中的符号进行编程。 请注意,当 I2C 总线被引出时,可以向该板添加一个外部 EEPROM(或 FRAM)。 顺便说一句,是否有任何信息,甚至是源代码,可用于某处的引导加载程序? |
只是一个快速更新。事实证明,我之前的所有构建(调试和发布)都使用了 STM32F401CCUX_FLASH.ld,这是一个疏忽。我已经尝试过 STM32F407VGTX_FLASH.ld 和 STM32F407VGTX_BL32K_FLASH.ld,但都不适合我。由于某种原因,我遇到了困难。第一个陷阱出现在 HAL_RCC_OscConfig() 中,但如果我单步执行该函数则不会。我不明白为什么内存地址会对设置时钟产生任何影响。我开始怀疑我的 MCU 是否有一些坏的闪存,它与全内存链接器脚本一起使用,但在使用 F401 的链接器脚本时却没有。当我有更多信息时,我会更新。目前,我无法验证上面的代码,抱歉。 账单 |
好吧,我不认为我知道如何正确调试 FLASH 起始地址为 0x8008000 的程序。 如果我使用 0x8000000 的起始地址,那么一切都很好。如果我随后更改 .ld 文件中的地址,那么也可以。但是,如果我执行完整的芯片擦除,然后将程序加载到调试器中,它就会死于 HAL_RCC_OscConfig() 中的硬故障,如上所述。似乎在地址 0x800000 处遗留了一些东西,可以让一切正常工作,当我擦除闪存时,需要的东西不再存在。 我在 STM32CubeIDE 的运行/调试设置中找到了一些选项来更改向量表地址。我尝试将其设置为 0x8008000 但没有任何乐趣。 有人知道我做错了什么吗? 谢谢, |
好的,弄清楚如何让调试器工作:-)。需要将system_stm32f4xx.c中的VECT_TAB_OFFSET从0x00修改为0x08008000。 现在,关于新的 flash.c。在调试器中,_EEPROM_Emul_Start 和 _EEPROM_Emul_Sector 似乎都不是 flash.c 中的正确值。我认为 _EEPROM_Emul_Sector 应该是 11 作为闪存中的最后一个扇区。这以 0xff 的形式出现,我认为它是已擦除的闪存。通常 _EEPROM_Emul_Start 以 0xffffffff 的形式出现,它看起来也像已擦除的闪存,但上次我得到的是 0x1313。 我按照上面的 Ray 修改了原始的 flash.c,这似乎工作得很好。 我在 .map 文件中看到了EEPROM * 定义,但在我看来它们不像变量,更像是定义(它们似乎没有存储空间)。我不知道为什么在没有这样的 extern 变量时 flash.c 中的 extern 限定符没有得到投诉。另外,我不明白这些项目中 & 的用法。 账单 |
终于,我想我已经触底了。
通过以上更改,我可以擦除整个闪存,重新编程引导加载程序,将新的 .bin 文件复制到 SD 卡并将其插入我的 SKR-2 上的插槽中。引导加载程序从 .bin 文件对闪存进行编程并将其重命名为 firmware.cur。在我看来一切都很好。 账单 |
0xFF… 在编程前擦除闪存时是正确的。0x13 是设置结构版本号,在设置被刷新后也是正确的。
这是我这边的错误 – 我上传的文件将 _EEPROM_Emul_Sector 设置为 1,它应该是 11。抱歉。
_EEPROM_Emul_Sector 用作常量,而不是闪存的指针。
引导加载程序不应该在输入代码之前设置向量地址寄存器吗?如果没有,那么 VECT_TAB_OFFSET 应该在构建配置中定义——而不是通过更改源代码,因为这会扰乱所有其他构建配置。 顺便说一句,您提供的引导加载程序代码的链接适用于 LPC176x MCU – 也许它的一部分与 STM32F4xx 相同,但肯定不是全部。所以我不明白这个说法:
您使用了 LPC176x 二进制文件来恢复 STM407 板?还是我忽略的 STM32 二进制文件?
这是如何声明的应该无关紧要, void * 对我有用并且看起来更合乎逻辑。_EEPROM_Emul_Start 不是 8 位值… |
Terje, 我验证了 _EEPROM_Emul_Start 的 (void *) 类型有效。 引导加载程序将在加载固件时正确设置向量表位置,因此对于发布版本,VECT_TAB_OFFSET 不需要更改。然而,为了调试它确实需要改变,至少对于 SKR-2。我刚才所做的是为我的调试版本设置另一个符号。system_stm32f4xx.c 文件检查它是否已定义,如果已定义则使用已定义的值。这行得通,但我希望有更好的方法可以在为 SKR-2 定义 DEBUG 时自动设置此设置。如果你有更好的主意,请告诉我。 我想我已经准备好通过仅将闪存扇区设置为 11 来祝福提议的更改。其他一切都很好。好工作! 我发送给您的链接是许多 BTT 板的引导加载程序的集合。如果你查看一个名为 bootloader_bin 的文件夹,你会找到电路板的目录,并且有在工厂编程的原始引导加载程序的副本。我使用出厂副本来恢复我的电路板。 谢谢, |
是否真的需要在刷入引导加载程序时进行调试?我认为我不会为此提供构建配置。
感谢您验证 – 我会尽快提交更新。
谢谢,当我看到源代码是针对 LPC176x 时,我没有浏览那么远。我想我会添加一个指向驱动程序页面的链接,以便于查找。 |
Terje, 让调试版本将所有内容都放在标准位置并没有错,然后向量表也放在正确的位置,但是我们需要一个不同的链接描述文件。 如果我们想用相同的链接描述文件构建两个版本,那么向量表偏移量需要以某种方式改变。 解决此问题的另一种方法是仅记录如何通过设置符号 VECT_TAB_OFFSET 来调试此特定构建。 如果容易做到,我的偏好是让程序员尽可能轻松地做到这一点。但记录它也是一种解决方案。无论如何,我认为必须做点什么。不是每个人都会浪费数小时/数天来追查向量表偏移量,但我做到了。 我一直在想 .map 文件可能是放置一堆特定于电路板的文档的好地方。也许关于调试的几句话可以放在 .map 文件中。 想到其他想法吗? 账单 |
我将在自述更改日志中添加有关此的信息,也可能在wiki中添加。 由于此驱动程序可用于不同配置的许多 F4xx 处理器,我正在考虑添加构建配置与板表。 |
我已经为 SKR2 板成功编译了 grblHAL。但在保存参数后,引导加载程序被覆盖。这是因为该板有一个 32k 引导加载程序,并使用 grblHAL 用于保存设置的地址 0x8004000。我已将设置地址更改为 0x8Exxx,但这也不起作用!(?)。有解决这个问题的想法吗?