Jump to content

    

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

Где взять описание алгоритма 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

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

embedded_swd.zip

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this