【STM32Cube开发记录】1-下载和安装STM32CubeIDE
【STM32Cube开发记录】2-STM32CubeProgrammer的使用
【STM32Cube开发记录】3-STM32CubeMX的使用
大多数时候,我们可能写代码很快就写完了。但是一下载实际运行的时候就会遇到各种不正常工作的情况,这就需要我们区调试软件bug,所以有一个好的调试工具可以事半功倍。
STM32CubeIDE本身就提供了调试工具,除了需要一个STLINK,其它不需要额外的硬件或程序。
(好像还有其它调试工具,待补充)
1. 使用STM32CubeIDE的Debug
连接好你的硬件,点击下方的Debug图标
会弹出一个选项框,提示是否切换到调试窗口。选择Switch(建议勾选上Remember my decision)
这样就会进入到调试窗口了。
在变量窗格提供了查看当前堆栈帧(即调用堆栈中的所选过程)中定义的变量内容的功能。通过鼠标右键单击检查的变量,可以进一步自定义变量显示的方式。在右键菜单中单击“View Memory”,还可以转到变量存储的内存地址。(这里随意定义了一个变量a)
断点视图列出了应用程序中使用的所有断点。断点允许在程序计数器(PC)达到特定指令时停止固件的执行。当这种情况发生时,调试器会停止,并且Eclipse将显示停止指令的上下文。带代码行最前双击就可以设置断点。每个Cortex-M的MCU都有一定数量的硬件断点。
Cortex-M | Breakpoints | Watchpoints |
M0/0+ | 4 | 2 |
M3/4/7/33 | 8 | 4 |
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