ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用SWO打印调试信息

2021-11-28 12:35:16  阅读:206  来源: 互联网

标签:Control ITM SWO stimulus Register 打印 调试信息 uint32


    在使用STM32过程中,刚开始经常使用UART作为调试信息输出的通道,之后看到SEGGER RTT的方式搭配JLINK,直接使用SWD调试口输出调试信息,速度快,效率高但是RTT的方式存在一个问题,产品发布后,为了防止程序被恶意读出,调试口基本会被禁用掉,所以考虑使用SWO的方式作为备选。

    SWO框图如下,涉及到Coretx-M内的ITM、TPIU等

 

     在使用IDE开发时,可直接通过配置IDE使能SWO输出,程序中不需要额外设置,我的开发环境没有使用IDE,需要在程序中显示的使能SWO,

参考https://community.st.com/s/question/0D53W00000IWs2gSAD/how-to-enable-swo-with-stlink-utility-on-stm32f407gdisc1?t=1637668120413

具体程序如下:

void swoInit (uint32_t portMask, uint32_t cpuCoreFreqHz, uint32_t baudrate)
{
uint32_t SWOPrescaler = (cpuCoreFreqHz / baudrate) - 1u ; // baudrate in Hz, note that cpuCoreFreqHz is expected to match the CPU core clock

CoreDebug->DEMCR = CoreDebug_DEMCR_TRCENA_Msk; // Debug Exception and Monitor Control Register (DEMCR): enable trace in core debug
DBGMCU->CR = 0x00000027u ; // DBGMCU_CR : TRACE_IOEN DBG_STANDBY DBG_STOP DBG_SLEEP
TPI->SPPR = 0x00000002u ; // Selected PIN Protocol Register: Select which protocol to use for trace output (2: SWO)
TPI->ACPR = SWOPrescaler ; // Async Clock Prescaler Register: Scale the baud rate of the asynchronous output
ITM->LAR = 0xC5ACCE55u ; // ITM Lock Access Register: C5ACCE55 enables more write access to Control Register 0xE00 :: 0xFFC
ITM->TCR = 0x0001000Du ; // ITM Trace Control Register
ITM->TPR = ITM_TPR_PRIVMASK_Msk ; // ITM Trace Privilege Register: All stimulus ports
ITM->TER = portMask ; // ITM Trace Enable Register: Enabled tracing on stimulus ports. One bit per stimulus port.
DWT->CTRL = 0x400003FEu ; // Data Watchpoint and Trace Register
TPI->FFCR = 0x00000100u ; // Formatter and Flush Control Register

// ITM/SWO works only if enabled from debugger.
// If ITM stimulus 0 is not free, don't try to send data to SWO
if (ITM->PORT [0].u8 == 1)
{
bItmAvailable = 1 ;
}
}

通过实验发现,单纯使用上述程序初始化SWO后,调用ITM_SendChar周期发送字符,使用示波器在SWO引脚上并未测量到任何信号,

使用命令行JLinkSWOViewerCL -swoattach on -swofreq 4000000 -device xxxx -itmport 0xF可以接收到SWO输出的信息,怀疑调试器还是去配置了内部的寄存器

通过逻辑分析仪抓取SWD的信号,发现在上述命令行期间,调试器去遍历调试相关的ROM表,并没有去配置寄存器

所以猜测STM32的debug模块默认是不上电电的,在通过命令行请求其上电之后SWO的信号就可以在引脚上测量到了。

 

标签:Control,ITM,SWO,stimulus,Register,打印,调试信息,uint32
来源: https://www.cnblogs.com/chen0207/p/15614671.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有