Загрузчик STM32

Я настоящий новичок в области микроконтроллеров. Так что прошу прощения, если что-то пропустил или напутал в терминологии.

Есть много действительно конкретных вопросов по конкретным проблемам по этой теме, но я хочу понять это немного больше на общем уровне.

Моя ссылка — STM32F1 на Bluepill.

Я знаю, что это за контроллер как у всех? в семействе STM32 системная память начинается с адреса 0x00000000, в которой находится загрузчик, и основная флэш-память, начинающаяся с адреса 0x08000000, в которой хранится моя прошивка.

Когда у меня есть BOOT0 и BOOT1 на GND, процессор будет загружаться из основной флэш-памяти, и если я установлю BOOT0 на HIGH, он загрузит загрузчик.

Таким образом, загрузчик имеет другое значение по сравнению с компьютерами и операционными системами, поскольку для окончательного использования устройства мне не нужен загрузчик, мне нужна только правильная настройка контактов BOOT0 и BOOT1.

Насколько я понимаю, если я хочу сменить прошивку, мне следует настроить контроллер на загрузку загрузчика, а затем подключиться через один из многих интерфейсов и прошить основную флэш-память. Когда я настраиваю его вот так и подключаю через USB к ПК, ничего не происходит.

Из знакомства со встроенным Rust я успешно адаптировался к настройке контроллера на загрузку из основной флэш-памяти и подключению ST-LinkV2 к Bluepill. Затем я могу подключиться через GDB к ST-LinkV2 и прошить свою прошивку.

Итак, у меня есть пара вопросов:

  1. Почему ST-LinkV2 используется при настройке памяти для загрузки основной прошивки, а не загрузчика?

  2. Почему я не вижу USB-устройства, когда настраиваю контроллер на загрузку и подключаю его через USB?

  3. Я вижу много людей, которые хотят использовать Bluepills с Arduino IDE. Они прошивают новый загрузчик на контроллер. Они заменяют загрузчик ST? Будет ли после этого интерфейс USB похож на программирование через ST-Link?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
342
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

SRAM STM32F103 находится по адресу 0x20000000, а его флэш-память — по адресу 0x08000000 (обратите внимание на ведущий ноль). Он также имеет загрузчик (в ПЗУ) по адресу 0x1FFFxxxx.

В зависимости от настройки контактов BOOTx одна из этих трех областей памяти будет иметь псевдоним 0x00000000. например если вы загружаетесь с флэш-памяти, флэш-память будет видна как по адресу 0x08000000, так и по адресу 0x00000000.

Поскольку процессор, когда он выходит из режима сброса, всегда извлекает вектор сброса с адреса 0x00000004, этот псевдоним позволяет загружаться либо из SRAM, либо из флэш-памяти, либо из загрузчика.

Загрузчик системы находится в ПЗУ и не может быть изменен или обновлен.

Когда вы программируете свою плату с помощью ST-Link, вы не используете загрузчик на STM32 (или какое-либо программное обеспечение на STM32), программирование происходит полностью через интерфейс JTAG или SWD.

Загрузчик STM32F103 не поддерживает USB, он поддерживает только USART1. См. таблицу 3 в AN2606.

Можно написать свой собственный загрузчик, и многие это делают. Однако он по-прежнему будет храниться в обычной флэш-памяти и не перезапишет встроенный загрузчик.

Спасибо за разъяснение. Я интерпретировал комментарий в карте памяти этого чипа о том, что адреса от 0x00000000 до 0x08000000 доступны в зависимости от загрузочных контактов вместе с поведением загрузки конфигурации загрузочных контактов, как указание на то, что загрузчик находится там. Так можно ли вообще использовать эту адресную область в качестве флэш-памяти?

FordPrefect 29.05.2024 15:52

Единственное, что находится по адресу 0x00000000, — это ваш псевдоним, который будет там находиться. Вы можете использовать псевдоним флэш-памяти, и именно так большинство людей запускают свою систему. (т.е. загрузка с флешки). Но на самом деле флэш-память находится по адресу 0x08000000. Вы просто получаете еще одно представление об этом по адресу 0x00000000.

pmacfarlane 29.05.2024 16:04

Ах, теперь я понял. От 0x00000000 до 0x08000000 не очень жестко связаны с какой-либо памятью. В одной конфигурации загрузки загрузчик сопоставлен с этой адресной областью, в одной - с основной флэш-памятью, а в другой - с оперативной памятью. А поскольку процессор стартует с 0x000004, то он будет запускать ту память, которая ему сопоставлена.

FordPrefect 29.05.2024 16:15

Правильно, в 0x0 вообще ничего нет.

pmacfarlane 29.05.2024 16:20

Во-первых, давайте определим загрузчик в контексте 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 меня устраивает.

FordPrefect 29.05.2024 15:55

STLink — лучший способ до тех пор, пока/если вас не интересуют обновления прошивки в полевых условиях или OTA (и это вообще отдельная дискуссия).

Andrey Turkin 29.05.2024 18:12

Другие вопросы по теме