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的工具看到OpenOCD学习笔记 5-stm32f0x配置文件解析_第1张图片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中的定义。

 

你可能感兴趣的:(工具)