Jump to content

    
Sign in to follow this  
HardEgor

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

Recommended Posts

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Edited by ataradov

Share this post


Link to post
Share on other sites

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

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

 

Задача: мелкий 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); 
}

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
18 minutes ago, MasterElectric said:

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

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

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

Share this post


Link to post
Share on other sites

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

Edited by MasterElectric

Share this post


Link to post
Share on other sites
2 hours ago, MasterElectric said:

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this