Леонардо (32u4): способы программно обмазать его

8

Я думаю, что когда появился Leonardo, я прочитал несколько статей о том, как осторожно делать некоторые вещи, которые могут привести к тому, что он больше не будет загружать новые эскизы, поэтому нужно переписать загрузчик. Поскольку я планирую использовать параметры энергосбережения, например, для отключения неиспользуемых аппаратных компонентов, таких как порт USB, я боюсь сделать что-то не так.

Один Леонардо-деликатес, который я нашел до сих пор:

  • если прерывания отключены, загрузка новых эскизов завершится неудачно, если не будет нажата кнопка «Сброс», как только в среде Arduino IDE появится «Загрузка ...»

Какие вещи (кроме обычных аппаратных представлений, таких как подключение выводов, сконфигурированных на выходе, к фиксированным потенциалам) могут повредить контроллер или потребовать перепрошивки Leonardo свежим загрузчиком?

Томас С.
источник
Как правило, Arduinos невозможно обработать с помощью программного обеспечения, если только они не возятся с предохранителями на чипе (или разработали робота для разрушения платы: D).
анонимный пингвин
1
Загрузчик всегда запускается перед вашей собственной программой. Поэтому, когда вы нажимаете кнопку сброса, запускается загрузчик, и вы можете загрузить новую программу, даже если ваша старая программа была неисправна. Отключение определенных компонентов происходит только временно, и они должны восстанавливаться при перезагрузке устройства. Изменяя предохранители, вы можете сделать определенный параметр постоянным, поэтому старайтесь не менять их.
Гербен
2
Гербен, не могли бы вы добавить свой комментарий в качестве ответа?
Томас С.

Ответы:

1

Если вы загрузите программу, которая изменяет скорость ядра USB, она будет почти кирпичной. Что произойдет, это:

  1. Включение, загрузчик запускается, USB-устройство перечислено на ПК.
  2. Через несколько секунд запускается программа, скорость ядра USB изменилась, устройство USB исчезает с ПК

Проблема здесь заключается в том, что вы не только должны нажать «сброс» к программе, после сброса вы должны быстро выбрать правильный com-порт и затем загрузить его до запуска программы.

Redbearlab Blend Micro требует, чтобы скорость ядра USB была установлена ​​в пользовательской программе. В их инструкциях по настройке есть шаг, чтобы отредактировать Arduino main.cpp и добавить раздел для этого. Если этот шаг пропущен, возникает вышеуказанная проблема.

geometrikal
источник
1

Мне удалось на кирпичную стену ATMega128RFA1. Загрузчик и загруженное в него программное обеспечение работали нормально. Но было невозможно стереть / записать ПЗУ.

После проверки того, что произошло, я обнаружил в спецификации, что некоторые предохранители в ядре AVR предназначены для защиты от случайной записи в ПЗУ. Какие-то предохранители.

Я никогда не обнаруживал ошибку, записанную в этих байтах (так как это была действительно большая программа, и мы были тремя людьми, вовлеченными в кодирование), но да, мы просто взорвали предохранитель и потеряли MCU из-за ошибки.

Что касается леонардо, может произойти несколько вещей, но ничто из этого не может замуровать вашу доску, если вы не перегорели один из этих предохранителей.

CopperMaze
источник
1

С некоторым действительно умным кодом можно использовать загрузчик для перезаписи самого себя.

Выдержка:

Решение на самом деле концептуально довольно просто. Загрузчик по своей природе предназначен для загрузки новых прошивок на устройство. Поэтому он будет содержать хотя бы одну инструкцию spm. Поскольку регистр конфигурации spm должен быть записан не более чем за 4 цикла до инструкции spm, это означает, что на практике практически не встречаются последовательности: только последовательности sts, spm или out, spm. Итак, все, что вам нужно, это найти последовательность в разделе загрузчика; установить правильные регистры и вызвать его.

Однако оказалось, что с этим тоже была серьезная проблема. Инструкции spm загрузчика самопрограммирующегося загрузчика V-USB - это не простая рутинная процедура, а встроенный в основной код; так что его вызов вызовет сбой AVR, когда он попытается выполнить остальную часть загрузчика V-USB.

Противно, но опять же есть решение. Используя таймер, работающий на частоте ЦП (что легко на AVR), вы можете создать подпрограмму в ассемблере, которая устанавливает регистры для последовательности out, spm загрузчика; вызывает его и как раз в тот момент, когда выполняется первый цикл самого spm, прерывание по таймеру отключается, и AVR должен перейти к вашей процедуре прерывания (в пространстве приложения). Подпрограмма прерывания извлекает адрес загрузчика и затем возвращается к предыдущему коду - это подпрограмма, которая устанавливает последовательность out, spm. Это должно работать, потому что когда вы применяете инструкции spm к разделу загрузчика, ЦП останавливается до тех пор, пока он не завершится.

Таким образом, в основном, вы можете заняться каким-то интересным программированием и заставить загрузчик работать самостоятельно, делая MCU бесполезным без специального программиста.

Коннор Вольф
источник
0

Один из тех, о которых я знаю, - заставить Леонарда действовать как USB-мышь, которая повсюду хлопает и печатает случайные клавиши, так что вы не сможете перепрограммировать ее, не совершив какой-то хитрости, чтобы обойти ее. Но они упоминают это на Api Docs.

EternityForest
источник