STM32工作笔记0049---JLINK在线调试__软件调试方法与技巧

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

.

这里,我们调试的时候,串行接口就是swd,这个swd需要两个引脚.

jtag需要5个引脚.

调试允许,程序运行中,暂停并允许获取内部状态,查看完以后,还可以恢复外设的状态,继续执行程序

可以看到对于JTAG调试来说,需要上面的JTDO JTDI JNTRST JTMS JTCK这5个引脚,如果swd的话,

只需要SWCLK SWDS这两个引脚.

然后我们使用的JLINK,他是20个引脚,所以他同时支持JLINK 和SW的调试模式.

上面可以看到.JTMS/SWDIO对应的引脚是PA13,依次,下面的针脚对应的引脚是...

然后对于JTAG调试接口,可以看到需要5个.PA13,PA14,PA15,PB3,PB4

而SW调试结构需要2个引脚.PA13,PA14

SW用的多一些.

这里要注意

因为,这里的开发版,默认是打开SWJ-DP调试功能的,也就是,如果你要是用对应的这个引脚作为

IO口来使用的话,是不行的,因为默认这个是作为调试来用的,也就是被占用了.

要注意,复位的时候,这5个口,都不能作为IO口来使用.

如果这里只连接SWJ,也就是sw调试和JLINK调试,不包含NJTRST这个时候,NJTRST是可以用的.

然后如果禁止了JTAG而打开sw也就是只用了SWDIO SWCLK那么剩下的PA15,PB3,PB4是可以用的.

如果禁止了JTAG也禁止了SW那么5个都可以做位IO口用了.

那么如果这里我想使用PB3,PB4的话,也就是我这里只用SW进行调试,PB3,PB4作为IO口,需要怎么设置呢

可以用上面的库函数.

可以看到有两个参数,这里第一个是设置,也就是前面说到的要用什么模式调试,然后第二个是个enable,disable这样的设置.

先看看第一个模式参数.

去定义可以看到有这么多的模式

下面的先不看,先看看这个,

也就是说第三个,SWJ_Disable也就是SW和jtag都关闭

然后SWJ_JTAGDisable意思是关闭jtag然后打开sw.

然后SWJ_NoJTRST也就是说sw调试和jtag调试都打开,然后

同时关闭NoJTRST.

通过上面的设置,这里如果设置了只使用sw调试,那么另外的几个针脚就可以作为IO口用了

其他的也是一样的道理.

这里可以看到上面就是JLINK调试工具.

有一个JLINK主机,这个上面有个JTAG,20个针脚的,可以用排线连接到开发版上,然后另一端,有个USB,可以连接到电脑上.

可以看到,上面的排线,注意,要使用的话,一定要,先给开发版供电,不管是

用usb供电,还是用电源供电,都需要.先供电,电源灯亮的时候,才能调试.

这个是硬件图,

可以看到这里JTRST等对应的信号线,一般是通过上拉10k的电阻,拉到3.3v

然后JTCK接地,然后RESET连接芯片的复位引脚.其他的引脚,很多都是接地的,

可以看到虽然,这个JLINK调试,虽然有20脚,但是很多都是接地的.

接下来看看代码去调试,

对于战舰版和精英版这里都是打开下面的这个调试章节用代码

对于mini版打开

并且把最后main文件源码中的代码,copy到main.c中覆盖掉就可以了.

调试中需要参考的文档在下面.

然后打开对应的战舰版的程序看看

首先要做个设置

打开debug这个选项卡然后

图中画的都选上,然后打开utilities这个额选项卡

上面那两个勾上.

然后再回到

打开settings然后

可以看到,这里可以选择是sw还是jtag,用

sw的时候,一般使用10mhz,如果jtag,一般设置为5mhz就可以了.

可以看到选择完ort,右边会自动检测到芯片

然后Flash Download这个

.

然后上面的三个√勾选上,然后512k,这个对于精英战舰都是这样的.这个一般会自动识别出来.

这里先说一下先使用软件进行仿真一下.也就是让程序在仿真软件中执行一下,

这个效果,肯定不如直接用硬件跑好的.

软件仿真可以参考下面.

接下来,咱们按照文档一步步做仿真实验.

首先也要设置.

改成左边勾选.然后

.

画出来的四个参数需要都设置好,输入一样的内容就可以,如果是mini版,那么后面parameter,需要输入

-PSTM32F103LC

可以看到文档中也有详细说.

软件仿真,可以点击,右上角的那个D,debug的意思.

点击以后程序就执行了.

常用的调试按钮

文档中有说.

左上角的RST,这个意思是复位的意思,相当于开发版的复位按钮

点击复位可以看到

程序执行到了ResetHandler这个地方.

然后点击向下执行,最终会执行到main中去.

可以点击上图中的位置,直接执行到断点处.

然后是设置断点就是点击一下就行了

这个是跳入执行,执行到方法里面.

这个是按行执行.一行一行的执行.

可以看到第三个按钮是跳出来,也就是跳出来这个函数.

也就是会执行到

delay_ms这个函数外面了.

最后一个是执行到光标处,也就是执行到光标所在的地方.

上面这个是打开关闭汇编窗口

上面这个是观察窗口,call stack local

比如这里我要查看一个变量的内容可以这样,选中这个变量,然后右键,选中watch1,可以看到.

可以看到watch1就可以查看变量内容了.

.

这里有个内存窗口,

这个内存窗口是,可以输入一个地址,可以看到这个地址的变化情况.

这个比较重要,这个是串口窗口.选中一个打开

可以看到首先初始化串口uart_init(115200),然后因为程序不停的打印printf(),

可以看到uart#1窗口,出现了一堆的内容.

这个print(),默认是打印到串口1上面的.注意.

然后再来看看,如果是硬件仿真:

需要勾选上面的画的.

然后也是点击debug,下面的红的部分.

点击了debug可以看到板子没有任何现象的是

虽然这里执行了printf,也就是发送了数据到串口,但是开发版是看不出来的.

.

这个时候可以这样,

可以看到,上面图中,如果我们把串口连接到电脑上的话,那么,

这个窗口,最终连接到usb上,然后我们通过usb连接到电脑上,

安装了串口驱动后,我们可以通过串口调试工具来查看,串口中输出的数据.

可以找到串口调试助手.

这里点击打开串口,选上对应的串口以后.

可以看到刚开始没东西.

但是这里如果咱们让他执行print,就可以看到串口调试工具中出现了数据了,

实际上这个就是,咱们发给硬件串口的数据.,

这个时候也可以,选中某个变量,右键watch查看变量的值.

下面咱们打开跑马灯实验,

打开以后,这里设置

然后点击cebug

然后,这里主要说一下这个逻辑分析窗口.

可以看到下面这个部分就是逻辑分析窗口.

然后点击这个setup,这里是可以设置信号量的.

对于跑马灯实验的话,比如下面的代码

咱们就可以通过逻辑分析窗口,来查看这个LED0和LED1的这个高电平,或者低电平的状态

.这里要说明一下,这个逻辑分析只是对软件仿真有效,对硬件仿真是没有效果的.

比如这里如果,我们要查看PB5和PE5这两个引脚的高低电平,就可以在上面添加上这个两个引脚.

然后为了后面出波形的时候好看

这里还可以,设置不同针脚的颜色.

设置一个是红色,一个是蓝色.

点击ok以后可以看到

注意先看代码,可以看到这个300毫秒,就会进行一次翻转.也就是高低电平的切换.

注意这里,可以点击上图中的in ,out来设置,这个输出的时间间隔,就是这个波形多长时间输出一次,这里

可以点击IN,或者Out就能设置对应的.时间间隔.

好执行代码,这里,打上断点,然后执行,第二次执行的时候可以看到上面的变化了就可以.

可以看到这个PB5,和PE5的波形就出来了,可以看到PE5是高电平的时候,PB5就是低电平,相反也是.

可以看到,他们是相反的,代码写的也是相反的,显示跟代码一致.

然后

如果把光标放到对应的电平上,还可以看到有提示

copy出来看一下,可以看到这里,执行一次大约话了0.303991s,也就是大约300毫秒.

这个和代码是一致的.

实际上还有个窗口可以用.

这里选中比如GPIOB

咱们知道这里,可以看到代码,这个LED0实际上是设置的 GPIOB这个IO口

而且是操作的GPIOB这个io口的第5个引脚,可以看到右边的窗口中.

可以看到,下面有GPIOB这个tab页,可以看到上面有个ODR寄存器,这个时候,第五位,是打钩的.

注意这里打钩了是因为这里已经执行了一次循环,并且断点停在了LED0=0这个位置,而这句代码还没有执行,

也就是,上一次循环LED0=1这句代码已经执行了,我们知道这个LED0=1实际上是设置的GPIOB的第5个引脚是1高电平,

也就是设置的GPIOB这个IO口的,ODR寄存器位5是1..

------------------------------------------------------

https://blog.csdn.net/lidew521/article/details/107999659

这里如果忘记了可以去看对应的博文.

端口输出数据寄存器的作用是,IO口输出低电平,里面就存0,IO口输出高电平,里面就存1

这里,也是对应的,他只用到了低16位。

对应一组io的,16个IO口

给某个IO口输出高电平实际上就是在这个IO口的ODR寄存器中设置为1,因为ODR寄存器有16位,对应的

一组IO的16个IO口,所以这里PB5就是给GPIOB这个IO口组的第5个Io口,的odr寄存器的位5设置为1.也就是让

这个ODR寄存器输出高电平.

------------------------------------------------------

然后我们通过调试执行一行代码,可以看到这个勾就去掉了.

同样对于LED1也是这样的.

然后比如对于串口的USART1

对应的寄存器的值都可以打开查看的.

猜你喜欢

转载自blog.csdn.net/lidew521/article/details/108173745