Как отладить два или более микроконтроллеров с цепочкой JTAG?

#debugging #stm32 #stm32f4 #openocd #jtag

#отладка #stm32 #stm32f4 #openocd #jtag

Вопрос:

Мне удалось запрограммировать и отладить микроконтроллер STM32F4, выполнить несколько простых операций и написать небольшие сценарии.

Настройка

  • Микроконтроллер: STM32F405RG
  • Отладочный зонд: я использую старый JTAGKEY2 от Amontec
  • Набор инструментов: OpenOCD и GDB на порту 3333
  • Я не использую какой-либо графический интерфейс и какой-либо конкретный программный инструмент.

Цель

Теперь я хотел бы немного повысить уровень.

Мой проект состоит из 3 микроконтроллеров на печатной плате, работающих с резервированием.

Я хотел бы отладить два или более STM32F4 и выполнить некоторые операции в одном микроконтроллере, пока остальные остановлены. Вот пример :

    1. Запрограммируйте все устройства (назовем их MCU1 и MCU2) с одним и тем же .elf .
    1. Запустите.
    1. Остановите MCU1 и MCU2 в определенное время (например, через 10 секунд после запуска).
    1. Измените r4 только для MCU1
    1. Возобновить все цели.

Для одного 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:

  1. Я смог выяснить, как запрограммировать два микроконтроллера с помощью Openocd
  2. В настоящее время я использую плату разработки USB Bus Blaster V4, которая содержит микросхему FT2232 USB to JTAG Converter.
  3. Моя настройка состоит из 2 микроконтроллеров STM32 в конфигурации последовательной цепочки.
  4. Поскольку оба микроконтроллера имеют одну и ту же микросхему, я создал файл конфигурации платы, как указано в руководстве пользователя на странице 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```
    
     
  5. Команда, используемая для запуска openocd, выглядит следующим образом:
    sudo openocd -d2 -f интерфейс / ftdi/dp_busblaster_kt-link.cfg -f плата/stm32trail.cfg -c инициализация -c scan_chain -c цели
  6. Мой вывод после выполнения приведенной выше команды в терминале выглядит следующим образом:
  7. Последовательность, в которой я выполнял команды на локальном узле telnet, следующая:
    1. нацелен на stm32master.cpu
    2. остановка
    3. нацелен на stm32slave.cpu
    4. остановка
    5. flash erase_sector 0 0 7
    6. flash write_image erase /home/nikhil/Downloads/Red_Led_C13.hex
    7. verify_image /home/nikhil/Downloads/Red_Led_C13.hex
    8. Сброс
    9. нацелен на stm32master.cpu
    10. остановка
    11. flash erase_sector 0 0 7
    12. flash write_image erase /home/nikhil/Downloads/Red_Led_C13.hex
    13. verify_image /home/nikhil/Downloads/Red_Led_C13.hex
    14. Сброс
    15. Я смог успешно запрограммировать оба MCU.