При сбросе стартует всегда загрузчик. Проверяет CRC (целостность) целевой программы, если все пучком, передает ей управление. Если нет - ждет команду программирования. Работающей целевой программе можно послать команду "запустить загрузчик". Ну и для принудительного входа в процедуру программирования в загрузчике можно опросить какую-либо ногу при старте, проверить "магическое число" в EEPROM и т.п.