8 Star 30 Fork 12

alicedodo / arduino-nrf2401-bootloader

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

arduino-nrf2401-bootloader

介绍

这是一个专门为arduino UNO/Nano/Pro Mini打造的无线下载bootloader,可通过NRF24L01+模块或串口烧写程序.2 Kb Flash.兼容STK500V2协议,支持avrdude,支持arduino IDE,支持跳频传输,附带编程器端实现代码.

注1: 项目内附带的编程器端代码是arduino IDE简化版, 完整项目链接: https://gitee.com/alicedodo/arduino-nrf2401-programmer
注2:这个bootloader是否仅仅是一个玩具?。
初看起来,这确实是个玩具,给arduino升级固件的时候,没办法硬件自动复位(无线传输,无解),需要及时手动去复位,稍晚的话bootloader就会超时退出,导致升级失败。板子搁桌子上还不如串口线下载来的方便。
但如果有固件本身的配合,那换一个场景也许就不一样了:

  • arduino在我的无线操控小车/小四轴上
  • arduino作为无线节点挂在墙/外阳台/房顶/电线杆子路灯上

当要升级固件的时候,给旧固件发个命令,固件启动看门狗,然后看门狗超时复位,然后bootloader执行,然后固件升级。

如果固件下载到一半,无线连接挂了怎么办?这不是问题,bootloader有容错机制。

bootloader有两种工作模式: NORMAL / CRITICAL ,通过检查复位源来确定要进入哪种模式
上电复位/手动RST复位: 进入NORMAL模式,1秒内没下载信号,跳转至固件;
看门狗复位: 立即进入CRITICAL模式;
NORMAL模式下1秒内收到下载信号,自动转入CRITICAL模式;
CRITICAL模式下看门狗保持开启状态,超时时间1秒,接收固件代码过程中,反复喂狗,保持看门狗不超时;
一旦下载中断,看门狗复位,bootloader在CRITICAL模式下重新运行,重置无线模块,等待下载信号;

所以遇到了下载中断的情况,重置一下无线编程器,再次下载即可。

特点:

1. 兼容STK500V2下载协议

实现了协议中的通用命令以及ISP命令子集: Flash读+写 / EEPROM读+写 / 熔丝位只读.
通过无线编程器和avrdude通信,完成程序下载.
所谓的无线编程器仅仅是数据透传,相当于无线串口,作用是从PC串口接收一帧命令,不做解析,通过NRF24L01+模块分包发送给bootloader.
bootloader执行命令完毕后,再将命令的ACK帧分包发送给无线编程器,再由串口送达avrdude.
精力有限,只使用avrdude5.10 和 avrdud6.3测试过,不保证其他版本没问题.
5.10是winAVR2010内置avrdude版本; 6.3是当前官方最新版本.

2. 支持两种下载接口: nrf24L01P-on-SPI 或者 串口

bootloader默认优先使用无线模块接收数据,当检测不到无线模块时,启用串口(115200bps). 只在复位后检测一次,中途不再切换.

3. 支持简易的跳频通信

复位后bootloader在 [默认空中波特率+默认地址+默认频道]上监听握手信号,programmer端将 [新的空中波特率+随机频道+随机地址] 打包进握手信号,握手成功后双方一起修改配置,转移到新的频道继续通信.
跳频命令是基于STK500V2的协议格式实现的,在bootloader看来和其他命令没有任何区别,所以理论上双方可以多次跳频.

如何接线:

默认连线图:
默认连线图

如何编译:

  1. 修改Makefile中定义的串口号,根据你自己的情况修改 DEVICE_PORT
  2. 编译: make
  3. 使用usbasp烧写: make upload (upload命令先烧写熔丝位,再烧写代码)
  4. 由于SPI-CLK引脚正好连上了板载的LED,所以无线下载bootloader没办法像arduino官方bootloader那样闪烁LED提示正在运行,因此烧写完毕后需要测试一下能否正常工作,请按照下文描述的测试方法测试一下

(如果你使用的交叉工具链是winAVR2010的话,还是不要自己编译了。winAVR已经快十年没更新了,内置的avr-gcc还是4.3版本,编译效率比较低,bootloader绝对会超过2Kb,建议换更高版本的,我自己使用的是5.4 )

(对于没有条件自己编译的各位,我上传了编译好的HEX文件,使用上图中的默认连线方式,文件位于bin目录下,烧写前需要先想办法修改熔丝位,配置: lfuse:0xFF / hfuse:0xDA / efuse:0xFD )

如何测试bootloader:

  1. 拔掉nrf24l01+模块,然后将烧写好的目标板串口线连接PC并找出对应的串口设备
  2. 输入测试命令 avrdude -cstk500v2 -pm328p -P COMx/ttyUSBx/ttyACMx -U flash:r:test_read.hex:i
  3. 如果你能看到命令正常执行完毕,那么恭喜你,bootloader已经成功运行了。
  4. 请注意,这个地方存在一个问题:
    当你把烧写了本bootloader的arduino第一次连接上PC时,上述测试命令可正常执行,但如果不重新插拔USB线,而直接再次运行这个测试命令的话,arduino不会有反应,命令会超时,原因是二次执行此命令时,板载的自动复位电路不会触发,从而导致bootloader无法得到执行。
    这当然不会是bootloader的BUG,arduino上运行任何代码也不会禁用板载的自动复位电路,真正的原因是avrdude(我使用的是6.3,其他版本没试过)在使用命令选项-cstk500v2时存在的BUG,我给出的证明是:
    1. 随便找个串口助手工具,多次打开关闭和arduino相连的COM口,arduino必定会复位;
    2. 每次在串口工具关闭COM口之后再执行上述测试命令,arduino必定会复位,命令也会正常执行

arduino IDE中如何使用bootloader下载程序:

  1. 检查两块板各自的连线,确保正常(如果你没改过代码的话,两块板和NRF24L01模块之间的连线是完全一样的)。
  2. 使用arduino IDE打开arduino-nrf2401-programmer目录下的arduino-nrf2401-programmer.ino
  3. 编译这个工程并下载到充当无线编程器的arduino板上
  4. IDE中打开你要给目标板烧写的程序,编译之
  5. 烧写目标板前对IDE进行必要的配置(这里以官方自带例程Blink为例子):
  6. 烧写: "项目" ==> "使用编程器上传"
    注意:这一步和我们正常下载程序不大一样:
    无线编程器无法接触到目标板,所以没办法像串口下载那样直接使目标板上的m328p复位,只能是手动及时复位目标板。
    具体方法是: 启动烧写之后,注意观察IDE左下角的状态提示,如果出现了"上传中...."之类的字样,立即手动复位目标板。
    稍晚的话就会下载失败,因为复位之后,目标板的bootloader仅仅等待下载信号1秒钟,超时了就会跳转至APP代码区去执行固件。

丢包率测试结果:

  1. 无2.4G wifi设备干扰
  2. 2.4G wifi设备轻微干扰
  3. 2.4G wifi设备编程器端重度干扰
  4. 2.4G wifi设备bootloader端重度干扰

结尾:

时间所限,暂时写这些,如果大家感兴趣,请留言提醒,我可以在代码具体实现上补一些文档。

MIT License Copyright (c) 2019 alicedodo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

专门为arduino UNO/Nano/Pro Mini打造的无线下载bootloader,可通过NRF24L01+模块或串口烧写程序.2 Kb Flash.兼容STK500V2协议,支持avrdude,支持arduino IDE,支持跳频传输,附带编程器端实现代码. 展开 收起
C 等 3 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/alicedodo/arduino-nrf2401-bootloader.git
git@gitee.com:alicedodo/arduino-nrf2401-bootloader.git
alicedodo
arduino-nrf2401-bootloader
arduino-nrf2401-bootloader
master

搜索帮助