Tôi sẽ đưa ra một câu trả lời lý thuyết hơn một chút; các câu trả lời khác là khá tốt từ một quan điểm thực tế. Bộ tải khởi động là mã nằm trong một phân đoạn đặc biệt của bộ nhớ flash. Mã nằm trong phân đoạn đó được phép thực hiện Hướng dẫn tự lập trình, cho phép sửa đổi bộ nhớ flash (tức là nơi mã người dùng cư trú) mà không cần lập trình viên thông thường (ví dụ: ISP lập trình trong hệ thống hoặc HVP lập trình điện áp cao) như STK500 hoặc AVRISP mkII.
Về nguyên tắc, UART Recipe Data Interrupt Service Routine (ISR) thực hiện một cuộc gọi hàm vào mã bộ tải khởi động sao chép hình ảnh chương trình được gửi một cách an toàn vào không gian chương trình người dùng trong bộ nhớ flash. Khi khởi động, bất kỳ chương trình nào trên chip đều bắt đầu chạy, nhưng nếu sớm nhận được dữ liệu nối tiếp được định dạng thích hợp, thì AVR sẽ chuyển sang chế độ tự lập trình. Có một số logic trong UART ISR chỉ trì hoãn mã khởi động trong một khoảng thời gian ngắn trong khi khởi động. Các chi tiết phức tạp hơn thế một chút, nhưng đó là ý tưởng cơ bản.
Cái hay của việc này là bạn có thể mua Arduino, và không gì khác, tải xuống Môi trường phát triển tích hợp (IDE) miễn phí, và bắt đầu viết Arduino Sketches (chương trình), và tải chúng xuống AVR giống như vậy, qua USB không kém với chip IC FTDI nhỏ lạ mắt được tích hợp vào bo mạch Arduino.