前言

最初改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          0x01000000

struct __FILE { int handle; /* Add whatever you need here */ };

#endif // #ifndef __MY_ITM_H__

// @file \BSP\itm\my_ITM.c

#include "my_ITM.h"

#include <stdio.h>

#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 就能看到调试信息,不需要给他工程。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐