Я настоящий новичок в области микроконтроллеров. Так что прошу прощения, если что-то пропустил или напутал в терминологии.
Есть много действительно конкретных вопросов по конкретным проблемам по этой теме, но я хочу понять это немного больше на общем уровне.
Моя ссылка — STM32F1 на Bluepill.
Я знаю, что это за контроллер как у всех? в семействе STM32 системная память начинается с адреса 0x00000000, в которой находится загрузчик, и основная флэш-память, начинающаяся с адреса 0x08000000, в которой хранится моя прошивка.
Когда у меня есть BOOT0 и BOOT1 на GND, процессор будет загружаться из основной флэш-памяти, и если я установлю BOOT0 на HIGH, он загрузит загрузчик.
Таким образом, загрузчик имеет другое значение по сравнению с компьютерами и операционными системами, поскольку для окончательного использования устройства мне не нужен загрузчик, мне нужна только правильная настройка контактов BOOT0 и BOOT1.
Насколько я понимаю, если я хочу сменить прошивку, мне следует настроить контроллер на загрузку загрузчика, а затем подключиться через один из многих интерфейсов и прошить основную флэш-память. Когда я настраиваю его вот так и подключаю через USB к ПК, ничего не происходит.
Из знакомства со встроенным Rust я успешно адаптировался к настройке контроллера на загрузку из основной флэш-памяти и подключению ST-LinkV2 к Bluepill. Затем я могу подключиться через GDB к ST-LinkV2 и прошить свою прошивку.
Итак, у меня есть пара вопросов:
Почему ST-LinkV2 используется при настройке памяти для загрузки основной прошивки, а не загрузчика?
Почему я не вижу USB-устройства, когда настраиваю контроллер на загрузку и подключаю его через USB?
Я вижу много людей, которые хотят использовать Bluepills с Arduino IDE. Они прошивают новый загрузчик на контроллер. Они заменяют загрузчик ST? Будет ли после этого интерфейс USB похож на программирование через ST-Link?





SRAM STM32F103 находится по адресу 0x20000000, а его флэш-память — по адресу 0x08000000 (обратите внимание на ведущий ноль). Он также имеет загрузчик (в ПЗУ) по адресу 0x1FFFxxxx.
В зависимости от настройки контактов BOOTx одна из этих трех областей памяти будет иметь псевдоним 0x00000000. например если вы загружаетесь с флэш-памяти, флэш-память будет видна как по адресу 0x08000000, так и по адресу 0x00000000.
Поскольку процессор, когда он выходит из режима сброса, всегда извлекает вектор сброса с адреса 0x00000004, этот псевдоним позволяет загружаться либо из SRAM, либо из флэш-памяти, либо из загрузчика.
Загрузчик системы находится в ПЗУ и не может быть изменен или обновлен.
Когда вы программируете свою плату с помощью ST-Link, вы не используете загрузчик на STM32 (или какое-либо программное обеспечение на STM32), программирование происходит полностью через интерфейс JTAG или SWD.
Загрузчик STM32F103 не поддерживает USB, он поддерживает только USART1. См. таблицу 3 в AN2606.
Можно написать свой собственный загрузчик, и многие это делают. Однако он по-прежнему будет храниться в обычной флэш-памяти и не перезапишет встроенный загрузчик.
Единственное, что находится по адресу 0x00000000, — это ваш псевдоним, который будет там находиться. Вы можете использовать псевдоним флэш-памяти, и именно так большинство людей запускают свою систему. (т.е. загрузка с флешки). Но на самом деле флэш-память находится по адресу 0x08000000. Вы просто получаете еще одно представление об этом по адресу 0x00000000.
Ах, теперь я понял. От 0x00000000 до 0x08000000 не очень жестко связаны с какой-либо памятью. В одной конфигурации загрузки загрузчик сопоставлен с этой адресной областью, в одной - с основной флэш-памятью, а в другой - с оперативной памятью. А поскольку процессор стартует с 0x000004, то он будет запускать ту память, которая ему сопоставлена.
Правильно, в 0x0 вообще ничего нет.
Во-первых, давайте определим загрузчик в контексте MCU. Загрузчик, как обычно понимают, представляет собой специальный фрагмент кода, который позволяет загружать или обновлять программное обеспечение вашего приложения на флэш-память, чтобы его можно было впоследствии запустить из него.
У вас есть несколько вопросов. Давайте пройдемся по ним один за другим.
Почему ST-LinkV2 используется при настройке памяти для загрузки основной прошивки, а не загрузчика?
Когда мы говорим о STLink, мы говорим об использовании подключения отладчика, возможно, SWD. Это метод подключения очень низкого уровня, который подключается непосредственно к внутренним компонентам MCU. В этом методе загрузчик не используется; фактически ядро MCU вообще не работает, т. е. остановлено, и никакие инструкции не выполняются. Программист может напрямую стереть и записать новую прошивку в основную флэш-память, не используя исполнительное ядро.
Почему я не вижу USB-устройства, когда настраиваю контроллер на загрузку и подключаю его через USB?
Я предполагаю, что мы говорим о микроконтроллере STM32F103, который можно найти в Bluepills. Этот MCU содержит загрузчик, который может работать только через USART. Он вообще не запускает USB-оборудование, поэтому вы его не увидите. Если вы хотите использовать этот загрузчик, вам необходимо подключиться к USART микроконтроллера с помощью какого-либо адаптера и использовать этот COM-порт в программаторе (вы можете найти протокол для него в примечании ST AN3155, если вас интересует его внутренняя работа - или используйте его). программных приложений, которые его поддерживают).
Я вижу много людей, которые хотят использовать Bluepills с Arduino IDE. Они прошивают новый загрузчик на контроллер. Они заменяют загрузчик ST? Будет ли после этого интерфейс USB похож на программирование через ST-Link?
Нет, они не заменяют загрузчик ST. Его невозможно заменить; он хранится в ПЗУ - правильном ПЗУ, которое нельзя стереть и изменить.
Загрузчик Arduino для STM32 (названный stm32duino) — это специальный загрузчик, который находится в основной флэш-памяти. Что касается MCU, то это просто обычное приложение; однако это очень специализированное приложение, и его единственная цель — позволить вам записать другое (основное) приложение в основную флэш-память рядом с ним, а затем запустить его. Обратите внимание, что для этого требуется немного флэш-памяти, и ваше основное приложение должно учитывать это и освобождать место для загрузчика; например stm32duino резервирует для себя первые 8 КБ флэш-памяти, которые не должны быть затронуты приложением.
Спасибо за разъяснение. Я предполагаю, что люди затем программируют что-то вроде загрузчика arduino через USART и загрузчика ST в основную флэш-память для интеграции с IDE arduino и потому, что они не хотят адаптировать настройку инструментов независимо от arduino. В этом случае я думаю, что знаю достаточно и мне больше не нужно об этом думать, потому что ST-Link с gdb меня устраивает.
STLink — лучший способ до тех пор, пока/если вас не интересуют обновления прошивки в полевых условиях или OTA (и это вообще отдельная дискуссия).
Спасибо за разъяснение. Я интерпретировал комментарий в карте памяти этого чипа о том, что адреса от 0x00000000 до 0x08000000 доступны в зависимости от загрузочных контактов вместе с поведением загрузки конфигурации загрузочных контактов, как указание на то, что загрузчик находится там. Так можно ли вообще использовать эту адресную область в качестве флэш-памяти?