ProMicro и bootloader
- Войдите на сайт для отправки комментариев
Ср, 30/03/2022 - 16:26
Добрый день камрады.
Назрел вопросец по поводу бута в ПроМикро. Значится имеет вшитый по умолчанию usb-бут, который при замыкании reset на землю, определяется в системе как компорт через который с помощью usbasp прошиваем. Допустим прошили что-то типа hid устройства, всё красиво, при следующем подключении по usb стартует основная программа и для следующей прошивки надо снова замыкать ресет. Так вот собсно вопрос, можно ли каким-то способом программно ресентнутся в бут? Пробовал watchdog, не помогает - стартует основной флеш.
программно с какой целью? Бутлоадер имеет смысл запускать только в случае, если у вас есть какое-то внешнее устройство, готовое прошивать про микру. Если оно есть - пусть оно за РЕСЕТ и дергает.
программно с какой целью? Бутлоадер имеет смысл запускать только в случае, если у вас есть какое-то внешнее устройство, готовое прошивать про микру. Если оно есть - пусть оно за РЕСЕТ и дергает.
Ну как с какой целью, чтобы я из своей программы смог прошить.
Вся ж прелесть именно atmega32u4 что там аппаратный usb и бутлоадер создает по юсб виртуальный компорт, по которому и прошивается. т.е. не надо никаких внешних программаторов.
Пробовал watchdog, не помогает - стартует основной флеш.
ну перепиши загрузчик, чтобы не стартовал
ну перепиши загрузчик, чтобы не стартовал
Загрузчик трогать нельзя, эти платы ардуино идут по умолчанию с загрузчиком, который создает в системе ком-порт по которому заливается основная программа. Но загрузчик выполняется только после нажатия ресет, т.е. когда просто воткнуть в юсб, то система сброса это "нюхает" и загрузчик не вызывает, а стартует с основной программы. Для прошивки надо снова нажимать ресет или сделать это программно. Внизу картинка одной программы, которая так и делать, т.е. программно это реально, хочу только узнать куда копать. Может как-то вызвать функцию, с указателем на адрес загрузчика. Надо попробовать.
как-то несколько лет назад Дракула подробно обьяснял, как сбросить статус загрузки еще до исполнения загрузчика, возможно это именно то, что вы ищете (хотя не уверен)
ща попробую найти
вот как-то так
http://arduino.ru/forum/apparatnye-voprosy/ne-mogu-vylechit-vatchdog-na-goloi-atmege328r-s-vnutr-taktirovaniem-8-mgts#comment-339435
по состоянию регистра MCUSR можно определить, что вызвало перезагрузку и, вероятно, сэмулировать реакцию загрузчика как на хард-ресет
Хотя это лучше у Дракулы спросить
Исходники загрузчиков есть в IDE - что мешает шагнуть в нужную точку загрузчика (0x785E для Caterina)???
__Alexander, IDE при прошивке не дёргает ресет. Тыц. Теоритически можно выехать в бут и из тела программы, но подозреваю, что желающий такого изврата куда то не той дорогой пошёл...)
__Alexander, IDE при прошивке не дёргает ресет. Тыц. Теоритически можно выехать в бут и из тела программы, но подозреваю, что желающий такого изврата куда то не той дорогой пошёл...)
Именно это и надо, стартонуть загрузчик из основной программы.
Загрузчик трогать нельзя, эти платы ардуино идут по умолчанию с загрузчиком, который создает в системе ком-порт по которому заливается основная программа.
первое из второго никак не следует
asm volatile( "JMP 0x785E \n\t" :: );для загрузчика Caterina
asm volatile( "JMP 0x785E \n\t" :: );для загрузчика Caterina
"святая катерина пошли мне армянина"... )))
Короче получилось вызвав загрузчик как функцию по адресу.
Главный нюанс был в том, чтобы устройство переинициализировалось, надо текущее прибить.
Короче, создаем указатель на функцию, даем функции имя и адрес и вызываем.
unsigned long res =0; typedef void (*funcPtr_t) (void); int main(void) { funcPtr_t bootloader = (void *) 0x3800; USB_Init(); GlobalInterruptEnable(); for (;;) { HID_Device_USBTask(&Generic_HID_Interface); USB_USBTask(); res++; if (res == 1000000) { USB_Disable(); bootloader(); }Загрузчик начинается с адреса 0x7000 в байтах, поэтому в словах это 0x3800;
Если использовать асм вставку, как привел Komandir, то адрес указывать в байтах.