尊敬的 Champ:
我曾引用 SWO 跟踪()
来测试 CCS 中的 SWO 函数。 我希望在没有 CCS 的情况下具有 SWO 跟踪功能。 我将下面的内容添加到我的代码中。
/*
*初始化 SWO 跟踪端口以进行调试消息打印
*\param portNumber 要配置的端口位掩码
*\param cpuCoreFreqHz CPU 内核时钟频率、单位为 Hz
*\param swoSpeed SWO 输出位速率、单位为 Hz
*
void SwoInit (uint32_t portNumber、uint32_t cpuCoreFreqHz、uint32_t swoSpeed)
{
/*以 Hz 为单位的 SWOSpeed、请注意 cpuCoreFreqHz 应与 CPU 内核时钟相匹配*/
uint32_t swoPrescaler =(cpuCoreFreqHz/swoSpeed)- 1;
/*在内核调试中启用跟踪*/
CoreDebug->DEMCR = CoreDebug_DEMCR_TRCENA_MSK;
/* ITM 锁定访问寄存器,C5ACCE55使能对控制寄存器0xE00的更多写入访问:0xFFC */
ITM->LAR = 0xC5ACCE55;
/*"Selected PIN Protocol Register":选择要用于跟踪输出的协议(2:SWO NRZ、1:SWO 曼彻斯特编码)*/
TPI -> SPPR = 0x00000002;
/*"Async 时钟预分频器寄存器"。 缩放异步输出的波特率*/
TPI -> ACPR = swoPrescaler;
/* ITM 跟踪控制寄存器*/
iTM->TCR = ITM_TCR_TraceBusID_MSK | ITM_TCR_SWOENA_MSK | ITM_TCR_DWTINA_MSK | ITM_TCR_SYNCENA_MSK | ITM_TCR_ITMENA_MSK;
/* ITM 跟踪特权寄存器*/
iTM->TPR = ITM_TPR_PRIVMASK_MSK;
/* ITM 跟踪使能寄存器。 启用激励端口上的跟踪。 每个激励端口一位。 *
iTM->ter =(1ul << portNumber);
/* DWT_CTRL */
dwt->CTRL = 0x400003FE;
/*格式化板和刷新控制寄存器*/
TPI->FFCR = 0x00000100;
}
/*
*通过 SWO 通道发送字符。 另请参见 core_cm4.h 中的 ITM_SendChar()
*\param c 字符待发送
*\param portNo SWO channel number、value in the range of 0 to 31
*
void SwoPrintChar (char c、uint8_t portNo)
{
volatile int timeout;
/*如果启用了 ITM 跟踪,请检查跟踪控制寄存器*/
if (((ITM->TCR & ITM_TCR_ITMENA_MSK)=0)
{
/*未启用? *
返回;
}
/*如果请求的端口被启用、请检查跟踪使能寄存器*/
if (((ITM->ter &(1ul << portNo))=0)
{
/*请求的端口未启用? *
返回;
}
/*任意超时值*/
超时= 5000;
while (ITM->port[portNo].u32 =0)
{
/*等待 STIMx 准备就绪,然后发送数据*/
超时--;
如果(超时=0)
{
/*无法发送*/
返回;
}
}
/*发送数据*/
iTM->port[portNo].u8 = c;
}
/*
*通过 SWO 向主机发送字符串
*\param s 要发送的字符串
*\param portNumber 端口号、0-31、对正常调试字符串使用0
*
void SwoPrintString (const char * s、uint8_t portNumber)
{
while (* s!='\0')
{
SwoPrintChar (* s++、portNumber);
}
}
如果我在没有启用"Custom Core Trace"的情况下进入 CCS 调试模式、则日志可以从 SWO 正确输出。 如果我没有进入 CCS 调试模式、SWO 中没有输出。 您能告诉我 我 SwoInit 有什么不好的地方吗? 谢谢。
此致、
Jeffery

