STM32 6根线SWD的接法
发布日期:2021-06-30 22:01:50 浏览次数:3 分类:技术文章

本文共 2295 字,大约阅读时间需要 7 分钟。

前言

最初改STM32F407板子的时候,因为同事没引出SWO线,导致不能用ITM,调试很不方便。

改了一个临时板子,因为没做验证实验,居然将SWD线引出错了,导致板子废了。
这次,找到一个引脚都引出的开发板(STM32F407ZG(144管脚)),用杜邦线验证了6线SWD的接法,单步调试和打印ITM都正常。

试验

从JLINK仿真器出口接了一块转接板,在6线接口处用杜邦线直接和板子上引出管脚连接。

转接板上6针插座的管脚定义

备注:<2021_0114_1711>如果不是自己做的转接座,要注意核对调试插座的6个引脚定义,是否和下面的定义相同。

从x宝上上买了多次JLINK转接座,刚才要调试一个新打样的板子,因为调试用的东西丢公司了,从家里屯的JLINK转接座随便抓起一个,居然和我当时做下面实验的转接座不一样,坑货…

我这次打样的板子,调试接口的定义的6pin插座和下面的转接座相同,准备直接用6pin排线插座(两端都是母座,一边插入JLINK转接座上的6pin插座,一边插入板子的6pin插针),这要是没核对,这次惨了。

调试插座如果插反了(VREF, GND反了),板子一定烧了,相当于将电源和地短路了。前一段时间,因为插错调试接口方向, 就将焊接了一下午的打样板子都烧了。

有的调试转接座,VREF, GND在一边,还好些。像VREF,GND对称布置在6pin插座两边的,可要小心。

要不自己做个JLINK转接板,和x宝上卖的JLINK转接座长的不一样,自己每次调试,都用自己的转接座,这样也不会弄错。

在这里插入图片描述
VREF : 接板子上的参考电压(3.3V), 这个参考电压,就是板子上MCU用的3.3V电源网络。
SWDIO : SWD接口的输入数据线(从JLINK到板子)
SWCLK : SWD接口的时钟线
SWO : SWD接口的输出线(从板子到JLINK)
NRST : 接板子上MCU的复位引脚
GND : 和板子的数字地相连。

转接板和MCU板的6线连接线序

转接板 => MCU板

VREF(转接板6线插座_1脚, 红色线) => 随便在板子上找个3.3V引出管脚
SWDIO(转接板6线插座_2脚, 绿色线) => MCU_PA13
SWCLK(转接板6线插座_3脚, 蓝色线) => MCU_PA14
SWO(转接板6线插座_4脚, 黄色线) => MCU_PB3
NRST(转接板6线插座_5脚, 橙色线) => MCU_NRST no.25脚,因为这个管脚没引出,就接在JTAG插座的no.15脚
GND (转接板6线插座_6脚, 锗色线)=> 随便在板子上找个GND引出管脚

连接完的接线图

在这里插入图片描述

6根线SWD原理图

在这里插入图片描述

设置ITM

顶级菜单 => Project => Options for Target ‘xx’ … => Debug => Settings

在这里插入图片描述
在这里插入图片描述
作2个ITM封装的文件,加入工程

// @file \BSP\itm\my_ITM.h#ifndef __MY_ITM_H__#define __MY_ITM_H__#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))#define TRCENA          0x01000000struct __FILE { int handle; /* Add whatever you need here */ };#endif // #ifndef __MY_ITM_H__
// @file \BSP\itm\my_ITM.c#include "my_ITM.h"#include 
#pragma import(__use_no_semihosting)FILE __stdout;FILE __stdin;void _sys_exit(int x) { x = x; }int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0) { }; ITM_Port8(0) = ch; } return(ch);}

测试ITM

多拉出一根SWO, 就是想全速调试时,看ITM的printf输出.

编译工程时, 为了防止编译问题,需要全部编译工程才靠谱.

在这里插入图片描述
在实现中加入printf打印语句
在调试时,在程序入口处断住时,打开printf查看窗口
顶级菜单 => View => Serial Windows => Debug(printf) Viewer
当程序全速跑起来时,在printf查看窗口,就能看到printf打印的内容了
在这里插入图片描述
如果现场出了问题,可以让现场同事,接上JLINK,用C:\Program Files (x86)\SEGGER\JLink\JLinkSWOViewer.exe 就能看到调试信息,不需要给他工程。

转载地址:https://lostspeed.blog.csdn.net/article/details/103437050 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:STM32F407 SPI线的选择
下一篇:在STM34F407固件库工程模板中加入ucOS_ii

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月13日 14时20分01秒