- stm32: работа с st-link в linux
- Программирование микроконтроллеров stm32 при помощи stlink
- Отладка программы для stm32 при помощи st-link
- Installing ST-Link v2 to flash STM32 targets on Linux
- Related Posts
- Comments
- Программирование флэш-памяти микроконтроллеров STM32F через ST-LINK V1 из System Workbench for STM32 IDE (SWSTM32) в ОС Ubuntu (GNU/Linux)
- Комментарии ( 16 )
stm32: работа с st-link в linux
Микроконтроллеры stm32 прошиваются разными способами, например, через COM порт, или по USB, используя режим dfu. Также прошивку можно заливить по интерфейсу SWD.
Для подключения к SWD используется или отдельное устройство st-link, или st-link, входящий в отладочные платы семейства discovery.
Программирование микроконтроллеров stm32 при помощи stlink
Для того чтобы залить прошивку на микроконтроллер stm32 из под linux потребуется утилита st-flash. Готовых пакетов с этой утилитой нет, поэтому её надо собирать из исходников.
Скачиваем исходники st-link:
Добавляем правило для udev, чтобы к st-link был доступ не только у root’a:
Теперь можно прошивать:
Отладка программы для stm32 при помощи st-link
Используя st-link можно не только заливать прошивку но и отлаживать её. Для этого запускаем gdb сервер st-util.
Затем запускаем arm-none-eabi-gdb и в нем выполняем команды.
Подключаемся к gdb серверу:
Загруженный файл заливаем в микроконтроллер:
Устанавливаем breakpoint на функцию main:
Запускаем выполнение программы:
Поле того, как отладчик остановится на функции main, можно выполнять пошаговую отладку:
В арсенале отладчика gdb есть ещё куча полезных команд. А если связать gdb c eclipse, то получиться довольно удобная среда с графическим интерфейсом.
Источник
Installing ST-Link v2 to flash STM32 targets on Linux
This guide is targeting Linux users and ST-Link v2 hardware.
First, we are going to install the necessary libraries and build tools:
Now, we will download and build the ST-Link utilities:
Now we copy the built binaries to their place:
then udev rules:
Now, plug the ST-Link device into the USB port, but DON’T CONNECT the target board, then type:
If everything went OK, you should see something like this:
Now, disconnect the ST-LINK from USB, connect the four wires to the target board as in the picture
then plug back the ST-Link to the USB and type:
You should see something like:
If the target board is not connected, the ST-Link device will be identified, but you (obviously) will get an error during memory read.
We can decide it is correctly installed.
Please add comments if you encounter any issue using this guide. I hope it will help you.
Thanks for the effort to all contributors to this repository https://github.com/stlink-org/stlink .
The older version of this post is here.
Related Posts
Comments
I found the st-* files under /bin directory , not under /stlink .
Must the other files ” test-* ” also being copied to /usr/local/bin or is that not important ?
Thanks for letting me know about the issue, I have corrected. If you think you’ll never need those test binaries, don’t copy them.
You are the best! Working well
😉 Thanks. Keep an eye on the page.
evething goes well,
marco@marco:
/stm32/stlink/bin$ lsusb
Bus 002 Device 005: ID 046d:c526 Logitech, Inc. Nano Receiver
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0483:3748 STMicroelectronics ST-LINK/V2
Bus 001 Device 003: ID 0781:556b SanDisk Corp. Cruzer Edge
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
/stm32/stlink/bin$ st-info –probe
2020-06-04T03:44:35 ERROR usb.c: Could not open USB device 0x0483:0x3748, access error.
Found 0 stlink programmers
the device shows up, but probing it returns error.
what do i need to do now?
please, i would love to finally compile the blinking led example.
Hi,
Perhaps a nice addition, also with Linux build.
https://github.com/EmBitz/EBlink
I started this project 4 years ago because I was a bit frustrated about texane in those days. For every new device a lot of changes and rebuild were necessary.
on October 24, 2020
I consider adding a post about using GDB with stlink. Thanks for the idea.
on October 24, 2020
marco@marco:/home/marco# st-info –probe
[!] send_recv read reply failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_DEBUG_ENTER
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_JTAG_DRIVE_NRST
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_DEBUG_RESETSYS
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_DEBUG_READCOREID
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_JTAG_READDEBUG_32BIT
Found 1 stlink programmers
serial: 493f6e066772565630332267
hla-serial: “\x49\x3f\x6e\x06\x67\x72\x56\x56\x30\x33\x22\x67”
flash: 0 (pagesize: 0)
sram: 0
chipid: 0x0000
descr: unknown device
marco@marco:/home/marco# st-flash –debug read dummy.file 0 256
st-flash 1.6.0-368-gade735d
2020-06-04T03:57:01 DEBUG common.c: *** looking up stlink version
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_GET_VERSION
2020-06-04T03:57:04 DEBUG common.c: *** looking up stlink version
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_GET_VERSION
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_GET_CURRENT_MODE
2020-06-04T03:57:10 DEBUG common.c: stlink mode: unknown!
2020-06-04T03:57:10 DEBUG usb.c: JTAG/SWD freq set to 0
2020-06-04T03:57:10 DEBUG common.c: *** set_swdclk ***
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_GET_CURRENT_MODE
2020-06-04T03:57:13 DEBUG common.c: stlink mode: unknown!
2020-06-04T03:57:13 DEBUG common.c: *** stlink_enter_swd_mode ***
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_DEBUG_ENTER
2020-06-04T03:57:16 DEBUG common.c: *** stlink_jtag_reset ***
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_JTAG_DRIVE_NRST
2020-06-04T03:57:19 DEBUG common.c: *** stlink_reset ***
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_DEBUG_RESETSYS
2020-06-04T03:57:22 DEBUG common.c: Loading device parameters….
2020-06-04T03:57:22 DEBUG common.c: *** stlink_core_id ***
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_DEBUG_READCOREID
2020-06-04T03:57:25 ERROR common.c: Failed to read core_id
[!] send_recv send request failed: LIBUSB_ERROR_TIMEOUT
[!] send_recv STLINK_JTAG_READDEBUG_32BIT
2020-06-04T03:57:28 WARN common.c: unknown chip id! 0x7f90
Failed to connect to target
st-flash –debug read dummy.file 0 256
what do i need to do now?
now, i have a different serial number and a chipid show up.
found 1 stlink programmers
serial: 303030303030303030303031
hla-serial: “\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x31”
flash: 0 (pagesize: 0)
sram: 0
chipid: 0x0f79
Hello ‘By Natural’
I had exactly the same problem as you.
Источник
Программирование флэш-памяти микроконтроллеров STM32F через ST-LINK V1 из System Workbench for STM32 IDE (SWSTM32) в ОС Ubuntu (GNU/Linux)
НЕ СОВЕТУЮ ПОВТОРЯТЬ ТО, ЧТО НАПИСАНО В ДАННОЙ СТАТЬЕ!
ВОЗНИКАЛИ ПРОБЛЕМЫ ВПЛОТЬ ДО ПОЛНОЙ БЛОКИРОВКИ ПРОГРАММИРУЕМОЙ МИКРОСХЕМЫ.
СОВЕТУЮ ИСПОЛЬЗОВАТЬ БОЛЕЕ СОВРЕМЕННЫЕ ПЛАТЫ С ПРОГРАММАТОРАМИ ST-LINK V2, которые поддерживает программа System Workbench for STM32 IDE (SWSTM32) в ОС Ubuntu.
Приношу извинения за доставленные неудобства, если таковые имели место! Статью со временем удалю или поменяю тему статьи вместе с названием.
Думаю, не только мне приходится работать с платой STM32VLDISCOVERY. По сравнению с другими ознакомительными платами она (иногда) хороша тем, что на ней не навешены дополнительные устройства, следовательно, можно задействовать большинство контактов данной платы для быстрого прототипирования. Недостатки часто становятся достоинствами. 🙂
Особенность платы STM32VLDISCOVERY в том, что на ней установлен программатор/отладчик ST-LINK V1. Возникли сложности с поддержкой ST-LINK V1 в ОС Ubuntu (GNU/Linux). Поэтому отсутствует поддержка ознакомительных плат, содержащих ST-LINK V1, в программах STM32CubeMX и SWSTM32, портированных на GNU/Linux, в частности на Ubuntu.
Потратив немало времени, удалось таки заставить System Workbench for STM32 IDE (SWSTM32) программировать флэш-память микроконтроллеров STM32F через ST-LINK V1 в Ubuntu! Но, увы, не совсем естественно.
Сперва следовал инструкции в статье: How to deal with a problematic STM32 ST-Link/v1 device and Ubuntu
В первую очередь создаётся файл /etc/modprobe.d/usb-storage.conf с содержимым:
Затем необходимо создать файл /etc/udev/rules.d/49-stlinkv1.rules с содержимым(ссылку на соответствующую статью, увы, не помню):
Затем нужно в терминале запусить команду:
или перезагрузить ЭВМ.
OpenOCD, который загружается из репозитория Ubuntu, будет в этом случае работать с ST-LINK V1, если задавать правильные параметры командной строки.
Далее следовал инструкции, приведенной в первой части статьи: Setting up a GCC/Eclipse toolchain for STM32Nucleo – Part II
Нужно из панели главного меню вызывать меню «Run->External Tools->External Tools Configurations. » для того, чтобы открыть окно «External Tools Configurations». Вид окна «External Tools Configurations» приведен на первой картинке.
Далее:
— в графе «Name» присвойте название, например «ST-LINK V1».
— в графе «Location» укажите путь к OpenOCD(установите из репозитория Ubuntu): /usr/bin/openocd
— в графе «Working Directory» укажите переменную «$
— в поле «Arguments» напишите следующее:
Нажмите кнопку «Apply». Таким образом создана конфигурация «ST-LINK V1».
Уже можно програмировать микроконтроллер, вызвав окно «External Tools Configurations» через меню «Run->External Tools->External Tools Configurations. » и нажав кнопку «Run».
Но нельзя не упомянуть одной особенности. В данном случае выбрана была конфигурация «Debug», поэтому в поле «Arguments» при описании пути к программному файлу присутствует название директории «Debug»: $
Если бы была конфигурация «Release», тогда путь к программному файлу выглядел бы примерно так: $
Но это ещё не всё.
Из панели главного меню, через меню «Run->Run Configurations. » вызовите окно «Run Configurations», вид которого показан на второй картинке.
Выберите пункт «Launch Group» и нажмите кнопочку «New Launch Configuration», которая выглядит как иконка с плюсом. Появится название конфигурации «New_Configuration». Затем нажмите кнопку «Add. », после чего появится окно «Add Launch Configuration». Вид окна «Add Launch Configuration» приведен на третьей картинке.
В окне «Add Launch Configuration» в пункте «Program» выберите конфигурацию «ST-LINK V1» и нажмите кнопку «OK». В окне «Add Launch Configuration» в графе «Name» вместо названия «New_configuration» напишите новое название, например «Using ST-LINK V1» и нажмите кнопку «Apply».
Вид окна «Run Configurations» после указанных действий показан на четвёртой картинке.
Затем можете нажать кнопку «Run» для прошивки микроконтроллера.
Каждый раз, когда вы захотите перепрограммировать флэш-память микроконтроллера, вызывайте меню «Run->Run Configurations. » из панели главного меню и выберите нужную конфигурацию, например «Using ST-LINK V1», затем нажимаете кнопку «Run». Это можно сделать также через выпадающее меню «Run As->Run Configurations. ».
Надеюсь, что разработчики программ STM32CubeMX и System Workbench for STM32 IDE (SWSTM32), портированных на GNU/Linux, в будущем решат проблему с ST-LINK V1.
Дополнение от 06.12.2016
Провёл эксперимент на другой ЭВМ. Сделал так, как описано выше. Но по неизвестной мне причине самопроизвольно была установлена защита от записи определённых областей флэш-памяти микроконтроллера, что не позволяло загружать программу во флэш-память микроконтроллера. Пришлось загрузить Windows и с помощью ST-LINK Utility снять биты защиты, после чего стало возможным использовать снова OpenOCD для программирования флэш-памяти. Поэтому будьте осторожны!
Удачи!
Комментарии ( 16 )
Команды, которые вы передаете openocd через -c, можно написать в конфиг, и вызывать openocd… -f flash.cfg — получится короче )
Вопрос — что именно делают правила udev и зачем именно они нужны? У меня удалось пользоваться stlink, когда я выполнил от рута описанное тут — fabooh.com/2014/03/16/how-to-deal-with-a-problematic-stm32-st-linkv1-device-and-ubuntu/
udev — менеджер устройств для новых версий ядра Linux, являющийся преемником devfs, hotplug и HAL. Его основная задача — обслуживание файлов устройств (англ. device nodes) в каталоге /dev и обработка всех действий, выполняемых в пространстве пользователя при добавлении/отключении внешних устройств, включая загрузку firmware
Источник