Witam,
mam sobie meżkę z bootloaderem usbasploader (polecam btw). W programie chciałbym umieścić funkcję powrotu do bootloadera. Robię to w ten sposób:
Słyszałem, że watchdog działa tak, jak fizyczne zwarcie linii RESET do masy. Jednak po wywołaniu reset() program wraca do swojego początku, zamiast w pełni resetować urządzenie. Co innego, jeśli zewrę reset – wtedy odpala się bootloader. Moim pytaniem jest, czy da się z poziomu programu zrobić pełniejszy reset?
Żeby nie trzeba było za dużo szukać, przeklejam maina bootloadera:
(bootLoaderCondition() to po prostu sprawdzenie zworki)
Wesołych Świąt
mam sobie meżkę z bootloaderem usbasploader (polecam btw). W programie chciałbym umieścić funkcję powrotu do bootloadera. Robię to w ten sposób:
void reset() { cli();wdt_enable(WDTO_15MS);while(1); }Słyszałem, że watchdog działa tak, jak fizyczne zwarcie linii RESET do masy. Jednak po wywołaniu reset() program wraca do swojego początku, zamiast w pełni resetować urządzenie. Co innego, jeśli zewrę reset – wtedy odpala się bootloader. Moim pytaniem jest, czy da się z poziomu programu zrobić pełniejszy reset?
Żeby nie trzeba było za dużo szukać, przeklejam maina bootloadera:
int __attribute__((noreturn)) main(void)
{
/* initialize */
wdt_disable(); /* main app may have enabled watchdog */
bootLoaderInit();
odDebugInit();
DBG1(0x00, 0, 0);
#ifndef NO_FLASH_WRITE
GICR = (1 << IVCE); /* enable change of interrupt vectors */
GICR = (1 << IVSEL); /* move interrupts to boot flash section */
#endif
if(bootLoaderCondition()){
uchar i = 0, j = 0;
initForUsbConnectivity();
do{
usbPoll();
#if BOOTLOADER_CAN_EXIT
if(requestBootLoaderExit){
if(--i == 0){
if(--j == 0)
break;
}
}
#endif
}while(bootLoaderCondition()); /* main event loop */
}
leaveBootloader();
}(bootLoaderCondition() to po prostu sprawdzenie zworki)
Wesołych Świąt
