前文已经描述STM32CubeIDE的一些基本操作,基于前两篇文章,已经可以完成配置工程然后编译下载的目的,但是STM32开发,最重要的是实时调试,这一章描述STM32CubeIDE通过ST-Link调试,并对照Keil进行对比。
在Keil中,如果想调试,只需要将调试器和MCU连接好后,按下Keil中的这个按钮即可,随后程序会自动暂停到main函数第一行。
Keil中进入调试按钮
在STM32CubeIDE中,选中工程的情况下,也可以在工程上右键点击如图红框所示选项或者菜单栏上的按钮进入调试状态。
STM32CubeIDE进入调试。
如果该工程是第一次进入调试状态,则会弹出下图所示配置窗口。
调试配置窗口
在Keil中也有类似的配置,我们对比进行说明,下图左图就是STM32CubeIDE的调试器配置栏,右图是Keil的调试配置栏目。
下列所有图片中,左图是STM32CubeIDE的页面截图,右图是Keil中对应页面截图,下文不在说明。
调试器配置栏
Keil中支持很多的调试器,每种调试器都有自己不同的协议和优缺点。STM32CubeIDE目前只支持三种调试器,可通过该选项配置,其中ST-Link、J-Link,对于搞单片机的人来说再熟悉不过了,OpenOCD是一个开源的功能强大的调试器,如果要使用别的调试器,例如CMSIS-DAP等,可以通过ST-Link(OpenOCD)来实现。
选择调试器
接口和频率选择,现在搞STM32一般都使用三线的SWD,特别是ST-Link OB,JLink OB出现后,方便、小巧,板子上也只需要留出SWDIO、SWCLK和GND三根线就行,很难看见JTAG口了。如果板子调试线过长或者干扰太大,可以尝试降低频率提高通信成功率。
接口和频率配置
复位选项,这里介绍下STM32CubeIDE中的各个选项含义,Keil中的选项可自行参考:https://www.keil.com/support/man/docs/ulink2/ulink2_ctx_debug.htm#!#%2Fconnect。
复位选项
要想了解这些选项,必须先了解NRST异步复位引脚,STM32处理器对外都包含了一个NRST引脚,只要拉低这个引脚,MCU就会处于复位状态,复位外设和内核。而在ST-Link调试器中,对外就包含了一根NRST线,用于连接到目标硬件的NRST操作目标处理器复位。
NRST引脚
Connect under reset:先拉低NRST线复位MCU,然后连接MCU,然后拉高NRST线MCU退出复位状态。
Software system reset:先连接到MCU,然后向MCU寄存器写命令来复位MCU,复位内核和外围设备。
Hardware reset:先拉低NRST线复位MCU,然后拉高NRST线退出复位状态,接着连接MCU。
Core reset:向MCU寄存器写命令来复位MCU,只复位内核,不复位外围设备。
None:程序已经下载运行的情况下,不复位,直接连接MCU。
可以根据实际情况选择,如果有NRST线,当然是选择Connect under reset比较好,例如当没有配置处理的Debug口或者Debug口被占用的时候,这时候普通的方式已经无法连接到处理器,就可以使用这种方式烧录入新的程序释放Debug口。如果没有NRST,那就选择Software system reset。不过只要SWDIO、SWCLK、GND线连接和功能正常,不管选那种方式,总能进入调试模式。
配置相关的文件存放在.launch文件中,如果没有这个文件,进入调试时就会弹出配置窗口。
launch文件
点击Debug按钮进入调试,此时如果连接正确的情况下控制台会弹出若干信息,接着将程序停到main函数第一行。
进入调试
通过左上角的这些按钮,就可以达到如同Keil的单步跳过、单步进入、暂停、运行等操作。这里有一个小bug,一定要等停到main函数第一行时才可以操作调试命令,如果操之过急,在还没停到第一行就开始就进行操作,此时调试会异常退出。
点击如图所示的Resume,快捷键F8,程序开始运行。
常用调试命令
打断点和Keil一样,在程序左侧双击,程序就会运行到断点处停止。
打断点
将鼠标移动到断点上方,接着就会弹出一个小框,点击小框右侧如下图所示的图标,就可以删除这个断点。
删除断点
如果有很多个断点需要删除,就可以通过调试界面右侧进行全部删除。
删除所有断点
如果找不到上图这个视图界面,可以通过如下图所示的菜单栏打开。
打开各种视图
同Keil一样,断点的数量有上限,太多的断点将会报错。
在程序中定义了三个变量,分别为全局变量、静态变量和局部变量。并在主函数中让其自增,用来说明STM32CubeIDE中的查看变量功能。
增加三个变量
在Expressions、现场表达式这两个试图中,都将三个变量添加进去,可以看到,在程序不暂停的情况下,现场表达式可以实时查看全局变量的变化情况,局部变量和静态变量则无法查看,而Expressions则无法实时查看任何变量。
现场表达式视图
Expressions视图
当程序暂停的时候,将鼠标移动到变量名称上就会自动弹出当前变量的值。
查看变量
此时在右侧Expressions试图也可以看到添加进去的变量。
Expressions试图
此外,还可以通过SFRs查看处理器各个外设寄存器的值。
SFRs视图
也可以通过Registers查看内核各个寄存器的值。
Registers视图
另外Keil中可以配置下载程序时是否擦除所有Flash、不拆除、部分扇区,这在STM32CubeIDE中是没有的(也有可能是我没找到),需要搭配STM32CubeProg实现。
从调试体验这一块来说,还是Keil体验上来的比较好,各个功能也比较人性化,STM32CubeIDE的调试各种操作接口还有可优化的空间,但目前也能满足需求,最重要的还是免费。
对一个加法函数的库项目的建立和编译整个过程如下:
1、这里就要选择ARMMCU的GCC编译器了。
2、选择和MCU型号的绑定关系了,毕竟编译的库是给MCU项目所用,这里选择STM32F401CCU6的芯片。
2、添加源文件编写加法函数,编写加法函数进行编译。
3、编译成功,在工程目录里就可以找到编译好的库文件了,库文件的调用,配置一个对应MCU的基本工程,建立一个STM32F401CCU6的工程,并配置USART2作为串口输出。
4、保存后产生基本工程代码,重载printf函数方便打印输出,参考STM32UART串口printf函数应用及浮点打印代码空间节省。
5、在工程的core/inc/目录新建一个和库文件同名的头文件,将库文件libLib_C_Demo.a放置到工程的源文件目录core/src/,则在工程目录树立可以看到。
6、因为编译器默认只是识别C语言源代码(.c文件),还需要进行库文件的指定,这样编译器才会对二进制库文件(.a)进行识别。
7、先打开属性菜单,进行库文件所在目录和库文件名的添加指定,注意库文件名前需要加冒号,ApplyandClose后,就可以在工程文件里对库文件进行调用,首先要引入库文件的头文件。
8、在while循环里进行打印输出,打印数据为库函数调用的加法和,编译下载到STM32F401CCU6芯片后运行,通过串口工具观察打印结果,输出打印结果正确,库函数正常调用成功。
你问的是导入stm32cubeide工程失败怎么回事吗?目录有中文。
导入stm32cubeide工程失败可能是因为安装文件的目录上面有中文字符,导致导入无法正常进行。
stm32cubeide是ST公司官方推出的用于STM32开发的IDE。
stm32cubeide中项目栏叉掉了在任务中挂起恢复。使用在非LED任务中挂起、恢复LED任务。在LED任务中直接挂起,接下来就没法恢复自己,需要通过别的任务来恢复LED任务。
系统bug。stm32cubeide是一款一体化的多操作系统开发工具,在该工具使用时若一直找不到project,是系统bug的原因,可将该工具退出,重新打开即可看到。