ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RIOT Arduino Uno 开发板支持指南:硬件规格、make flash 烧录与 debugWIRE 片上调试

RIOT Arduino Uno 开发板支持指南:硬件规格、make flash 烧录与 debugWIRE 片上调试 RIOT Arduino Uno 开发板支持指南硬件规格、make flash 烧录与 debugWIRE 片上调试【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本篇指南围绕 RIOT 对 Arduino Uno 开发板的官方支持文档展开覆盖 ATmega328P 硬件规格、基于make flash的固件烧录流程、中断与外设特性说明以及 Arduino Uno 特有的 debugWIRE 片上调试方案——包括硬件改造、熔丝位配置和 AVaRICE 调试工具链的使用。读完后你可以独立完成 RIOT 固件在 Uno 上的编译烧录理解为何 Uno 无法使用 JTAG 而必须走 debugWIRE并掌握启用/禁用调试、处理调试器与烧录器冲突的完整操作方法。一、硬件平台概览Arduino Uno 是入门级、成本最低的开发板之一适合电子与嵌入式开发的初学者。它基于 Atmel现 Microchip的 AVR 架构核心 MCU 为ATmega328P并且和大多数 Arduino 一样可以通过Shield 扩展板进行功能扩展。MCU 核心规格MCUATmega328P系列AVR/ATmega厂商Atmel/MicrochipRAM2 KiBFlash32 KiB主频16 MHz定时器3 个2 个 8 位、1 个 16 位ADC6 个模拟输入引脚UART1SPI1I2C1在 AVR 中称为 TWI供电电压5.0 V以上资源约束直接决定了 Uno 在 RIOT 中的定位2 KiB RAM 32 KiB Flash 的组合非常紧张官方文档明确提示——不要期望能在 Uno 上跑起一个可用的网络协议栈Dont expect having a working network stack due to very limited resources。选型时这一点应作为硬性前提。编译系统如何声明这些外设RIOT 通过构建系统的特性声明把硬件能力暴露给上层模块。boards/arduino-uno/Makefile.features 声明了 CPU 型号与板级特性CPU atmega328p FEATURES_PROVIDED arduino_shield_uno include $(RIOTBOARD)/common/arduino-atmega/Makefile.features它继承自公共板模块 boards/common/arduino-atmega/Makefile.features在那里定义了 Uno 实际提供的外设特性FEATURES_PROVIDED periph_adc FEATURES_PROVIDED periph_i2c FEATURES_PROVIDED periph_pwm FEATURES_PROVIDED periph_spi FEATURES_PROVIDED periph_timer FEATURES_PROVIDED periph_uart FEATURES_PROVIDED arduino_analog FEATURES_PROVIDED arduino_i2c FEATURES_PROVIDED arduino_pins FEATURES_PROVIDED arduino_pwm FEATURES_PROVIDED arduino_shield_isp FEATURES_PROVIDED arduino_spi FEATURES_PROVIDED arduino_uart这与上表中的外设清单一一对应1 个 ADC、1 个 UART、1 个 SPI、1 个 TWI/I2C、3 个定时器/PWM 源arduino_shield_isp特性则对应 Uno 板载的 ISP 排针供外部烧录器使用。板级 Kconfig 见 boards/arduino-uno/Kconfigconfig BOARD_ARDUINO_UNO bool default y select CPU_MODEL_ATMEGA328P select BOARD_COMMON_ARDUINO_ATMEGA可见 Uno 在构建系统中被绑定到CPU_MODEL_ATMEGA328P并复用common/arduino-atmega公共模块这是理解后续刷写与调试行为的基础。板级头文件中的微秒定时器校准boards/arduino-uno/include/board.h 覆盖了公共默认的 ztimer 微秒定时器校准参数#define CONFIG_ZTIMER_USEC_ADJUST_SET (128) #define CONFIG_ZTIMER_USEC_ADJUST_SLEEP (116)从源码结构看这两个ADJUST参数用于补偿定时器计数与真实微秒之间的偏差分别作用于激活态与睡眠态。它们与 boards/common/arduino-atmega/include/board_common.h 中基于 Timer 0 的 ztimer 微秒配置频率 250000 Hz、16 位宽度配套使用保证在 16 MHz 系统时钟下ztimer_usec提供尽量精确的短延时。二、固件烧录BOARDarduino-uno make flash将 RIOT 固件烧录到 Arduino Uno 非常直接用**编程口programming port**把 Uno 连接到宿主机然后执行BOARDarduino-uno make flash这一步会完成构建并调用开源工具avrdude把新代码写入 ATmega328P 的 Flash。烧录参数在板级 boards/arduino-uno/Makefile.include 中预配置# configure the terminal program BAUD ? 9600 ARDUINO_UNO_BOOTLOADER ? optiboot include $(RIOTBOARD)/common/arduino-atmega/Makefile.include两个值得注意的点BAUD ? 9600Uno 上 UART 终端的默认波特率Uno 的串口波特率通常固定为 115200 由板级配置决定这里的 BAUD 是终端/烧录侧的默认值均可通过命令行覆盖ARDUINO_UNO_BOOTLOADER ? optibootRIOT 默认假定板上烧的是Optiboot引导加载程序Arduino 官方 Uno 出厂即使用它这影响后续 ISP 刷写与引导恢复的判断。从 makefiles/tools/avrdude.inc.mk 的通用实现可以看到烧录链路的细节avrdude 的器件参数由 CPU 名自动推导atmega328p→-p m328pAVRDUDE_PROGRAMMER_FLAGS -p $(subst atmega,m,$(CPU)) FFLAGS -c $(AVRDUDE_PROGRAMMER) $(AVRDUDE_PROGRAMMER_FLAGS) -U flash:w:$(FLASHFILE)默认的烧录器为板载 USB 转串口芯片配合 Optiboot 引导程序自动复位进入引导模式。也可以通过PROGRAMMER变量切换为 ISP 方式例如PROGRAMMERdragon_isp——这在下一节的调试场景中会用到。三、引脚变化中断与其他特性除标准 GPIO 外中断外Uno 还可以利用 AVR 的**引脚变化中断Pin Change Interrupt**功能把更多引脚用作硬件中断源具体说明见 boards/common/atmega/doc.mdATmega 公共模块文档。另外arduino_analog、arduino_i2c、arduino_pins、arduino_pwm、arduino_spi、arduino_uart等特性意味着上层驱动可以沿用 Arduino 引脚编号习惯数字引脚 0–13、模拟引脚 A0–A5访问外设对已有 Arduino 经验的开发者迁移成本较低。四、片上调试为什么 Uno 必须走 debugWIRE4.1 debugWIRE 与 JTAG 的区别Arduino Uno 的 ATmega328P 引脚数较少不支持高引脚数 ATmega 常用的 JTAG 调试接口只能使用debugWIREdebugWIRE 的优势是只需占用RESET 引脚传输数据但提供的调试能力极其有限单个硬件断点、零硬件观察点官方建议如果同样的问题可以在Arduino Mega2560上复现Mega2560 支持 JTAG在 Mega2560 上调试会容易且高效得多只有在 bug 无法复现时才退而求其次在 Uno 上做有限的片上调试。这一设计在 RIOT 构建系统中有直接体现——makefiles/tools/avrdude.inc.mk 会按 CPU 自动选择调试协议ifneq (,$(filter $(CPU),atmega328p)) # Use debugWIRE as protocol for debugging (ATmega328P does not support JTAG) DEBUGPROTO : -w else # Use JTAG as protocol for debugging as default DEBUGPROTO ? -j $(AVR_DEBUGINTERFACE) endif即 CPU 为atmega328p时make debug底层自动为 AVaRICE 指定-wdebugWIRE协议无需手动干预。4.2 调试硬件前提片上调试需要一块AVR Dragon编程器/调试器——它是支持面最广的 AVR 调试设备同时支持SPI普通 ISP编程、高压串行编程HVSP、并行口编程调试JTAG、debugWIRE、PDI、aWire。4.3 板子改造断开 RESET 引脚上的 100 nF 电容Uno 的 RESET 引脚经一个100 nF 电容连接到 ATmega16U2大多数克隆板是 CH340 TTL 适配器。这个电路的作用是通过串口连接时自动触发复位——这在经引导程序烧录时特别有用avrdude 可借此自动拉起 bootloader无需用户按复位按钮。但要使用片上调试必须把这个电容从 RESET 引脚断开原装 Arduino Uno剪断标注RESET EN的焊盘跳线即可之后重新焊接即可恢复原状克隆板大多没有这个跳线通常需要直接剪掉那颗通常是贴片安装的电容。可以用万用表判断哪颗电容连在 RESET 引脚上。注意强行拆下的电容通常会损坏克隆板的自动复位功能将很难恢复。4.4 软件AVaRICE需要安装AVaRICE部分发行版已提供软件包它是 RIOT AVR 调试链路的调试服务器RIOT 中对应路径为$(RIOTTOOLS)/avarice见 makefiles/tools/avrdude.inc.mk 中的AVARICE_PATH。4.5 熔丝位配置使能 DWEN 位启用片上调试需要把高熔丝high fuse中的DWEN位使能置零。ATmega328P 的调试熔丝配置与默认值如下熔丝默认设置调试设置低熔丝Low Fuse0xFF0xFF高熔丝High Fuse0xDE0x9E扩展熔丝Extended Fuse0xFD0xFD0xDE→0x9E的差异正是 DWEN 位0x9E 0xDE 与 0x60 异或即高熔丝第 5 位置零。用 avrdude 使能 debugWIRE 调试将PROGRAMMER替换为你的烧录器名称AVR Dragon 为dragon_ispavrdude -p m328p -c PROGRAMMER -U hfuse:w:0x9e:m禁用调试avrdude -p m328p -c PROGRAMMER -U hfuse:w:0xde:m重要警告你可以用任意 ISP 使能调试但再次禁用调试只有 AVR Dragon或同接口兼容的 ISP 调试器组合能做到ISP 编程依赖 RESET 引脚工作而调试使能后 RESET 引脚已被 debugWIRE 征用。较新版本的 avrdude 会尝试通过 debugWIRE 接口临时关闭 debugWIRE、恢复 RESET 引脚的默认行为再切回 ISP——但前提是烧录器/调试器能通过同一个连接器既做 ISP 又做 debugWIRE 调试。所以除非你有 AVR Dragon 或别的禁用方案不要随意使能调试。4.6 启动调试会话AVR Dragon 就绪后调试就是make BOARDarduino-uno debugRIOT 的make debug底层由 makefiles/tools/avrdude.inc.mk 组装命令启动debug_srv.sh调试服务器AVaRICE默认端口 4242再用debug.sh连接 GDB-x gdb.conf指向 ELF 文件。调试器硬件选择逻辑同样在那里# AVRDUDE_PROGRAMMER 若本身支持调试则优先复用它 ifneq (,$(filter dragon%,$(AVRDUDE_PROGRAMMER))) AVR_DEBUGDEVICE ? --dragon endif # Atmel ICE / EDBG 是最合理的回退 AVR_DEBUGDEVICE ? --edbg AVR_DEBUGINTERFACE ? usb如果使用的不是 AVR Dragon例如 Atmel-ICE需要手动导出AVR_DEBUGDEVICE环境变量为 AVaRICE 所需标志如export AVR_DEBUGDEVICE--edbg若调试设备不通过 USB 连接还需导出AVR_DEBUGINTERFACE为正确值。4.7 调试期间的烧录注意事项avrdude 经 ISP 烧录时会临时禁用 debugWIRE。若烧录后 AVaRICE 抱怨无法与设备同步设备可能需要一次**冷启动cold boot**来重新激活 debugWIREELF 文件的内存映射不考虑引导程序的存在Uno 的 Flash 尾部被 Optiboot 占据。文档作者建议调试期间改用 ISP 直接烧录以避免一切引导程序相关问题make BOARDarduino-uno PROGRAMMERdragon_isp flash警告经 ISP 烧录会覆盖引导程序。可用 ISP 轻松恢复具体方法请参考 Arduino 官方的引导程序恢复文档本仓库不重述其步骤。4.8 断点与观察点的现实局限ATmega328P 只有1 个硬件断点和0 个硬件观察点而这唯一的硬件断点被单步执行single-step占用结果是常规意义的断点和观察点都无法使用。AVaRICE 的应对方式是在 Flash 中被断点处原指令的位置插入break机器指令来模拟断点执行到该 break 指令后再恢复原指令。这一模拟方式有两个代价速度极慢每次命中断点都会额外消耗 2 次 Flash 擦写循环长时间调试会话会累积出显著的 Flash 磨损。在 Uno 上调试时应据此控制调试时长并尽量把复现路径收敛到 Mega2560JTAG上验证。五、小结主题关键结论硬件ATmega328P2 KiB RAM / 32 KiB Flash / 16 MHz1×UART、1×SPI、1×TWI、6 路 ADC支持 Shield 扩展定位资源限制严格不适合运行网络协议栈烧录BOARDarduino-uno make flashavrdude OptibootARDUINO_UNO_BOOTLOADER ? optiboot调试接口仅 debugWIRERESET 引脚不支持 JTAG构建系统对atmega328p自动选择-w协议调试前提AVR Dragon、剪断 RESET 引脚 100 nF 电容RESET EN 跳线、安装 AVaRICE、高熔丝改为0x9E调试命令make BOARDarduino-uno debug调试期烧录建议PROGRAMMERdragon_isp flash断点单硬件断点被单步占用AVaRICE 以 Flash 插指令模拟慢且磨损 Flash核心文档位于 boards/arduino-uno/doc.md配套的构建与特性文件为 boards/arduino-uno/Makefile.include、boards/arduino-uno/Makefile.features 与 boards/arduino-uno/include/board.h调试工具链实现见 makefiles/tools/avrdude.inc.mk。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表