【STM32Cube开发记录】7-Debug调试功能的使用

【STM32Cube开发记录】1-下载和安装STM32CubeIDE

【STM32Cube开发记录】2-STM32CubeProgrammer的使用

【STM32Cube开发记录】3-STM32CubeMX的使用

【STM32Cube开发记录】4-标准库 HAL库 LL库

【STM32Cube开发记录】5-寄存器和存储器映射

【STM32Cube开发记录】6-STM32核心功能

【STM32Cube开发记录】7-Debug调试功能的使用

大多数时候,我们可能写代码很快就写完了。但是一下载实际运行的时候就会遇到各种不正常工作的情况,这就需要我们区调试软件bug,所以有一个好的调试工具可以事半功倍。

STM32CubeIDE本身就提供了调试工具,除了需要一个STLINK,其它不需要额外的硬件或程序。

(好像还有其它调试工具,待补充)

1. 使用STM32CubeIDE的Debug

连接好你的硬件,点击下方的Debug图标

 会弹出一个选项框,提示是否切换到调试窗口。选择Switch(建议勾选上Remember my decision)

 这样就会进入到调试窗口了。

在变量窗格提供了查看当前堆栈帧(即调用堆栈中的所选过程)中定义的变量内容的功能。通过鼠标右键单击检查的变量,可以进一步自定义变量显示的方式。在右键菜单中单击“View Memory”,还可以转到变量存储的内存地址。(这里随意定义了一个变量a)

断点视图列出了应用程序中使用的所有断点。断点允许在程序计数器(PC)达到特定指令时停止固件的执行。当这种情况发生时,调试器会停止,并且Eclipse将显示停止指令的上下文。带代码行最前双击就可以设置断点。每个Cortex-M的MCU都有一定数量的硬件断点。

Cortex-MBreakpointsWatchpoints
M0/0+42
M3/4/7/3384

2. 调试图标的说明

 用于软复位,不会终止Debug。

  开启则忽略所有断点,继续执行而不中断。

 终止调试,并重新启动调试会话。

 触发断点或代码暂停后,恢复代码运行。

代码在运行的时候,暂停运行。

 终止调试,关闭调试会话。

 进入调用函数内部。

 执行下一个指令,不会进入函数内部。

 MCU将继续运行,直到退出(即返回)当前程序。执行将准确停在调用函数中的下一条指令上。
(除此之外的窗口还有寄存器窗口。后面学到再来补充)

3. 调试的配置

我们可以对我们的Debug进行一些配置,上面我们采用的方法是直接点击Debug那个图标,实际上STM32CubeIDE帮我们进行了一些配置。

点击这个进行配置
 

 我们关注的是STM32 C/C++ Application。

 在右侧有几个选项Main\调试器\StartUp

3.1 Main

选择项目,需要加载的二进制文件。 

3.2 调试器

GDB连接设置:选择连接本地还是远程。(这部分先不改动)。

调试探头:STM32CubeIDE支持三种不同的调试探头(标准ST-LINK、SEGGER J-Link和OpenOCD)。我使用的ST-LINK调试探针。(后续可能补充其它两种)

接口:可以选择使用哪个MCU调试接口。大多数STM32 MCU都支持JTAG和SWD接口。我使用的是SWD接口。
Reset behaviour:有时候可能会遇到无法烧录MCU或使用ST-LINK进行调试的情况,当发生这种情况时,意味着ST-LINK调试器无法访问目标MCU的调试端口(通过SWD接口),或者Flash已被锁定,阻止调试器访问。一般来说,如果SWD引脚已被配置为通用GPIO或者MCU处于深度低功耗模式,关闭了调试端口,再或者选项字节配置存在问题(可能Flash已被写保护,或者读保护级别1已经打开),就会造成这种原因。要解决这个,必须强制ST-LINK调试器在保持目标MCU的nRST引脚低电平的情况下连接到它。这个操作被称为"复位下连接",它可以通过选择一种复位行为来执行,接下来将对这些行为进行描述。

  • Connect under reset (default):复位下连接,reset线被激活,等待连接完成后,reset线被停用。
  • Software system reset:通过软件写入RCC寄存器来激活系统复位。这将重置核心和外设,并且可以重置整个系统,因为目标的复位引脚会自动断开。
  • Hardware reset:ST-LINK复位线被激活然后停用--产生一个脉冲,然后ST-LINK以SWD或JTAG模式连接。
  • Core reset:通过在Cortex-M寄存器中写入来激活core复位(不适用于Cortex-M0/0+/33核心)。这只重置core,不会重置外设或复位引脚。
  • None:用于连接到正在运行的目标,其中程序已经下载到设备中。在启动选项卡中不应有任何文件程序命令。

3.3 StartUp

Initializtion Commands: 这个可以配置如何启动调试会话。如果需要在发送加载命令之前向GDB服务器发送某些命令,可以在这里编辑任何类型的GDB或GDB服务器监视器命令。比如,如果需要在加载之前执行完整的FLASH存储器擦除,可以在这里输入monitor flash mass_erase命令。

load image and symbols:列表框必须包含要进行调试的文件。

Runtime Options: 用于设置启动地址和断点,启用异常处理和恢复。默认情况下,"设置断点"复选框被启用,并且编辑字段显示"main"。默认情况下,在调试程序时会在"main()"例程处设置一个断点。这就是为什么在每次调试会话开始时执行会在"main()"处停止的原因。
关于异常选项:

  • Exception on divide by zero:捕获除零错误。
  • Exception on unaligned access:如果存在任何未对齐的内存访问,会有这个异常。
  • Halt on exception:异常时停止。

4. 输入输出重定向

在调试过程中,如果有像C语言那种使用printf输出我们想要的调试信息,会方便很多,再者,使用断点调试,会导致丢失相关的事件。如何实现这种功能?我们可以重写函数来将标准输入(STDIN)、标准输出(STDOUT)和标准错误输出(STDERR)重定向到MCU的USART上。

对于float的支持,需要进行设置,勾选Use float with printf from newlib-nano and Use float with scanf from newlib-nano

### STM32CubeIDE调试教程 #### 打开并配置调试会话 为了启动调试,在STM32CubeIDE中需先创建或加载一个项目。通过点击菜单栏中的“Run”选项,选择“Debug Configurations...”,可以进入调试设置界面[^1]。 #### 启动调试模式 在弹出窗口内可以选择不同的调试器类型,通常情况下选用ST-Link Debugger即可满足大多数需求。选好之后点击“Apply and Close”。回到主界面后,再次访问“Run”菜单下的“Debug”子项来开启一次新的调试过程。 #### 设置断点 利用左侧源文件编辑区旁边的空白处单击鼠标左键可快速设定行级断点;对于函数入口,则可以直接右键目标函数名并选取相应的操作完成断点布置工作。当程序执行到这些位置时将会暂停等待进一步指示。 #### 查看变量与表达式 一旦处于暂停状态,顶部工具条会出现一系列用于控制流程的新按钮,比如继续运行(F8)、逐语句前进而不深入调用细节(F6)以及步入当前指令内部(F7)。与此同时,“Variables”视图允许实时监控局部及全局范围内各个量的变化情况。“Expressions”面板支持自定义关注特定计算式的即时结果更新显示。 #### 利用终端辅助调试 除了上述方法外,还可以借助集成于IDE内的Command Shell Console来进行更灵活多样的交互测试。这不仅限于发送简单的AT命令序列至MCU端口监听响应消息,也适用于其他任何基于UART通信协议的应用场景下的人机对话模拟练习。 ```python print("This is an example of Python code that could be used to demonstrate interaction with the serial port.") ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值