Bootloader для 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.