Skip to content

Alternative way to program STM32

Edgar K edited this page Apr 11, 2019 · 32 revisions

Авторы: Казиахмедов Эдгар, Молодцов Владислав

В данной статье мы постараемся подробнее разобраться с такими участками памяти как System Memory и Option Bytes, а также загрузим прошивку в микроконтроллер через последовательный интерфейс.

Режимы старта

Как было замечено на лекции при старте микроконтроллер выбирает область, которая будет отображена в начальную область памяти с адресом 0x00000000.

boot_map.png Рис. 1. Режимы старта

На Рис.1 показано, что конкретный участок памяти может выбран установкой соответствующих значений на физическом пине BOOT0 (см. распиновку) и изменением определенных битов в конфигурационном байте Option byte (nBOOT1, BOOT_SEL, nBOOT0 bits). Таким образом в зависимости от выбранного режима загрузка может быть произведена с следующих режимах:

  • старт с основной FLASH памяти, т.е. основная память будет отображена в начальную секцию по адресу 0x00000000, но также будет доступна по адресу 0x08000000. Другими словами, содержимое FLASH памяти будет доступна как и по адресу 0x00000000 так и по адресу 0x08000000;
  • старт с области системной памяти, т.е. область системной памяти будет отображена в начальную секцию и будет доступна как и с изначального адреса 0x1FFFEC00 на STM32F03x и STM32F05x (0x1FFF C400 на STM32F04x, 0x1FFFC800 на STM32F07x, 0x1FFFD800 на STM32F09x) так и с 0x00000000;
  • старт со встроенной оперативной памяти, таким же образом доступ будет возможен с адресов 0x00000000 и 0x20000000.

По умолчанию на отладочной плате с установленной STM32F051R8T6 пин BOOT0 подключен к земле, тем самым происходит отображание FLASH памяти в начальную секцию. Собственно поэтому программа, которая была загружена, начинает исполняться.

Бутлоадер

Теперь подробнее остановимся на системном участке памяти. Если мы вручную подключим пин BOOT0 к +3v, то при после сброса микроконтроллер начнет исполнять код, который находится в системной памяти. Код в системной памяти называется бутлоудером (bootloader), он записан компанией STMicroelectronics на этапе производства (защищен от записи) и используется для загрузки прошивки в память микроконтроллера. Бутлоудер поддерживает несколько интерфейсов для загрузки данных, а именно:

  • USART (Universal asynchronous receiver-transmitter) на пинах PA14/PA15, либо PA9/PA10;
  • I2C на пинах PB6/PB7 (только на STM32F04xxx, STM32F07xxx и STM32F09xxx);
  • USB DFU, то есть контроллер отображается как флеш-память (только для STM32F04xxx и STM32F07xxx).

После подключения бутлоадер ожидает данные и после установки соединения выполняет запрашиваемые операции над памятью, либо меняет Option Bytes. Для наглядности на Рис.2 предоставлен алгоритм работы бутлоадера.

bootloader.png

Рис. 2. Алгоритм работы бутлоадера

Стоит заметить, что попасть в бутлоадер можно и обычным переходом в соответствующую область памяти (обычный JUMP):

void (*foo)(void) = 0x1FFFEC00;
foo();

Но перед этим необходимо:

  • Отключить тактирование от периферии
  • Отключить использование PLL
  • Выключить все прерывания
  • Убедиться в том, что нет ожидающих обработки прерываний

Конфигурационные байты

Перейдем к описанию следующего региона памяти - Option Bytes. Структуру этой области можно представить на Рис. 3:

optionbyte.png

Рис. 3. Структура конфигурационных регистров

Формально вся структра представлена 4-мя 32-битными регистрами, каждый из которых хранит 2 конфигурационных байта с комплементарным дополнением для защиты от ошибок. Для примера:

nUSER = ~USER

Таким образом в нашем микроконтроллере присутствуют 8 конфиг. регистров.

После включения микроконтроллера, контроллер Option Byte памяти скопирует значения из вышеупомянутых регистров и запишет их в регистры контроллера FLASH памяти FLASH_OBR и FLASH_WRPR, попутно проверяя комплементарные пары на наличие ошибок. В случае возникновения несовпадения байта и его компл. пары, соответсвующий конфиг. байт будет выставлен равным 0xFF, а бит OPTERR в FLASH_OBR будет выставлен в 1.

Рассмотрим параметры конфиг. байта USER:

  • BOOT_SEL, nBOOT1, nBOOT0 - отвечают за режим старта (Рис. 1)
  • RAM_PARITY_CHECK - включение бита проверки для оперативной памяти
  • VDDA_MONITOR - монитор напряжения вкл/выкл
  • nRST_STDBY - сброс при входе в StandBy режим
  • nRST_STOP - сброс при входе в Stop режим
  • WDG_SW - программный/аппаратный сторожевой таймер

Рассмотрим параметры конфиг. байта RDP:

  • весь байт задает уровень защиты на чтение FLASH памяти (подробнее в след. статье про FLASH). Если установить RDP на уровень 1 или 2, стандартный программатор st-link (установленный на отл. плате) не сможет перезагрузить программу на микроконтроллер. Придется подключиться через бутлоадер и сбросить RDP. При сбросе RDP выполняется полная очистка памяти.

Data1, Data0 - пользовательские байты, а остальные байты используются для разблокировки FLASH памяти на запись

Пример загрузки через бутлоадер

Для прошивки через бутлоадер нам необходим USB-USART преобразователь. Выход RX преобразователя нужно подключить к пину PA10, выход TX - к пину PA9: эти пины отвечают за данный протокол, также возможно использование PA14/PA15.

Для работы программатора нужно установить stm32flash (Linux):

sudo apt-get install stm32flash

Теперь соединим BOOT0 пин с питанием +3V и нажнем черную кнопку RESET на отладочной плате.

С помощью следующей команды можно получить информацию о подключенном устройстве:

sudo stm32flash /dev/ttyUSB0

Мы должны увидеть следующее:

Version : 0x31
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0440 (STM32F030x8/F05xxx)
- RAM : 8KiB (2048b reserved by bootloader)
- Flash : 64KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 3KiB

Заметим, что здесь присутствуют размеры FLASH памяти, ОЗУ, а также значение двух пользовательских конфиг. байтов (Option byte 1 и Option byte 2).

Далее приведем основные команды, с помощью которых можно произвести чтение и запись прошивки.

  • Прочитать с микроконтроллера в файл dump.bin:
sudo stm32flash -r dump.bin /dev/ttyUSB0
  • Записать в память микроконтроллера файл dump.bin и запустить исполнение загруженной программы:
sudo stm32flash -w dump.bin -v -g 0x0 /dev/ttyUSB0

В этой статье мы рассмотрели бутлоадер, разобрались с конфигурационными байтами, а также попробовали считать и записать прошивку в память микроконтроллера альтернативным способом. Данным способ загрузки программы может пригодиться тогда, когда отсутсвует отладчик st-link, либо при прошивании готового устройства, не подразумевающего выводы под SWD интерфейс.

Детальное описание программы бутлоудера можно на найти по ссылке.