Printf через SWO

Дрбанана
Чт, 6 октября 2016 г. 13:19
Обычно я программирую плату STM32 со ST Link, но проблема в том, что я не могу отлаживать, поскольку она не связана через серийный. Теперь мне интересно, есть ли метод, который может отправлять струны из MCU на ПК через SWO, чтобы я мог использовать утилиту ST Link и ее «printf через SWO» ?

Стивестронг
Чт, 6 октября 2016 г., 14:40
Ну, если вы просто хотите отладить, у вас уже есть правильный инструмент (адаптер Stlink) в вашей руке. Вам просто нужно смешать его с небольшим количеством SW на вашем ПК (Eclipse + OpenOCD), и там у вас есть.

Функция SWO была бы интересной для меня.

Rogerclark
Чт 06 октября 2016 г., 20:53
Есть способ отправить обратные струны отладки stlink (или любой программист SWD), но из того, что я видел, это, кажется, не широко используется.

Почему бы просто не подключить USB к серийному адаптеру с USART1 (PA9 и PA10),

Сжимать
Чт 06 октября 2016 г., 21:39
STDIO через SWO требует некоторой инициализации во время запуска и функции, основанной на CMSIS, ITM_SENDCHAR (), с этим очень легко расширить класс потока, чтобы использовать его в качестве PUTCHAR. Дополнительный код для использования SWO более или менее такой же, как UART, и вам нужна специальная программа для его чтения (OpenOCD, утилита ST Link и т. Д.).
Я протестировал с плагином Arm Eclipse (он может быть включен во время создания проекта), но, наконец, я думаю, что использование UART для этого - лучший вариант. Лично за трудные моменты, которые я предпочитаю отлаживать с ST-Link напрямую (с точками останова, выполнением шага и т. Д.)
Хотя SWO работает с досками Nucleo, это не работает с клонами ST-Link V2, поскольку SWO не существует.

Martinayotte
Пт, 07 октября 2016 г., 13:50
Там кто -то, кто взломал клонов Stlink, чтобы добавить на них линию SWO:
http: // www.Eevblog.com/forum/microcontr ... NK-Clones/

Олли
Пт, 07 октября 2016 г., 15:10
Лично мне нравится отлаживать с ST-Link. Есть много вариантов использования, когда операторы отслеживания не работают.

Если однажды, Arduino или STM32Duino получит поддержку отладчика, я надеюсь, что это пойдет на шаг вперед и использует все возможности, построенные на платформе M3. Пожалуйста, посмотрите на следующий блог, объясняющий и демонстрируя эти возможности.

http: // EssentialScrap.com/tips/arm_trace/теория.HTML

Ура, Олли

Пито
Пт, 07 октября 2016 г., 16:24
Там кто -то, кто взломал клонов Stlink, чтобы добавить на них линию SWO:
Интересно последний пост в ветке :)
Я понял это, но все еще ждал, нажимая на курок :) (Как у меня в настоящее время есть только один stlink dongle..)

Rogerclark
Пт, 07 октября 2016 г., 20:07
Олли

Существует активная поток @stevestrong, где он теперь использует плагин Eclipse + Arduino.

Это может быть лучшим из обоих миров, но похоже, что установка немного сложна.

Я не думаю, что Arduino IDE получит поддержку отладчиков в любое время в ближайшем будущем, так как для Avr Arduino теперь рекомендует использовать Aml Поддержка - это не то, чего захотят новички (но я думаю, что поддержка отладки облегчает для начинающих для начинающих, даже веб -браузеры теперь поставляются с отладчиками JavaScript по умолчанию)

victor_pv
Солнце 15 января 2017 г. 2:57 утра
Дрбанана писала:Обычно я программирую плату STM32 со ST Link, но проблема в том, что я не могу отлаживать, поскольку она не связана через серийный. Теперь мне интересно, есть ли метод, который может отправлять струны из MCU на ПК через SWO, чтобы я мог использовать утилиту ST Link и ее «printf через SWO» ?

victor_pv
Солнце 19 февраля 2017 г. 18:11
У меня было некоторое время, чтобы проверить класс SWO с J-Link и ST-Link, отлично работает на обоих.
Он красиво печатает информацию примерно в 2 МГц в Stlink и 4.5 МГц в SWO Viewer.

Теперь у меня есть проблема с #define и ifdef в Arduino Ide.

Это прекрасно работает как в Eclipse, так и в Arduino IDE, если я определяю Swodebug, но если я прокомментирую его «#Define Swodebug», чтобы устранить вывод отладки, то в Arduino это не компилируется:
uint8 SPIClass::dmaSendRepeat(uint16 length) { if (length == 0) return 1; dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit if (_currentSetting->TXcallback){ return 0; } uint32_t m = millis(); uint8 b = 0; while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); spi_tx_dma_disable(_currentSetting->spi_d); //uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! return b; } void SPIClass::dmaSendSet(void * transmitBuf, bool minc) { uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); dma_init(_currentSetting->spiDmaDev); // TX spi_tx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, flags);// Transmit buffer DMA } uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) { dmaSendSet(transmitBuf, minc); return dmaRepeat(length); }

Стивестронг
Солнце 19 февраля 2017 г. 18:37
Вы пробовали: C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp:433:26: error: 'class SPISettings' has no member named 'receiveCallback' if (_currentSetting->receiveCallback){ ^ C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp: At global scope: C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp:463:7: error: prototype for 'uint8 SPIClass::dmaTransfer(uint8*, uint8*, uint16)' does not match any in class 'SPIClass' uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length) { ^ In file included from C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp:32:0: C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.h:306:8: error: candidate is: uint8 SPIClass::dmaTransfer(void*, void*, uint16) uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); ^ C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp: In member function 'uint8 SPIClass::dmaSendRepeat(uint16)': C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp:499:26: error: 'class SPISettings' has no member named 'transmitCallback' if (_currentSetting->transmitCallback) ^ C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp: At global scope: C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp:563:2: error: expected unqualified-id before '/' token */ ^ C:\Users\S\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\SPI\src\SPI.cpp:563:2: error: expected constructor, destructor, or type conversion before '/' token

victor_pv
Пн 20 февраля 2017 г. 12:13
Стивестронг написал:Вы пробовали: #include

Rogerclark
Пн 20 февраля 2017 г., 7:23 утра
Вы пытались добавить это в любую доски.TXT или платформа.txt, чтобы он был применен ко всем файлам, которые выполняются

Я подозреваю, что проблема в том, что его необходимо определить во всем мире, и если вы только определите его в эскизе, к которому он только применяется, включает в себя непосредственно набросок, а не ни одним из других основных файлов

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

Стивестронг
Пн 20 февраля 2017 г. 8:28 утра
Проверьте параметры компиляции/сборки, возможно, один из них отменяет ваш определение.

victor_pv
Пн 20 февраля 2017 г. 16:11
Я проверил варианты компиляции/сборки, и это не перезаписывает.

Ничто не идет не так, когда я сам объявляю функции в INO (или, скорее, некоторые из них). Кажется, что Arduino Ide ставит функции перед #Define, если есть только PIN -один, и #IFDEF, но не делает это там, где есть другой #Define.. В любом случае, кажется, совершенно проблема Arduino IDE и ничего больше. Поскольку я нашел способ обойти это, если это произойдет снова, я могу перейти к другим вещам.
Спасибо вам обоим за предложения.

Стивестронг
Пн 20 февраля 2017 г., 17:47
Кстати, какую версию IDE вы используете, и есть эта проблема?

victor_pv
Пн 20 февраля 2017 г. 18:11
Стивестронг написал:Кстати, какую версию IDE вы используете, и есть эта проблема?

Ddrown
Пн 20 февраля 2017 г., 21:26
victor_pv написал: uint32_t flags = (DMA_MINC_MODE | DMA_FROM_MEM); if (!transmitBuf) { transmitBuf = &ff; flags &= ~DMA_MINC_MODE; } dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, flags);

victor_pv
Пн 20 февраля 2017 г., 21:51
DDROWN написал:
Кроме того, какова была строка выше определения с точками?

Ddrown
Вт 21 февраля 2017 г. 12:42
victor_pv написал:DDROWN написал:
Кроме того, какова была строка выше определения с точками?

Стивестронг
Вт 21 февраля 2017 г. 8:41
Насколько я помню, репо arduino_stm32 поддерживает только Arduino IDE версию 1.6.9 и выше. Так обновление...