Я дам немного более теоретический ответ; другие ответы довольно хороши с практической точки зрения. Загрузчик - это код, который находится в специальном сегменте флэш-памяти. Коду, находящемуся в этом сегменте, разрешено выполнять инструкции самопрограммирования, что позволяет изменять флэш-память (т. Е. Там, где находится код пользователя) без использования обычного программатора (например, ISP для системного программирования или HVP для программирования высокого напряжения), такого как STK500 или AVRISP mkII.
В принципе, подпрограмма обслуживания прерывания получения данных UART (ISR) выполняет функциональный вызов кода загрузчика, который копирует образ программы, отправляемый последовательно в пространство пользовательских программ во флэш-памяти. При запуске, какая бы ни была программа на чипе, начинает работать, но, если правильно сформированные последовательные данные получены рано, AVR переходит в своего рода режим самопрограммирования. В UART ISR есть некоторая логика, которая во время запуска откладывает код загрузчика только на короткий промежуток времени. Детали немного сложнее, но это основная идея.
Прелесть этого в том, что вы можете купить Arduino и ничего более, загрузить бесплатную интегрированную среду разработки (IDE) и начать писать наброски (программы) Arduino и загружать их на AVR просто так, через USB не меньше, спасибо к причудливой маленькой микросхеме FTDI, встроенной в плату Arduino.