Как удалить загрузчик Adafruit Pro Trinket, мигающий при запуске

Насколько я понимаю, Pro Trinket имеет «Optiboot», который позволяет ему определять, какой загрузчик вы пытаетесь использовать, один для USB и один для FTDI. Когда он находится в этом «состоянии загрузчика», красный светодиод на контакте 13 загорается на 10 секунд, прежде чем он начнет запускать запрограммированную мной программу.

Можно ли удалить эту функцию Optiboot? Повлечет ли это постоянный выбор одного загрузчика/интерфейса?

Одна проблема, с которой я столкнулся, заключается в том, что вместе со светодиодом на 13 светодиодная лента, подключенная к контактам 9, 10, 11, мигает. Мне также очень хотелось бы, чтобы не приходилось ждать 10 секунд, чтобы запустить код.

Вот страница на сайте Adafruit, на которой рассказывается о загрузчике[ах] на Pro Trinket.

Спасибо!

, 👍3

Обсуждение

Если у вас есть исходный код, программист и стремление погрузиться в детали, то да, вы, по-видимому, можете это сделать., @Chris Stratton

Вы спрашивали на форумах Adafruit? Они, наверное, могут ответить лучше, чем кто-либо., @Craig

Только пин 13 будет мигать. Контакты 9-11 будут плавающими. Возможно, вам следует добавить несколько подтягивающих резисторов к полевым транзисторам, подключенным к светодиодной ленте (это хорошая идея, даже если вы меняете загрузчик)., @Gerben


4 ответа


1

Вы можете взять исходный код загрузчика Pro Trinket и настроить его под свои нужды, запишите его и убедитесь, что у вас есть терпение и навыки отладки.

Из исходного кода автора (Фрэнка Чжао) кажется, что это 10-секундный цикл, о котором вы говорите, расположенный в main.c, строка № 456:

if ( ((usbHasRxed != 0) && (timeout > USBBOOTLOADER_TIMEOUT)

Переменная USBBOOTLOADER_TIMEOUT, которая определена как 10 в верхней части этого файла, строка № 70:

#define USBBOOTLOADER_TIMEOUT 10

и продолжается примерно через 1 секунду в строке 496:

// примерно 1 секунда
#if (F_CPU == 12000000)
    if (t1ovf > 183) {
    #elif (F_CPU == 16000000)
    if (t1ovf > 244) {
    #endif
        t1ovf = 0;
        timeout++;
    }
,

Не обычная безделушка. [Исходный код загрузчика PRO Trinket](https://github.com/adafruit/Adafruit_ProTrinket_Bootloader)., @Gerben


0

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

,

Это скорее комментарий, чем реальный ответ. Вы можете настроить время так, чтобы оно подходило лучше, это не будет проблемой. ЕСЛИ вы можете изменить загрузчик, вы также сможете его отменить (те же инструменты/те же изменения). Я не уверен, что загрузчик мигает, вы также можете легко отключить это в загрузчике. Но да, я бы протестировал его перед отправкой клиентам ;D, @Paul


1

Просто запрограммируйте брелок с помощью интернет-провайдера. (без использования разъема USB). Например, используя Arduino в качестве ISP-программиста.

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

,

0

На самом деле это намного проще, чем предполагают другие ответы. Нет необходимости удалять/перезаписывать загрузчик. Вы можете просто отключить загрузчик, установив соответствующий бит фьюза.

Для этого вам нужен программист интернет-провайдера. Как вы, возможно, знаете, вы потеряете возможность загружать код через USB/FTDI. Но вы можете восстановить эту возможность в любое время, просто сбросив соответствующий бит фьюза в исходное значение.

Шаг 1. Подключите брелок через программатор интернет-провайдера

На брелоке нет разъема ISP, но вы можете легко его собрать или просто использовать перемычки для подключения отдельных контактов непосредственно к программатору . Распиновку можно найти на сайте Learn.adafruit.com. Вам необходимо подключить MISO, MOSI, SCK, RST, VCC и GND.

Шаг 2. Определите текущую конфигурацию предохранителя

avrdude -c usbtiny -p m328p

Если вы используете программатор, отличный от USBTinyISP, замените usbtiny соответствующим идентификатором. Перечислите возможные значения, указав фиктивный идентификатор, например. avrdude -c foo.

Среди прочего, avrdude должен возвращать строку, содержащую текущие значения фьюзов. Это должно выглядеть примерно так:

avrdude: safemode: Предохранители в порядке (E:FD, H:D0, L:FF)

Нас интересует высокий предохранитель (H:D0). D0 указывает, что загрузчик включен. На самом деле любое четное число означает, что загрузчик включен.

Шаг 3. Рассчитайте новое значение фьюза

Мы хотим установить бит BOOTRST фьюза high. Это младший значащий бит фьюза, равный 1. Поэтому все, что нам нужно сделать, это увеличить значение на 1.

В примере новое значение предохранителя — D1.

Если вы не знаете, как рассчитать значение предохранителя, воспользуйтесь калькулятором предохранителя. Выберите ATMega328P в качестве устройства, введите значения предохранителей, указанные avrdude, в самом низу раздела «Текущие настройки», затем нажмите «Применить». Снимите флажок BOOTRST в разделе «Ручная настройка битов предохранителей», после чего вы увидите новое значение предохранителя в нижней части, где вы ввели исходное значение.

Шаг 4. Запрограммируйте новое значение предохранителя

avrdude -c usbtiny -p m328p -U hfuse:w:0xd1:m

Снова замените usbtiny на идентификатор вашего программатора. Если вы рассчитали значение, отличное от D1, замените 0xd1 соответствующим значением. Однако, если исходное значение предохранителя высокого уровня было D0, то новое значение равно D1.

Готово!

,