tourist 0 22 октября, 2009 Опубликовано 22 октября, 2009 (изменено) · Жалоба Имеется bootloader стартующий после сброса. Доступ к устройству затруднен, поэтому, для обновления прошивки, приходится делать программный сброс. Сейчас я для этого использую WDT: case UPDATE_FIRMWARE: __delay_cycles(10000000); //ждем FBOOT __watchdog_reset(); WDTCR |= (1<<WDCE) | (1<<WDE); WDTCR = (1<<WDE) | (0<<WDP2) | (0<<WDP1)| (1<<WDP0); while(1){__no_operation();} // ждем сброса по WDT ... Собственно вопрос: есть ли другие способы сделать программный reset (передать управление bootloader)? Кто как вообще это делает? P.S.: использую AVR Bootloader FastBoot von Peter Dannegger P.P.S.: MK - tiny2313 Изменено 22 октября, 2009 пользователем tourist Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 22 октября, 2009 Опубликовано 22 октября, 2009 · Жалоба Вы, собственно, не сказали чем Вас не устраивает приведённый вполне адекватный, за исключением на мой взгляд лишнего __delay_cycles, способ. На форуме уже обсуждался этот вопрос. И из чисто программных этот способ наиболее полно соответствует понятию полного сброса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tourist 0 22 октября, 2009 Опубликовано 22 октября, 2009 · Жалоба чем Вас не устраивает... Собственно устраивает. Только я не был уверен, что не существует других более простых способов. Спасибо за консультацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 22 октября, 2009 Опубликовано 22 октября, 2009 · Жалоба Только я не был уверен, что не существует других более простых способов.Если речь о программном ресете - то, по другому в AVR и не сделать. Если Ваш бутлоадер стартует с известного Вам адреса (наверное, это так и есть), то можно банально перейти по этому адресу, примерно, так: void (*bootloader)(void) = 0x12345; ...... case UPDATE_FIRMWARE: bootloader(); P.S. При таком переходе на бутлоадер есть "подводные камни" в виде несброшенных и продолжающих работать устройств (таймеры, UART, SPI и т.д.). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tourist 0 22 октября, 2009 Опубликовано 22 октября, 2009 · Жалоба Если Ваш бутлоадер стартует с известного Вам адреса (наверное, это так и есть), то можно банально перейти по этому адресу... Прочитав ветку Как программно сгенерить ресет? решил остановиться на WDT... Хотя вариант с переходом по адресу, в моем случае, наверное был бы не хуже. Только вот не знаю я с какого адреса стартует бутлоадер... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 22 октября, 2009 Опубликовано 22 октября, 2009 · Жалоба решил остановиться на WDT... Хотя вариант с переходом по адресу, в моем случае, наверное был бы не хуже. Только вот не знаю я с какого адреса стартует бутлоадер... Wdt - надежнее, потому что, вся переферия тоже сбрасывается! Если вы не используете бутлоадер, (fuse есть куда ресет вектор будет указывать) будет стартовать с 0. если fuse стерт (0) то на начало бутлоадера, почитайте описание fuse. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться