首先下载stlink的Linux的版本,下载地址。
然后解压到你所指定的路径下,参照其中的自述文件进行编译配置。如下:(笔者在此将对关键点进行标注)
HOWTO
== ===
首先,您必须知道该软件支持几种板。
这些板使用芯片从 USB 转换为 JTAG 命令。该芯片
称为 stlink,有 2 个版本:
。 STLINKv1,存在于 STM32VL 探索套件中,
。 STLINKv2,出现在 STM32L 发现和更高版本的套件中。
使用了 2 个不同的传输层:
。 STLINKv1 通过 USB 使用 SCSI passthru 命令,
。 STLINKv2 使用原始 USB 命令。
共同需求(依赖环境)
~~~~~~~~~~~~~~~~~~~
。 libu***-1.0 (你可能已经有了这个,但你需要
开发版才能编译)
(这个工具只需要执行 sudo apt-get install libu***-dev && sudo apt-get install libu***-1.0-0-dev 这个命令分类。)
。pkg-config
(这个工具一般Ubuntu都默认安装,注意变量PKG-CONFIG-PATH的设置)
IF YOU HAVE AN STLINKv1
~~~~~~~~~~~~~~~~~~~~~~~
STLINKv1 的 SCSI 仿真非常糟糕,所以最好的办法
是告诉您的操作系统完全忽略它。
选项(在插入之前执行其中一项)
*) modprobe -r u***-storage && modprobe u***-storage quirks=483:3744:i
或 *)1。将“options u***-storage quirks=483:3744:i”添加到/etc/modprobe.conf
*)2。modprobe -r u***-storage && modprobe u***-storage
或 *)1。cp stlink_v1.modprobe.conf /etc/modprobe.d
*)2. modprobe -r u***-storage && modprobe u***-storage
IF YOU HAVE AN STLINKv2(我们的开发板支持STLINKv2,所以这里不做配置)
~~~~~~~~~~~~~~~~~~~~ ~~~
你准备好了 :)
COMPILING(编译:下边3个清洗消毒)
~~~~~~~~~
这个项目是由一个好心人转换成Autotools的。在
下面的步骤将构建项目给你。
$ 。/autogen.sh
$ 。/configure
$ make
USING THE GDBSERVER(使用GDB调试服务)
~~~~~~~~~~~~~~~~~~~
运行gdb服务器:(你不
权限设置正确就需要sudo )
(此时连上你的开发板,一般都要sudo)
$ make && [sudo] 。/st-util
有几个选项:
。/st-util - 用法:
-h, --help 打印此帮助
-vXX, --verbose=XX 指定特定的详细级别 (0..99)
-v, --verbose 指定一般详细日志记录
-s X, --stlink_version=X
选择使用哪个版本的stlink,(默认为2)
-1, --stlinkv1 Force stlink version 1
-p 4242, --listen_port=1234
设置gdb服务器监听端口。(默认端口:4242)
-m, --multi
将 gdb 服务器设置为扩展模式。
st-util 将在断开连接后继续侦听连接。
-n, --no-reset
不要在连接时重置板。
要使用的 STLINKv2 设备可以在环境
变量 STLINK_DEVICE 中以 《USB_BUS》:《USB_ADDR》 格式指定。
然后,在你的项目目录中,像这样。..。..
(记住,你需要运行一个 _ARM_ gdb,而不是一个 x86 gdb)
(重打开一个终端,找到你编译好的应用程序的目录,就是存在自己的文件地方)
$ arm-none-eabi-gdb Fantasyblink.elf (开启调试)
。..
(gdb) tar extended-remote :4242 (连上 GDB 服务)
。..
(gdb) load
Loading section .text, size 0x458 lma 0x8000000
加载部分 .data,大小 0x8 lma 0x8000458
起始地址 0x80001c1,加载大小 1120
传输速率:1 KB/秒,560 字节/写入。
(gdb)
。..
(gdb) 继续
玩得开心!
从 GDB 重置芯片
============================
如果需要,您可以使用 GDB 重置芯片。您将需要
在此会话中使用“target extended-remote”命令:
(gdb) target extended-remote localhost:4242
Remote debugging using localhost:4242
0x080007a8 in _startup ()
(gdb) kill
杀死正在调试的程序?(y or n) y
(gdb) run
启动程序:/home/whitequark/ST/apps/bally/firmware.elf
请记住,您可以缩短命令。`tar ext :4242‘
对 GDB来说已经足够了。
设置 udev 规则
====================
为方便起见,您可以安装 udev 规则文件,49-stlinkv*.rules,位于
在存储库的根目录中。您需要将其复制到 /etc/udev/rules.d,
然后重新启动或执行
$ udevadm control --reload-rules
$ udevadm trigger
Udev 现在将创建一个 /dev/stlinkv2_XX 或 /dev/stlinkv1_XX 文件,适当的权限。
这是目前所有的设备,(
目前任何时候只支持每个版本的一个stlink )
从SRAM运行程序(在RAM上运行)
================== ==========
如果需要,您可以直接从 SRAM 运行固件。就
在0x20000000链接,做
(gdb) loadfirmware.elf
就会加载,然后调整pc指向开始
代码,如果链接正确(即 ELF 具有正确的入口点)。
写入闪存(烧写Flash)
================
GDB 存根附带正确的内存映射,包括闪存区域。
如果您将可执行文件链接到 0x08000000,然后执行
(gdb) load firmware.elf,
那么它将被写入内存。
常见问题
===
问:我的断点根本不起作用或只起作用一次。
答:优化会导致严重的指令重新排序。例如,
如果你正在做类似`REG = 0x100;’ 在循环中,代码可以
分为两部分:将 0x100 加载到某个中间寄存器
并将该值移动到 REG。当你设置断点时,GDB 会
挂钩到第一条指令,如果有
足够的未使用寄存器,则可能只调用一次。根据我的经验,-O3 经常导致这种情况。
问:在某些时候,我使用 GDB 命令“next”,但它挂起。
A: 有时,当您尝试使用 GDB 的“next”命令跳过循环时,
它会使用一种相当低效的单步执行方式。
在这种情况下手动设置断点并执行“继续”。
当前已知的程序员和目标的工作组合
========================================== ==================
STLink v1(在 32VL Discovery 板上找到)
已知工作目标:
* STM32F100xx(中等密度 VL)
* STM32F103(根据 jpa- on # #stm32)
没有信息:
* 其他一切!
STLink v2(可在 32L 和 F4 探索板上找到)
已知工作目标:
* STM32F0Discovery(STM32F0 探索板)
* STM32F100xx(中密度 VL,如 32VL 探索板)
* STM32L1xx(STM32L 探索板)
* STM32F0STM7RC1、STM32F12F STM32L151RB、STM32F205RE 和 STM32F405RE 在定制板上
* STM32F303xx (STM32F3 Discovery board)
* STM32F407 Discovery board
(STM32F407带 LCD)
* STM32F439VIT6(发现板重新安装 CPU)
* STM32L151CB(定制板)
* STM32L152RB(STM32L-Discovery 板,定制板)
STLink v2-1(可在 Nucleo 板上找到)
已知工作目标:
* STM32F401xx(STM32 Nucleo-F401RE 板)
请报告任何和所有已知的工作组合,以便我更新!
按照上边步骤编译配置,就可以调试和下载应用程序。