单片机通常通过编程器来下载程序。而 Arduino 中有一小段 bootloader 程序,在复位的时候运行,可以通过串口接收程序并写入单片机,因此可以不使用额外的编程器,直接通过串口下载程序。

前段时间,在为 AirTerminal 增加 XMODEM 协议的支持后,打算在下一个版本增加 Arduino 程序下载功能。所以先提前了解一下 Arduino Bootloader 使用的程序下载协议,并通过本文整理相关知识。

文章仅提供了解这些协议所需要的链接,对于协议的具体内容不再过多描述。文章内容将会根据自己的进一步了解不断更新。

Arduino 程序编译后的 HEX 文件,能被 Vim 正确识别并进行语法高亮
Arduino 程序编译生成的 HEX 文件,能被 Vim 正确识别并进行语法高亮

HEX 文件格式

基础知识

大部分单片机都可以将编译好的程序以 .hex 文件的形式保存,对于 Arduino,也可以方便地获取编译后生成的 hex 文件

原先以为与 ELF 这种稍微复杂的格式相比,HEX 文件较为简单,只是将 flash/eeprom 里面的内容进行原封不动地保存在文件中。现在经过了解,才知道 HEX 文件也是有自己固定的格式的。

HEX 文件里的内容为 ASCII 字符(而不是二进制),其中包含地址、数据、校验码等信息。如下三篇文章,对 HEX 文件的格式做了详细的描述:

代码参考

扩展阅读

在查阅资料的时候,找到了这篇关于 vim 的文章。作者从 vim 正确识别并高亮 HEX 文件开始,讲到了 vim 的历史。虽然文章与 HEX 文件的格式没有太多关系,但文章内容还是值得阅读的(这个网站中也有不少介绍计算机历史的文章,推荐阅读):

Arduino Bootloader 使用的协议:STK500

基础知识

Arduino Bootloader 使用 Atmel(现已被 Microchip 收购)的 STK500 协议进行文件下载。协议数据格式基本上是一个字节的命令 + 数据 + 0x20。其官方文档如下:

想初步了解 STK500 协议的基础知识,可以从 optiboot 的文档入手:

代码参考

具体的代码可以参考 optiboot。Optiboot 是 Arduino Bootloader 的一个实现(2018 年后,Arduino 的默认 Bootloader 就是 optiboot),其代码中实现了 STK500 协议下载程序所必需的指令:

对于电脑侧向 Arduino 发送数据的程序,除了 AVRDUDE,还可以参考如下代码:

扩展阅读

关于 Arduino Bootloader,其他有用的链接:


最后修改日期: 2021-05-11

留言

很高興有綠看到這篇文章,讚~ 用2張uno及一張ethernet shied, 好像可以實作網路刷機

很有用的信息!感谢。

回复 FANG 取消回复

发布留言必须填写的电子邮件地址不会公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据