ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Marlin DUE HAL 深度解析:SAM3X8E 平台构建、USB/EEPROM/看门狗等底层移植指南

Marlin DUE HAL 深度解析:SAM3X8E 平台构建、USB/EEPROM/看门狗等底层移植指南 Marlin DUE HAL 深度解析SAM3X8E 平台构建、USB/EEPROM/看门狗等底层移植指南【免费下载链接】MarlinMarlin is a firmware for RepRap 3D printers optimized for both 8 and 32 bit microcontrollers. Marlin supports all common platforms. Many commercial 3D printers come with Marlin installed. Check with your vendor if you need source code for your specific machine.项目地址: https://gitcode.com/GitHub_Trending/ma/MarlinMarlin 为 Arduino Due 及兼容板Atmel/MicrochipSAM3X8EARM Cortex-M3提供了独立的 HAL 实现位于Marlin/src/HAL/DUE/。本指南以该 HAL 的维护文档Marlin/src/HAL/DUE/AGENTS.md为核心系统讲解 DUE 平台的构建与测试流程、上游 Arduino SAM 框架的集成方式以及原生 USB CDC 串口、Flash EEPROM 模拟、看门狗早期初始化、84 MHz 时钟与定时器等底层实现要点帮助开发者在 RAMPS4DUE、RADDS、UltiMachine Archim 等板卡上构建、调试与二次移植 Marlin 固件。一、DUE HAL 的适用范围与目录结构DUE HAL 覆盖 Arduino Due 及所有基于 SAM3X8EARM Cortex-M3的兼容板卡主要源码全部集中在Marlin/src/HAL/DUE/目录下其子目录与关键文件如下路径仓库根目录相对职责Marlin/src/HAL/DUE/HAL.hHAL 类型定义、ADC 参数、引脚映射宏、MarlinHAL类接口Marlin/src/HAL/DUE/HAL.cppinit()、idletask()、复位源读取、reboot()与watchdogSetup()Marlin/src/HAL/DUE/timers.h定时器参数步进/温度/蜂鸣、TC2/TC4/TC6中断处理器宏Marlin/src/HAL/DUE/MarlinSerialUSB.cpp原生 USB CDC 串口实现Marlin/src/HAL/DUE/eeprom/Flash 模拟 EEPROMeeprom_flash.cpp与 I²C/SPI EEPROMeeprom_wired.cppMarlin/src/HAL/DUE/usb/从 Atmel ASF2015vendor 进来的 USB 协议栈Marlin/src/HAL/DUE/upload_extra_script.pyArchim 专用上传钩子整个 HAL 的所有源码都通过#ifdef ARDUINO_ARCH_SAM进行守卫见 HAL.cpp该宏由上游 Arduino SAM 核心 /atmelsamPlatformIO 平台定义无需在ini文件中额外添加编译标志。二、构建与测试循环mftest 的正确用法2.1 为什么用 mftest 而不是裸pio runDUE 家族在ini/due.ini中定义了三个环境env:DUE、env:DUE_USB、env:DUE_archim分别映射到 PlatformIO 的due、dueUSB、marlin_archim板卡 JSON。官方维护流程建议使用mftest进行验证因为它会为每个目标重新生成Marlin/Configuration.h而裸的pio run -e并不总能可靠地做到这一点cd $(git rev-parse --show-toplevel) buildroot/bin/mftest -t DUE -n1 -y # RAMPS4DUE_EFB硬件 UARTSerial buildroot/bin/mftest -t DUE_USB -n1 -y # RAMPS4DUE 原生 USB CDC buildroot/bin/mftest -t DUE_archim -n1 -y # UltiMachine Archim 1/2SAM3X8E2.2 各测试目标的特点与已知构建状态DUE对应buildroot/tests/DUE/config-01.ini是最重的冒烟测试板卡为BOARD_RAMPS4DUE_EFB开启了 ABL双线性自动调平、S-Curve 加速度、ExtUI可扩展 UI、SD 支持、二进制文件传输、断料检测、LED 控制等大量选项覆盖面最广。该测试配置还启用了eeprom_settings、assisted_tramming、z_safe_homing等高级功能。DUE_archim对应buildroot/tests/DUE_archim/config-01.ini直接复用示例配置example/UltiMachine/Archim1使用上游 Arduino SAM 变体通过board_build.variants_dir指向buildroot/share/PlatformIO/variants/。文档记录的构建状态mftest -t DUE_archim可成功构建约 8.7 秒固件约 103 KB / 524 KB Flash而mftest -t DUE存在一个预先存在的SanityCheck.h串口 1 引脚冲突错误Serial Port 1 pin D18 and/or D19 conflicts…出现于 RAMPS4DUE_EFB 测试配置该问题并非由 HAL 文档引起使用前需要单独排查。2.3 强制重建的禁忌不要使用rm -rf .pio/build/...强制重建——交叉配置文件写入保护会阻止该操作而且它并不安全。正确做法是使用pio run -e env -t clean或者直接让mftest自行重建。三、框架集成上游 Arduino SAM 核心非 vendored与 AT32 等平台不同DUE 构建使用上游 Arduino SAM 核心framework-arduino-sam它由atmelsamPlatformIO 平台和toolchain-gccarmnoneeabi工具链拉取不存放在buildroot/share/PlatformIO/下因此不存在“安装包 ↔ 仓库镜像”的同步步骤。Marlin 专属的胶水代码完全位于 DUE HAL 目录内外加两部分Marlin/src/HAL/DUE/upload_extra_script.py——env:DUE_archim专用的上传钩子在 Windows 上把上传命令替换为bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCEbuildroot/share/PlatformIO/variants/——Archim 板卡变体。ini/due.ini中三个环境的配置要点如下[env:DUE] platform atmelsam #platform_packages toolchain-gccarmnoneeabi1.120301.0 # 注释掉默认解析为 GCC 7.2.1 board due build_src_filter ${common.default_src_filter} src/HAL/DUE src/HAL/shared/backtrace build_flags -DWATCHDOG_PIO_RESET [env:DUE_USB] extends env:DUE board dueUSB [env:DUE_archim] extends env:DUE board marlin_archim board_build.variants_dir buildroot/share/PlatformIO/variants/ extra_scripts ${common.extra_scripts} Marlin/src/HAL/DUE/upload_extra_script.py维护约定不要去修改~/.platformio/packages/framework-arduino-sam/下的 SAM 核心任何 Marlin 相关改动都应放在Marlin/src/HAL/DUE/板卡相关则放在Marlin/src/pins/sam/下的板卡引脚文件如pins_RAMPS4DUE.h、pins_ARCHIM1.h、pins_ARCHIM2.h。同时不要随意固定或 vendor 工具链版本——due.ini中刻意保留了注释掉的platform_packages toolchain-gccarmnoneeabi1.120301.0因为默认解析会得到更老的 GCC 7.2.1。四、六个容易踩坑的底层实现细节4.1 原生 USB 是真正的 CDC 协议栈而非 UART 模拟当SERIAL_PORT -1时DUE_USB环境正是如此Marlin 将串口路由到 SAM3X 原生 USBMarlinSerialUSB。USB 协议栈是从Atmel ASF2015vendor 进usb/目录的必须被初始化HAL.cpp 的init()中调用usb_task_init()HAL.cpp 的idletask()中调用usb_task_idle()做 USB 协议栈的日常维护。如果idletask()不被调用即 Marlin 主循环的marlin.idle()未运行USB 永远不会完成枚举。MarlinSerialUSB的读操作会先检查usb_task_cdc_isenabled()与udi_cdc_is_rx_ready()见 MarlinSerialUSB.cpp进一步印证了“枚举未完成则无数据”的行为。ASF 的出处与升级注意事项记录在 usb/README.md。4.2 USB 中断竞态修复位于usb/uotghs_device_due.cusb/README.md明确记录Marlin 对uotghs_device_due.c做了一处非轻微修改以解决冻结外设时钟时中断保持断言asserted的竞态条件——该竞态会导致挂死以及由中断风暴引发的看门狗复位。这是 vendor ASF 之后由 Marlin 带回的本地修复修改 USB 驱动时必须保留。4.3 EEPROM 后端是按板卡选择的不会自动选择Marlin 并不会为 DUE 自动挑选 EEPROM 后端。两种实现位于 Marlin/src/HAL/DUE/eeprom/eeprom_flash.cpp实现FLASH_EEPROM_EMULATION——基于差异diff写入、跨 Flash 页组做磨损均衡的 EEPROM 模拟eeprom_wired.cpp实现 I²C/SPI EEPROMI2C_EEPROM/SPI_EEPROM需要MARLIN_EEPROM_SIZE宏。每个 DUE 板卡的引脚文件必须自行#define所需后端默认没有任何后端被选中。这一点可以从Marlin/src/pins/pins.h的NO_EEPROM_SELECTED检测EEPROM_SETTINGS开启但I2C_EEPROM、SPI_EEPROM、FLASH_EEPROM_EMULATION等均未定义时报错得到印证。从Marlin/src/pins/sam/的现有板卡看pins_RADDS.h、pins_RAMPS_SMART.h、pins_RAMPS_FD_V2.h、pins_KRATOS32.h等选择I2C_EEPROMpins_ALLIGATOR_R2.h选择SPI_EEPROM并定义了SPI_EEPROM1_CS_PIN/SPI_EEPROM2_CS_PIN。从 eeprom_flash.cpp 的头部注释可以看到 Flash 模拟的算法要点利用 Flash 位“擦除态为 1、可逐位置 0、恢复 1 需整页擦除”的特性把每次写入编码为“起始地址 块长度 新值”的差异块先在 RAM 缓冲中累积并合并压缩为最少的不重叠差异再写入当前组的下一个可用页当前组写满后把有效差异压缩写入另一组、擦除旧组并切换。同时该文件还实现了页写/页擦除ee_PageWrite/ee_PageErase的底层细节包括 Flash 写保护密钥、擦写期间关中断、按 SAM3X8E 勘误将 Flash 等待状态设为 6 等。由于 Flash 耐久每页约为 EEPROM按字节的 1/10 到 1/100这种设计实际是对“给定比例字节”的耐久模拟而非对所有字节的完整模拟。4.4 看门狗在启动早期配置覆盖 Arduino 运行时HAL.cpp的watchdogSetup()HAL.cpp在setup()之前运行启用 WDT超时 4 秒启用WATCHDOG_DURATION_8S则为 8 秒或完全禁用。原因是在 SAM3X 上硬件复位之后的看门狗晚初始化并不可靠存在意外复位风险所以必须在启动过程最早阶段完成。实现细节超时值按慢时钟 32.768 kHz、看门狗频率 256 Hz 换算为 WDT 计数器 ticks(timeout 8) / 1000并夹在 1 与 0xFFF 之间due.ini通过-DWATCHDOG_PIO_RESET使 WDT 故障同时复位 PIO 控制器若启用WATCHDOG_RESET_MANUAL则 WDT 只触发中断配置WDT_MR_WDFIEN、NVIC优先级 0否则 WDT 故障直接触发复位WDT_MR_WDRSTEN正常运行时由MarlinHAL::watchdog_refresh()每 4 秒内至少调用一次watchdogReset()刷新。4.5 时钟是 12 MHz 晶振经 PLL 得到的 84 MHzF_CPU为 84 MHz步进与温度定时器都由其派生timers.hHAL_TIMER_PRESCALER 2、HAL_TIMER_RATE F_CPU / 2。定时器分配为MF_TIMER_STEP 2步进、MF_TIMER_TEMP 4温度、MF_TIMER_TONE 6蜂鸣对应中断处理器宏TC2_Handler、TC4_Handler、TC6_Handlertimers.h温度 ISR 频率为 1000 Hz。不要按 AVR 的 16 MHz 思维推算时序——PWM 频率与analogWrite的比例尺完全不同。4.6pin_t是int8_tADC 为 10 位 / 3.3 VHAL.h 将pin_t定义为int8_t并设置#define HAL_ADC_VREF_MV 3300 #define HAL_ADC_RESOLUTION 10 #define analogInputToDigitalPin(p) pin_t((p 12U) ? (p) 54U : -1)DUE 的模拟引脚映射在数字引脚范围之上因此M43/M42引脚计算GET_PIN_MAP_PIN、PARSED_PIN_INDEX直接透传引脚号依赖这一映射关系。ADC 采样由MarlinHAL::adc_start()调用analogRead(ch)完成adc_ready()恒为真HAL.h。五、其他 HAL 能力速览复位源读取get_reset_source()读取RSTC-RSTC_SR寄存器区分上电复位、备份复位、看门狗复位、软件复位与外部复位HAL.cppreboot()通过rstc_start_software_reset(RSTC)软复位。串口转发USING_HW_SERIAL0..3分别转发到Serial、Serial1、Serial2、Serial3HAL.cpp。空闲内存查询freeMemory()基于_sbrk(0)与栈上变量地址计算空闲 SRAMHAL.cpp。共享 HAL 复用DUE HAL 通过#include ../shared/…复用Marlin/src/HAL/shared/中的Marduino.h、eeprom_if.h、math_32bit.h、HAL_SPI.h等共享 API。六、USB 子树的 ASF 出处与升级注意usb/目录下的文件源自 Atmel ASF高级软件框架2015 年版权大部分仅做了轻微外观修改uotghs_device_due.c则是上述竞态修复所在。Marlin 曾评估过 2022 年发布的 ASF 3.52.0认为没有立即升级的收益且 Marlin 内的文件目录结构与 ASF 不完全一致对比与套用更新文件较为困难。维护约定升级时务必逐文件与 Marlin 版本仔细比对把 Marlin 本地改进带回理想做法是让 Marlin 目录结构与 ASF 对齐或至少记录每个文件的来源以便未来更新。七、维护约定总结所有 HAL 源码以ARDUINO_ARCH_SAM宏守卫HAL 改动放Marlin/src/HAL/DUE/板卡引脚改动放Marlin/src/pins/sam/如pins_RAMPS4DUE.h、pins_ARCHIM1.h、pins_ARCHIM2.husb/是 vendored ASF按“易碎品”对待对比新版 ASF 时要把 Marlin 本地修复带回不要随意固定工具链版本参考due.ini中被注释的platform_packages构建验证优先使用buildroot/bin/mftest并避免rm -rf .pio/build/...式强制重建。相关深度资料还可继续阅读 Marlin/src/HAL/DUE/usb/README.mdASF 出处与升级说明、ini/due.iniDUE 三个构建环境的完整定义以及 Marlin/src/HAL/shared/DUE HAL 复用的共享 HAL API。【免费下载链接】MarlinMarlin is a firmware for RepRap 3D printers optimized for both 8 and 32 bit microcontrollers. Marlin supports all common platforms. Many commercial 3D printers come with Marlin installed. Check with your vendor if you need source code for your specific machine.项目地址: https://gitcode.com/GitHub_Trending/ma/Marlin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表