Bootloader для STM32

 

stm32


Загрузчик (bootloader) - это небольшая программа обеспечивающая загрузку основного приложения удобным для пользователя способом. После начала работы микроконтроллера запускается бутлоадер с помощью которго удобным способом можно обновить прошивку. При заводских настрояйках контроллер, как правило, поддерживает запись прошивок через JTAG и/или UART, или собственный интерфейс (ISP, например, у AVR, debug wire у Freescale). Для того, чтобы обновить прошивку требуется специальный  программатор, который не всегда удобен в использовании. Во многих случаях гораздо эффектвнее осуществлять загрузку прошивки через альтернативный интерфейс, например, ethernet/wifi, CAN, rs-485, не требующий специального оборудования. Для этой цели пишется собственный загрузчик, позволяющий обновлять память через наиболее подходящий интерфейс.

В данной статье пойдет речь о базовых функциях обновления  flash памяти "внутри кода" для микроконтролеров stm. Коротко алгоритм загрузчика можно описать так:

1) Войти в режим загрузчика из основного приложения;

2) Получить команду на обновление прошивки;

3) Получить небольшую обновляемую область памяти (писать внтрупрограммного можно только заданными небольшими фрагментами);

4) Подготовить память к записи;

5) Записать по заданному адресу памяти данные прошивки;

Микроконтроллеры серии stm можно прошивать 3-мя различными способами: JTAG, SWD. USART(через загрузчик). Те из вас, кто знаком с этим контроллером, наверняка знают, что существует загрузчик от компании stm, позволяющий прошивать микроконтроллер через UART. Загрузчик находится в области памяти под названием Sytem Memory, эту область памяти невозможно стереть и контроллер в любом случае можно будет прошить, с использованием специальной утилиты от фирмы stm. Чтоб ввести наш контроллер в режим прошивки, удерживаем кнопку BOOT и жмем RESET. Затем кнопку можно отпустить прошивка контроллера производится с использованием утилиты Flash Loader Demonstrator. Данную утилиту можно скачать с сайта st.com.

Описанный пример был реализован для любой из имеющихся плат DISCOVERY фирмы stm. Я использовал stm32l152 DISCOVERY. Приведем пример моего кода, написанного для микроконтроллера stm32l100:

void flash_eraseall (void)

{
   uint32_t index_erase;
   FLASH_Unlock();
  FLASH_ClearFlag (FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR |

                           FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR);

   for (index_erase = 0; index_erase < 473;  index_erase++)
       FLASH_ErasePage(ADDR_FIRMWARE + (0x100 * index_erase));

   FLASH_Lock();
}

 

Функции, начинающиеся с FLASH - это специльные функции, востребоавнные именно для загрузчика. Эти функции отвечают за работу с памятью прогамм использованной внутри программы:

1) Функция FLASH_Unlock разблокирует flash память МК для дальнейшей работы с внутренней памятью контроллера.
2) Функция FLASH_ClearFlag сбрасывает флаги flash.
3) Функция FLASH_ErasePage стирает одну страницу во flash контроллере. Этих страниц в нашем контроллере 473, за исключением страниц в которых содержится наш загрузчик.
4) Функция FLASH_Lock блокирует flash контроллера. В этом коде мы разблокировали flash контроллер и очистили flash начиная с адреса ADDR_FIRMWARE = 0x08002500. После чего происходит запись программы в очищенную flash память контроллера.

Далее собственно сам цикл записи отдельных фрагментов для записи во флеш прошивке:

for (i = 0; i < size_wr/4; i++)
{
  FLASH_FastProgramWord(flash_adr, ram_buf[i]);
  flash_adr = flash_adr +4;
}

В данной статье мы коротко рассмотрели алгоритм внутрикодового обновления flash памяти в микроконтроллере STM32 через загрузчик USART.