OpenOCD的文档东西比较多,还有很多可能与DAPLink无关,所以改为分析stm32f0x.cfg文件,逐步学习每个的含义。

1. source [find target/swj-dp.tcl]

source and find commands,命令格式:

source [find FILENAME]

使用的规则:

  • find命令和参数FILENAME是放在[]中,命令返回的是该文件的完整路径(文件名不要用‘#’,‘#’是TCL的关键字)
  • source命令使用find到的文件,并以把这个文件作为脚本执行。

2.打开swj-dp.tcl文件,tcl命令可以到以下网址查看命令的说明

http://jim.tcl.tk/fossil/doc/trunk/Tcl_shipped.html#_eval

可以查找关键字“BUILT-IN COMMANDS”,有所有命令字的链接。

if [catch {transport select}] {

echo "Error: unable to select a session transport. Can't continue."

shutdown

}

这句是tcl命令,不是OpenOcd的命令,所以文档openocd.pdf没有这个命令。

catch是一个错误捕捉器。有1到2个参数

第一个参数是“要执行的代码”

第二个(可选)是错误消息的放置位置。

CATCH成功时返回0,失败时返回1。

这段命令的含义是判断transport select是否正确,如果不正确则输出错误信息。

proc swj_newdap {chip tag args} {

if [using_hla] {

eval hla newtap $chip $tag $args

} elseif [using_jtag] {

eval jtag newtap $chip $tag $args

} elseif [using_swd] {

eval swd newdap $chip $tag $args

}

}

proc实际上是一个带3个参数(函数名,参数,函数体)的命令。用于创建新的Tcl命令过程。

eval是将多个参数共同组成一个Tcl命令,比如eval swd newdap $chip $tag $args就是把newdap $chip $tag $args组合成swd命令。

3. 打开mem_helper.tcl文件

定义了4个函数,分别是mrw(memory读字),mrh(memory读半字),mrb(memory读字节),mmw(memory读改写)。

读函数都调用了mem2array,找不到mem2array的说明,估计是OpenOCD的API函数,网上看资料还有一个array2mem。以mrw说明一下mem2array的含义(不一定正确)

proc mrw {reg} {

set value ""

mem2array value 32 $reg 1

return $value(0)

}

从寄存器reg(精确到1字节)读32bit数据到value。

mem2array arrayname width address count

array2mem arrayname width address count

另外,mmw中调用了mww,看字面意思是memory write word,但是没有找这个函数在哪里定义的。

4. if { [info exists CHIPNAME] } {

set _CHIPNAME $CHIPNAME

} else {

set _CHIPNAME stm32f0x

}

exists:检查变量/过程(proc)/命令/别名是否存在,存在返回1,否则返回0.

info:向Tcl解释器提供各种内部信息,而info exists则表示该变量是否存在于当前上下文中。

5. set _ENDIAN little

设置大小端模式

6. if { [info exists WORKAREASIZE] } {

set _WORKAREASIZE $WORKAREASIZE

} else {

set _WORKAREASIZE 0x1000

}

WORKAREASIZE是设置flash烧录用到的ram空间,默认是4KB。

7. if { [info exists FLASH_SIZE] } {

set _FLASH_SIZE $FLASH_SIZE

} else {

# autodetect size

set _FLASH_SIZE 0

}

设置运行覆盖的flash宽度大小,以字节为单位;大多数微控制器忽略。

8. if { [info exists CPUTAPID] } {

set _CPUTAPID $CPUTAPID

} else {

# See STM Document RM0091

# Section 29.5.3

set _CPUTAPID 0x0bb11477

}

设置TAPID,在下面newtap命令中详细介绍。

这个ID一般情况是芯片厂家提供,不过也可以在MDK的工具看到9. swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID

swj_newdap就是前面介绍的文件swj-dp.tcl中的一个过程。在openocd.pdf中可以看10.3 TAP Declaration Commands中的jtag newtap的介绍。

具体的命令格式:

jtag newtap chipname tapname configparams...

定义一个新的TAP,configparams是对应tap的参数列表。

chipname是芯片的符号名。一般使用$芯片名,默认为芯片供应商提供的名字。

tapname 反映了TAP的作用,有固定的关键字:

  • bs –用于边界扫描
  • cpu –芯片的主cpu
  • etb –嵌入式跟踪缓冲区
  • flash – flash TAP
  • jrc–JTAG路由控制器
  • tap–用于FPGA/CPLD
  • unknownN–不清楚TAP的作用时使用(N是数字)
  • 有其他疑问时需要在数据表中填写芯片制造商的名称。例如,Freescale i.MX31有一个带有JTAG TAP的SDMA(智能DMA);该TAP应命名为SDMA。

参数不是固定的,但是每种TAP都会有参数-irlen,

  • -irlen NUMBER

指令寄存器的位长度,如4或5位。

其他参数:

  • -disable (or -enable)

使用-disable来标记一个TAP在TRST或JTAG 处在RESET状态复位后不链接到扫描链。-enable则表示链接。

  • -expected-id NUMBER

非0,32bit,表示扫描链的ID。可以有多个ID(比如表示不同的版本)。

  • -ignore-version

指定此选项可忽略-expected id选项中的JTAG version字段。IDCODE的28-31bit是JTAG的version字段。

  • -ircapture NUMBER

在进入ircapture状态时,由TAP加载到JTAG移位寄存器的位模式,如0x01。JTAG要求此值的最低2个位为01。默认情况下,-ircapture和-irmask设置为验证两位值。如果可以提供已知的额外的位,或者指示TAP不符合JTAG规范。

  • -irmask NUMBER

与-ircapture一起使用的掩码,用于验证指令扫描是否正常工作。OpenOCD不使用此类扫描,除非验证JTAG扫描链操作是不是没有问题。

  • -ignore-syspwrupack

设置这个参数用于忽略ARM DAP DP CTRL/STAT寄存器的CSYSPWRUPACK位。

10. dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu

命令原型:dap create dap name -chain-position dotted.name configparams...

申明一个名为dap name的DAP实例并链接到名为dotted.name的JTAG tap上。这条命令也创建了一个同名(dap name)的命令以方便用于额外的配置。一个JTAG tap只能由一个DAP实例。

11. set _TARGETNAME $_CHIPNAME.cpu

target create $_TARGETNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap

命令原型:target create target_name type configparams...

此命令创建一个GDB调试目标,该目标用于特定的JTAG tap。它将该目标输入到一个列表中,并创建一个用于各种目的(包括附加配置)的新命令(目标名称)。

  • target name

调试目标的名称,按照惯例,这应该与与此目标关联的TAP的dotted.name相同。

  • type

指定目标类型,

  • configparams

$target_name配置接受的所有参数都是按次提交的。如果目标是big-endian,请在此处设置-endian big。必须在此处设置-chain position dotted.name或-dap dap_name。

12. $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0

命令原型:$target_name configure configparams...

  • -chain-position dotted.name

命名用于访问此目标的TAP。

  • -dap dap name

命名用于访问此目标的DAP.

  • -endian (big|little)

指定CPU使用大端还是小端。

  • -event event name event bod

后面再解释event

  • -work-area-backup (0|1)

指示是否备份工作区;默认情况下,不备份。如果可能,请使用不需要备份的工作区,因为执行备份会减慢操作速度。

  • -work-area-size  size

指定工作大小(字节)。无论使用的是物理地址还是虚拟地址,都应用相同的大小。

  • -work-area-phys address

设置MMU不处于活动状态时要使用的工作区基址

  • -work-area-virt address

设置MMU处于活动状态时要使用的工作区基址。除了在带有MMU的目标上,不要配置这个值。该值通常应与当前操作系统设置的-work area-phys地址的静态映射相对应。

  • -rtos rtos_type

对目标启用rtos支持,rtos类型可以是auto,eCos, ThreadX, FreeRTOS, linux, ChibiOS, embKernel, mqx, uCOS-III, nuttx

  • -defer-examine

在初始JTAG链扫描和重置后跳过目标检查。需要手动调用arp examine才能访问目标进行调试。

  • -ap-num ap_number

为目标设置DAP访问端口,ap_number是目标连接到的DAP AP的数字索引。对于多个独立核心连接到同一DAP的单独访问端口的系统,请使用此选项。

  • -cti cti_name

设置与目标连接的交叉触发接口(CTI)。目前,只有aarch64目标使用此选项,它是目标运行控件的强制配置。

  • -gdb-port number

13. adapter_nsrst_delay 100

命令原型:adapter_nsrst_delay milliseconds

OpenOCD在撤销nSRST(系统复位低有效)后应等待多长时间(以毫秒为单位),然后才能启动新的JTAG操作。当电路有一个复位按钮连接到SRST线,它可能会有硬件去抖动,这意味着你应该使用这个。

14. reset_config srst_nogate

命令原型:reset_config mode_flag

此命令在目标配置脚本中显示或修改JTAG板和目标组合的复位配置。

mode_flag选项可以按任意顺序指定,但一次只能指定每种类型中的一种- signals, combination, gates, trst type, srst type和connect type。

  • signals

signals可以指定连接了哪些复位信号。可能的值有:none (默认), trst_only, srst_only and trst_and_srst.

  • combination

combination是一个可选值,用于指定中断的重置信号实现。如果没有指定选项,则默认separate,表示所有内容都正常工作。srst_pulls_trst表示测试逻辑与系统复位一起复位,trst_pulls_srst表示系统与测试逻辑一起复位。Combined则等于srst_pulls_trst和trst_pulls_srst都设置。

  • gates

gates令牌控制标志用于描述在复位期间JTAG可能不可用的一些情况。srst_gates_jtag(默认)表示执行srst将进入jtag时钟。这意味着在执行SRST时,JTAG上不会发生通信。相反的是srst-nogate,这表明在srst处于活动状态时可以安全地发出JTAG命令。

  • connect type

connect type令牌控制标志用于描述在连接到目标时执行SRST的某些情况。使用此选项需要srst_nogate。connect_deassert_srst(默认)表示在连接到目标时不会执行srst。相反的是connect_assert_srst,表示srst将在任何目标连接之前被执行只有一些目标支持此功能,例如STM32和STR9。如果由于选项字节配置不正确或程序执行非法而无法连接到目标,则此功能非常有用。

  • trst type(可选)

测试复位信号(trst)可能的trst类型驱动模式是默认的trst_push_pull和trst_open_drain。

  • srst type(可选)

系统复位信号(srst)的可能srst类型驱动程序模式是默认srst_open_drain和srst_push_pull

15. $_TARGETNAME configure -event examine-end { stm32f0x_default_examine_end }

$_TARGETNAME configure -event reset-start { stm32f0x_default_reset_start }

$_TARGETNAME configure -event reset-init { stm32f0x_default_reset_init }

在不同的时间,某些事情会发生,或者你希望它们发生。这些事情可以由目标event处理程序寻址。Event有固定的事件,具体参考文档openocd.pfd的11.5 Target Events中的定义。

OpenOCD学习笔记 5-stm32f0x配置文件解析相关推荐

  1. linux软件包管理解析,linux学习笔记_09_软件包管理解析.doc

    linux学习笔记_09_软件包管理解析 软件包管理 软件包分类 源码包(C语言编写的源代码) linux主要由C语言来写. 源码包可以用写字板打开 脚本安装包:源码包进行再开发的源码包(提供安装界面 ...

  2. XML学习笔记02【xml_解析】

    Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 03 xml_解析 xml_解 ...

  3. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)

    写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持) 参考文章: (1)写给大忙人的ELK最新版6.2.4学习笔记-Logstash ...

  4. 安卓开发Android studio学习笔记12:读取解析XML(案例演示)

    Android studio学习笔记 第一步:配置Student.XML 第二步:配置activity_main.xml 第三步:配置student.xml 第四步:配置Student用户类 第五步: ...

  5. OpenOCD学习笔记 3-配置基本知识

    一般情况下要实现一个完整的调试配置,只需要2个配置文件,比如: openocd –f interface/yourInterface.cfg –f yourBoard.cfg yourInterfac ...

  6. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)...

    接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...

  7. TensorFlow学习笔记——《TensorFlow技术解析与实战》

    著名历史学家斯塔夫里阿诺斯在<全球通史>中,曾以15世纪的航海在"物理上"连通"各大洲"作为标志将人类历史划分为两个阶段.在我正在写作的<互联 ...

  8. python学习笔记3-解析配置文件ConfigParser模块

    配置文件内容: [db] db_host=127.0.0.1 db_port=3306 db_user=root db_pass=password [concurrent] thread=10 pro ...

  9. OpenOCD学习笔记 6-如何使用FTDI芯片作为SWD或JTAG调试器

    FTDI的设备用到的interface Driver有2个,分别位ftdi和ft232r. [ftdi] 如果使用ftdi的interface配置,则使用的是FTDI的MPSSE模式,仅H系列芯片(F ...

最新文章

  1. BZOJ 1923: [Sdoi2010]外星千足虫
  2. apc220使用心得
  3. RabbitMQ 和 Kafka 到底怎么选?
  4. Java回调机制解析
  5. 基于stm32f405控制三相无刷电机例程_直流有刷电机和无刷电机的区别
  6. 微信小程序 下拉刷新页面时的加载状态
  7. python程序打包多个py文件_不使用setup.py,打包 Python 项目
  8. leetcode 515. 在每个树行中找最大值(层序遍历06)
  9. java---sychronized的深入理解
  10. openresty package.path require 报错
  11. STM32标准库官网下载方法
  12. js导出的xlsx无法打开_遇到U盘无法打开,属性显示0字节这样的问题?数据该如何导出?...
  13. IDEA代码格式化后缩进符不正确
  14. java毕向东学习笔记——day01
  15. 全国医疗卫生信息化公司网址大全
  16. 新年里真挚的情怀共祝愿南阳好
  17. 基于Tushare量化分析示例
  18. 发现IGame中又一个大坑
  19. 动手画混淆矩阵(Confusion Matrix)(含代码)
  20. Zeal--一款支持207个离线文档的浏览器

热门文章

  1. 织梦标签全攻略[转]
  2. Godot Engine:选择Skeleton节点时出现不停输出“object was deleted while awaiting a callback”并死机问题
  3. 十字路口待转区什么用_左转待转区的几种违章 稍不注意你绝对就要中招
  4. 飞机大战游戏需求分析文档 5改
  5. Matlab——m_map指南(3)——实例
  6. java 等额本息计算方式
  7. 免费图片外链网站收集整理,不再为贴图而发愁!!
  8. js 监听esc按键
  9. Alibaba Cloud Linux 3安装MySql8.0过程及配置
  10. 7天物联网智能家居实战训练营(百问网)-day1