Пытаюсь выводить отладочные сообщения через ITM. Лишние байты на выходе. Как избавиться? Внутри подробнее. Функция инициализации:
static inline void SWO_Init(uint32_t portBits, uint32_t SWOSpeed) { uint32_t SWOPrescaler = (SystemCoreClock / SWOSpeed) - 1; /* SWOSpeed in Hz, note that cpuCoreFreqHz is expected to be match the CPU core clock */ TPI->SPPR = 0x00000002; /* "Selected PIN Protocol Register": Select which protocol to use for trace output (2: SWO NRZ, 1: SWO Manchester encoding) */ TPI->ACPR = SWOPrescaler; /* "Async Clock Prescaler Register". Scale the baud rate of the asynchronous output */ ITM->LAR = 0xC5ACCE55; /* ITM Lock Access Register, C5ACCE55 enables more write access to Control Register 0xE00 :: 0xFFC */ ITM->TCR = /*ITM_TCR_TraceBusID_Msk |*/ ITM_TCR_SWOENA_Msk /*| ITM_TCR_SYNCENA_Msk*/ | ITM_TCR_ITMENA_Msk; /* ITM Trace Control Register */ ITM->TPR = ITM_TPR_PRIVMASK_Msk; /* ITM Trace Privilege Register */ ITM->TER = portBits; /* ITM Trace Enable Register. Enabled tracing on stimulus ports. One bit per stimulus port. */ DWT->CTRL = 0x400003FE; /* DWT_CTRL */ TPI->FFCR = 0x00000100; /* Formatter and Flush Control Register (TrigOnTrigIn)*/ }Функция вывода:
__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) { if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ { while (ITM->PORT[0].u32 == 0); ITM->PORT[0].u8 = (uint8_t) ch; } return (ch); }OpenOCD вызывается командой:
@$(OPENOCD) -s $(OPENOCD_SCRIPTS_DIR) -f ./openocd/mdr32f9q2_jlink.cfg -c init -c "tpiu config internal print.log uart off 80000000 64000" -c "reset halt" &В файле print.log что-то вроде: \2H\0\2e\0\2l\0\2l\0\2o\0\2!\0 Как победить?
-
- Про Open_OCD и ITM по ссылке. Может чем-то поможет? Сам не пробовал. - Chum_A(19.03.2019 17:43, ссылка)