8) 安装 ST-Link USB 驱动程序如果上面的测试没有问题,则不需要进行这一步。
安装 ST-Link USB 驱动程序:(当上面的测试没有通过时) 先断开 NUCLEO 开发板和电脑之间的 USB 连接。 需要手动运行 stlink_winusb_install.bat 来安装 USB 驱动,这个文件存放在C:\Keil_v5\ARM\STLink\USBDriver 中。找到这个文件并双击来安装驱动程序。 连接 NUCLEO 的 USB,USB 驱动程序应该会以正常的方式安装完毕。
重要提示:ST-Link V2 固件升级程序 ST-LinkUpgrade.exe 存放在 C:\Keil_v5\ARM\STLink。如果要更新 ST-Link 固件,找到并双击这个程序,操作还是比较简单的,程序会检查并报告当前的固件版本。请注意我们需要使用 V2.J16.S0 或更高的版本来支持 SWV 操作。另外不要使用 V2.J19.S0,这一版本与最新版驱动程序不兼容。
(译者注:V2.J19.S0 不兼容估计是个历史问题,我已经在用 MDK 5.17 和 V2.J24.M11 版本了。)
COM LED LD1 的含义: LED 红色闪烁:电脑开始 USB 枚举,但还未完成。
LED 红色:电脑和 ST-LINK/V2 之间已经建立连接(枚举结束),但 μVision 还没有连接到 ST-Link (比如 Debug 模式)。
LED 绿色:μVision 以 Debug 模式连接到 ST-Link,上一个通信是成功的。
LED 红色、绿色间隔闪烁:μVision 和目标之间正在交换数据。
LED 熄灭,但当进入 Debug 模式或点击 RUN 时闪烁一下:μVision 的 SWV 跟踪已启动。
LED 熄灭:ST-LINK/V2 与目标 MCU 或 μVision 之间的连接失败,需要重新连接电源以重启开发板。 9) 使用 NUCLEO 开发板运行 Blinky 例程我们将使用板载 ST-Link V2 调试器连接 Keil MDK 开发平台和真实的目标硬件。 NUCLEO 开发板上的绿色 LED 会开始闪烁。
按下开发板上蓝色的 USER 按键会暂停闪烁。
至此你已经了解如何编译工程、下载到 STM32 处理器的 flash 中、运行并停止程序! 注意: Blinky 程序已经永久的烧写到 flash 中了,开发板可以独立运行这个程序,直到下一次被烧写。 10) 硬件断点STM32F4 共有六个硬件断点,可以在程序运行过程中随时设置或取消。 提示: 如果单步调试(Step In)不工作,点击 Disassembly 窗口使它成为焦点,可能需要点击一行反汇编代码。这样操作表示想要汇编级别的单步运行,而不是 C 语言代码级别。 提示: ARM CoreSight 的断点是 no-skid 的,硬件断点发生在被设置断点的指令执行之前(译者注:有 skid 的断点的意思是,程序停止在断点设置的指令甚至后面几个指令执行之后)。另外 flash 中烧写的指令不会被替代或修改,这的特性对于高效率软件开发有重要意义。 完成这个实验后,再次点击这些断点以删除它们,为后面的实验做准备。 提示: 可以通过点击断点,或者选择 Debug/Breakpoints(或按 Ctrl+B)并选择 Kill All 来删除。 提示: 可以通过选择 Debug/Breakpoints 或按 Ctrl+B 来查看所有断点的设置。 11) Call Stack + Locals 窗口局部变量Call Stack + Locals 窗口被合并在一个集成窗口中,每当程序停止时会显示调用栈和当前函数的所有局部变量。 如果可能,局部变量的值会显示,否则显示 < not in scope >。菜单中的 View/Call Stack Window 用来切换 Call Stack + Locals 窗口显示或隐藏。 提示: 如果单步调试(Step In)不工作,点击 Disassembly 窗口使它成为焦点,可能需要点击一行反汇编代码来执行汇编级别的单步运行。如果焦点在源代码窗口上,则是执行 C 语言代码级别的单步运行。 提示: 可以在程序停止运行时,通过 Call Stack + Locals 窗口来修改变量的值。 提示: 上述是标准的“Stop and Go”调试过程。ARM Coresight 调试技术还可以做很多更强大的事情,比如在程序运行中显示并实时更新全局或静态变量,而不需要修改程序。由于局部变量通常存储在 CPU 寄存器中,不能在程序运行时实时显示,需要转换成全局或静态变量使得作用域不会消失。 如果借助 ULINK pro 和 ETM 跟踪,可以记录所有指令的执行情况。Disassambly 和 Source 窗口是按编写的顺序显示代码的,而 ETM 跟踪可以按执行的顺序显示。另外 ETM 还提供 Code Coverage、Performance Analysis 及 Execution Profiling 等功能。 把局部变量转换成全局或静态变量通常意味着把它从 CPU 寄存器移动到 RAM 上,CoreSight 在程序运行中可以观察 RAM,但不能观察 CPU 寄存器。 调用栈如上面可以看到的,当程序停止运行时,函数按栈的方式显示在列表中。当想要了解栈中有哪些函数被调用、存储的返回值是什么的时候,这个功能就很有用。 提示: 可以在程序停止运行时,通修改局部变量的值。 提示: 点击菜单 Debug/Breakpoints 或按 Ctrl+B 键可以查看 Hardware Breakpoint 列表,同时这也是配置 Watchpoint (观察点,也叫 Access Point)的地方。在这个列表里可以临时屏蔽某些项目。点击 Debug/Kill All Breakpoints 会删除断点,但不会删除观察点。 12) Watch 和 Memory 窗口及其使用方法Watch 和 Memory 窗口实时显示变量的值,这是通过 ARM CoreSight 调试技术实现的,这项技术是包含在 Cortex-M 处理器中的一部分。同时,也可以在这些存储器地址上实时地“put”或插入数值。这两个窗口都可以通过拖拽变量名,或者手动输入来添加变量。 Watch 窗口添加全局变量: 除非程序停止在局部变量所在的函数,否则 Watch 和 Memory 窗口不能观察局部变量。 停止运行处理器 并退出 Debug 模式 。 在 Blinky.c 的第24行左右,声明一个全局变量(这里变量名叫做 value):unsigned int value = 0;。 在第104行左右添加语句 value++; 和 if (value > 0x10) value = 0;,如图:
选择菜单 File/Save All 或点击 。 点击 Rebuild ,点击 Load 下载到 flash。 进入 Debug 模式 ,点击 RUN ,提示:可以在程序运行中设置 Watch 和 Memory 窗口。 在 Blinky.c 中,右键点击变量 value 并选择 Add value to … 及 Watch 1,Watch 1 窗口会打开并显示value 如下图。 value会实时增加到0x10。
提示: 也可以框选 value,单击并拖拽到 Watch 或 Memory 窗口。
提示: 请确认菜单 View/Periodic Window Update 在选中状态。 也可以在 Name 下面区域双击或按 F2,再手动输入或复制粘贴变量名。或是打开菜单 View/Symbols Window 来输入变量。
提示: 如果要拖拽到一个非活动的选项卡,选中变量按住鼠标并移动至希望打开的选项卡名字上,等待其打开并拖拽鼠标到窗口内释放。
Memory 窗口右键点击 value 并选择添加到 Memory 1,或手动添加 value 到 Memory 1。如果需要的话,选择菜单 View/Memory 来打开 Memory 1 窗口。 注意 value 被当作了一个指针,其值做为地址显示在了 Memory 1 上。这个操作在想要看一个指针指向的地址的时候很有用,但不是我们现在想看到的。 在变量名前面加一个“&”符号并按回车键,改为显示变量的物理地址(0x2000000C)。 右键点击 Memory 1 窗口并选择 Unsigned/Int。 value 的值现在以32位的形式显示了。 Watch 和 Memory 窗口都是实时更新的。 在 Memory 窗口中,鼠标移动到数据区域右键点击,选择 Modify Memory,可以修改对应地址的值。
提示: 这些操作通常不会占用 CPU 周期。关于 DAP 是如何运行的,详见下一章“原理”。 提示: 在 Debug 模式中选择菜单 View/Symbol Window,可以打开 Symbol 窗口查看变量和各自的位置。 上面展示的 Memory 和 Watch 窗口的操作并不需要配置 Serial Wire Viewer (SWV),这些机制使用的是 SWV 之外的另一个 CoreSight 特性。CoreSight Debug Access Port (DAP)通过 Serial Wire Debug (SWD)或 JTAG 连接来处理读写操作,从而实现实时在线的存储器访问。
|