CORTEX-M 系列调试下载总览

MCU 所有的下载方式
我们常见的MCU / CPU 代码烧录方式主要有以下三种:

ICP(In Circuit Programing):
	在电路编程,可通过CPU的Debug Access Port 烧录代码
	比如ARM Cortex的Debug Interface主要是SWD(Serial Wire Debug)JTAG(Joint Test Action Group)ISP(In System Programing):
	在系统编程,可借助MCU厂商预置的Bootloader 实现通过板载UART或USB接口烧录代码,
	比如STM32存储映射Code分区中的System memory可以预置厂商的Bootloader,
	让MCU支持通过UART下载(不限于UART,具体由厂商预置Bootloader实现而定);
IAP(In Applicating Programing):
	在应用编程,由开发者实现Bootloader功能,
	比如STM32存储映射Code分区中的Flash本是存储用户应用程序的区间(上电从此处执行用户代码),
	开发者可以将自己实现的Bootloader存放到Flash区间,
	MCU上电启动先执行用户的Bootloader代码,
	该代码可为用户应用程序的下载、校验、增量/补丁更新、升级、恢复等提供支持,
	如果用户代码提供了网络访问功能,IAP 还能通过无线网络下载更新代码,实现OTA空中升级功能
————————————————
版权声明:本文为CSDN博主「流云IoT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37621078/article/details/106798909

我们针对第一种方式 ICP(SWJ) 进行解读
  • 下载框架
// 下载是指将bin文件下载到 存储器里面(包括片上的片外的,易失性的非易失性的)

一般的架构是这样子的

服务器客户端架构:
pc机上的arm-gdb(或telnet) <--socket通信(本地或远程)-->PC机上openocd或JLink_Windows中的JLinkGDBServer.exe <--USB--> 仿真器  <--SWD/JTAG--> cortex-m芯片
	// arm-gdb 用 load 命令支持下载

或

无服务器架构:
PC机上openocd(linux)或者JLink_Windows中的JLink.exe或keil <--USB--> 仿真器  <--SWD/JTAG--> cortex-m芯片
	// Jlink.exe 需要用 connect命令 连接 芯片,并用 loadbin 命令支持下载
	// keil 需要用 点击按钮的方式 支持下载
	开源实现
		pc机软件		gdb				http://ftp.gnu.org/gnu/gdb/
		pc机软件 	openocd			https://sourceforge.net/projects/openocd/
									https://www.gnutoolchains.com/arm-eabi/openocd/
		仿真器		cmsis-dap		https://github.com/wuxx/nanoDAP			// 这些仿真器都是基于 ARM 发布的 CMSIS DAP 源码制作的
									https://gitee.com/cazure/CMSIS-DAP 		// CMSID DAP 源码 位于 https://github.com/ARMmbed/DAPLink


当然也会有 脱机(无PC机) 的情况
下载器  <--SWD/JTAG--> cortex-m芯片 // 此时的结构可以下载
	开源实现
		脱机烧录器	DAPLink			https://github.com/Kevincoooool/KS_DAP_Wireless
									https://www.bilibili.com/video/BV1h54y1C7z4
  • 调试框架

调试是指 下断点/单步运行/全速运行/停止/打印(修改)寄存器 等 功能

一般的架构是这样子的

服务器客户端架构:
pc机上的arm-gdb(或telnet) <--socket通信(本地或远程)-->PC机上openocd或JLink_Windows中的JLinkGDBServer.exe <--USB--> 仿真器  <--SWD/JTAG--> cortex-m芯片
	// arm-gdb 用 break/s/r/ctrl-c/bt 等命令来支持调试

或

无服务器架构:
PC机上openocd(linux)或者JLink_Windows中的JLink.exe或者keil <--USB--> 仿真器  <--SWD/JTAG--> cortex-m芯片
	// Jlink.exe需要用 connect 命令连接 芯片,并用 loadbin/SetPC/g/h 命令支持调试
	// keil 需要用 点击按钮的方式 支持调试 
  • 其他相关的硬件及软件
硬件:
	ulink cmsis-dap st-link nulink gdlink openjtag easyopenjtag
服务器:
	openocd-for-windows openocd-for-linux jlink-for-windows jlink-for-linux pyOCD
客户端:
	gdb
  • 其他相关的软件(IDE)-level2
其实是 对 level1 中的 服务器和客户端 的封装
eclipse : 有窗口可以自定义 服务器 和 客户端
Visual Studio : 有配置可以自定义 服务器 和 客户端 , 类似 eclipse
		https://blog.csdn.net/makerdiary/article/details/104958596

ds-mdk 
SDT
ADS
REALVIEW DEVELOPER SUITE
RealView MDK
MULTI 2000
Embest IDE
Hitool for ARM



IAR 	: 可以通过选择调试器驱动自定义硬件(调试器)和选择硬件(SWD/JTAG)接口,没有用客户端服务器架构,类似keil
			http://bbs.eeworld.com.cn/thread-645416-1-1.html
			https://github.com/talpachen/vsf_2017/tree/master/vsf/example/vsfusbd/proj/EWARM7.40
		  也有窗口可以自定义 服务器 和 客户端
keil 	: 没有用客户端服务器架构

  • [参考资料]
https://zhuanlan.zhihu.com/p/259494491
https://zhuanlan.zhihu.com/p/41517198
  • 仿真/下载原理
swd
coresight
  • 仿真过程

  • 下载过程

扩展
  • ARM7 ARM9 ARM11 cortex-a 系列芯片的调试
openocd 支持 ARM7 ARM9 ARM11 cortex-a
如果仿真器支持 ARM7 ARM9 ARM11 cortex-a
那么 他俩 就是 调试方案

一般用来调试裸机和u-boot(u-boot也是裸机的一种)
  • linux下的调试
如果 openocd 和仿真器 能调试 一个板子的 u-boot(可能是ARM7 ARM9 ARM11 cortex-a)
那么 openocd 和仿真器 能用来调试 linux吗?

linux是u-boot 是两套代码,调试u-boot时能否直接跳转到linux的调试?

应该可以,怎么实现?
有没有必要?是不是有更好的调试方式(gdb),并基于同一种coresight原理


  • qemu -s -S
qemu 开启单步调试, gdb 通过 target remote localhost:3333 连接

openocd 运行时 , gdb 也是通过 target remote localhost:3333 连接

qemu 和 openocd 有什么关系
	相同点
		都实现了一个gdbserver
	不同点
		qemu 中的 gdbserver 直接调用 ptrace 系统调用
		openocd 中的 gdbserver 是 控制的 usb设备,用coresight技术控硬件



下载非易失性存储器
// OK6410
如果flash被映射到了 memory map,则可以直接用jflash(或者jlink.exe中的loadbin 命令)来烧写
如果没有映射,则可以
	1.加载烧写程序(烧写程序一般比较大,比sram的总空间要大)到ddr
		1.1加载初始化内存的bin到sram并运行
		1.2加载没有初始化内存过程的bin(A)到ddr 
	2.加载即将被烧写的bin(B)到ddr
	3.运行A来烧写B

你可能感兴趣的:(CORTEX-M,32bit,单片机)