【STM32F303开发】+ 使用SWO输出调试信息到Debug Viewer窗口

本文介绍如何利用STM32的SWO接口进行调试输出,包括配置Keil及重定向printf函数的方法,并展示了如何通过SWO接口实现基本的输入功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以直接用Jlink接口连接开发板,设置Debug选项为J-LINK/J-TRACE Cortex;再进入Settings对话框中选择SW模式(JTAG模式不行),并选择Trace使能并且必须使开发板的主频与其中的core相同(这里是72MHz);最后debug即可!好像只能用keil5,4的话会卡死。


Jlink/STLink自带一个SWO接口,使用这个接口配合keil可以输出一些简单的调试信息,在没有串口可以使用的时候,SWO也可很方便的打印一些信息,比如F303RE这个板子在我的电脑上一直没法安装虚拟串口的驱动,所以我可以用这个SWO输出调试信息。论坛送的STM32F303RE上自带的stlink正好有这个SWO口,而且也接到了MCU上,所以正好可以使用,好像有的ST的板子也带了这个接口,但是其中桥接电阻并没有贴到板子上,如果要使用的话,就要自己连接起来(比如STM32F429DISCO好像就没有接上)。


 

对于stlink的驱动好像也有一些要求,我使用keil4带的有点旧的stlink驱动就会提示驱动不支持,后来使用keil5带的stlink驱动据可以了。

 
如果硬件和软件都没有问题了,还需要设置下kei:
首先打开Micro LIB
 
然后打开keil的Trace功能,具体设置如下:
 
然后就是一些重定向printf的函数了,如果之前将printf重定向了串口,那么要修改并添加如下代码:
  1. #include "stdio.h"
  2. #define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
  3. #define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
  4. #define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))

  5. #define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
  6. #define TRCENA          0x01000000

  7. struct __FILE { int handle; /* Add whatever needed */ };
  8. FILE __stdout;
  9. FILE __stdin;

  10. int fputc(int ch, FILE *f) {
  11.   if (DEMCR & TRCENA) {
  12.     while (ITM_Port32(0) == 0);
  13.     ITM_Port8(0) = ch;
  14.   }
  15.   return(ch);
  16. }
复制代码

打开调试即可得到调试信息:
 
输出调试信息
 
测试代码:
  F303RE_SWO.rar (394.54 KB, 下载次数: 86) 

http://www.stmcu.org/module/forum/forum.php?mod=attachment&aid=MzQ1Mzg4fDdmZDdhOWYzfDE0NjgyOTcwMjF8MHw2MDIyMDU%3D
*******************************************一天过去了***************************************
上面说了输出的功能,其实如果需要的话,重定向下scanf()函数即可完成从Debug Viewer向程序输入参数的,这在调试某些需要动态调整参数的程序里面应该有帮助,比如按下某个按键,激活输入功能,重新配置下参数,然后继续运行程序。
调试的时候有个变量在一直检测是否有数据输入,如果有数据输入,那么输入的数据就传到这个变量,这个接口在内核的头文件有相关的定义,我们只需要定义这个变量即可。
将下面的main.c代码完整的替换掉上面的mian.c就可以使用了。
  1. #include "main.h"
  2. #include "string.h"
  3. //SWV test
  4. //2015-6-15
  5. //by creep
  6. #define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
  7. #define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
  8. #define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))

  9. #define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
  10. #define TRCENA          0x01000000

  11. struct __FILE { int handle; /* Add whatever needed */ };
  12. FILE __stdout;
  13. FILE __stdin;

  14. volatile int32_t ITM_RxBuffer=ITM_RXBUFFER_EMPTY;

  15. int fputc(int ch, FILE *f) {
  16.   if (DEMCR & TRCENA) {
  17.     while (ITM_Port32(0) == 0);
  18.     ITM_Port8(0) = ch;
  19.   }
  20.   return(ch);
  21. }
  22. int fgetc(FILE *f)
  23. {
  24.         while(ITM_CheckChar() == 0)
  25.         {                
  26.         }
  27.         return ITM_ReceiveChar();
  28. }

  29. u8 Write_buff[30] = "\n\r\n\rPlease enter your name:\n\r";
  30. u8 read_buff[50]= "";
  31. u8 name[100]="\n\rYour name is : ";
  32. int main(void)
  33. {
  34.         static u8 led_sta = ON;
  35.     LED_Init();
  36.     delay_init();
  37.                 delay_ms(1000);
  38.     while(1)
  39.     {
  40.                                 //将数据发送到Debug Viewer
  41.                                 printf((const char*)Write_buff);
  42.                                 memset(read_buff,0,50);
  43.                                 //等待输入
  44.                                 scanf("%s",read_buff);
  45.                                 //将姓名输出
  46.                                 printf((const char*)name);
  47.                                 printf((const char*)read_buff);
  48.                                 LED(led_sta);
  49.                                 led_sta = !led_sta;
  50.         delay_ms(1000);
  51.     }
  52. }


复制代码
直接在debug viewer窗口输入内容然后回车即可,输入的内容不会回显在窗口中,输入也支持中文。运行结果如下:


 
<think>好的,我现在需要帮助用户解决关于STM32通过SWO输出配置以及支持该功能的IDE教程的问题。首先,我得先理解用户的具体需求。用户提到参考了三个引用,都是关于STM32不同系列使用SWO实现printf功能的,其中提到了Cube IDE、SWV功能以及ST-LINK Utility等工具。用户现在想寻找相关的配置方法和支持IDE的教程。 首先,我需要回忆一下SWO是什么。SWO(Serial Wire Output)是ARM CoreSight调试组件的一部分,用于在调试过程中通过单线输出数据,通常与SWD(Serial Wire Debug)接口配合使用。这样可以在不占用额外串口的情况下实现调试信息输出,比如printf打印。这对于资源有限的嵌入式系统非常有用。 接下来,用户需要知道如何配置SWO以及哪些IDE支持这个功能。根据提供的引用,STM32CubeIDE、Keil、IAR、ST-LINK Utility等都支持SWV(Serial Wire Viewer)功能,也就是SWO输出。不过要注意,某些系列如STM32F0不支持SWO,如引用1提到的,所以用户需要确认自己的芯片型号是否支持。 现在,我需要整理配置步骤。首先,在STM32CubeIDE中的配置步骤。根据引用1和3,可能需要使能ITM(Instrumentation Trace Macrocell)模块,配置时钟,然后在代码中重定向printf到ITM的端口。同时,在IDE中设置SWV的时钟和启用相关跟踪。 然后,其他IDE比如Keil和IAR的配置方法可能类似,但具体步骤有所不同。例如,Keil中需要配置Debug设置中的Trace选项,启用ITM并设置正确的时钟频率。IAR可能需要类似的设置,并且在代码中同样需要重定向printf函数。 另外,用户可能需要使用ST-LINK Utility或J-Link工具来查看SWO输出,这部分在引用2和3中也有提到。例如,ST-LINK Utility的SWV功能可以实时显示打印的数据。 需要注意的地方包括确认芯片支持SWO,正确配置时钟频率(通常与CPU时钟相关),以及在代码中正确实现ITM_SendChar函数来重定向输出。此外,不同的IDE可能有不同的设置路径,需要详细说明。 用户可能遇到的问题包括无法看到输出,这时候需要检查SWO的配置是否正确,包括时钟设置、跟踪使能以及IDE中的SWV查看器是否配置正确。例如,引用3提到STM32F429的配置步骤,可能需要参考类似的流程。 最后,生成相关问题需要考虑用户可能的后续疑问,比如不同芯片的支持情况、时钟配置错误如何处理、性能优化等。</think>以下是关于STM32 SWO输出配置及支持IDE的详细说明: ### 一、SWO输出配置步骤 1. **硬件要求** - 需使用支持SWD调试接口的STM32芯片(如STM32F4/F7/H7系列,**注意STM32F0系列不支持**[^1])。 - 调试器需连接SWO引脚(如ST-LINK/V2或J-Link)。 2. **Cube IDE配置** - 在工程中启用`ITM`跟踪功能: ```c // 添加以下代码重定向printf到ITM端口0 int __io_putchar(int ch) { ITM_SendChar(ch); return ch; } ``` - 配置时钟: 在`SystemCoreClock`初始化后添加: ```c CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; TPI->SPPR = 2; // 选择异步模式 TPI->ACPR = 0; // 分频系数=1 ITM->LAR = 0xC5ACCE55; // 解锁访问 ITM->TCR = 0x10001; // 启用ITM和全局使能 ``` 3. **IDE设置** - 打开`Run > Debug Configurations > Debugger`,设置`Trace`选项: - 勾选`Enable Serial Wire Viewer (SWV)` - 设置`Core Clock`与芯片主频一致(如STM32F411为100MHz)[^3]。 ### 二、支持SWO的IDE及教程 | IDE/工具 | 关键配置步骤 | |----------------|----------------------------------------------------------------------------| | **STM32CubeIDE** | 1. 启用`ITM`代码重定向<br>2. 在`SWV`窗口添加`ITM Stimulus Port 0`[^2] | | **Keil MDK** | 1. 调试设置中启用`Trace`<br>2. 配置`ITM Port 0`并设置时钟[^2] | | **IAR EWARM** | 使用`SWO`终端插件,配置`ITM Channel 0`和CPU时钟[^2] | | **ST-LINK Utility** | 通过`SWV`菜单直接查看实时输出 | ### 三、常见问题 1. **无输出排查** - 检查SWO引脚是否连接(需SWD接口4线:VCC/GND/SWCLK/SWDIO/SWO) - 确认`ITM_SendChar()`函数被正确调用 - 验证IDE中`Core Clock`与实际主频一致[^3] 2. **性能优化** 使用`DWT`计数器实现时间戳功能: ```c #define DWT_CYCCNT (*(volatile uint32_t *)0xE0001004) void DWT_Init(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT = 0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值