3D打印Marlin2.0固件源代码分析之参数存储方式实现

简介: 3D打印Marlin2.0固件源代码分析之参数存储方式实现

640.png

1、Marlin2.0 参数存储M命令

Marlin2.0 的存储功能主要依靠 EEPROM 来进行,Marlin也提供了相应的M代码来协助 3D 打印爱好者 进行调试,这些参数配置完毕以后可以存储在单片机的 EEPROM 中,关于 EEPROM 的操作,主要有如下 指令:

640.png

比如我们可以通过串口来更改 PID 值、步进电机运行的加速度和最大速度的设置,设置完毕以后输入以 上对应的存储指令 M500 即可完成参数的保存,如下所示:

640.png

以上这些参数都可以通过串口进行修改,有一些支持LCD的机器,也可以通过LCD进行修改,修改参数 后可以调用 M503 获取设置的结果:

640.png

但是这个结果是当前生效,当设备断电重启后,设置的参数也就消失了,如果想要断电保存,则需要设 置完参数以后调用 M500 命令进行保存,然后通过 M501 读取保存的结果,如果想恢复成原来的参数,也 可以通过 M502 命令将参数恢复到出厂前。

2、Marlin2.0 参数存储方式代码分析

当我们在串口输入M代码的时候,程序会执行到Gcode.cpp中对应的 case 分支:

case 'M':
switch (parser.codenum)
{
  //....
  case 500: M500(); break;  // M500: 将设置好的参数保存到EEPROM中
  case 501: M501(); break;  // M501: 从EEPROM中读取设置参数
  case 502: M502(); break;  // M502: 恢复参数为出厂前的状态
  #if DISABLED(DISABLE_M503)
  case 503: M503(); break;  // M503: 打印当前设置的参数(不是从EEPROM中读取)
  #endif
  //...
 ...
}


对应的M代码实现位于Marlin/src/gcode/eeprom/M500-M504.cpp中:

//M500:将设置好的参数保存到EEPROM中
void GcodeSuite::M500() {
  (void)settings.save(); //MarlinSettings settings;
}
//M501:从EEPROM中读取设置参数
void GcodeSuite::M501() {
  (void)settings.load(); //MarlinSettings settings;
}
//M502:恢复参数为出厂前的状态
void GcodeSuite::M502() {
  (void)settings.reset(); //MarlinSettings settings;
}
#if DISABLED(DISABLE_M503)
 //M503:打印当前设置的参数(不是从EEPROM中读取)
 void GcodeSuite::M503() {
 (void)settings.report(!parser.boolval('S', true)); //MarlinSettings
settings;
}
#endif // !DISABLE_M503


Marlin的参数存储主要是依靠 MarlinSettings 类来实现,位于Marlin/src/module/Settings.h以 及Marlin/src/module/Settings.cpp中,最终会调用到具体的存储硬件的读写函数。

往期精彩

开源Marlin2.x源代码架构学习笔记


步进电机驱动在3D打印应用的学习笔记(一)


光固化3D打印悬空和支撑讲解


3D打印过程与最近的学习成果


两个最常用的3D打印机切片软件


3D打印机marlin固件框架与GCode命令总结


3D打印机Marlin固件串口功能解析和程序移植


让野火F103开发板支持Marlin2.0固件是什么体验?3D打印主控板成员+1


C语言映射表在嵌入式串口解析、UI设计中的应用(值得收藏并实践的精华帖)

目录
相关文章
|
Unix Linux Shell
|
存储 内存技术
从简单的文件偏移、读写进一步研究MCU程序的下载和软件升级(上)
从简单的文件偏移、读写进一步研究MCU程序的下载和软件升级(上)
69 0
|
存储 编解码 缓存
【嵌入式基础】常用显示器及其参数等概念整理
【嵌入式基础】常用显示器及其参数等概念整理
208 0
|
Linux iOS开发 MacOS
图解固件、驱动、软件的区别
图解固件、驱动、软件的区别
1355 0
图解固件、驱动、软件的区别
|
安全 Unix Linux
关于嵌入式Linux系统flash分区设计及文件系统格式选择的一些浅见
嵌入式系统应用程序升级是比较频繁的,对于flash的合理划分与文件系统选型就显得尤为关键。
395 0
|
物联网 Linux C语言
《嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.3 位、字节、半字、字的概念和内存位宽
本节书摘来自华章出版社《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第1章,第1.3节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.3 位、字节、半字、字的概念和内存位宽 1.3.1 深入了解内存(硬件和逻辑两个角度) 在前面我们就已经介绍了什么是内存,这里我们继续深入理解内存。
2321 0
|
Linux 芯片 内存技术
嵌入式Linux引导过程之1.5——从BootRom到Xloader
<div class="bct fc05 fc11 nbw-blog ztag"> <br> 在开始看Xloader_Entry的代码之前,我想先总结一下从芯片上电到开始运行Xloader的代码的过程,这是我目前理解的一个过程,可能有所出入,待以后继续完善。<br> 当 系统上电之后,首先会将PC寄存器设置成BootRom里面的代码对应的一个地址。BootRom是芯片内部集成的一块很小
3103 0
|
9月前
|
存储 缓存 固态存储
Linux设备全览:从字符到块,揭秘每种设备的秘密
在Linux的世界里,设备是构成系统的基础,它们使得计算机能够与外界互动。Linux设备可以大致分为几种类型,每种类型都有其独特的特性和用途。🌌让我们一起探索这些设备类型及其特性。
|
Go vr&ar C语言
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写
实验十八:SDRAM模块① — 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者。笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙。《整合篇》之际,笔者曾经大战几回儿,不过内容都是点到即止。
951 0

热门文章

最新文章