前几天重新在linux(Fedora 21 x64)下搭建了stm32的交叉开发环境,特此记录以下,方便以后查看。
openocd 安装与配置
安装openocd很简单,可直接在源里安装,不嫌麻烦可以自己下载源码编译。源里直接安装openocd1
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
7interface 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
2ftdi_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
5reset 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 |
即可成功登陆。