一、调试前的准备
使用J-Link将PC和单片机连接
以STM32入门教程中的"读写内部FLASH"实验为例,使用Keil打开该工程
按照下图所示的步骤进行操作,如果使用J-Link仿真器,则在第三步选择ST-Link Debugger


按照下图所示的步骤进行操作,输出选项卡需要勾选调试信息

按照下图所示的步骤进行操作,代码生成的优化选项中,优化等级需要选为0,否则Keil在编译程序的过程中可能会过度优化,导致编译得到的二进制机器码和C语言代码不是等价的,在调试过程中会引起代码执行顺序错乱

完成以上步骤后,编译程序,然后将其下载到单片机中
二、Ozone调试工程快速创建
1、新建工程
(1)打开Ozone,在菜单栏选择"File"→"New"→"Project",新建一个工程。(如果是初次使用,那么打开Ozone后会自动弹出向导,引导用户新建工程)

(2)在Device选择MCU型号(本教程使用STM32F103C8T6),并在Peripherals导入对应的.svd文件(芯片厂商提供,可生成外设寄存器树,直接在上位机查看和修改外设寄存器)。

(3)主机接口选择USB;目标接口视情况选择,对于ARM芯片,通过查看数据手册关于调试的章节,可以确认是否支持SWD,支持即可选择,而非ARM芯片仅支持JTAG;目标接口速率可以选择2MHz,若硬件稳定,则可以提速。

(4)选择编译输出的.elf文件,如果是使用Keil编译,则选择编译输出的.axf文件(.axf文件是ARM扩展版.elf文件),路径尽量不包含中文和全角字符。

(5)创建完成后,在菜单栏选择"File"→"Save Project as...",即可保存调试工程。

2、三种调试启动模式

(1)Download & Reset Program:擦除Flash,将固件烧录到Flash中,然后复位MCU,释放复位后程序从头全速运行。
(2)Attach to Running Program:连接后程序保持运行,可观察设备实时的动态变量,不会破坏RAM堆栈、寄存器。
(3)Attach & Halt Program:连接后停止正在运行的程序,直接冻结现场,立刻捕获当前寄存器、堆栈、内存快照,不会破坏RAM堆栈、寄存器。
三、Ozone基础调试功能
1、断点系统
(1)使用Ozone调试,Flash区不限制硬件断点数量(Cortex-M只有4~8个硬件断点,Keil调试受限于硬件数量),因为Ozone自动在Flash写入BKPT断点指令,缓存原始指令,断点取消后自动恢复代码。
(2)源码断点(程序断点):
①在代码浏览区的左侧有一些灰色的区域,鼠标左键点击,即可在区域对应的代码打上源码断点,当单片机运行到这些代码的时候,会触发停止运行的条件;如果需要取消源码断点,鼠标左键点击它对应的红色圆圈,即可取消断点。

②鼠标右键点击源码断点对应的红色圆圈,选择"Edit Breakpoint",在弹出的窗口中可以设置断点触发的前置条件。

1Condition填入条件表达式,如cnt>100。如果选择"Trigger when true",那么断点命中时,需要满足条件表达式才会真正停机;如果选择"Trigger on change",那么断点命中时,表达式数值发生过变化,才会真正停机。
2Skpi填入断点命中次数,假如设置为499,那么断点命中500次才会真正停机。
