#debugging #stm32 #stm32f4 #openocd #jtag
#отладка #stm32 #stm32f4 #openocd #jtag
Вопрос:
Мне удалось запрограммировать и отладить микроконтроллер STM32F4, выполнить несколько простых операций и написать небольшие сценарии.
Настройка
- Микроконтроллер: STM32F405RG
- Отладочный зонд: я использую старый JTAGKEY2 от Amontec
- Набор инструментов: OpenOCD и GDB на порту 3333
- Я не использую какой-либо графический интерфейс и какой-либо конкретный программный инструмент.
Цель
Теперь я хотел бы немного повысить уровень.
Мой проект состоит из 3 микроконтроллеров на печатной плате, работающих с резервированием.
Я хотел бы отладить два или более STM32F4 и выполнить некоторые операции в одном микроконтроллере, пока остальные остановлены. Вот пример :
-
- Запрограммируйте все устройства (назовем их MCU1 и MCU2) с одним и тем же .elf .
-
- Запустите.
-
- Остановите MCU1 и MCU2 в определенное время (например, через 10 секунд после запуска).
-
- Измените r4 только для MCU1
-
- Возобновить все цели.
Для одного MCU я вызываю целевой конфигурационный файл smt32f4x.cfg. Для двух микроконтроллеров я прочитал Руководство пользователя OpenOCD, и кажется, что мне нужно создать новый tap. Но сначала я хотел попробовать отладить оба MCU1 и MCU2 с одинаковой конфигурацией. Я подключил систему, чтобы подключить микроконтроллеры к шине, открыл терминал и ввел openocd
в папку моего проекта.
Проблема
Как и ожидалось, я получаю это сообщение:
Info : JTAG tap: STM32F405RGTx.bs tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)
Info : JTAG tap: auto0.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: auto1.tap tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 4 -expected-id 0x4ba00477"
Warn : AUTO auto1.tap - use "jtag newtap auto1 tap -irlen 5 -expected-id 0x06413041"
Info : STM32F405RGTx.cpu: hardware has 6 breakpoints, 4 watchpoints
adapter speed: 2000 kHz
Info : JTAG tap: STM32F405RGTx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: STM32F405RGTx.bs tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)
Info : JTAG tap: auto0.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: auto1.tap tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000910 msp: 0x20020000
Тогда происходит то, что программируется только один MCU.
Поэтому я думаю, что я мог бы создать файл конфигурации платы и использовать jtag newtap auto0 tap -irlen 4 -expected-id 0x4ba00477
и использовать один DAP для каждого нажатия…
Поскольку я не уверен в своих навыках, мне не удалось запустить свой собственный конфигурационный файл с нуля.
И я не нашел примеров конфигурации с несколькими микроконтроллерами или примеров в gdb для передачи команд отладки разным командам разным MCU на шине.
Вопросы
- Где я могу найти примеры конфигурации платы с несколькими микроконтроллерами?
- Возможно ли давать команды отладки только одному из устройств в режиме отладки? Как?
Ответ №1:
Я сделал это, используя серийные номера нескольких st-ссылок.
#To invoke without this script: openocd -s /share/openocd/scripts -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg
gdb_port 3334
tcl_port 6667
telnet_port 4445
#To run: openocd -s /share/openocd/scripts and then telnet localhost 4445
#To erase type into telnet: flash erase_sector 0 0 127
#To read device ID and Flash size type into telnet: flash probe 0
source [find interface/stlink-v2-1.cfg]
hla_serial x56x3Fx6Ex06x66x3Fx48x55x38x57x09x67
transport select hla_swd
source stm32f1x-nores.cfg
reset_config none srst_nogate
Посмотрите на строку hla_serial . Каждый MCU имеет свой собственный st-link, подключенный через SWD, и каждый st-link имеет собственную конфигурацию oocd с серийным номером и собственным портом. Затем запустите oocd для каждого из них, и вы получите сервер GDB для каждого MCU.
Вы можете получить серийный номер st-link с помощью команды lsusb -v в Linux. Некоторые клоны не имеют серийного номера, а некоторые нуждаются в обновлении. Google вам поможет.
Комментарии:
1. Спасибо за вашу помощь! На самом деле это хороший обходной путь! Чтобы использовать цепочку JTAG, я скоро опубликую свое решение.
Ответ №2:
- Я смог выяснить, как запрограммировать два микроконтроллера с помощью Openocd
- В настоящее время я использую плату разработки USB Bus Blaster V4, которая содержит микросхему FT2232 USB to JTAG Converter.
- Моя настройка состоит из 2 микроконтроллеров STM32 в конфигурации последовательной цепочки.
- Поскольку оба микроконтроллера имеют одну и ту же микросхему, я создал файл конфигурации платы, как указано в руководстве пользователя на странице 22, раздел 6.2.1, следующим образом:
set CHIPNAME stm32master source [find target/stm32f4x.cfg] -# Chip #2: STM32F405 for Slave STM32, little endian set CHIPNAME stm32slave source [find target/stm32f4x.cfg] gdb_memory_map disable reset_config srst_only```
- Команда, используемая для запуска openocd, выглядит следующим образом:
sudo openocd -d2 -f интерфейс / ftdi/dp_busblaster_kt-link.cfg -f плата/stm32trail.cfg -c инициализация -c scan_chain -c цели - Мой вывод после выполнения приведенной выше команды в терминале выглядит следующим образом:
- Последовательность, в которой я выполнял команды на локальном узле telnet, следующая:
- нацелен на stm32master.cpu
- остановка
- нацелен на stm32slave.cpu
- остановка
- flash erase_sector 0 0 7
- flash write_image erase /home/nikhil/Downloads/Red_Led_C13.hex
- verify_image /home/nikhil/Downloads/Red_Led_C13.hex
- Сброс
- нацелен на stm32master.cpu
- остановка
- flash erase_sector 0 0 7
- flash write_image erase /home/nikhil/Downloads/Red_Led_C13.hex
- verify_image /home/nikhil/Downloads/Red_Led_C13.hex
- Сброс
- Я смог успешно запрограммировать оба MCU.