一、简介
公司的GD32项目,第一次接触GD32的调试,遇到了很多问题,把这些问题和调试过程简单地记录下来,作为分享。有些地方可能不准确,说错了请在评论指出。
二、硬件与Keil连接
1. 硬件介绍
板子使用的是GD32芯片,型号为GD32F407ZK(型号一定要弄清楚),公司产品,图片我就不拍了。Jlink,不用多说,直接将电脑和板子连接。
板子记得上电,否则使用时Keil找不到设备。
2. keil配置
在这一步出现了很多问题,有很多要注意的地方。
首先,打开keil工程,如果没有建,就新建一个,教程可以去找,我没研究,直接使用的是项目提供的工程。当存在一个工程的时候,菜单栏 Project -> open project,选择keil的工程文件。
这样就打开了一个工程。
下一步就是修改配置了。点击上图中的魔法棒,进入配置界面。
先看device,找到对应的型号,我的板子是GD32F407ZK,如果没有找到,可以去keil官网下载相应的设备驱动,并安装。板子的型号一定不能选错!
然后看target,上图圈中的部分是板子rom的起始地址,keil一般默认程序会从这个地址开始读 ,即0x8000000,可以修改,但我目前还没研究。
接下来看Linker,我没有勾选上面的Use Memory Layout from Target Dialog,一开始我勾选了,结果没想到这个工程的MDK有后缀为 *.sct 的分散加载文件,配置了节区地址,导致我调试时一直卡死在0xFFFFFFFE的位置。后面我就添加了需要的sct文件,然后,另一个坑出现了,sct文件里配置的地址时从0x8010000开始,而之前说的Keil默认地址是从0x8000000开始,还是卡死在0xFFFFFFFE,只有把sct文件里的地址修改成0x8000000才解决。
最后是dubug,选择使用j-link调试,点击settings。
我使用的是SWD来连接,如果前面的device选择没错,右侧会自动识别出连接的GD32设备。
到这里基本的配置就已经配好了,可以进行编译,如果编译成功,就下载程序,最后调试。
这就是调试界面 (打个码),怎么调试有很多教程,就不细说了。
三、调试
现在,我有遇到了一个keil调试的经典问题,就是调试时,在程序走到引脚初始化那里会出现报错“Could not stop Cortex-M device”。
破案了,看门狗没有关,关掉后就不会报这个错误。
新的问题,程序可以单步调试,但多步调试就卡死,显示如下错误:
问题已解决,在程序初始化的时候加了一个地址的偏移,导致调试step over时出现T-bit of XPSR is 0 but should be 1. Changed to 1. 这个错误。
关于为什么单步调试(step)可以进行,而多步调试(step over)卡死的原因,个人推测是因为step over是根据中断向量表去找要执行程序的地址,执行到哪一步了;而step则是根据当前地址去寻找下一步的执行地址(可能说的不准确,就是这个意思)。所以地址的偏移不会影响step而会影响step over。