开源改变世界

保存 BTT-SKR2 的 GRBL 设置 #32

推推 grbl 3年前 (2023-02-08) 432次浏览
打开
natrix45772 打开了这个问题 2021 年 9 月 13 日 · 16条评论
打开

保存 BTT-SKR2 的 GRBL 设置#32

natrix45772 打开了这个问题 2021 年 9 月 13 日 · 16条评论

评论

保存 BTT-SKR2 的 GRBL 设置 #32

我已经为 SKR2 板成功编译了 grblHAL。但在保存参数后,引导加载程序被覆盖。这是因为该板有一个 32k 引导加载程序,并使用 grblHAL 用于保存设置的地址 0x8004000。我已将设置地址更改为 0x8Exxx,但这也不起作用!(?)。有解决这个问题的想法吗?

保存 BTT-SKR2 的 GRBL 设置 #32 terjeio 从 grblHAL/Controllers 转移了这个问题 2021 年 9 月 13 日
保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

应该将设置移至 0x08008000 处的扇区 2?为此必须修改.ld 文件。如果你能试一试就好了,因为我没有可以测试的板。

保存 BTT-SKR2 的 GRBL 设置 #32
作者

扇区 2 是引导加载程序寻址的程序开始。我将最后一个扇区 11 用于 EEPROM_EMUAL(该扇区为 128k,但我们总共有 1M)。现在它似乎工作!我必须做一些测试才能真正确定……

我的改变是:

  1. STM32F407VGTX_FLASH.ld

/* 内存定义 */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
BOOT_FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 32K
FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 1024K – 160K
EEPROM_EMUL(x : 起源 = 0x80E0000, 长度 = 128K
}

  1. 闪存.c

#define FLASH_SECTOR 11
#define FLASH_SECTOR_ADDR 0x80e0000

我将在接下来的几天内留下确认信息。感谢您的快速回复

射线

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

这也是我列表中的一个问题。我不知道加载程序脚本是否可以接受预处理器指令。有没有办法使起始地址有条件,以便只有 skr-2 在引导加载程序之外启动?

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

这是一个新的加载程序脚本STM32F407VGTX_BL32K_FLASH.ld和修改后的flash.c,它使用加载程序脚本中的符号进行编程。
还包括一个更新的.cproject,它将“Release F407 8MHz 32K Bootloader”添加到 Eclipse 中的构建菜单。希望这应该有效。请核实并反馈。

STM32F407VGTX_BL32K_FLASH.zip

请注意,当 I2C 总线被引出时,可以向该板添加一个外部 EEPROM(或 FRAM)。

顺便说一句,是否有任何信息,甚至是源代码,可用于某处的引导加载程序?

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者
菲奇22 评论了 2021 年 9 月 15 日 通过电子邮件
保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

只是一个快速更新。事实证明,我之前的所有构建(调试和发布)都使用了 STM32F401CCUX_FLASH.ld,这是一个疏忽。我已经尝试过 STM32F407VGTX_FLASH.ld 和 STM32F407VGTX_BL32K_FLASH.ld,但都不适合我。由于某种原因,我遇到了困难。第一个陷阱出现在 HAL_RCC_OscConfig() 中,但如果我单步执行该函数则不会。我不明白为什么内存地址会对设置时钟产生任何影响。我开始怀疑我的 MCU 是否有一些坏的闪存,它与全内存链接器脚本一起使用,但在使用 F401 的链接器脚本时却没有。当我有更多信息时,我会更新。目前,我无法验证上面的代码,抱歉。

账单

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

好吧,我不认为我知道如何正确调试 FLASH 起始地址为 0x8008000 的程序。

如果我使用 0x8000000 的起始地址,那么一切都很好。如果我随后更改 .ld 文件中的地址,那么也可以。但是,如果我执行完整的芯片擦除,然后将程序加载到调试器中,它就会死于 HAL_RCC_OscConfig() 中的硬故障,如上所述。似乎在地址 0x800000 处遗留了一些东西,可以让一切正常工作,当我擦除闪存时,需要的东西不再存在。

我在 STM32CubeIDE 的运行/调试设置中找到了一些选项来更改向量表地址。我尝试将其设置为 0x8008000 但没有任何乐趣。

有人知道我做错了什么吗?

谢谢,
比尔

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

好的,弄清楚如何让调试器工作:-)。需要将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 限定符没有得到投诉。另外,我不明白这些项目中 & 的用法。

账单

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

终于,我想我已经触底了。

  1. 我们需要更改 system_stm32f4xx.c 中的 VECT_TAB_OFFSET 以匹配加载程序脚本中 FLASH 的起始地址。
  2. 我们需要将 flash.c 的第 31 行更改为“extern uint8_t _EEPROM_Emul_Start;”。将它声明为 void 指针会把事情搞砸。它仍然只是一个地址,并且 & 有效。

通过以上更改,我可以擦除整个闪存,重新编程引导加载程序,将新的 .bin 文件复制到 SD 卡并将其插入我的 SKR-2 上的插槽中。引导加载程序从 .bin 文件对闪存进行编程并将其重命名为 firmware.cur。在我看来一切都很好。

账单

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

通常 _EEPROM_Emul_Start 以 0xffffffff 的形式出现,它看起来也像已擦除的闪存,但上次我得到的是 0x1313。

0xFF… 在编程前擦除闪存时是正确的。0x13 是设置结构版本号,在设置被刷新后也是正确的。

我认为 _EEPROM_Emul_Sector 应该是 11 作为闪存中的最后一个扇区。

这是我这边的错误 – 我上传的文件将 _EEPROM_Emul_Sector 设置为 1,它应该是 11。抱歉。

这以 0xff 的形式出现,我认为它是已擦除的闪存。

_EEPROM_Emul_Sector 用作常量,而不是闪存的指针。

我们需要更改 system_stm32f4xx.c 中的 VECT_TAB_OFFSET 以匹配加载程序脚本中 FLASH 的起始地址。

引导加载程序不应该在输入代码之前设置向量地址寄存器吗?如果没有,那么 VECT_TAB_OFFSET 应该在构建配置中定义——而不是通过更改源代码,因为这会扰乱所有其他构建配置。

顺便说一句,您提供的引导加载程序代码的链接适用于 LPC176x MCU – 也许它的一部分与 STM32F4xx 相同,但肯定不是全部。所以我不明白这个说法:

在吹掉引导加载程序后,我不得不用它来恢复我的电路板。

您使用了 LPC176x 二进制文件来恢复 STM407 板?还是我忽略的 STM32 二进制文件?

我们需要将 flash.c 的第 31 行更改为“extern uint8_t _EEPROM_Emul_Start;”。将它声明为 void 指针会把事情搞砸。它仍然只是一个地址,并且 & 有效。

这是如何声明的应该无关紧要, void * 对我有用并且看起来更合乎逻辑。_EEPROM_Emul_Start 不是 8 位值…

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

Terje,
好吧,我想我终于明白为什么我将鼠标悬停在 _EEPROM* 变量上时会看到 FF。它们是符号表中的条目,但没有存储空间。当我在调试器中将鼠标悬停在它们上面时,它会显示它们所指向的值,实际上它指向空白闪存,所以所有 FF 都是正确的。

我验证了 _EEPROM_Emul_Start 的 (void *) 类型有效。

引导加载程序将在加载固件时正确设置向量表位置,因此对于发布版本,VECT_TAB_OFFSET 不需要更改。然而,为了调试它确实需要改变,至少对于 SKR-2。我刚才所做的是为我的调试版本设置另一个符号。system_stm32f4xx.c 文件检查它是否已定义,如果已定义则使用已定义的值。这行得通,但我希望有更好的方法可以在为 SKR-2 定义 DEBUG 时自动设置此设置。如果你有更好的主意,请告诉我。

我想我已经准备好通过仅将闪存扇区设置为 11 来祝福提议的更改。其他一切都很好。好工作!

我发送给您的链接是许多 BTT 板的引导加载程序的集合。如果你查看一个名为 bootloader_bin 的文件夹,你会找到电路板的目录,并且有在工厂编程的原始引导加载程序的副本。我使用出厂副本来恢复我的电路板。

谢谢,
比尔

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

如果你有更好的主意,请告诉我。

是否真的需要在刷入引导加载程序时进行调试?我认为我不会为此提供构建配置。
IMO 最好使用“正常”调试版本进行调试并在完成后重新刷新引导加载程序,然后使用发布版本?
修改或添加构建配置并向其添加 VECT_TAB_OFFSET 符号是 AFAIK 如果您真的想调试引导加载程序版本,这是最干净的方法。

我想我已经准备好通过仅将闪存扇区设置为 11 来祝福提议的更改。

感谢您验证 – 我会尽快提交更新。

如果你查看一个名为 bootloader_bin 的文件夹,你会找到电路板的目录……

谢谢,当我看到源代码是针对 LPC176x 时,我没有浏览那么远。我想我会添加一个指向驱动程序页面的链接,以便于查找。

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

Terje,
我觉得 SKR-2 有点特别。它有一个来自工厂的引导加载程序,它被 Marlin 和 RepRap 固件以及可能的其他固件使用。因此,拥有一个链接器脚本将固件放在正确的位置以使用相同的引导加载程序显然是有意义的。对于发布版本,一切都很好。问题是如果有人想要构建调试版本,其他一切都已经通过设置 DEBUG 符号进行了配置。不幸的是,对于 SKR-2,构建将无法工作,因为向量表不在标准位置。

让调试版本将所有内容都放在标准位置并没有错,然后向量表也放在正确的位置,但是我们需要一个不同的链接描述文件。

如果我们想用相同的链接描述文件构建两个版本,那么向量表偏移量需要以某种方式改变。

解决此问题的另一种方法是仅记录如何通过设置符号 VECT_TAB_OFFSET 来调试此特定构建。

如果容易做到,我的偏好是让程序员尽可能轻松地做到这一点。但记录它也是一种解决方案。无论如何,我认为必须做点什么。不是每个人都会浪费数小时/数天来追查向量表偏移量,但我做到了。

我一直在想 .map 文件可能是放置一堆特定于电路板的文档的好地方。也许关于调试的几句话可以放在 .map 文件中。

想到其他想法吗?

账单

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者

我将在自述更改日志中添加有关此的信息,也可能在wiki中添加。

由于此驱动程序可用于不同配置的许多 F4xx 处理器,我正在考虑添加构建配置与板表。

保存 BTT-SKR2 的 GRBL 设置 #32
贡献者
菲奇22 评论了 2021 年 9 月 19 日 通过电子邮件
保存 BTT-SKR2 的 GRBL 设置 #32
贡献者
菲奇22 评论了 2021 年 9 月 21 日 通过电子邮件

免费注册 在 GitHub 上加入此对话。已有帐户? 登录评论
标签
还没有
项目

还没有

发展

没有分支机构或拉取请求

3人参加
保存 BTT-SKR2 的 GRBL 设置 #32保存 BTT-SKR2 的 GRBL 设置 #32保存 BTT-SKR2 的 GRBL 设置 #32

喜欢 (0)