
01. 概述$ a" u) y a4 t! q4 X7 G 在实际的开发过程中,如果程序比较简单就不需要调试程序,但是对于比较复杂的程序,往往需要通过调试来解决bug。串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 JLINK、ULINK、STLINK等就可以实时跟踪程序,从而找到你程序中的 bug,使你的开发事半功倍。* h* X8 y n2 w( h 1 {; m' m9 i# t7 d STLINK 支持 JTAG 和 SWD,同时 STM32F4 也支持 JTAG 和 SWD。所以,我们有 2 种方式可以用来调试,JTAG 调试的时候,占用的 IO 线比较多,而 SWD 调试的时候占用的 IO 线很少,只需要两根即可。 $ s$ B# `/ J" R- O# [; G 02. STLINK调试程序 2.1 点击开始调试按钮 / Z8 J1 t6 U/ }5 z ![]() i5 p6 P) c' I( N 编译一下工程。然后点击:(开始/停止仿真按钮),开始仿真(如果开发板的代码没被更新过,则会先更新代码(即下载代码),再仿真,你也可以通过按下载按钮,只下载代码,而不进入仿真。特别注意:开发板上的 B0和 B1 都要设置到 GND,否则代码下载后不会自动运行的!) 3 L# R/ C5 W& a# m 2.2 跳转到主函数执行: a0 a6 m" G6 K6 N2 h2 k0 q0 ~ ![]() # @) a# g2 q# c. E# _: F' ? 2.3 Debug工具条介绍8 Y- s/ j# D2 t( }1 u4 } 因为我们之前勾选了 Run to main()选项,所以,程序直接就运行到了 main 函数的入口处。另外,此时 MDK 多出了一个工具条,这就是 Debug 工具条,这个工具条在我们仿真的时候是非常有用的,下面简单介绍一下 Debug 工具条相关按钮的功能。! z/ S& C+ z" o/ @ ![]() 8 K4 p8 y, q( y b8 ~6 J4 M) B 复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。 1 p" G1 c6 `: M4 m$ J 执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。 停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。 执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。 执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。 执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。 执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。 汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。 堆栈局部变量窗口:通过该按钮,显示 Call Stack+Locals 窗口,显示当前函数的局部变量及其值,方便查看。 ) m5 P7 {6 b2 |. f0 g* K 观察窗口:MDK5 提供 2 个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。1 N' F& L* u! R" C* ^ 内存查看窗口:MDK5 提供 4 个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口 " X. y; ? y3 }# f& j6 p 串口打印窗口:MDK5 提供 4 个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。8 h, |& |' l1 i" ~: n4 J 逻辑分析窗口:该图标下面有 3 个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(Logic Analyzer),点击即可调出该窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。 系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。 Debug 工具条上的其他几个按钮用的比较少,我们这里就不介绍了。以上介绍的是比较常用的,当然也不是每次都用得着这么多,具体看你程序调试的时候有没有必要观看这些东西,来决定要不要看。 ' d5 W1 C+ l" i/ J 特别注意:串口打印窗口和逻辑分析窗口仅在软件仿真的时候可用,而 MDK5 对 STM32F4的软件仿真,基本上不支持(故本教程直接没有对软件仿真进行介绍了),所以,基本上这两个窗口用不着。但是对 STM32F1 的软件仿真,MDK5 是支持的,在 F1 开发的时候,可以用到。+ j+ B0 h; h/ o. C8 |) g. I2 R 2.4 设置和取消断点 我们把光标放到 test.c 的第22行左侧的灰色区域,然后按下鼠标左键,即可放置一个断点(红色的实心点,也可以通过鼠标右键弹出菜单来加入),再次单击则取消。- s' C# E9 ~8 a8 `4 J/ k ![]() 9 w4 @) e! J% q) y% I, H 2.5 点击run执行到断点处1 B1 M# ?5 z, t7 Q( U# g+ {. ^ ' N4 ~1 s8 R( P* \) a ![]() 2.6 查看外设信息 点击菜单栏的 Peripherals→System Viewer→GPIO→GPIOF。可以看到,有很多外设可以查看,这里我们查看的是GPIOF 的情况。 ![]() ! q) M* T! w |2 v+ E6 v. E 单击 GPIOF后会在 IDE 右侧出现一个如图 ![]() + L4 S) y; c1 a1 |8 g 2.7 执行完初始化 7 i) j9 l' Y# F# Y( ] ![]() 我们可以查看GPIOF 的各个寄存器设置状态,从而判断我们写的代码是否有问题,只有这里的设置正确了之后,才有可能在硬件上正确的执行。同样这样的方法也可以适用于很多其他外设,这个读者慢慢体会吧!这一方法不论是在排错还是在编写代码的时候,都是非常有用的。5 F* n$ v1 G$ w( P5 Q ( V; L7 P9 F. A ! a9 K* P' n' X 2.8 查看栈信息 ![]() ( i3 w5 w5 \. Z* n- S * M" J3 n8 a. ~2 n |
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命