• Начало
  • Новини
  • Как микроконтролерът стартира след reset – boot процес стъпка по стъпка
Продукти

Как микроконтролерът стартира след reset – boot процес стъпка по стъпка

Как микроконтролерът стартира след reset – boot процес стъпка по стъпка
16 януари 2026

Въведение

Всеки микроконтролер, независимо дали е Arduino, STM32, ESP32 или друг, след reset изпълнява строго определена последователност от стъпки, наречена boot процес.
Този процес определя:

  • От къде ще започне изпълнението на програмата;

  • Как се инициализира хардуерът;

  • Как се зарежда потребителският код.

В тази статия ще разгледаме подробно всяка стъпка, за да разбереш какво реално се случва вътре в чипа.

 

 

 

 

 

 

 

 

1. Какво е reset?

Reset е събитие, което връща микроконтролера в начално състояние.

Видове reset:

  • Power-on reset – при включване на захранването;

  • External reset – чрез reset пин;

  • Watchdog reset – от watchdog таймера;

  • Software reset – от код;

  • Brown-out reset – при спад на напрежението.

Независимо от вида, процесът на стартиране е почти еднакъв.

 

 

2. Хардуерен reset – първите микросекунди

След reset:

  • Всички регистри се връщат в начално състояние;

  • Прекъсванията се забраняват;

  • Периферията се спира;

  • Clock системата се връща на default.

Това става изцяло в хардуер, без код.

 

 

3. Вектор на reset – откъде започва кодът?

Всеки микроконтролер има reset vector – адрес в паметта, от който започва изпълнението.

Пример:

  • AVR (Arduino Uno): 0x0000

  • STM32: 0x08000000

В този адрес има:

// Псевдокод
JMP start_boot

Това е първата инструкция, която процесорът изпълнява.

 

 

4. Стартиране на bootloader

Какво е bootloader?

Bootloader е малка програма, която:

  • Проверява дали има нов firmware;

  • Позволява програмиране по UART/USB;

  • Стартира основната програма.

Примерна логика:

if (update_requested)
{
receive_firmware();
write_flash();
}
else
{
jump_to_main();
}

 

Как разбира дали да влезе в bootloader?

  • Проверка на бутон;

  • Таймер;

  • Специален флаг в паметта.

 

5. Прескачане към основната програма (main firmware)

След bootloader:

jump_to(0x08004000); // примерен адрес на main firmware

Тук започва твоят код. 

 

 

6. Startup код – преди main()

Преди да се извика main():

  1. Инициализация на stack pointer;

  2. Копиране на глобални променливи;

  3. Зануляване на RAM;

  4. Настройка на clock;

  5. Настройка на прекъсвания.

Пример:

void Reset_Handler(void)
{
init_stack();
copy_data_to_ram();
clear_bss();
SystemClock_Config();
main();
}
 
 

7. Влизане в main()

Едва сега стартира твоята програма:

int main(void)
{
setup();
while(1)
{
loop();
}
}

Това е краят на boot процеса.

 
 

8. Как изглежда целият процес накратко?

Стъпка по стъпка:

  1. Reset сигнал;

  2. Хардуерна инициализация;

  3. Изпълнение от reset vector;

  4. Стартиране на bootloader.

  5. Проверка за update;

  6. Прескачане към main firmware;

  7. Startup код;

  8. Влизане в main().

 

 

9. Практически пример – Arduino

При Arduino:

  • Reset → bootloader;

  • Изчаква ~2 секунди;

  • Ако няма upload → стартира скеча.

 

 

10. Защо е важно да знаеш това?

Ползи:

  • Пишеш собствен bootloader;

  • Debug по-лесно;

  • Разбираш защо понякога кодът не стартира;

  • Оптимизираш стартовото време.

 

 

Заключение

Boot процесът е гръбнакът на всеки embedded проект.
Разбирането му ти дава пълен контрол върху:

  • Стартирането;

  • Обновяването;

  • Сигурността.