-
Notifications
You must be signed in to change notification settings - Fork 62
Alternative way to program STM32
Авторы: Казиахмедов Эдгар, Молодцов Владислав
В данной статье мы постараемся подробнее разобраться с такими участками памяти как System Memory и Option Bytes, а также загрузим прошивку в микроконтроллер через последовательный интерфейс.
Как было замечено на лекции при старте микроконтроллер выбирает область, которая будет отображена в начальную область памяти с адресом 0x00000000.
Рис. 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 предоставлен алгоритм работы бутлоадера.
Рис. 1. Алгоритм работы бутлоадера
Стоит заметить, что попасть в бутлоадер можно и обычным переходом в соответствующую область памяти (обычный JUMP):
void (*foo)(void) = 0x1FFFEC00;
foo();
Но перед этим необходимо:
- Отключить тактирование от периферии
- Отключить использование PLL
- Выключить все прерывания
- Убедиться в том, что нет ожидающих обработки прерываний
Перейдем к описанию следующего региона памяти - Option Bytes. Структуру этой области можно представить на Рис. 3:
Рис. 3. Структура конфигурационных регистров