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

Программирование контроллера контроллером по 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

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


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

Вот нашел реализацию более готовую к прямому применению. Пример программирует 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 эмодзи.

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

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

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

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