莱昂纳多(32u4):以编程方式对其进行砌砖的方法


8

我认为,当莱昂纳多(Leonardo)面世时,我读过一些关于谨慎做事的文章,这可能会导致它不再加载任何新草图,因此必须重写引导程序。因为我计划使用节能选项,例如禁用未使用的硬件组件(例如USB端口),所以我担心会做错事情。

到目前为止,我发现了一个Leonardo美食:

  • 如果禁用了中断,则上传新草图将失败,除非在Arduino IDE显示“正在上传...”后立即按下“重置”按钮。

哪些东西(与通常的硬件相关的想法除外,例如将输出配置的引脚连接到固定电势)会损坏控制器或需要使用新的引导程序重新刷新Leonardo?


通常,除非弄乱芯片上的保险丝(或设计一个机器人来破坏电路板:D),否则Arduino不可能通过软件来实现。
匿名企鹅2014年

1
引导加载程序始终在您自己的程序之前运行。因此,当您按下重置按钮时,引导加载程序将启动,即使您的旧程序有问题,您也可以上传新程序。禁用某些组件只是暂时的,应该在重置设备后恢复它们。通过更换保险丝,您可以使某些选件永久化,因此请避免不必更换。
Gerben 2014年

2
Gerben,能否请您添加评论作为答案?
Thomas S.

Answers:


1

如果您上传的程序更改了USB内核的速度,则几乎会变砖。将会发生什么:

  1. 打开电源,启动加载程序启动,在PC上枚举USB设备。
  2. 几秒钟后,程序启动,USB核心速度改变,USB设备从PC上消失

这里的问题是,不仅您必须点击重置为程序,重置后还必须快速选择正确的COM端口,然后在程序启动之前上传。

Redbearlab Blend Micro需要在用户程序中设置USB内核速度。在他们的安装说明中,有一个步骤可以编辑Arduino main.cpp并添加一个部分来执行此操作。如果错过了此步骤,则会发生上述问题。


1

我设法将ATMega128RFA1砌成墙。引导加载程序以及我上载的软件运行正常。但是不可能擦除/写入ROM。

在检查了发生了什么之后,我在数据表中发现AVR内核中的一些保险丝旨在保护ROM上的意外写入。某种安全保险丝。

我从来没有发现用这些字节写的错误(因为这是一个非常大的程序,我们由3个人参与编码),但是,是的,我们只是炸了个保险丝,因为一个错误而丢失了MCU。

至于莱昂纳多,可能会发生几件事,但是除非您烧断其中一根保护保险丝,否则所有这些事情都不会使您的电路板瘫痪。


1

这是可能的,有一些很聪明的代码,利用该引导程序改写本身。

摘抄:

实际上,该解决方案在概念上非常简单。引导加载程序本质上旨在将新固件下载到设备。因此,它将至少包含一个spm指令。因为在spm指令之前必须将spm配置寄存器写入不超过4个周期,所以这意味着实际上很少发生序列:仅是sts,spm或out,spm序列。因此,您所需要做的就是在引导加载程序部分中找到序列;设置正确的寄存器并调用它。

但是,事实证明,这也是一个主要问题。V-USB自编程引导程序的spm指令不是一个小巧的例程,而是内联到主代码中。因此调用它只会导致AVR在尝试执行其余V-USB引导加载程序时崩溃。

令人讨厌,但又有解决方案。通过使用以CPU频率为时钟的计时器(在AVR上很容易),您可以在汇编器中创建一个例程,该例程为Bootloader的out,spm序列设置寄存器。调用它,并在执行SPM本身的第一个周期的那一刻,定时器中断关闭,AVR应该跳到您的中断例程(在应用程序空间中)。中断例程会弹出引导加载程序地址,然后返回上一个代码-该例程将设置out,spm序列。这应该可行,因为当您将spm指令应用于bootloader部分时,CPU会暂停直到完成。

因此,基本上,您可以进行一些有趣的编程,并使引导加载程序自动运行,从而使MCU在没有专用编程器的情况下变得无用。


0

我知道的一个方法是使伦纳德的行为就像USB鼠标一样,它随处可见并键入随机密钥,因此,如果不做一些技巧来解决它,就无法对其重新编程。但是他们在api文档中提到了这一点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.