OpenOCD学习笔记 5-stm32f0x配置文件解析
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配置文件解析相关推荐
- linux软件包管理解析,linux学习笔记_09_软件包管理解析.doc
linux学习笔记_09_软件包管理解析 软件包管理 软件包分类 源码包(C语言编写的源代码) linux主要由C语言来写. 源码包可以用写字板打开 脚本安装包:源码包进行再开发的源码包(提供安装界面 ...
- XML学习笔记02【xml_解析】
Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 03 xml_解析 xml_解 ...
- 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持) 参考文章: (1)写给大忙人的ELK最新版6.2.4学习笔记-Logstash ...
- 安卓开发Android studio学习笔记12:读取解析XML(案例演示)
Android studio学习笔记 第一步:配置Student.XML 第二步:配置activity_main.xml 第三步:配置student.xml 第四步:配置Student用户类 第五步: ...
- OpenOCD学习笔记 3-配置基本知识
一般情况下要实现一个完整的调试配置,只需要2个配置文件,比如: openocd –f interface/yourInterface.cfg –f yourBoard.cfg yourInterfac ...
- 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)...
接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...
- TensorFlow学习笔记——《TensorFlow技术解析与实战》
著名历史学家斯塔夫里阿诺斯在<全球通史>中,曾以15世纪的航海在"物理上"连通"各大洲"作为标志将人类历史划分为两个阶段.在我正在写作的<互联 ...
- python学习笔记3-解析配置文件ConfigParser模块
配置文件内容: [db] db_host=127.0.0.1 db_port=3306 db_user=root db_pass=password [concurrent] thread=10 pro ...
- OpenOCD学习笔记 6-如何使用FTDI芯片作为SWD或JTAG调试器
FTDI的设备用到的interface Driver有2个,分别位ftdi和ft232r. [ftdi] 如果使用ftdi的interface配置,则使用的是FTDI的MPSSE模式,仅H系列芯片(F ...
最新文章
- BZOJ 1923: [Sdoi2010]外星千足虫
- apc220使用心得
- RabbitMQ 和 Kafka 到底怎么选?
- Java回调机制解析
- 基于stm32f405控制三相无刷电机例程_直流有刷电机和无刷电机的区别
- 微信小程序 下拉刷新页面时的加载状态
- python程序打包多个py文件_不使用setup.py,打包 Python 项目
- leetcode 515. 在每个树行中找最大值(层序遍历06)
- java---sychronized的深入理解
- openresty package.path require 报错
- STM32标准库官网下载方法
- js导出的xlsx无法打开_遇到U盘无法打开,属性显示0字节这样的问题?数据该如何导出?...
- IDEA代码格式化后缩进符不正确
- java毕向东学习笔记——day01
- 全国医疗卫生信息化公司网址大全
- 新年里真挚的情怀共祝愿南阳好
- 基于Tushare量化分析示例
- 发现IGame中又一个大坑
- 动手画混淆矩阵(Confusion Matrix)(含代码)
- Zeal--一款支持207个离线文档的浏览器
热门文章
- 织梦标签全攻略[转]
- Godot Engine:选择Skeleton节点时出现不停输出“object was deleted while awaiting a callback”并死机问题
- 十字路口待转区什么用_左转待转区的几种违章 稍不注意你绝对就要中招
- 飞机大战游戏需求分析文档 5改
- Matlab——m_map指南(3)——实例
- java 等额本息计算方式
- 免费图片外链网站收集整理,不再为贴图而发愁!!
- js 监听esc按键
- Alibaba Cloud Linux 3安装MySql8.0过程及配置
- 7天物联网智能家居实战训练营(百问网)-day1