1 获取软件和工具
1.1 Keil uVision5 IDE
可在官网获取最新版本或者在百度网盘获取笔者使用的版本(uVision V5.23.0.0)。
链接:https://pan.baidu.com/s/1sJUj7l0yCmke7_ipqnxrVA
提取码:1m6r
1.2 STM32CubeMX
可在官网获取最新版本或者在百度网盘获取笔者使用的版本(4.22.0)。
1.3 Keil uVision5注册
安装好uVision5之后可以编译小于5K大小的可执行程序,超过5K需要注册才能编译成功。
以管理员方式打开uVsion,File->Liscense Management,以管理员方式打开注册机软件,将uVision中的CID拷贝到注册机的CID一栏,注册机的Target一栏选择ARM,点击注册机上Generate会生成一串字符串(LIC),将该字符串拷贝到uVision中的 New License ID Code(LIC):一栏并点击Add LIC,如果底部内容框显示”LIC Added Successfully”则表示注册成功,此时可以编译超过限定大小(5K)的可执行程序。
1.4 ST-Link V2
ST-Link V2相关使用,
参考网站:
https://www.st.com/en/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html
参考文档:
UM1075/ST-LINK/V2 in-circuit debugger/programmer for STM8 and STM32 User manual
连接方式(SWD):

使用4个端口:1-电源,7-SWDIO,9-SWCLK,20-地
2 调试程序
2.1 程序下载
在烧录程序之前需要导入设备描述文件给IDE,否则会出现“Cannot load flash Device description”的错误。按照如下步骤,点击下面的图标,



将对应的单片机描述添加进去,记得按下“确定”保存更改。
使用STM32CubeMX生成Keil项目代码,编译代码,

代码编译通过之后,通过如下设置,


代码能编译通过,调试选项设置正确之后即可下载程序到板端Flash,

下载成功即板端Flash有用户程序,下次上电则会直接执行该用户程序。
代码能编译通过,调试选项设置正确之后也可以选择在线调试,

此时用户程序会下载到板端Flash,并且板端会自动重启并停止调试起点处。
2.2 查看main函数中的局部变量
如图,main函数中有局部变量cyl_cnt2,通过右键选择该变量的方式添加该变量到Watch1,即可实时查看该变量。

Watch1窗口默认在Keil的右下角显示,如果没看到可在菜单栏View->Watch Windows->Watch1打开。
如果在main函数中定义一个变量,调试程序时查看那个变量的值,Watchx(x=1或者x=2)总是显示not in scope。该问题主要是由于编译器优化了我们的程序代码。有两种解决办法,1:把变量定义为一个全局变量,2:将编译器优化等级修改为0。


2.3 查看内存内容
菜单栏->View->Symbols Window->找到指定的变量->右键选中变量->增加变量到Memoryx(x为[1,4])即可在memory watchs窗口(一般在keil软件的右下角,跟watchx(x为[1,2])同一栏))中看到内存内容。

如果一个字符数组变量的内容太长,在watch窗口中会显示不全,此时可以将变量添加到memory窗口,通过右键更改显示选项为Ascii,此时就会以字符串形式显示变量的内容。
可以设置断点,程序停止断点处时可以查看当前调用栈,一般在keil的右下角,与watchx(x为[1,2])同一栏,如果没有则可以通过菜单栏->View->Call Stack Window调出该窗口。

2.4 清除断点及watch列表

在Command栏目中敲入BK *即可清除所有断点,WK 1/2即可清除watch 1或者watch 2。
2.6 生成bin文件
keil提供了生成hex文件的勾选项(在Options for Target->Output中),但没有提供生成bin文件的勾选项,需要用户添加预定义命令生成,在预定义命令栏中输入“fromelf --bin --output=@L.bin !L”即可。如下图所示,

2.7 断点太多导致调试时启动出现异常
SW调试方式,在调试时一次创建了5个以上的断点,当次调试没有问题,下次想继续调试则出现启动异常,将断点删除之后就没有出现类似的问题。
2.8 生成预编译文件查看预编译变量
有时软件版本日期直接使用__DATE__,__TIME__这样的预编译变量,或者想看看程序的文件包含路径等等,需要生成预编译文件协助查看。Options fot Target ‘xxx’->Listing->勾选”C Preprocessor Listing: *.i”,此时重新编译,可以看到项目文件夹下有所有源文件的预编译文件。
2.9 使用多个ST Link仿真器
如果是使用keil软件烧录程序,则Options for Target ‘XXX’ -> Debug -> 选中ST-Link Debugger -> Settings -> Debug -> Debug Adapter -> 在unit下拉列表中会枚举出当前识别到的多个仿真器,选中需要的那个即可。
如果是使用STM32 ST-LINK Utility烧录程序,则Target -> Settings -> Serial Number ->在下拉列表中会枚举出当前识别到的多个仿真器,选中需要的那个即可。
2.10 在调试过程中IDE报错
板端有继电器,在开关继电器时会出现IDE报错的情况,认为是继电器断开和闭合时SWDIO或SWCLK受到干扰所导致,最初的调试接口电路图如下:

修改后的调试接口电路图如下:

修改后的电路开关继电器时不会出现IDE报错,参考ST官方文档:





