arm处理器分为cortex-a,cortex-r,cortex-m等3个内核系列,其中m系列一般是单片机,例如stm32等,工控用得挺多。a系列一般是消费娱乐产品等使用较多,例如手机处理器。r系列是高端实时类型处理器,价格高,不太了解。这里说说最多接触的m和a系列。
说说硬件调试器:
一般有多种,st官方的st-link,SEGGER的J-Link、IAR的I-jet(本人使用过其多核调试功能),ulink,cmsis-dap等这几个我们一般能用到的。简单说一下:
st-link:仅支持自家m系列stm32单片机
jlink:支持m,a,r系列
ulink:这些请看这个博客:
常用的ARM调试器介绍(系统的学习调试器看这一篇就够了)-CSDN博客
说一下常用的调试环境搭建:
m系列一般用st-link调试器就可以调试,a系列一般得用jlink调试。
m和a系列处理器一般支持jtag、swd两种调试协议。jtag调试协议占用引脚端口多,swd占用仅2个而且烧录速度更快,stm32一般都用swd协议,a系列用jtag协议较多,但是也可以尝试一下swd协议,看看速度有变快不。
注意:对于swd协议,st-link最大支持4MHZ通信频率(st-link调试器一般是v2版本,据说st-link硬件调试器升级软件版本为v3能提高一倍速度?没试过可以试试),但是jlink则可以达到几十MHZ,下载速度确实快几倍(本人手头也有jlink v11的调试器实测过stm32f103zet6采用swd协议,确实比st-link快几倍,但是采用jtag协议,好像连不上不知道为什么,没深究了)。
关于这个通信速率(swd和jtag模式其实都是同样共用设置的频率),目前已知为:st-link最大4MHZ(keil使用的话里面最大可设该值),jink最大未知(看jlink.exe软件安装后里面的手册 UM08001_Jlink.pdf介绍的章节 7.6.1 SWD speed 提到和目标处理器以及jlink版本什么的都有关系,也就是没有个确定上界值(但是在keil里,或者JLinkGDBServer.exe双击运行界面里,最大可选50MHZ),一般来说4000KHZ,也就是4MHZ比较常见且稳定,设高了,能正常通信就可以(和线缆质量也有很大关系),否则就自己降低速率吧),但是我发现命令行启动jlink时候,设置超过50MHZ竟然也没有报错,就不太懂了。而且jlink分别base版(近100块,用得比较多,下载频率设置到15MHZ,也很稳,也比stlink快几倍)、pro版(稍微贵一些,频率可以到几十MHZ)、ultra版(近万元一个,极致性能了)。
也就是说,无论是stm32还是a系列处理器,调试器尽量选用jlink(对stm32所有系列支持也非常友好的),虽然贵了点,但是下载速度更快,功能更强大,可配置内容也更多。关于其它品类的支持arm的调试器,我没测试过,就不多说了,但是从那些调试器的性能介绍来看,jlink依然速率和稳定性应该是最好的。
关于stlink的使用:
可以使用一个开源的st-link.exe工具链,或者openocd(而且各种类型调试器它都能驱动)都可以。可以看我其它博客:
嵌入式IDE原理 OpenOCD介绍 以及stlink如何连接stm32板子-CSDN博客
驱动单片机硬件调试器的一些开源库总结(包含stlink调试器)_stlink 开源-CSDN博客
OpenOCD如何通过stlink直接下载程序到stm32板子(已解决)_openocd stlink-CSDN博客
windows用gcc编译stm32程序命令行控制stlink下载到板子_stlinkgdb.exe-CSDN博客
关于jlink的使用:
使用openocd也可以,但是这里主要说使用jlink调试器官方自己的jlink.exe工具链,因为适配性更好。只需要下载官方的jlink软件工具安装即可。里面有各种jlink开头的.exe工具链,但是用户接口一般都是jlink.exe这个软件,如果是gdb连接jlink调试器,那么需要启动JLinkGDBServerCL.exe,然后gdb.exe发起连接它即可,这里进行常用的介绍如下:
首先,最全的介绍,就在jlink.exe软件安装后里面的手册 UM08001_Jlink.pdf介绍,所有功能大纲以及相关命令出处,里面都介绍得清清楚楚。关于jlink.exe的命令,里面仅进行了简单介绍,是给了在线网页命令大全:J-Link Commander - SEGGER Knowledge Base。而关于jlinkgdbserver.exe命令倒是进行了详细介绍,以及gdb能执行的透传monitor命令列表。
jlink.exe的操作命令,从上面的网页可以看出,分为启动jlink.exe时候(也称为配置命令)的命令行参数,以及进入jlink.exe软件后(也成为Debugging命令)的命令行参数两种,例如halt命令,就只能是进入了jlink.exe后,才能使用的。所以多看看这些资料,就知道如何用了。
例如下载程序,由于loadfile命令得进入jlink.exe才能使用,此时一行命令行就没法实现了,jlink.exe刚好支持命令脚本,启动jlink.exe时候-CommandFile即可指定命令脚本,具体参见文档以及网页说明。此外,如果用户有自定义的目标版设置命令,jlink.exe还支持init脚本,请参见相关内容。
最后再说一点,jlink的命令很多,但是我们一般需要用的其实就几个,其它的都是保持默认就可以了。还有就是文档风格等原因吧,如果深究,其实会发现有些写得逻辑不太容易理解,总之已经能解决我们的问题,以及知道设置参数一些极限,就可以了,不用太转牛角尖了,不然越思考越觉得文档写得有些解释不通的地方,例如退出命令,里面写的是exit,但是用quit也能退出(会发现jlink所有介绍命令都没有出现过quit)!!!这个可能就是文档写得没有完全准确的原因,如果我们一直深究,转牛角尖去看,就只会徒劳费时间精力了,做嵌入式开发其实其它任务也有类似现象,也无需转牛角尖的。
最后给出stm32的程序下载命令:
-device STM32F103ZET6 -if SWD -speed 50000 -autoconnect 1 -CommandFile download.jlink
download.jlink内容如下:
connect
halt
WaitHalt 100
loadfile "build/Project4_hal_small_debug.bin" 0x08000000
RX 100
exit