解决OpenOCD烧录STM32失败, 无法通过SWD连接的问题
OpenOCD烧录STM32失败的问题
Linux下使用 OpenOCD 烧录 STM32, 出现了 Error: init mode failed (unable to connect to the target) 错误.
如果在代码中, 不小心将 PA13,PA14 的 SWD 功能关闭, 例如使用了下面的代码
rcc_periph_clock_enable(RCC_GPIOA); // Need GPIOA clock
gpio_primary_remap(
AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_OFF, // Optional
AFIO_MAPR_TIM2_REMAP_NO_REMAP); // This is default: TIM2.CH2=GPIOA1
或者在 STM32CubeMX 中忘记勾选 PA13/PA14 的串口调试功能, 都会导致后续烧录和连接失败, 出现
Uploading .pio/build/bluepill_f103c8/firmware.elf
xPack OpenOCD x86_64 Open On-Chip Debugger 0.11.0+dev (2021-10-16-21:15)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
debug_level: 1
hla_swd
none separate
Error: init mode failed (unable to connect to the target)
in procedure 'program'
** OpenOCD init failed **
shutdown command invoked
*** [upload] Error 1
STLINK 工具 st-flash 和 st-info
首先检查一下系统中是否有st-flash和st-info命令, 没有的话需要安装
安装步骤
git clone https://github.com/stlink-org/stlink.git
cd stlink/
make
# 如果报 libusb 错误, 就安装一下 libusb-1.0-0-dev, 再make
sudo apt install libusb-1.0-0-dev
make clean
make
cd build/Release/
sudo make install
通过 st-info 检查 会提示无法进入 SWD 模式
$ st-info --probe
Failed to parse flash type or unrecognized flash type
Failed to enter SWD mode
Found 1 stlink programmers
version: V2J37S7
serial: 56FF6B064966485627461667
flash: 0 (pagesize: 0)
sram: 0
chipid: 0x000
detected chip_id parametres
# Device Type: unknown
# Reference Manual: RM0000
#
chip_id 0x0
flash_type 0
flash_size_reg 0x0
flash_pagesize 0x0
sram_size 0x0
bootrom_base 0x0
bootrom_size 0x0
option_base 0x0
option_size 0x0
flags 0
dev-type: unknown
使用 st-flash 和 st-info 解决 STM32 烧录失败
在网上搜到的大部分方案, 例如这个stackoverflow的解答, 都是要到Windows下, 通过 ST-link utility 去重置擦除, 这里介绍一下 Linux 下的处理方法
st-info 使用 --connect-under-reset 参数
此时需要使用--connect-under-reset参数, 按住开发板的 RESET 键之后, 执行下面的命令, 就能正确检测到芯片信息
$ st-info --probe --connect-under-reset
Failed to parse flash type or unrecognized flash type
detected chip_id parametres
# Device Type: STM32F1xx_MD
# Reference Manual: RM0008
#
chip_id 0x410
flash_type 1
flash_size_reg 0x1ffff7e0
flash_pagesize 0x400
sram_size 0x5000
bootrom_base 0x1ffff000
bootrom_size 0x800
option_base 0x1ffff800
option_size 0x10
flags 2
Found 1 stlink programmers
version: V2J37S7
serial: 56FF6B064966485627461667
flash: 0 (pagesize: 1024)
sram: 20480
chipid: 0x410
detected chip_id parametres
# Device Type: STM32F1xx_MD
# Reference Manual: RM0008
#
chip_id 0x410
flash_type 1
flash_size_reg 0x1ffff7e0
flash_pagesize 0x400
sram_size 0x5000
bootrom_base 0x1ffff000
bootrom_size 0x800
option_base 0x1ffff800
option_size 0x10
flags 2
dev-type: STM32F1xx_MD
如果是这种情况, 说明是PA13/PA14的功能复用问题, 可以通过固件擦除解决问题
st-flash 擦除固件
st-flash 同样地要加上--connect-under-reset参赛, 在按住 RESET 键后执行下面的命令
$ st-flash --connect-under-reset erase
st-flash 1.7.0-184-g468b1d2
Failed to parse flash type or unrecognized flash type
2022-02-14T22:51:20 ERROR common.c: Soft reset failed: timeout
detected chip_id parametres
# Device Type: STM32F1xx_MD
# Reference Manual: RM0008
#
chip_id 0x410
flash_type 1
flash_size_reg 0x1ffff7e0
flash_pagesize 0x400
sram_size 0x5000
bootrom_base 0x1ffff000
bootrom_size 0x800
option_base 0x1ffff800
option_size 0x10
flags 2
2022-02-14T22:51:20 INFO common.c: STM32F1xx_MD: 20 KiB SRAM, 0 KiB flash in at least 1 KiB pages.
Mass erasing
在出现Mass erasing后, 不能立即断电, 需要等待一小段时间, 之后用st-info --probe检查是否成功, 如果还显示Failed to enter SWD mode, 就再重复一遍上面的操作.
如果st-info --probe能直接检测到芯片, 就说明SWD功能已经恢复, 可以继续在 Linux 下用 OpenOCD 愉快地烧录 STM32 了.
解决OpenOCD烧录STM32失败, 无法通过SWD连接的问题的更多相关文章
- RSA加密-解密以及解决超长内容加密失败解决
加解密(没有使用到证书):https://blog.csdn.net/qy20115549/article/details/83105736 生成证书网站:https://blog.csdn.net/ ...
- Docker 安装 Jenkins , 并解决初始安装插件失败
安装 Jenkins 后,初始化下载插件总是失败,导致安装不成功,重试好几次都是卡在安装插件那. 这里记录下 Docker 下怎么安装 Jenkins ,并解决初始安装插件失败问题. 安装插件失败,其 ...
- MySQL解决插入emoji表情失败的问题
普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题.涉及无线 ...
- 解决mysql默认的8小时自动断开连接
语言:javaEE 框架:spring mvc+spring+mybatis 数据库:mysql8 WEB服务器:tomcat8 背景: 在试运营阶段发现发生“连接超时”异常 抛出异常: Cause: ...
- 解决安卓SDK更新dl-ssl.google.com无法连接的方法
Q:解决安卓SDK更新dl-ssl.google.com无法连接的方法: A1.修改C:\windows\system32\dirvers\etc\hosts文件,将其复制到其他地方修改后替换回原来的 ...
- [异常解决] JTAG 与STM32的SWD连接接线方式
如果我们的板子上只留了4个接口:V3.3,SWDIO,SWDCLK,GND.那么和JTAG的连接关系参见下图: dd400cf22b5c01e57a6c9e198d5383a0_189.jpg (0 ...
- [异常解决] JLINK 与STM32的SWD连接接线方式
如果我们的板子上只留了4个接口:V3.3,SWDIO,SWDCLK,GND.那么和JTAG的连接关系参见下图: 注意缺口方向.然后GND可以接左边任何一个pin(除了最底下这个PIN). FROM: ...
- STM32的JTAG、SWD和串口下载的问题
最近有一个项目用到STM32,为了使PCB布线方便一些所以改了一些引脚,占用了JTAG接口的PA15和PB3,所以要禁用一下JTAG,下载采用SWD模式.这样在实际操作中做出一些总结(方法网上都有.这 ...
- 【解决】安装compass失败(gem install compass)
原始日期:2016-01-25 16:26 这个问题比较常见. 很多人在安装ruby后再使用gem install compass命令安装compass,发现安装失败. [解决方法:] / ...
随机推荐
- idea 创建Maven项目,Enable auto Import报“本地服务器没有从权威服务器上收到响应”
完整的报错信息:Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from/to cent ...
- Flask_Flask-Script脚本扩展的使用(八)
Flask-Script扩展包提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行 ...
- PPT2010封面形状效果
原文链接:https://www.toutiao.com/i6486787584457441805/ 一.填充一张背景图片 选择一张空白幻灯片,右键菜单,选择背景格式. 进入"设置背景格式& ...
- 前端 vue 等刷新清浏览器缓存的方法
vue开发过程中发现内存一直往上飙,360时不时的提示下清理内存,测试发现每刷新一次页面内存就增加1%. 清掉浏览器的缓存等各种数据以后内存明显变小,刷新页面导致内存爆表. 这种问题着实不应该存在,记 ...
- 【C primer plus】初始化链表函数的错误
C primer plus第六版 的一处错误 第五百页17.3.4 实现接口的程序清单17.5中的初始化链表函数有误 #源代码 void InitializeList(List * plist) { ...
- 一篇文章带你搞懂DEX文件的结构
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看 ...
- winform 中心旋转 图片旋转
//设置左上角到中心点 g.TranslateTransform(int.Parse(x), int.Parse(y)); //旋转角度 g.RotateTransform(int.Parse(&qu ...
- 5.13-jsp分页功能实现
1.分页共能的实现 可以在dao层中创建方法 List<Member> pager(Long pageSize, Long pageNum);(方法灵活运用)其中传入的两个参数pageSi ...
- WebGPU相关的资源学习和社区
我在网上搜寻了很多关于WebGPU相关的资料: #我觉得首先在B站上看到的徐博士免费教程非常好,讲解详细,并且评论回复比较快,都会有回应,徐博士B站网址:https://space.bilibili. ...
- Go 变量及基本数据类型3
#### Go 变量及基本数据类型(三)今天学习一下剩下的两个基本数据类型(布尔类型,字符串类型)以及基本数据类型的相互转换##### 布尔类型布尔类型也称为bool 类型, bool 类型只允许取值 ...