[其他ST产品] STM32在线调试、看门狗、跑飞调试

[复制链接]
 楼主| 好几遍vh 发表于 2023-1-31 20:41 | 显示全部楼层 |阅读模式
调试准备

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。

评论

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

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdlbF9jcw==,size_16,color_FFFFFF,t_70.jpg


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

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdlbF9jcw==,size_16,color_FFFFFF,t_70.jpg



 楼主| 好几遍vh 发表于 2023-1-31 20:50 | 显示全部楼层
、基本调试选项

1. 开始调试

    一般IDE开发工具上都有start/stop调试按钮,点击后进入调试模式。
 楼主| 好几遍vh 发表于 2023-1-31 20:51 | 显示全部楼层
 楼主| 好几遍vh 发表于 2023-1-31 20:52 | 显示全部楼层
Call Stack 窗口 582063d90ef0cdcaa.png


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


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

 楼主| 好几遍vh 发表于 2023-1-31 20:56 | 显示全部楼层
Watch窗口 3172163d90fe5abf0d.png

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

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

8330863d90fd6887f4.png
 楼主| 好几遍vh 发表于 2023-1-31 20:56 | 显示全部楼层
代码优化

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

5059763d90ffc82c79.png

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

8139763d9100a9f07b.png

 楼主| 好几遍vh 发表于 2023-1-31 20:57 | 显示全部楼层
查看外设寄存器的值Peripherals

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

4346363d9103d78656.png
 楼主| 好几遍vh 发表于 2023-1-31 20:59 | 显示全部楼层
基于多任务的调试

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

    如果要查看其他任务修改的全局变量,也可以通过watch窗口查看,在调试本任务时,其他任务也在运行。
 楼主| 好几遍vh 发表于 2023-1-31 21:01 | 显示全部楼层

高级调试方法

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

20200212150007712.png

    调试时,点击一行一行的运行,然后查看MDK最右下角 20200212150300446.png 处就可以知道时间。用当前值减去前面一行运行时的时间就是这段代码运行时间。


 楼主| 好几遍vh 发表于 2023-1-31 21:11 | 显示全部楼层

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdlbF9jcw==,size_16,color_FFFFFF,t_70.jpg


 楼主| 好几遍vh 发表于 2023-1-31 21:14 | 显示全部楼层
查看内存地址数据的方法

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

2084663d914384a215.png

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

 楼主| 好几遍vh 发表于 2023-1-31 21:15 | 显示全部楼层
查看中断执行时间和次数

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

5192763d9147d01a60.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

252

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

32

主题

252

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部