使用 Keil 调试
在前几个小节中, 我们已经将整个软硬件系统都下载到了 FPGA 中, 但是由于软件实现的是一个循环计数器, 我们无法通过外部的显示器件来观察程序的运行情况, 所以我们只能够通过调试器深入 Cortex-M0 内部, 去观察其寄存器值的变化情况.
这时候, 我们就需要用到 Keil 的调试功能了, 打开 Keil 的 Options 选项卡, 进入 Debug 一栏, 左边是仿真设置, 右边是调试设置, 在前几个小节中, 我们已经提前将该栏设置到了调试模式, 所以这里我们直接进行连接和调试即可.
连接
首先进行调试器的连接. 在建立连接时必须保证两点:
比特流已经下载完成, 且 FPGA 没有被复位 (指 FPGA 芯片复位, 对应板卡中间的复位按键), SoC 在使能状态 (板卡上 SW0 向上拨开), FPGA 不断电. 这样才可以保证 Cortex-M0 软核中的调试接口能够正常工作.
在 1 的基础上, 打开 PC 的设备管理器的端口一栏, 确保 PC 上检测到了调试数据线所连接的端口, 且端口准备就绪. 这样才可以保证 PC 与调试端口能够顺利连接.
![35](../img/lab2/35.png)
点击进入 Debug 页面右上角的 settings 进入调试器的设置, 注意选择调试接口为 SW, 这时会看到右侧出现了调试器的设备 ID 和名称, 说明已经成功建立连接, 点击 OK 完成连接. 若右侧显示未找到设备或连接失败, 则再次确认上述两个连接条件, 或尝试拔下数据线再重新插上.
![33](../img/lab2/33.png)
调试
连接完成后, 点击 Keil 工具栏中的图标进入调试, 这时会发现调试界面和 LAB1 中用到的仿真界面基本是一样的, 只是调试界面中运行的是实际板卡中的程序, 而不是软件仿真的程序.
单步运行程序, 可以观察到 r0 的值在 0-4 循环, 说明程序在 FPGA 中能够正常运行.
![34](../img/lab2/34.png)
实现在线下载程序
你有没有想过, 既然我们的软件程序是以 .hex 文件的形式被写入到比特流文件中, 然后被下载配置到 FPGA 中的, 那么这是不是意味着, 我们每次修改软件代码后, 都要重新编译, 综合, 实现, 下载比特流呢? 这样的话调试效率是不是就太低了? 按上面的道理来说确实是这样的, 但是不要忽视了 Cortex-M0 核中 DAP 的调试功能, 当我们在 Keil 软件中进行调试时, 刚刚编译得到的目标文件会通过 USB 数据线, 经过 FPGA 开发板的 DAP 接口以及我们约束的 SW 调试引脚进入 CortexM0 的 DAP 中, 实现程序的在线下载与运行. 这样, 我们就可以不必重新综合, 也能够调试最新的程序了. 这种 "硬件固定不动, 软件在线调试" 的思想对于我们之后的调试来说是非常重要的.
但是! 前提是必须要做到两点:- 在 Keil 的 Options -> Debug 选项卡中一定要勾选上 Load Application at Startup 选项.
![38](../img/lab2/38.png)
- 每次修改软件后务必重新编译并确认目标文件顺利生成 (我有一个朋友改了软件不重新编译就又开始调试, 结果跑的还是旧程序, 查错查不到还把自己心态搞崩了).