打印
[其他ST产品]

STM32在线调试、看门狗、跑飞调试

[复制链接]
681|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
调试准备

1. STM32的调试模式

     对于STM32的CPU,支持调试模式,即CPU可以被暂停,用户可以在CPU暂停后查看寄存器或变量的状态。

2. 在线调试工具

    由于版权问题,JLink调试工具渐渐淡出,现在大部分使用ST-Link,它与JTAG调试方式兼容,虽然JTAG要比ST-Link快,但是JTAG要用到多个引脚,ST-link只需要3根线。

3. 调试准备

    首先插上ST-Link后,需要正确安装驱动,然后在设备管理器可以看到ST-Link。驱动安装好后,需要设置IDE工具,在MDK的魔术棒即option for project中的Debug选项中,要选择ST-Link,然后点击setting,这个时候如果能看到ST-Link版本等信息,说明ST-Link没问题,这个时候,还需要选择ort为SW表示用st-link,频率选择4MHz。

使用特权

评论回复
评论
好几遍vh 2023-1-31 20:43 回复TA
———————————————— 版权声明:本文为CSDN博主「川渝小神丢」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/fengel_cs/article/details/104268730 
沙发
好几遍vh|  楼主 | 2023-1-31 20:45 | 只看该作者
  要在Utilities 选项卡里面设置下载时的目标编程器,直接勾选Use Debug Driver,选择ST_LINK V2.1 来给目标器件的FLASH
编程,

使用特权

评论回复
板凳
好几遍vh|  楼主 | 2023-1-31 20:45 | 只看该作者

然后点击Settings,进入FLASH 算法设置,


使用特权

评论回复
地板
好几遍vh|  楼主 | 2023-1-31 20:47 | 只看该作者
这里MDK5 会根据新建工程时选择的目标器件,自动设置flash 算法。一般Programming Algorithm 里面默认会有相应处理器型号的 算法。另外,如果这里没有flash 算法,可以点击Add 按钮,自行添加即可。最后,选中Reset and Run 选项,以实现在编程后自动运行,如果在MDK软件包安装完后,没有正确安装了对应处理器的pack包,这里的Programming Algorithm中可能会找不到对应处理器型号。

使用特权

评论回复
5
好几遍vh|  楼主 | 2023-1-31 20:49 | 只看该作者

    上述设置完后,确定后,选择run to main,这样调试模式开始后,就会跳到main函数,相应设置如下:



使用特权

评论回复
6
好几遍vh|  楼主 | 2023-1-31 20:50 | 只看该作者
、基本调试选项

1. 开始调试

    一般IDE开发工具上都有start/stop调试按钮,点击后进入调试模式。

使用特权

评论回复
7
好几遍vh|  楼主 | 2023-1-31 20:51 | 只看该作者


使用特权

评论回复
8
好几遍vh|  楼主 | 2023-1-31 20:52 | 只看该作者
Call Stack 窗口


进入调试模式后,一般会显示出堆栈窗口(如果没有出来可以在view视图中打开),在这个窗口里面可以看到函数的调用关系和入口地址,以及局部变量的值,下图就是一个例子:



    图中可见,首先是main函数调用了LED_Init函数,然后在LED_Init函数中调用了HAL_GPIO_WritePin函数,另外在ED_Init函数中,可以看到类似Pin等局部变量的值(Location/Value列),当我们调试时,选择一行一行地运行,就会观察到这些值在变化。

使用特权

评论回复
9
好几遍vh|  楼主 | 2023-1-31 20:56 | 只看该作者
Watch窗口

    这个窗口也可以在View->watch 打开,可以选择watch1或watch2。用于查看特定函数入口地址和变量值。当我们要查看特定变量值的时候,可以直接把变量加入到watch窗口中查看值。

    方法是,选中变量或函数,右键选择add 变量或函数to watch1或watch2.

使用特权

评论回复
10
好几遍vh|  楼主 | 2023-1-31 20:56 | 只看该作者
代码优化

    编译器会根据设置对程序进行优化,优化后的程序,调试时可能看不到实际值,比如下会显示not in scope:



     原因在于编译器已经对该变量进行过优化,有可能会直接从缓存中取的,因此调试时最好不要打开优化选项,这样编译器会重新编译所有文件函数,如果优化打开,有可能就会只编译使用到的函数,并且某些变量有可能不是最新的值。设置编译优化方法如下(设置为leve0即可):



使用特权

评论回复
11
好几遍vh|  楼主 | 2023-1-31 20:57 | 只看该作者
查看外设寄存器的值Peripherals

    在调试的时候,有可能需要查看控制的外设寄出去是否为预期控制值,可以通过Peripherals查看。

使用特权

评论回复
12
好几遍vh|  楼主 | 2023-1-31 20:59 | 只看该作者
基于多任务的调试

    目前为止对多任务调试的理解,原先以为单CPU多任务会受到操作系统比如UCOSII的调度影响,无法进行单步调试。然而通过实验发现,在某一个UcosII的任务中打个断点,然后再全速运行,然后会调试到断点处,此时可进行此任务的单步调试,其他任务类似。

    如果要查看其他任务修改的全局变量,也可以通过watch窗口查看,在调试本任务时,其他任务也在运行。

使用特权

评论回复
13
好几遍vh|  楼主 | 2023-1-31 21:01 | 只看该作者

高级调试方法

1. 查看代码段运行时间,比如如下代码:

    调试时,点击一行一行的运行,然后查看MDK最右下角

处就可以知道时间。用当前值减去前面一行运行时的时间就是这段代码运行时间。


使用特权

评论回复
14
好几遍vh|  楼主 | 2023-1-31 21:11 | 只看该作者

  为了计算准确,调试前得先设置调试时钟频率,也就是STM32运行时的频率,对于STM32F411系列来说,填96MHz即可。并且勾选上Trace Enabl。这个设置框在MDK魔术棒->Debug->Setting->Trace处设置。


使用特权

评论回复
15
好几遍vh|  楼主 | 2023-1-31 21:14 | 只看该作者
查看内存地址数据的方法

    比如查看一个数组所有元素的数据,我们可以用watch查看,但是如果数组元素非常多,就需要用到Memory窗口查看。我们可以先用Watch查看到数组的首地址,然后把数组首地址输入到Memory窗口就可以看到后面连续内存的值,即所有数组元素的值为05 04 03...  如下图:



  Memory也在View视图选项中打开。

使用特权

评论回复
16
好几遍vh|  楼主 | 2023-1-31 21:15 | 只看该作者
查看中断执行时间和次数

    有时候需要调试中断的时候,可以打开这个窗口,这个窗口在下图中可以打开。

    打开后就会在MDK的右下角弹出Trace Exceptions窗口,当发生外部中断后,比如按键按下,就会执行多次外部中断,详见下图中的EXTI2和EXTI3,其中Count就是执行次数,也可以查看到中断服务函数大致执行时间。由此可见,按键按下会产生多次按键中断,但是我们只需要一次,所以需要防抖。



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

225

帖子

0

粉丝