本帖最后由 sy12138 于 2022-11-29 14:16 编辑
#申请原创# #技术资源#
@21小跑堂 @安小芯
测试条件
| IDE
| 硬件
| 软件
| 其他
| MDK 5.37
| N32G457XVL-STB V1.1J-LINK V9
| SEGGER-J-LINK V7.54d
|
| 以前在其他芯片上使用过SWO功能,使用起来还是比较简单的,但在N32G4XX上使用SWO功能还真是有点波折。
先看一下JLINK管脚定义
首先看看一下用户手册了对调试功能能描述,从调试接口的管脚定义上看应该是支持SWO功能的,SWO需要使用PB3引脚。
但在调试寄存器描述中却没有看到和 SWO调试相关的描述,我给我搞的有点懵,难道厂家把相关功能裁剪掉了吗?这个功能是内核功能,应该不会被裁剪掉才对,现在只能自己试试看了
我按照之前使用的方法在例程中配置了相关设置,编写了测试代码。
在使用SWO功能前,需要将调试接口改为仅SWD使能,JTAG关闭模式
GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_SW_ENABLE, ENABLE);
使用SWO接收功能需要定义volatile int32_t ITM_RxBuffer = ITM_RXBUFFER_EMPTY;
ITM_SendChar('2'); SWO发送字符2
ITM_CheckChar();检查是够收到数据
ITM_ReceiveChar();读取数据
SWO相关函数在core_cm4.h内
SWO输出只能在SW模式下
在Trace页面,需要勾选Enable,并设置Croe Clock时钟和芯片内核时钟一致,这里芯片内核时钟为144M,所以设置Croe Clock为144M
这里有个地方要说明一下
DBG->CTRL&=0xffdf;
DBG->CTRL|=0x0020;
这里实际是使能TRACE_IOEN,并配置调试模式。但由于MDK有问题,有时并不能很好的开启相关功能,所以采用操作寄存器方式开启TRACE_IOEN。
在其他芯片的用户手册中找到的相关说明
配置完后进入调试模式
在Debug (print) Viewer窗口内查看SWO输出情况,程序运行后并没有看到字符2,而且在窗口内输入字符后,在串口输出打印上能看到在窗口输入的字符,但收不到SWO发送的数据。从现象上看,数据接收是正常的,但SWO输出没有。
因为之前在其他芯片上使用过SWO就是这么配置的,流程上肯定是没错的,出现这种情况,现在怀疑有2种可能,1是JLINK有问题,不支持这个功能(用JLINK的SWO我还真没试过);2芯片被裁剪,不支持SWO输出。
为了排除这些问题,我换上了之前验证过SWO功能的板子,配置如下
运行效果如下,调试代码是一样的,调试窗口能够收到数据,但数据是乱码,说明SWO是支持的,可能是其他哪里设置不对了
进入设置页面,怀疑是SWO时钟太快导致的,于是重新修改参数如下
重新进入调试模式,发现这回数据都对了,就是时钟问题导致的
重新回到N32G45X板上,修改配置如下
这回SWO的收发都正常了
但还需要确认一下N32G45X在JLINK下SWO支持的最快时钟,经过测试发现,SWO的最快时钟只能到3M,再高JLINK的SWO就不能正常发送数据了 ,这里一定要注意!!!
接下来使用J-LINK SWO Viewer,进行SWO接收测试,在SEEGER目录下,找到J-LINK SWO Viewer工具打开。
配置芯片型号和时钟参数,时钟参数一定要和MDK中Trace页面配置的一致才行
这里可以正确显示芯片通过SWO发送的数据,由于J-LINK SWO Viewer只能接收数据,不能发送数据,所以,使用J-LINK SWO Viewer时只能作为输出信息的查看。
到此,N32G45X下JLINK的SWO功能就测试完了,希望对用到的人会有帮助。
源码:
Nationstech.N32G45x_Library.2.1.0.zip
(3.7 MB)
应用笔记:
视频地址:
|