Перейти к содержанию
    

Программирование контроллера контроллером по SWD

Где взять описание алгоритма SWD?

 

Увидел я тут датчик BMF055 от BOSCH. Внутри Cortex-M0, для программирования используется SWD, корпус 3x4 мм - разъем для программирования получается больше процессора.

Но на плате всяко будет какой-нибудь управляющий контроллер, который сможет залить прошивку в BMF055.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большая часть описана в IHI0031A_ARM_debug_interface_v5.pdf

 

Если хочется готовый код, то у меня есть пара проектов в тему. Первый - https://github.com/ataradov/free-dap - это реализация CMSIS-DAP отладчика, что включает реализацию SWD.

 

И второй - https://github.com/ataradov/edbg - это CMSIS-DAP программатор для МК от Atmel, но предварительные шаги одинаковые для всех, а конкретный алгоритм программирования нудно будет поменять под этот МК.

 

У меня где-то еще есть более интегрированная версия, но я ее не могу найти сейчас. Если найду - опубликую тоже.

Изменено пользователем ataradov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О, спасибо!

Более новая версия ARM Debug Interface Architecture Specification ADIv5.0 to ADIv5.2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот нашел реализацию более готовую к прямому применению. Пример программирует Atmel SAM D21 через SWD.

embedded_swd.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подниму тему.

Сходу не смог разобраться, как читать-писать регистры контроллера.

 

Задача: мелкий cortex-m через SWD подключен к "большому". Необходимо загрузить в RAM некий кусок кода и передать ему управление.

Первая часть задачи готова (большое спасибо Александру (Алексею?) Тарадову - freedap работает и довольно быстро портируется).

А вот дальше - проблемы: готовых примеров не вижу, описание ADI какое-то мутное (детально прописано, что это такое, но как оно сопрягается с ядром, я не разобрался)...

 

UPDATE. А всё потому, что обращение к регистрам ядра там ооочень непрямое.

Спасибо Energy Micro за документ и mcheb за ссылку. Код из приложения к AN0062:

 

/**********************************************************
 * Writes a value to a CPU register in the target.
 * 
 * @param reg
 *   The register number to write to
 * 
 * @param value
 *   The value to write to the register
 **********************************************************/
void writeCpuReg(int reg, uint32_t value)
{
  /* Wait until debug register is ready to accept new data */
  waitForRegReady();
  
  /* Write value to Data Register */
  writeAP(AP_TAR, (uint32_t)&(CoreDebug->DCRDR));
  writeAP(AP_DRW, value);
  
  /* Write register number ot Selector Register. 
   * This will update the CPU register */
  writeAP(AP_TAR, (uint32_t)&(CoreDebug->DCRSR));
  writeAP(AP_DRW, 0x10000 | reg); 
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

esaulenka Можно вопрос, если мы заняли интерфейс отладки для подключения к другому МК, то отлаживать уже никак не выйдет? только через USART. Я хотел бы вторым МК мониторить состояние некоторых переменных и принимать сообщения RTT.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, MasterElectric said:

esaulenka Можно вопрос, если мы заняли интерфейс отладки для подключения к другому МК, то отлаживать уже никак не выйдет? только через USART. Я хотел бы вторым МК мониторить состояние некоторых переменных и принимать сообщения RTT.

Я занимаю интерфейс только во время обновления прошивки. В этот момент - да, отладчик не работает (и я не проверял, будет ли в принципе работать обновление с подключенным отладчиком).

Всё остальное время ноги хост-контроллера в z-state, и отладке особо не мешают (только как дополнительная нагрузка, разве что).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

esaulenka почему-то вначале подумал что подключаемся к SWD хоста, а там ногодрыг. А у вас STM32, вы портировали работу с DAP? Не поделитесь? (Собираюсь портировать силабсовский пример)

Изменено пользователем MasterElectric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, MasterElectric said:

esaulenka почему-то вначале подумал что подключаемся к SWD хоста, а там ногодрыг. А у вас STM32, вы портировали работу с DAP? Не поделитесь? (Собираюсь портировать силабсовский пример)

Хост - STM, девайс - NRF.

В качестве отправной точки брал https://github.com/adafruit/Adafruit_DAP, а они, в свою очередь, взяли реализацию у Алекса Тарадова.

Я оттуда выкинул к чертям промежуточный уровень (сложить в буфер команду, а потом сразу же разобрать). Портирование собственно на STM примитивное - там требуются только функции "установить вход/выход", "установить 0/1", "прочитать" для трёх ножек. Выкладывать, пожалуй, не буду - это я на работе делал...

 

И, да, надо сразу настраиваться, что оно медленное. Я уж не знаю, как устроен JFlash, но пара сотен кило зашивается две минуты.

Вот, собственно, и собираюсь переделать - загружать этим методом в ОЗУ пару килобайт загрузчика, а дальше по UART'у...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вызвать System Bootloader и потом через UART (протокол известен и реализован)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...