openocd+openjtag+stm32开发环境配置

前几天重新在linux(Fedora 21 x64)下搭建了stm32的交叉开发环境,特此记录以下,方便以后查看。

openocd 安装与配置

安装openocd很简单,可直接在源里安装,不嫌麻烦可以自己下载源码编译。源里直接安装openocd

1
sudo yum install openocd

运行openocd需要一个配置文件openocd.cfg,命令行下默认指定当前目录下的openocd.cfg,也可以通过-f参数指定配置文件。具体配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#port
telnet_port 4444
tcl_port 6666
gdb_port 3333

#interface
interface ftdi
ftdi_device_desc "USB<=>JTAG&RS232"
ftdi_vid_pid 0x1457 0x5118

ftdi_layout_init 0x0c08 0x0f1b
ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400
ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800

#board
set WORKAREASIZE 0x8000

#target
source [find target/stm32f1x.cfg]

#
# configure FSMC Bank 1 (NOR/PSRAM Bank 2) NOR flash
# M29W128GL70ZA6E
#

set _FLASHNAME $_CHIPNAME.norflash
flash bank $_FLASHNAME cfi 0x64000000 0x01000000 2 2 $_TARGETNAME

proc stm32_enable_fsmc {} {

echo "Enabling FSMC Bank 1 (NOR/PSRAM Bank 2)"

# enable gpio (defg) clocks for fsmc
# RCC_APB2ENR
mww 0x40021018 0x000001E0

# enable fsmc clock
# RCC_AHBENR
mww 0x40021014 0x00000114

# configure gpio to alternate function
# GPIOD_CRL
mww 0x40011400 0x44BB44BB
# GPIOD_CRH
mww 0x40011404 0xBBBBBBBB

# GPIOE_CRL
mww 0x40011800 0xBBBBB444
# GPIOE_CRH
mww 0x40011804 0xBBBBBBBB

# GPIOF_CRL
mww 0x40011C00 0x44BBBBBB
# GPIOF_CRH
mww 0x40011C04 0xBBBB4444

# GPIOG_CRL
mww 0x40012000 0x44BBBBBB
# GPIOG_CRH
mww 0x40012004 0x444444B4

# setup fsmc timings
# FSMC_BCR1
mww 0xA0000008 0x00001058

# FSMC_BTR1
mww 0xA000000C 0x10000502

# FSMC_BCR1 - enable fsmc
mww 0xA0000008 0x00001059
}

$_TARGETNAME configure -event reset-init {
stm32_enable_fsmc
}

配置文件主要包括四部分:

  • 端口设置
    主要是telent和gdb登陆openocd的端口。

  • 接口设置
    主要配置openocd连接下载器的接口,可根据所购买的下载器复制/usr/share/openocd/scripts/interface相应的文件。具体到本人在淘宝买的野鸡牌openjtag下载器配置方法如下:

由于openocd版本问题,与电脑通过usb相连相应的接口文件在interface/ftdi下,观察以下ftdi目录下文件,openjatgkey.cfg文件即有可能是所需的,其内容如下

1
2
3
4
5
6
7
interface ftdi
ftdi_device_desc "Amontec JTAGkey"
ftdi_vid_pid 0x0403 0xcff8

ftdi_layout_init 0x0c08 0x0f1b
ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400
ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800

问题是野鸡牌openjatg对于上述配置文件并不能适用,需要改以下两处:

1
2
ftdi_device_desc "USB<=>JTAG&RS232"
ftdi_vid_pid 0x1457 0x5118

以上两处信息插上openjtag通过dmesg命令可查看设备信息

1
2
3
4
5
6
7
8
9
10
11
[ 7122.745224] usb 2-1.2: new full-speed USB device number 6 using ehci-pci
[ 7122.837596] usb 2-1.2: New USB device found, idVendor=1457, idProduct=5118
[ 7122.837607] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 7122.837613] usb 2-1.2: Product: USB<=>JTAG&RS232
[ 7122.837618] usb 2-1.2: Manufacturer: www.100ask.net
[ 7122.956095] usbcore: registered new interface driver ftdi_sio
[ 7122.956136] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 7122.956370] usb 2-1.2: Ignoring serial port reserved for JTAG
[ 7122.956448] ftdi_sio 2-1.2:1.1: FTDI USB Serial Device converter detected
[ 7122.956521] usb 2-1.2: Detected FT2232C
[ 7122.958430] usb 2-1.2: FTDI USB Serial Device converter now attached to ttyUSB0

ftdi_device_desc即为Product值,ftdi_vid_pid即为idVendor和idProduct值。

  • 开发板设置
    所采用的是stm32f103ZET6,/usr/share/openocd/scripts/board目录下的stm3210e_eval.cfg文件正好是stm32f103ZET6的,其中也设置好了target。

  • 目标设置
    直接拷贝了/usr/share/openocd/scripts/target目录下的stm32f1x.cfg文件。

openocd 运行权限问题

openocd需要root权限才可以打开下载器设备,解决方法是利用udev规则,安装完openocd,会在/usr/lib/udev/rules.d目录下生成一个99-openocd.rules,其中文件名前面的数字表示rules执行先后顺序,数字越大越晚执行。其实一开始我先在/etc/udev/下自己写了个rules文件,然而一直不管用,后来才发现是被99-openocd.rules文件覆盖掉了。打开99-openocd.rules文件找到对应设备,修改权限即可,注意其中的GROUP=”plugdev”其实是ubuntu thing,fedora上根本没有plugdev用户组,其实也不用管group,只要把当前用户加到和root同一个用户组下。

telnet 登陆

使用以下命令登陆openocd:

1
telnet localhost 4444

登陆后下载烧录程序的命令如下:

1
2
3
4
5
reset halt
flash probe 0
stm32f1x mass_erase 0
flash write_bank 0 main.bin 0
reset run

GDB 登陆调试

使用arm-none-eabi-gdb调试所编译的程序,首先运行openocd,再命令行运行gdb调试程序

1
arm-none-eabi-gdb main.elf

然后登陆到openocd

1
target remote localhost:3333

个人登陆时遇到错误信息,根据错误信息提示,在openocd配置文件中加入

1
gdb_memory_map disable

即可成功登陆。