Прошивка и Serial через USB
تم الإنشاء في: ١ ديسمبر ٢٠٢٤
تمت الإجابة باستخدام O1 Preview بواسطة Chat01
تم الإنشاء في: ١ ديسمبر ٢٠٢٤
تمت الإجابة باستخدام O1 Preview بواسطة Chat01
я делаю контроллер на stm32f765(либо h743)vit6. программирую его через arduino ide.
мне нужно решить такой вопрос: мой контроллер будет стоят удаленно и подключен к ПК по usb, мне нужно прошивать его по USB, а так же нужно сделать serial порт чтобы получать данные с него.
Чтобы решить вашу задачу — обеспечить возможность прошивки контроллера STM32F765 или H743 по USB и одновременно использовать USB для последовательной связи (Serial) — необходимо выполнить следующие шаги:
Использование встроенного загрузчика STM32 (DFU):
Использование USB CDC для последовательной связи:
Serial
для связи по USB.cppvoid setup() { Serial.begin(115200); while(!Serial); // Ожидание подключения USB } void loop() { Serial.println("Данные от STM32"); delay(1000); }
Автоматизация процесса прошивки:
cppvoid enterBootloader() { // Установка бита для перехода в системный загрузчик __set_PRIMASK(1); // Отключение прерываний *((unsigned long *)0x20004FF0) = 0xDEADBEEF; // Магическое число NVIC_SystemReset(); // Сброс системы }
setup()
проверяйте это магическое число и, если оно установлено, переходите в загрузчик.Прошивка через DFU-утилиту:
Решение потенциальных проблем:
Альтернативный вариант — использование кастомного загрузчика:
Дополнительные рекомендации:
Заключение:
Комбинирование возможности прошивки по USB и использования USB для последовательной связи на STM32 требует правильной настройки загрузчика и вашего приложения. Используя встроенный загрузчик или установив кастомный, вы сможете обновлять прошивку удаленно. А настройка USB CDC в вашем скетче позволит получать данные через последовательный порт. Убедитесь, что все компоненты работают гармонично, и тщательно протестируйте систему перед ее развертыванием.
что такое boot1? я такого не видел
Извините за неточность в моём предыдущем ответе.
Ответ на ваш вопрос:
Для микроконтроллеров серии STM32F7 и STM32H7, включая STM32F765 и H743, пин BOOT1 отсутствует. Вместо этого они используют только один пин — BOOT0 — для выбора режима загрузки.
Пояснение:
BOOT0: Это единственный пин, который определяет режим загрузки микроконтроллера.
BOOT1: Этот пин присутствует в некоторых других сериях STM32, таких как F1 или F3. В STM32F7 и H7 он отсутствует, и все режимы загрузки контролируются только пином BOOT0.
Что это означает для вас:
Рекомендации для вашей задачи:
Аппаратное подключение BOOT0:
Программный переход в режим загрузчика:
Вы можете реализовать программный способ входа в системный загрузчик без физического переключения пина BOOT0.
Пример кода для STM32F7/H7:
cppvoid enterBootloader() { // Отключаем прерывания __disable_irq(); // Деинициализируем периферию (USB, таймеры, прерывания и т.д.) // ... // Устанавливаем адрес системного загрузчика для STM32F7/H7 uint32_t sysMemBootStartAddr = 0x1FF00000; // Устанавливаем указатель стека __set_MSP(*((uint32_t *)sysMemBootStartAddr)); // Устанавливаем указатель на функцию загрузчика void (*SysMemBootJump)(void); SysMemBootJump = (void (*)(void)) (*((uint32_t *)(sysMemBootStartAddr + 4))); // Переходим в системный загрузчик SysMemBootJump(); // Бесконечный цикл на случай, если что-то пойдет не так while (1); }
Прошивка по USB с использованием DFU:
Настройка USB для Serial связи в Arduino IDE:
В настройках платы в Arduino IDE выберите опцию, которая включает USB CDC (виртуальный COM-порт).
В вашем скетче используйте объект Serial
для обмена данными:
cppvoid setup() { Serial.begin(115200); while(!Serial); // Ждём подключения по USB } void loop() { Serial.println("Данные от STM32"); delay(1000); }
Совместное использование USB для прошивки и Serial связи:
Важно:
Безопасность процесса прошивки:
Тестирование:
Заключение:
Отсутствие пина BOOT1 в STM32F765 и H743 означает, что управление режимами загрузки осуществляется только через пин BOOT0 или программно. Используя программный метод перехода в загрузчик, вы можете облегчить процесс удалённой прошивки. При правильной настройке USB-интерфейса ваше устройство сможет одновременно предоставлять возможности прошивки по USB и последовательной связи.
напиши мне подробно шаги прошивки по usb, не надо варианты. надо точно рабочий способ через arduino ide
Подробная инструкция по прошивке STM32F765 или H743 через USB с использованием Arduino IDE
Чтобы прошить ваш контроллер STM32F765 или H743 по USB с помощью Arduino IDE и настроить последовательный порт для обмена данными, выполните следующие шаги.
Подключение пина BOOT0:
Подключение USB:
Дополнительные подключения (при необходимости):
Скачайте и установите последнюю версию Arduino IDE:
Добавьте URL для менеджера плат STM32:
https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
Установите STM32 Core:
Выберите плату:
Настройте параметры платы:
Дополнительные настройки:
Serial
будет использоваться для USB CDC (виртуальный COM-порт).Serial1
, Serial2
и т.д. соответствуют аппаратным UART.Пример скетча:
cppvoid setup() { Serial.begin(115200); while (!Serial) { ; // Ждем подключения по USB } Serial.println("Устройство запущено"); } void loop() { if (Serial.available()) { String command = Serial.readStringUntil('\n'); if (command == "bootloader") { Serial.println("Переход в загрузчик..."); delay(100); // Небольшая задержка для отправки сообщения enterBootloader(); } else { Serial.println("Неизвестная команда: " + command); } } // Дополнительный код delay(100); } void enterBootloader() { // Отключаем прерывания __disable_irq(); // Деинициализируем периферию (если используется) // Например, отключаем USB // Устанавливаем адрес системного загрузчика uint32_t sysMemBootStartAddr; #if defined(STM32F7) sysMemBootStartAddr = 0x1FF00000; // Адрес для STM32F7 #elif defined(STM32H7) sysMemBootStartAddr = 0x1FF09800; // Адрес для STM32H7 #else #error "Неизвестный микроконтроллер" #endif // Устанавливаем указатель стека __set_MSP(*((uint32_t *)sysMemBootStartAddr)); // Устанавливаем указатель на функцию загрузчика void (*SysMemBootJump)(void); SysMemBootJump = (void (*)(void)) (*((uint32_t *)(sysMemBootStartAddr + 4))); // Переходим в системный загрузчик SysMemBootJump(); // Бесконечный цикл на случай, если что-то пойдет не так while (1); }
Объяснение кода:
setup()
:
loop()
:
"bootloader"
, вызывает функцию enterBootloader()
.enterBootloader()
:
Подключите устройство к компьютеру через USB.
Установите STM32CubeProgrammer:
Убедитесь в корректной настройке пути к STM32CubeProgrammer:
Выберите правильный порт:
Загрузите скетч:
enterBootloader()
, отправьте команду "bootloader"
через Serial.Процесс загрузки:
Откройте монитор порта:
Обмен данными:
Переход в режим загрузчика:
Загрузка новой прошивки:
Установка драйверов (для Windows):
Устранение неполадок:
Безопасность:
Документация:
Примечание об адресах загрузчика:
0x1FF00000
0x1FF09800
(проверьте актуальность в документации)Следуя этим подробным шагам, вы сможете успешно прошить ваш контроллер STM32F765 или H743 через USB с использованием Arduino IDE и настроить последовательную связь для обмена данными. Программный переход в режим загрузчика облегчит процесс обновления прошивки, особенно для удаленных устройств.
Убедитесь, что вы тщательно протестировали весь процесс локально, прежде чем устанавливать устройство в удаленном месте.
я прошил твоб прошивку по swd. все прошилось. ком порт появился. к нему подключился. написало что перешло в режим загрузчика. потом поменял программатор на dfu но пишет что не может найти Selected interface: dfu
-------------------------------------------------------------------
STM32CubeProgrammer v2.17.0
-------------------------------------------------------------------
Error: Target device not found.
Establishing connection with the device failed.
Извините, что у вас возникли проблемы при попытке прошить устройство через DFU. Давайте постараемся разобраться и решить эту проблему шаг за шагом.
Вы загрузили прошивку через SWD.
COM-порт появился, вы подключились к нему.
Устройство сообщило, что переходит в режим загрузчика.
При попытке прошить через DFU получаете ошибку:
textError: Target device not found. Establishing connection with the device failed.
Проверка в Диспетчере устройств (Windows):
Установка драйверов DFU:
Проверка правильности адреса системного загрузчика:
0x1FF00000
.0x1FF09800
или 0x1FF0F800
(зависит от ревизии).Обновите функцию enterBootloader()
:
cppvoid enterBootloader() { __disable_irq(); // Отключаем прерывания // Деинициализируем периферию // Закрываем USB и другие используемые периферийные устройства // Сбрасываем настройки RCC (тактового генератора) RCC->APB1ENR1 = 0; RCC->APB1ENR2 = 0; RCC->APB2ENR = 0; RCC->AHB1ENR = 0; RCC->AHB2ENR = 0; RCC->AHB3ENR = 0; // Очищаем прерывания for (int i = 0; i < 8; i++) { NVIC->ICER[i] = 0xFFFFFFFF; NVIC->ICPR[i] = 0xFFFFFFFF; } // Устанавливаем адрес системного загрузчика uint32_t sysMemBootStartAddr; #if defined(STM32F7) sysMemBootStartAddr = 0x1FF00000; // Для STM32F7 #elif defined(STM32H7) sysMemBootStartAddr = 0x1FF09800; // Проверьте точный адрес #else #error "Неизвестный микроконтроллер" #endif // Устанавливаем указатель стека __set_MSP(*(__IO uint32_t*) sysMemBootStartAddr); // Устанавливаем указатель на функцию загрузчика void (*SysMemBootJump)(void); SysMemBootJump = (void (*)(void)) (*(__IO uint32_t*) (sysMemBootStartAddr + 4)); // Переходим в системный загрузчик SysMemBootJump(); // Бесконечный цикл на случай неудачи while (1); }
Некоторые STM32 требуют внешнего кварца для работы USB в режиме DFU.
Проверьте USB-кабель:
Проверьте USB-разъемы:
Запустите STM32CubeProgrammer отдельно от Arduino IDE:
Установите пин BOOT0 в высокий уровень:
Проверьте в STM32CubeProgrammer:
Деинициализация периферии:
Пример деинициализации USB:
cppvoid deinitUSB() { // Остановите USB-подсистему USBD_Stop(&hUsbDeviceFS); USBD_DeInit(&hUsbDeviceFS); // Отключите тактирование USB __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); }
Вызовите эту функцию перед переходом в загрузчик:
cppvoid enterBootloader() { __disable_irq(); // Отключаем прерывания deinitUSB(); // Деинициализируем USB // Остальная часть функции без изменений // ... }
Какой именно микроконтроллер вы используете (STM32F765 или STM32H743)?
Установлен ли у вас внешний кварц, и какой его номинал?
Появляется ли устройство в Диспетчере устройств после перехода в загрузчик (даже как неизвестное устройство)?
Какое сообщение выводит устройство в Serial перед переходом в загрузчик?
Проверьте наличие устройства в Диспетчере устройств:
Установите драйверы DFU:
Обновите функцию enterBootloader()
:
Попробуйте аппаратный способ входа в загрузчик:
Проверьте внешний кварц:
Используйте STM32CubeProgrammer напрямую:
Обновите STM32CubeProgrammer до последней версии.
Убедитесь, что USB Speed в настройках Arduino IDE соответствует вашей аппаратуре:
Проверьте документацию AN2606:
Рассмотрите использование кастомного загрузчика:
Проблема может быть связана с несколькими факторами: неправильный адрес загрузчика, отсутствие внешнего кварца, не корректная деинициализация USB или проблемы с драйверами на компьютере.
Пожалуйста, выполните следующие шаги и сообщите результаты:
Обновите функцию enterBootloader()
с учетом деинициализации USB и правильного адреса загрузчика.
Проверьте наличие устройства в Диспетчере устройств после перехода в загрузчик.
Установите драйверы DFU, если необходимо.
Попробуйте аппаратно установить BOOT0 в высокий уровень и прошить устройство через STM32CubeProgrammer напрямую.
Сообщите, какой микроконтроллер вы используете и установлен ли внешний кварц.
Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, пожалуйста, сообщите, и я с радостью помогу вам решить проблему.
в диспетчере устройств нашел только com порт соответсующий стм.
сейчас на плату запаяно h743
стоит кварц 8МГц
после перехода в режим загруузчика ничего не меняется в диспетчере устройств. но ком порт больше не открывается в ардуино иде
после отправки команды переключения выводит сообщение Переход в загрузчик
Спасибо за предоставленную информацию. Давайте детально разберём вашу ситуацию и постараемся найти решение.
После перехода в режим загрузчика COM-порт исчезает (что ожидаемо), но в Диспетчере устройств не появляется новое устройство, такое как DFU или другое USB-устройство.
Arduino IDE не может найти устройство в режиме DFU и выдаёт ошибку:
textError: Target device not found. Establishing connection with the device failed.
Действия:
Проверьте точный адрес системного загрузчика для STM32H743:
Согласно документу AN2606 (STM32 microcontroller system memory boot mode), для STM32H743 адрес системного загрузчика может быть 0x1FF1E000
.
Важно: В документации могут быть различия в зависимости от ревизии микроконтроллера. Убедитесь, что вы используете актуальную версию документации для вашей конкретной модели STM32H743.
Обновите функцию enterBootloader()
с корректным адресом:
cppvoid enterBootloader() { __disable_irq(); // Отключаем прерывания // Деинициализируем USB USBD_DeInit(&hUsbDeviceFS); // Отключаем тактирование USB __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); // Сбрасываем настройки RCC (тактового генератора) RCC->APB1ENR1 = 0; RCC->APB1ENR2 = 0; RCC->APB2ENR = 0; RCC->AHB1ENR = 0; RCC->AHB2ENR = 0; RCC->AHB3ENR = 0; // Очищаем прерывания for (int i = 0; i < 8; i++) { NVIC->ICER[i] = 0xFFFFFFFF; NVIC->ICPR[i] = 0xFFFFFFFF; } // Устанавливаем адрес системного загрузчика uint32_t sysMemBootStartAddr = 0x1FF1E000; // Проверьте актуальность адреса // Устанавливаем указатель стека __set_MSP(*(__IO uint32_t*) sysMemBootStartAddr); // Устанавливаем указатель на функцию загрузчика void (*SysMemBootJump)(void); SysMemBootJump = (void (*)(void)) (*(__IO uint32_t*) (sysMemBootStartAddr + 4)); // Переходим в системный загрузчик SysMemBootJump(); // Бесконечный цикл на случай неудачи while (1); }
Примечание: Убедитесь, что адрес 0x1FF1E000
соответствует вашей конкретной модели STM32H743. Если нет, используйте правильный адрес из документации.
Проблема:
Действия:
Деинициализируйте USB перед переходом в загрузчик:
cppvoid enterBootloader() { __disable_irq(); // Отключаем прерывания // Деинициализируем USB USBD_DeInit(&hUsbDeviceFS); // Отключаем тактирование USB __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); // Деинициализируем другие периферийные устройства, если необходимо // ... // Остальная часть функции без изменений // ... }
Убедитесь, что вы деинициализируете все используемые периферийные устройства, особенно те, которые могут конфликтовать с системным загрузчиком.
Проблема:
Действия:
Убедитесь, что кварцевый резонатор 8 МГц установлен правильно и работает:
Проверьте, запускается ли HSE при старте загрузчика:
Действия:
Подключите пин BOOT0 к 3.3V (высокий уровень).
Перезагрузите устройство (нажмите кнопку Reset или отключите и подключите питание).
Проверьте Диспетчер устройств:
Если устройство распознается:
enterBootloader()
и деинициализацию периферии.Если устройство не распознается:
Действия:
Проверьте USB-кабель и разъёмы:
Проверьте наличие неизвестных устройств в Диспетчере устройств:
Установите драйверы DFU:
Проблема:
Действия:
Проверьте документ AN2606:
Проверьте настройки пинов USB:
Проблема:
Действия:
Если системный загрузчик требует HSE:
Если загрузчик использует HSI:
Обновите функцию enterBootloader()
с корректным адресом загрузчика и полной деинициализацией USB и других периферийных устройств.
Проверьте работу внешнего кварца:
Попробуйте аппаратный метод перехода в загрузчик через BOOT0:
Проверьте USB-подключение:
Установите или обновите драйверы DFU на компьютере:
Используйте STM32CubeProgrammer напрямую:
Проверьте версию микроконтроллера:
Обратитесь к официальной поддержке STMicroelectronics:
Рассмотрите использование альтернативного загрузчика:
Проблема, с которой вы столкнулись, вероятно, связана с корректной инициализацией и переходом в системный загрузчик на STM32H743. Предлагаю выполнить предложенные шаги и внимательно проверить каждый из аспектов:
Пожалуйста, сообщите о результатах после выполнения этих действий. Если проблема останется нерешённой, мы можем продолжить поиск решения на основе новых данных.
напиши мне код целиком, а не частями. т.к. выдает ошибки
C:\Users\Skorokhod\AppData\Local\Temp.arduinoIDE-unsaved2024111-15244-ny5q3z.mj9x\sketch_dec1b\sketch_dec1b.ino: In function 'void enterBootloader()':
C:\Users\Skorokhod\AppData\Local\Temp.arduinoIDE-unsaved2024111-15244-ny5q3z.mj9x\sketch_dec1b\sketch_dec1b.ino:28:16: error: 'hUsbDeviceFS' was not declared in this scope
28 | USBD_DeInit(&hUsbDeviceFS);
| ^~~~~~~~~~~~
C:\Users\Skorokhod\AppData\Local\Temp.arduinoIDE-unsaved2024111-15244-ny5q3z.mj9x\sketch_dec1b\sketch_dec1b.ino:34:8: error: 'struct RCC_TypeDef' has no member named 'APB1ENR1'; did you mean 'AHB1ENR'?
34 | RCC->APB1ENR1 = 0;
| ^~~~~~~~
| AHB1ENR
C:\Users\Skorokhod\AppData\Local\Temp.arduinoIDE-unsaved2024111-15244-ny5q3z.mj9x\sketch_dec1b\sketch_dec1b.ino:35:8: error: 'struct RCC_TypeDef' has no member named 'APB1ENR2'; did you mean 'AHB1ENR'?
35 | RCC->APB1ENR2 = 0;
| ^~~~~~~~
| AHB1ENR
exit status 1
Compilation error: 'hUsbDeviceFS' was not declared in this scope
пс. когда втыкаю st-link то он появляется в universal bus devices
Полный код для STM32H743 с исправлениями ошибок компиляции
Извините за предыдущие неточности. Давайте предоставлю полный код, скорректированный для STM32H743 и Arduino IDE, который должен успешно компилироваться и, при возможности, позволит перейти в системный загрузчик.
Важное замечание:
Для микроконтроллеров STM32H7 программный переход в системный загрузчик может быть затруднен из-за особенностей архитектуры и требований к тактированию. В некоторых случаях единственный надежный способ войти в системный загрузчик — это установить пин BOOT0 в высокий уровень и перезагрузить устройство.
Тем не менее, я предоставлю код, который:
cpp#include <Arduino.h> // Определяем адрес системного загрузчика для STM32H743 #define SYS_MEM_ADDRESS 0x1FF1E000 void enterBootloader() { __disable_irq(); // Отключаем прерывания // Деинициализируем USB-подсистему (если используется) // В среде Arduino доступа к низкоуровневым USB-структурам может не быть // Поэтому можно попробовать отключить тактирование USB // Отключаем USB-периферию RCC->AHB1ENR &= ~RCC_AHB1ENR_USB2OTGHSEN; // Отключаем тактирование USB OTG HS RCC->AHB1ENR &= ~RCC_AHB1ENR_USB1OTGHSEN; // Отключаем тактирование USB OTG FS (если используется) // Деинициализируем системные прерывания for (int i = 0; i < 8; i++) { NVIC->ICER[i] = 0xFFFFFFFF; NVIC->ICPR[i] = 0xFFFFFFFF; } // Сбрасываем настройки RCC (если необходимо) // Не рекомендуется полностью обнулять регистры RCC, так как это может привести к нестабильности // Вместо этого деактивируйте только необходимые периферийные устройства // Устанавливаем указатель стека на начало системной памяти __set_MSP(*((uint32_t *)SYS_MEM_ADDRESS)); // Определяем указатель на функцию системного загрузчика void (*SysMemBootJump)(void); SysMemBootJump = (void (*)(void)) (*((uint32_t *)(SYS_MEM_ADDRESS + 4))); // Переходим в системный загрузчик SysMemBootJump(); // Бесконечный цикл на случай неудачи while (1); } void setup() { Serial.begin(115200); while (!Serial) { ; // Ждем подключения по USB } Serial.println("Устройство запущено"); } void loop() { if (Serial.available()) { String command = Serial.readStringUntil('\n'); if (command == "bootloader") { Serial.println("Переход в загрузчик..."); delay(100); // Небольшая задержка для отправки сообщения enterBootloader(); } else { Serial.println("Неизвестная команда: " + command); } } // Дополнительный код delay(100); }
Удаление использования hUsbDeviceFS
:
hUsbDeviceFS
не доступна в среде Arduino IDE, так как это низкоуровневая структура из библиотеки HAL.Корректировка регистров RCC для STM32H743:
RCC->AHB1ENR
.
RCC->AHB1ENR
— регистр включения тактирования для AHB1 периферии.USB1OTGHSEN
и USB2OTGHSEN
отвечают за тактирование USB OTG HS и FS соответственно.Удаление обнуления регистров RCC:
Исправление ошибки с APB1ENR1
и APB1ENR2
:
APB1ENR1
и APB1ENR2
.APB1LENR
и APB1HENR
.Добавление макроса SYS_MEM_ADDRESS
:
0x1FF1E000
.Деинициализация прерываний:
Использование стандартных функций Arduino:
Программный переход в загрузчик на STM32H743:
Рекомендация использовать аппаратный метод:
Использование кастомного загрузчика:
Проверка устройства в Диспетчере устройств:
Использование STM32CubeProgrammer:
Установка драйверов DFU (для Windows):
Документация:
Предоставленный код должен успешно компилироваться в Arduino IDE для STM32H743. Однако из-за ограничений архитектуры STM32H7 программный переход в системный загрузчик может не работать. Рекомендуется использовать аппаратный метод входа в загрузчик с помощью пина BOOT0 или рассмотреть возможность использования кастомного загрузчика для обновления прошивки по USB без аппаратных переключений.
Если у вас возникнут дополнительные вопросы или потребуется помощь в реализации альтернативных решений, пожалуйста, сообщите, и я с радостью помогу вам дальше.