开源改变世界

STM32硬故障保存设置 #1

推推 grbl 2年前 (2023-02-08) 215次浏览
关闭
dresco 打开了这个问题 2021 年 3 月 12 日 · 2 条评论
关闭

STM32硬故障保存设置#1

dresco 打开了这个问题 2021 年 3 月 12 日 · 2 条评论

评论

STM32硬故障保存设置 #1

我注意到我的 STM32F411 Nucleo 测试板在更新设置后出现硬故障。似乎是从这里来的;

STM32F4xx/Src/flash.c

第 61 至 69 行 906d7b1

uint16_t *数据=(uint16_t *)来源;
uint32_t地址 = ( uint32_t )flash_target,剩余 = ( uint32_t )hal。没有尺寸
while (剩余 && 状态 == HAL_OK) {
status = HAL_FLASH_Program (FLASH_TYPEPROGRAM_HALFWORD, address, *data++);
status = HAL_FLASH_Program (FLASH_TYPEPROGRAM_HALFWORD, address + 2 , *data++);
地址 += 4 ;
剩余 -= 4 ;
}

 

nvs_alloc() 正在向 hal.nvs.size 添加一些额外的字节,使其不再能被 4 整除;

hal.nvs.size = GRBL_NVS_SIZE + hal.nvs.driver_area.size + 1;

正因为如此,剩余永远不会达到 0(对我来说,它从 1034 开始,从 2 开始循环),并且闪存写入会继续进行,直到它大概运行在 eeprom 仿真区域之外。

我预计这也会影响 F1 和 F3 车手……

STM32硬故障保存设置 #1
贡献者

nvs_alloc() 正在向 hal.nvs.size 添加一些额外的字节,使其不再能被 4 整除;

额外的字节用于校验和。在 nvs_buffer_init() 的开头添加这一行

hal.nvs.size = ((hal.nvs.size - 1) | 0x03) + 1;

所以它变成:

//
// Switch over to RAM based copy.
// Changes to RAM based copy will be written to physical storage when grblHAL is in IDLE state.
bool nvs_buffer_init (void)
{
    hal.nvs.size = ((hal.nvs.size - 1) | 0x03) + 1;

    if(nvsbuffer) {
...

应该为所有驱动程序修复它。

STM32硬故障保存设置 #1
作者

谢谢,我在 nvs_alloc() 中添加了这一行,就在现有大小调整之后,它看起来不错(大小四舍五入到 1036 并且没有错误)..

hal.nvs.size = GRBL_NVS_SIZE + hal.nvs.driver_area.size + 1;
hal.nvs.size = ((hal.nvs.size - 1) | 0x03) + 1;